Mais um tutorial de Arduino. Desta vez será explicado como controlar dispositivos com um controle remoto IR (infravermelho). O funcionamento do controle IR será assunto para outro post.
Segunda edição
Eu fiz uns testes e encontrei erros no códigos apresentados neste post. Esta segunda edição substitui os algoritmos com erros por outros que já foram testados e funcionam.
Ligações
Primeiro temos que ligar o módulo receptor no Arduino.
O pino ao lado do sinal “-” é o terra, o pino do meio é para os 5V e o pino ao lado do “S” é o que recebe o sinal IR. O pino do sinal deve ser ligado a uma entrada digital.
Adicionando nova biblioteca
Antes de escrever o algoritmo, é necessário baixar uma biblioteca chamada “IRremote.h”. Na janela do Arduino, clique em “Tools(Ferramentas) -> Manage Libraries … (Gerenciar bibliotecas …)”
Algoritmo e novos comandos
Este é o algoritmo que testa o controle remoto IR.
#include <IRremote.h>
#define IR_RECEIVE_PIN 7
void setup() {
Serial.begin(9600);
IrReceiver.begin(IR_RECEIVE_PIN);
}
void loop() {
if (IrReceiver.decode()) {
IrReceiver.resume();
Serial.println(IrReceiver.decodedIRData.command);
}
}
A tela serial deve aparecer como mostra abaixo. Deve aparecer um número diferente para cada botão apertado no controle remoto.
Os novos comandos. Este define o pino dos dados do receptor IR.
#define IR_RECEIVE_PIN 7
A inicialização do receptor.
IrReceiver.begin(IR_RECEIVE_PIN);
Verifica se está recebendo sinal IR (IrReceiver.decode()). Se sim, o Arduino lê os dados (IrReceiver.resume();) e imprime o valor decodificado (Serial.println(IrReceiver.decodedIRData.command);).
if (IrReceiver.decode()) {
IrReceiver.resume();
Serial.println(IrReceiver.decodedIRData.command);
}
Alguns projetos
Este projeto controla um LED RGB e um buzzer com controle remoto IR. Aqui mostra o LED RGB e o buzzer ligados no Arduino.
O circuito completo. O terminal do receptor IR fica no mesmo pino do exemplo anterior.
Este é o algoritmo completo.
#include <IRremote.h>
#define IR_RECEIVE_PIN 7
int RGB_red=8;
int RGB_blue=9;
int RGB_green=10;
int buzzer=11;
void setup() {
Serial.begin(9600);
pinMode(RGB_red,OUTPUT);
pinMode(RGB_blue,OUTPUT);
pinMode(RGB_green,OUTPUT);
IrReceiver.begin(IR_RECEIVE_PIN);
digitalWrite(RGB_red,HIGH);
digitalWrite(RGB_blue,HIGH);
digitalWrite(RGB_green,HIGH);
}
void loop() {
if (IrReceiver.decode()) {
IrReceiver.resume();
Serial.println(IrReceiver.decodedIRData.command);
}
if(IrReceiver.decodedIRData.command==22){ //Pressionou a tecla 1?
digitalWrite(RGB_red,LOW);
digitalWrite(RGB_blue,HIGH);
digitalWrite(RGB_green,HIGH);
}
if(IrReceiver.decodedIRData.command==25){ //Pressionou a tecla 2?
digitalWrite(RGB_red,HIGH);
digitalWrite(RGB_blue,LOW);
digitalWrite(RGB_green,HIGH);
}
if(IrReceiver.decodedIRData.command==13){ //Pressionou a tecla 3?
digitalWrite(RGB_red,HIGH);
digitalWrite(RGB_blue,HIGH);
digitalWrite(RGB_green,LOW);
}
if(IrReceiver.decodedIRData.command==12){ //Pressionou a tecla 4?
digitalWrite(RGB_red,LOW);
digitalWrite(RGB_blue,HIGH);
digitalWrite(RGB_green,LOW);
}
if(IrReceiver.decodedIRData.command==24){ //Pressionou a tecla 5?
digitalWrite(RGB_red,HIGH);
digitalWrite(RGB_blue,LOW);
digitalWrite(RGB_green,LOW);
}
if(IrReceiver.decodedIRData.command==94){ //Pressionou a tecla 6?
digitalWrite(RGB_red,LOW);
digitalWrite(RGB_blue,LOW);
digitalWrite(RGB_green,HIGH);
}
if(IrReceiver.decodedIRData.command==64){ //Liga o buzzer se pressionar a tecla //OK.
digitalWrite(buzzer,HIGH);
}else{ //Se pressionar qualquer outra tecla, o buzzer //desliga.
digitalWrite(buzzer,LOW);
}
}
Apertando as teclas 1,2 ou 3, o LED acende em uma das cores primárias. Ao apertar 4, 5 ou 6 pode-se acender duas cores, outras teclas podem ser adicionadas. O próximo projeto é um braço robótico com três servomotores controlado por IR. Este é o braço montado.
Este é o algoritmo.
#include <Servo.h>
#include <IRremote.h>
#define IR_RECEIVE_PIN 7
Servo servobase;
Servo servotower;
Servo servohand;
void setup() {
Serial.begin(9600);
IrReceiver.begin(IR_RECEIVE_PIN);
servobase.attach(9);
servotower.attach(10);
servohand.attach(6);
}
void loop() {
if (IrReceiver.decode()) {
IrReceiver.resume();
Serial.println(IrReceiver.decodedIRData.command);
}
if(IrReceiver.decodedIRData.command==22){
servobase.write(100);
}
if(IrReceiver.decodedIRData.command==12){
servobase.write(10);
}
if(IrReceiver.decodedIRData.command==25){
servotower.write(10);
}
if(IrReceiver.decodedIRData.command==24){
servotower.write(100);
}
if(IrReceiver.decodedIRData.command==13){
servohand.write(100);
}
if(IrReceiver.decodedIRData.command==94){
servohand.write(10);
}
}
Este vídeo mostra o braço robótico em funcionamento.