Explorando o Controle de Servo Motor via Receptor Infravermelho (IR)
Neste exercício, vamos explorar como controlar um servo motor utilizando um sinal de controle infravermelho (IR) e como interagir com LEDs para indicar o estado do sistema. Utilizando o Arduino e o receptor IR, será possível movimentar o servo motor para diferentes ângulos (0º e 180º) e acionar LEDs de status que indicam o funcionamento do sistema.
Introdução ao Controle IR
O controle infravermelho (IR) é uma tecnologia amplamente utilizada para comunicação sem fio em curta distância, transmitindo sinais de controle entre dispositivos. Neste projeto, um receptor IR conectado ao Arduino será utilizado para receber comandos e, com base nesses sinais, acionar o movimento do servo motor e os LEDs de status.
Funcionamento básico do Sistema
-
Comandos IR: O sistema utiliza um receptor IR que decodifica os sinais de um controle remoto para acionar o servo motor e os LEDs. Cada comando de controle tem um código único, que será interpretado pelo Arduino para realizar ações específicas, como acionar os LEDs ou movimentar o servo motor.
-
Servo Motor: O servo motor é usado para movimentar uma estrutura ou componente, como uma porta ou uma parte de um robô. Ele pode ser movido para ângulos específicos (0º ou 180º) com base nos comandos recebidos.
-
LEDs de Status: LEDs indicam o estado do sistema. O LED verde é aceso quando o sistema está em operação, e o LED vermelho é aceso para indicar que o sistema está na posição inicial (0º).
Componentes
-
Arduino UNO
-
Protoboard
-
Jumpers
-
Led Verde
-
Led Vermelho
-
Resistor 220Ω para cada Led
-
Receptor IR
-
Servo Motor
-
Controle Remoto IR
Conexões
Receptor IR:
-
O receptor IR é conectado ao pino digital 11 do Arduino para receber os sinais do controle remoto.
LED Verde:
-
O ânodo (perna longa) do LED vai para o pino 8 do Arduino, que é o pino de saída no seu código.
-
O cátodo (perna curta) do LED deve ser conectado ao GND do Arduino através de um resistor de 220Ω para limitar a corrente que passa pelo LED e protegê-lo.
-
O LED acende para indicar que o sistema está em movimento (180º).
LED Vermelho:
-
O ânodo (perna longa) do LED vai para o pino 10 do Arduino.
-
O cátodo (perna curta) vai para o GND, com um resistor de 220Ω em série para limitar a corrente.
-
O LED acende para indicar que o sistema está na posição inicial (0º).
Servo Motor:
-
O servo motor é conectado ao pino 2 do Arduino para movimentar a estrutura de acordo com os comandos recebidos.
Sobre o Código:
O código é responsável por decodificar os sinais infravermelhos recebidos pelo receptor e acionar os componentes do sistema (servo motor e LEDs).
-
Inicia o Receptor IR: O Arduino é configurado para iniciar o receptor IR e começar a ler os sinais do controle remoto.
-
Comandos de Controle:
-
Código 22: Acende os LEDs e inicializa o sistema.
-
Código 13: Apaga os LEDs e desliga o sistema.
-
Código 69: Move o servo para 180º (a posição final), acende o LED verde e apaga o LED vermelho.
-
Código 71: Move o servo para 0º (posição inicial), acende o LED vermelho e apaga o LED verde.
-
-
Movimento do Servo: O servo motor é movido para os ângulos de 0º ou 180º com base nos comandos. O movimento é controlado por um loop que ajusta a posição do servo gradualmente, criando um movimento suave.
-
Controle de LEDs: Os LEDs indicam a posição do servo:
-
O LED verde acende quando o servo está em 180º.
-
O LED vermelho acende quando o servo está em 0º.
-
Considerações Finais
Este projeto permite uma interação simples e eficaz com o sistema, utilizando um controle remoto infravermelho para controlar o movimento de um servo motor e acionar LEDs indicadores. Além de ser uma excelente forma de aprender sobre controle remoto IR e servo motores, também proporciona uma base para projetos mais complexos de automação e robótica.
Programa
#include <IRremote.hpp>
#include <Servo.h> // Biblioteca para controlar o servo motor
#define servo1 2 // Pino do servo motor
#define LED_VD 8 // LED verde (indica 180 graus)
#define LED_VM 10 // LED vermelho (indica 0 graus)
// Declaração do objeto Servo
Servo s1;
bool sistema = false; // Estado do sistema
int anguloIO = 0; // Posição atual do servo
int velocidade = 30; // Velocidade do movimento do servo
int RECV_PIN = 11; // Pino do receptor IR
IRrecv irrecv(RECV_PIN);
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Inicia o receptor IR
pinMode(LED_VD, OUTPUT);
pinMode(LED_VM, OUTPUT);
digitalWrite(LED_VD, LOW);
digitalWrite(LED_VM, LOW);
s1.attach(servo1); // Associa o servo motor ao pino definido
s1.write(0); // Iniciar servo 1 na posição zero
}
void loop() {
if (irrecv.decode()) {
uint8_t codigoRecebido = irrecv.decodedIRData.command;
// Verifica se o código não é repetido
if (irrecv.decodedIRData.flags != IRDATA_FLAGS_IS_REPEAT) {
Serial.print("Código recebido (HEX): ");
Serial.println(codigoRecebido, HEX); // Exibe o código em formato hexadecimal
Serial.print("Código recebido (DECIMAL): ");
Serial.println(codigoRecebido); // Exibe o código em formato decimal
}
// Ação para o código 22 (acende o sistema e pisca LEDs)
if (codigoRecebido == 22) {
piscarLeds();
}
// Ação para o código 13 (desliga o sistema e apaga LEDs)
if (codigoRecebido == 13) {
apagarLeds();
}
// Ação para movimentar o servo para 180 graus (código 69)
if (codigoRecebido == 69) {
movimentarServo180();
}
// Ação para movimentar o servo para 0 graus (código 71)
if (codigoRecebido == 71) {
movimentarServo0();
}
irrecv.resume(); // Prepara para o próximo sinal
}
}
// Função para piscar os LEDs
void piscarLeds() {
if (sistema == false) {
Serial.println("Piscando LEDs...");
for (int x = 0; x < 5; x++) { // Pisca 5 vezes
digitalWrite(LED_VD, HIGH); // LED verde acende
digitalWrite(LED_VM, LOW); // LED vermelho apaga
delay(300);
digitalWrite(LED_VD, LOW); // LED verde apaga
digitalWrite(LED_VM, HIGH); // LED vermelho acende
delay(300);
}
// Garante que os LEDs retornem ao estado inicial
digitalWrite(LED_VD, HIGH);
digitalWrite(LED_VM, HIGH); // LED vermelho aceso inicialmente
Serial.println("Sistema Inicializado");
sistema = true;
}
}
// Função para apagar os LEDs
void apagarLeds() {
if (sistema == true) {
Serial.println("Apagando LEDs...");
for (int x = 0; x < 2; x++) { // Pisca 2 vezes
digitalWrite(LED_VD, HIGH); // Ambos os LEDs acendem
digitalWrite(LED_VM, HIGH);
delay(300);
digitalWrite(LED_VD, LOW); // Ambos os LEDs apagam
digitalWrite(LED_VM, LOW);
delay(300);
}
// Garante que os LEDs retornem ao estado inicial
digitalWrite(LED_VD, LOW);
digitalWrite(LED_VM, LOW);
Serial.println("Sistema Finalizado");
sistema = false;
}
}
// Função para movimentar o servo para 180 graus
void movimentarServo180() {
if (sistema == true && anguloIO == 0) {
Serial.println("Movendo para 180...");
for (int angulo = anguloIO; angulo <= 180; angulo++) {
s1.write(angulo); // Move o servo para o ângulo correspondente
delay(velocidade); // Controla a velocidade do movimento
digitalWrite(LED_VD, !digitalRead(LED_VD));
}
anguloIO = 180; // Atualiza a posição do servo
digitalWrite(LED_VD, HIGH); // Acende o LED verde
digitalWrite(LED_VM, LOW); // Apaga o LED vermelho
Serial.println("Sistema em 180");
}
}
// Função para movimentar o servo para 0 graus
void movimentarServo0() {
if (sistema == true && anguloIO == 180) {
Serial.println("Movendo para 0...");
for (int angulo = anguloIO; angulo >= 0; angulo--) {
s1.write(angulo); // Move o servo para o ângulo correspondente
delay(velocidade); // Controla a velocidade do movimento
digitalWrite(LED_VM, !digitalRead(LED_VM));
}
anguloIO = 0; // Atualiza a posição do servo
digitalWrite(LED_VD, LOW); // Apaga o LED verde
digitalWrite(LED_VM, HIGH); // Acende o LED vermelho
Serial.println("Sistema em 0");
}
}