domingo, 7 de julho de 2013

Acionando um buzzer com Arduino por infravermelho (Código Morse Simples)


            Uma das formas de interação sem fio que temos contato a um bom tempo e que a utilizamos com muita frequência é a infravermelho (IR), onde possuímos um emissor e um receptor. No caso do sinal infravermelho, eles são ondas de comprimento de 1 milímetro até 700 nanômetros, e, portanto, não visíveis para ao olho humano e possuem este nome, pois no espectro de luz, está localizado depois da luz vermelha. E o receptor de infravermelho é um encapsulamento de componentes que, normalmente, funcionam a uma frequência de modularização/demodularização de 38KHz no protocolo de transmissão NEC.

            A proposta a seguir visa utilizar este sistema de infravermelho para acionar um buzzer, distante do emissor, ao apertar de um botão.




1. Materiais Utilizados
 1.1.   Emissor
            7 fios (macho)
 
                
            2 fios (fêmea)

            1 led infravermelho
   
            1 resistor de 1KΩ
           
            1 botão
               
            1 arduino
               
            1 breadboard
              

   1.2.    Receptor
            6 fios (macho)
            1 fio (fêmea)
            1 buzzer
            1 receptor de infravermelho
            
            1 arduino
            1 breadboard
             

2. Montagem dos Materiais
   2.1.    Emissor
Para montar o emissor, primeiramente conectamos o botão à breadboard, colocamos uma tensão de 3.3V/5V em sua entrada, colocamos um resistor de 1KΩ para evitar curto e desligamento do Arduino ligado ao terra (GND) e na saída do botão adicionamos um fio para a porta digital 2 do Arduino. E o led infravermelho o conectamos diretamente no Arduino, onde o seu negativo (perna menor do led) conectamos em uma porta GND (terra) e o positivo (sinal) o conectamos na porta PWM 3 do Arduino.


   2.2.    Receptor
Para montar o  receptor, primeiramente conectamos na breadboard o receptor de infravermelho e na trilha da breadboard referente a marcação (-) do receptor conectamos um fio ligado ao terra (GND), na outra ponta, onde tem a marcação de um (S) é o sinal, e o conectamos na porta digital 11 do Arduino e por fim, o pino do meio do receptor é o Vcc que ligamos no 3.3V do Arduino. Após o receptor devidamente conectado, conectamos o buzzer, onde o fio preto é ligado no terra (GND) e o fio vermelho é ligado na porta digital 9 do Arduino.

 
 
 



3. Código utilizado no Arduino (Emissor)
Usando a biblioteca IRremote.

1:  #include <IRremote.h>  
2:  IRsend irsend; //Configurado para a PWM 3  
3:  const int buttonPin = 2;  
4:  int buttonState = 0;  
5:  int lastButtonState = 0;  
6:  void setup() {  
7:   Serial.begin(9600);  
8:   pinMode(buttonPin, INPUT);  
9:  }  
10: void loop() {  
11:  buttonState = digitalRead(buttonPin);  
12:  if (buttonState == HIGH)   
13:  {  
14:    irsend.sendNEC(0x00000001, 32); //Envia sinal NEC de 32bits  
15:    lastButtonState = 1;  
16:  }else{  
17:    if (lastButtonState == 1)  
18:    {  
19:     irsend.sendNEC(0x00000000, 32);  
20:    }  
21:    lastButtonState = 0;  
22:  }  
23:  delay(100);  
24: }  

Pontos Relevantes:
Este código é o responsável por identificar se o botão está sendo pressionado e é o responsável por enviar um sinal no padrão NEC de 32bits com um valor 1 ou 0, no caso.

O IRsend vem da biblioteca, é o responsável por enviar um sinal e por padrão ele está conectado ao PWM 3.

As linhas 14 e 19 são as responsáveis por enviar o sinal NEC propriamente dito.

As outras linhas dentro do método loop() basicamente são para identificar o estado do botão e enviar determinado sinal ou não.


4. Código utilizado no Arduino (Receptor)
Usando a biblioteca IRremote.
 
1:  #include <IRremote.h>  
2:    
3:  int RECV_PIN = 11;  
4:  const int buzzerPin = 9;  
5:  IRrecv irrecv(RECV_PIN);  
6:  boolean bLastState = false;  
7:  decode_results results;  
8:    
9:  void setup()  
10:  {  
11:   Serial.begin(9600);  
12:   irrecv.enableIRIn(); // Inicializa o receiver  
13:  }  
14:    
15:  void dump(decode_results *results) {  
16:   results->decode_type = NEC;  
17:   if (results->decode_type == NEC) {  
18:    Serial.print("Decoded NEC: ");  
19:   }   
20:   if(results->value == 1){  
21:    if(bLastState == 0) {  
22:     beepOn();  
23:     bLastState = 1;  
24:    }  
25:    } else {  
26:     if(bLastState == 1) {  
27:      beepOff();  
28:      bLastState = 0;  
29:     }  
30:    }  
31:    Serial.println(results->value, HEX);  
32:  }  
33:    
34:  void loop() {  
35:   if (irrecv.decode(&results)) {  
36:    dump(&results);  
37:    irrecv.resume(); // Prepara o receiver para o próximo dado  
38:   }  
39:  }  
40:    
41:  void beepOn(){  
42:   analogWrite(9, 20);     
43:  }   
44:    
45:  void beepOff(){  
46:   analogWrite(9, 0);     
47:  }  

Pontos Relevantes:
Este código é o responsável por receber o sinal no padrão NEC e emitir um som com o buzzer.

A linha 12 é a responsável por inicializar o receptor.

As linhas 41-47 são os métodos beepOn() e beepOff, ou seja, são eles que escrevem valores analógicos para o pino, 9 no caso, e emitem o som ou não no buzzer.

As linhas 20 - 30 são as responsáveis por realizar testes para ver em qual posição o botão do emissor está e consequentemente acionar o buzzer.

A linha 35 é útil para ver se tem algo sendo enviado.

A linha 37 serve para preparar o receptor para receber o próximo dado.

Nenhum comentário:

Postar um comentário