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 :


20 maio 2014

Usando Arduino Leonardo como teclado e mouse

O Arduino Leonardo é mais uma das placas da (grande) família Arduino. Utiliza o microcontrolador ATmega32u4 com comunicação USB embutida, o que dispensa o uso de circuitos auxiliares para comunicação. Essa placa possui 20 pinos de entrada/saída, sendo que 7 podem ser usados como saídas PWM, e 12 como portas analógicas. O clock é de 16 Mhz.

arduino leonardo teclado mouse
O Arduino Leonardo funciona da mesma maneira que as outras placas Arduino, mas tem uma funcionalidade adicional que vamos abordar nesse post, que é a possibilidade de utilizá-lo como se fosse um mouse ou um teclado.

Fisicamente, o Arduino Leonardo tem as mesmas dimensões que o Arduino Uno, e os conectores também estão dispostos de forma semelhante : na parte de cima, as portas digitais de 0 a 13, e os pinos GND, AREF, SDA e SCL. Na parte de baixo, as portas analógicas de 0 a 5 e os pinos de RESET, GND, 5v e 3.3v :

Arduino Leonardo - Detalhes
Para conexão ao computador é utilizado um cabo micro-usb e a instalação no Windows não exigiu a utilização de nenhum driver específico. Ao conectar o cabo, foram detectados três dispositivos : o Arduino Leonardo na porta serial COM13, o USB Composite Device e o USB Input Device :

Arduino Leonardo - Drivers

Finalizada a instalação da placa, a utilização é igual à de outras placas Arduino : carregue a IDE, e no menu Ferramentas => Placas selecione Arduino Leonardo. Em Ferramentas => Porta Serial, selecione a porta serial detectada no momento da instalação da placa (no nosso caso, COM13).

Para demonstrar a capacidade do Leonardo em ser utilizado como um teclado e um mouse, vamos montar um circuito composto por um push-button (será o nosso teclado), que vai enviar uma sequência de caracteres para o computador, e também um joystick (o nosso mouse), que vai determinar o movimento do cursor na tela do computador :

circuito Arduino Leonardo joystick push-button
No programa que vai controlar tudo isso (baseado no programa original do site oficial do Arduino), veremos novos comandos como o Keyboard.begin() e o Mouse.begin().

O Keyboard.begin() é o comando que inicia a emulação do teclado no Leonardo, ou seja, diz para a placa que a partir daquele momento ela pode se comportar como um teclado e enviar caracteres ao computador.

O Mouse.begin() faz a mesma coisa, mas com as funções de mouse. No programa, vamos ler as informações recebidas do joystick pelas portas A1 (eixo X) e A2 (eixo Y), e movimentar o cursor na tela do computador.

O push-button ligado à porta 7, cada vez que é acionado, executa o comando

Keyboard.println("Arduino e Cia !")

e envia a sequência de caracteres para o computador como se fosse um teclado. Você pode testar isso utilizando qualquer programa de edição de texto, como por exemplo o Bloco de Notas (notepad).

 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//Programa : Teclado e Mouse com o Arduino Leonardo
//Alteracoes e adaptacoes : Arduino e Cia

//Pino do push-button
int botao_msg = 7;
//Armazena estado do push-button
int previousButtonState = HIGH;

const int xAxis = A1;  //Pino entrada eixo X
const int yAxis = A2;  //Pino entrada eixo Y

int range = 2;              // output range of X or Y movement
int responseDelay = 2;      // response delay of the mouse, in ms
int threshold = range/4;    // resting threshold
int center = range/2;       // resting position value
int minima[] = { 
  1023, 1023};              // actual analogRead minima for {x, y}
int maxima[] = {
  0,0};                     // actual analogRead maxima for {x, y}
int axis[] = {
  xAxis, yAxis};            // pin numbers for {x, y}
int mouseReading[2];        // final mouse readings for {x, y}


void setup() 
{
  pinMode(botao_msg, INPUT);
  //Inicializa teclado
  Keyboard.begin();
  //Inicializa mouse
  Mouse.begin();
}

