29 maio 2014

Utilizando sensor de vibração SW-18010P com Arduino

Hoje vamos falar do Sensor de vibração SW-18010P, um sensor que, como o próprio nome diz, serve para medir a vibração e/ou movimentação de algum objeto. Com esse módulo, você pode montar alarmes (detectando, por exemplo, movimentação de uma porta), utilizá-lo em brinquedos (emitir algum som de acordo com a movimentação) ou algum outro sistema no qual você necessite medir o nível de vibração.

sensor de vibração SW-18015P
 
O módulo tem em uma das extremidades o sensor SW-18015P (ou SW-18010P, dependendo do modelo), que internamente possui uma mola que detecta se o sensor foi movimentado ou não. Esse sensor transfere para os pinos D0 e A0 as informações referentes à vibração. Pela sua construção, pode ser usado em qualquer ângulo, e também detecta movimentos em qualquer direção.

Sensor de vibração - Estrutura

O pino D0 (digital), indica se o sensor foi movimentado (sinal LOW - 0), ou não (sinal HIGH - 1). Já o pino A0 (analógico) tem a mesma função, porém emitindo sinais intermediários, ou seja, com ele podemos medir o nível de intensidade da vibração.

A alimentação do módulo é de 3.3 à 5v e ele possui dois leds na sua estrutura : o led verde indica que o módulo está ligado, e o led vermelho indica presença de vibração e o envio de dados pelos pinos D0 e A0. Com o potenciômetro, é possível alterar o nível de sensibilidade do módulo.

Sensor de vibração Ligado

Você pode ler as informações desse módulo usando tanto os pinos digitais como os pinos analógicos do Arduino, ou então utilizando os dois ao mesmo tempo, como nesse circuito que eu montei utilizando o sensor de vibração SW18010P e um display LCD 16x2, que mostra na parte superior se o sensor está ligado (vibrando), ou desligado, e na parte inferior o nível de intensidade da vibração, com o valor lido diretamente da porta analógica, ligada ao pino A0 do módulo :

Circuito Arduino - sensor de vibracao SW-1810P

O programa usa apenas a biblioteca LiquidCrystal para enviar dados ao LCD. Já utilizamos essa biblioteca várias vezes aqui no Arduino e Cia.  e eu recomendo a leitura desses artigos para verificar mais detalhes sobre o funcionamento e ligação do display. A comunicação com o módulo utiliza apenas uma porta digital (porta 7) e uma analógica (porta A5) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Programa : Sensor de vibracao com LCD 16x2
// Autor : Arduino e Cia

#include <LiquidCrystal.h>

// Porta ligada ao pino A0 do sensor de vibracao
int porta_A0 = A5;
// Porta ligada ao pino D0 do sensor de vibracao
int porta_D0 = 7;

int leitura_analogica = 0;
int leitura_analogica_ant = 0;
int leitura_digital = 0;

// Define os pinos de ligacao ao LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16,2); //Inicializa LCD
  lcd.clear();     //Limpa o LCD
  pinMode(porta_A0, INPUT);
  pinMode(porta_D0, INPUT);
  //Informacoes iniciais no LCD
  lcd.setCursor(0,0);
  lcd.print("Sensor: Deslig.");
  lcd.setCursor(0,1);
  lcd.print("Nivel : ");
  Serial.begin(9600);
}

void loop()
{
  // Leitura dos dados das portas do sensor
  leitura_analogica = analogRead(porta_A0);
  leitura_digital = digitalRead(porta_D0);
  // Exibe os dados da porta digital (se houver alteracao), e 
  // nivel de vibracao
  if (leitura_digital != 1)
  {
    lcd.setCursor(8,0);
    lcd.print("Vibracao");
    lcd.setCursor(8,1);
    lcd.print("      ");
    lcd.setCursor(8,1);
    lcd.print(leitura_analogica);
    leitura_analogica_ant = leitura_analogica;
    delay(1000);
    lcd.setCursor(8,0);
    lcd.print("         ");
    lcd.setCursor(8,0);
    lcd.print("Deslig.");
   }
  // Exibe os dados do nível de vibracao
  if (leitura_analogica != leitura_analogica_ant)
  {
    lcd.setCursor(8,1);
    lcd.print("      ");
    lcd.setCursor(8,1);
    lcd.print(leitura_analogica);
    leitura_analogica_ant = leitura_analogica;
  }
  delay(100);
}

Vale a pena dar uma olhada no datasheet do sensor, que contém mais detalhes e informações sobre o funcionamento do componente.

Vídeo do circuito em funcionamento ? Tem sim :