void loop() 
{
  //Checa se o push-button foi pressionado
  int valor = digitalRead(botao_msg);
  if ((valor != previousButtonState) && (valor == LOW)) 
  {
    Keyboard.println("Arduino e Cia !");
  }
  //Salva o estado do botao para comparacao no proximo loop
  previousButtonState = valor;
  
  // read and scale the two axes:
  int xReading = readAxis(0);
  int yReading = readAxis(1);
  
  // move the mouse:
   Mouse.move(xReading, yReading, 0);
   delay(responseDelay);
}

/*
  reads an axis (0 or 1 for x or y) and scales the 
  analog input range to a range from 0 to <range>
*/

int readAxis(int axisNumber) 
{
  int distance = 0;    // distance from center of the output range

  // read the analog input:
  int reading = analogRead(axis[axisNumber]);

// of the current reading exceeds the max or min for this axis,
// reset the max or min:
  if (reading < minima[axisNumber]) {
    minima[axisNumber] = reading;
  }
  if (reading > maxima[axisNumber]) {
    maxima[axisNumber] = reading;
  }

  // map the reading from the analog input range to the output range:
  reading = map(reading, minima[axisNumber], maxima[axisNumber], 0, range);

 // if the output reading is outside from the
 // rest position threshold,  use it:
  if (abs(reading - center) > threshold) {
    distance = (reading - center);
  } 

  // the Y axis needs to be inverted in order to 
  // map the movemment correctly:
  if (axisNumber == 1) {
    distance = -distance;
  }

  // return the distance for this axis:
  return distance;
}

Uma relação completa dos comandos de teclado e mouse que você pode utilizar no Arduino Leonardo estão na página oficial da placa, em http://arduino.cc/en/Reference/MouseKeyboard

Por último, uma observação sobre as funcionalidades de teclado e mouse do Arduino Leonardo. Funções como Mouse.move() e Keyboard.print() enviarão comandos diretamente para o seu computador, e isso pode dificultar um pouco a operação se por acaso algum comando errado for executado. O cursor do seu mouse, por exemplo, pode ficar em algum canto da tela, ou se mover de forma estranha.

Para evitar isso, é recomendável incluir no programa algum tipo de chave para que você possa ligar e desligar essas funções, utilizando-se dos comandos Mouse.begin() e Mouse.end() e Keyboard.begin() e Keyboard.end().

Atualizado - Vídeo do circuito em funcionamento: http://www.arduinoecia.com.br/2014/05/arduino-leonardo-teclado-mouse-video.html

05 maio 2014

Botão de reset externo para Arduino

Botão de reset externo para Arduino. Realmente foi uma coisa com a qual nunca me preocupei, até receber o email abaixo :

"Caro, 

Montei o seu circuito de lâmpadas com relés e controlado por infravermelho. Funciona perfeitamente mas o único problema é que quando o Arduino trava e o programa pára de funcionar, eu tenho que desparafusar a caixa plástica onde instalei o circuito, e apertar o botão de reset ou então desligar a energia do aparelho.

Isso dá um certo trabalho. Tem como instalar um botão de reset na caixa ?"

Tem sim, e é bem fácil de implementar.

O ATMega, quando ligado, está com o pino 1 (reset), em nível alto (1). Ao aplicarmos 0v (nível baixo) neste pino, o ATMega é resetado.

Repare que no barramento inferior do Arduino Uno, logo abaixo do microcontrolador, temos um dos pinos com a marcação RESET. Podemos utilizar este pino para resetar o microcontrolador, simplesmente aplicando à ele 0 volts.

Botão de reset Arduino
Seguindo esse princípio, podemos ligar um push-button ao pino RESET, a outra perna do botão ao GND, e utilizar um resistor pull-up para manter o pino em nível alto quando o botão não estiver sendo acionado.

O circuito fica mais ou menos assim, com um resistor de 10 K junto ao push-button. Usei um programa de teste para piscar o led ligado à porta 7 :

Circuito Reset ArduinoAlgumas pessoas utilizam esse circuito sem o resistor pull-up. Eu testei aqui as duas versões, com o mesmo resultado.

Não sei se há algum problema na utilização dessa solução à longo prazo. Se alguém usa uma versão diferente ou tem alguma consideração sobre essa ligação e quiser contribuir com o post, será bem vindo.

Até a próxima !