26 comentários:

  1. O nível de vibração medido é dado em que unidade ? Hertz ?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      O datasheet do sensor não informa o tipo de unidade. Creio que seja apenas uma variação da corrente elétrica na saída do sensor.

      Abraço !

      Excluir
    2. o q é esse dado mostrado na tela ?
      e pq ele diminui?

      Excluir
    3. Olá,

      Esse é o nível de tensão na porta analógica, em um valor que vai de 0 a 1024. Quando o sensor está em estado de espera, ele está em nível alto (HIGH, valor 1, ou 1024, na porta analógica). Quando há vibração, o valor vai diminuindo até chegar a zero.

      Abraço !

      Excluir
    4. Olá, minha porta analogica varia entre dois valores apenas 1023 e 30 trocando a sensibilidade do sensor, agora se tiver com vibração ele não varia nada fica fixo numa dessas duas acima... oq pode ser??

      Excluir
  2. Boa Tarde, gostaria que vc me orientasse, 1) se eu comprar este sensor de vibração ele funcionará sozinho? ( sem nenhum outro circuito eletrônico para fazer o reconhecimento da vibração pelo sensor ) 2) caso o sensor funcione somente com o arduino, qual arduino de menor tamanho vc tem e qual modelo vc me indicaria? O que eu quero, (VIBRAÇÃO -ja tenho) + (SENSOR - quero comprar) + (ALARME - já tenho). grato.

    ResponderExcluir
  3. Olá meu nome e josé luiz, postei anteriormente, queria frisar que tenho urgência em executar meu projeto e se der certo precisarei de um numero considerado de sensores, se for melhor a comunicação deixo meu email jsalsa1@gmail.com

    Obrigado pela atenção.

    ResponderExcluir
    Respostas
    1. Boa noite José,

      Esse sensor não funciona sozinho, você precisará de algum microcontrolador ou algum outro circuito auxiliar para ler os dados do sensor.

      O sensor é bem simples, ele funciona até em um Arduino Pro Mini ou um Arduino Nano.

      Abraço!

      Excluir
  4. estou com um projeto de ler as vibraçoes de uma ponte de ferro..
    ja tenho ele em maos, so queria saber como vc poderia me ajudar na hora dessa leitura o que posso fazer no caso desse projeto !!

    ResponderExcluir
    Respostas
    1. Boa noite,

      O que você precisa exatamente ?

      Abraço!

      Excluir
  5. ola com esse sensor ligado ao arduino com audio e autofalnte poderia colocar numa fantasia e ao eu começar andar acionaria o som gravado e ao parar de andar desligaria o som.obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Consegue sim, mas provavelmente você vai precisar de um amplificador para que ouçam os efeitos sonoros. :)

      Abraço!

      Excluir
  6. Como fazer o inverso. Tipo, mandar vibrações

    ResponderExcluir
    Respostas
    1. Bom dia,

      Use um motor de vibração, existem alguns modelos para Arduino, que funcionam com baixa tensão.

      Abraço!

      Excluir
  7. Pelo que entendi, esse sensor serve apenas para detectar vibração. Eu quero detectar o leve movimento de um dedo. Serve não, né?!

    ResponderExcluir
    Respostas
    1. Oi Alexandre,

      Na minha opinião não, pq se vc mover o dedo muito lentamente ele não vai acionar o sensor. Sugiro um módulo acelerômetro/giroscópio.

      Abraço!

      Excluir
    2. Mas lento, voluntário. Digo o curso do movimento, como um espasmo.

      Excluir
    3. Oi Alexandre,

      Entendi.. mesmo assim eu usaria um acelerômetro... acho que vc conseguiria detectar o movimento com mais precisão.

      Abraço!

      Excluir
    4. Também estou pensando num sensor de força resistivo. O tais movimentos podem ser tipo que geram pressão. Eu detectaria poucos gramas de força. Sparkfun vende alguns modelos. É interessante que eles são fininhos. Com o devido suporte, penso que dá implementar inclusive interruptor para bochecha.

      Excluir
  8. como ficaria para os dados aparecerem no monitor serial, retirando o lcd

    ResponderExcluir
    Respostas
    1. Oi Maicon,

      Você pode retirar os comandos e usar o Serial.print() e Serial.println(). O codigo fica mais ou menos assim (ficou meio baguncado, dá pra otimizar):

      void setup()
      {
      pinMode(porta_A0, INPUT);
      pinMode(porta_D0, INPUT);
      Serial.begin(9600);
      }

      void loop()
      {
      Serial.print("Sensor: Deslig.");
      Serial.print("Nivel : ");
      Serial.begin(9600);
      // Leitura dos dados das portas do sensor
      leitura_analogica = analogRead(porta_A0);
      leitura_digital = digitalRead(porta_D0);
      // Exibe os dados da porta digital (se houver alteracao), e
      // nivel de vibracao
      if (leitura_digital != 1)
      {
      Serial.print("Sensor: Vibracao");
      Serial.print(" Nivel : )";
      Serial.print(leitura_analogica);
      leitura_analogica_ant = leitura_analogica;
      delay(1000);
      Serial.println("Sensor: Deslig.");
      }
      // Exibe os dados do nível de vibracao
      if (leitura_analogica != leitura_analogica_ant)
      {
      Serial.print("Sensor: Deslig.");
      Serial.print(" Nivel : )";
      Serial.println(leitura_analogica);
      leitura_analogica_ant = leitura_analogica;
      }
      delay(100);
      }

      Abraço!

      Excluir
  9. Boa noite...
    Eu gostaria de saber se é possível fazer com que a partir do momento que o Arduíno receber essa informação de vibração seja possível dar um start em um buzzer.

    ResponderExcluir
  10. é possivel utilizar o sensor de vibração para sequencias de condicional? como por exemplo, acender/apagar uma lampada ao detectar duas vibrações ou abrir a cortina ao detectar 3???

    ResponderExcluir
    Respostas
    1. Acho que tudo depende apenas da forma que você pensa os tempos. Em outras palavras, os tipos de vibração, como isolá-las.

      Excluir