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. Neste projeto, o receptor decodifica sinais de um controle remoto, permitindo que o Arduino execute ações específicas com base no código recebido.
Funcionamento do Sistema
- Comandos IR: O sistema decodifica sinais únicos para cada tecla do controle. Cada comando (como ligar o sistema ou mover o motor) possui um código hexadecimal interpretado pelo código.
- Servo Motor: Utilizado para automação mecânica, movendo-se entre 0º e 180º. O movimento é processado em loops para garantir um deslocamento suave e controlado.
- LEDs de Status: O LED verde sinaliza a posição final (180º) ou movimento, enquanto o vermelho indica a posição de repouso (0º).
Materiais
- Arduino UNO & Protoboard
- Receptor IR & Controle Remoto
- Servo Motor SG90
- LED Verde e Vermelho
- Resistores de 220Ω
- Jumpers
Conexões Chave
- Receptor IR: Pino Digital 11
- Servo Motor: Pino Digital 2
- LED Verde: Pino 8 (Indica 180º)
- LED Vermelho: Pino 10 (Indica 0º)
- Alimentação: 5V e GND compartilhados
Protótipo em Operação
Lógica de Programação
Baixar Código (.INO)
#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)
Servo s1;
bool sistema = false;
int anguloIO = 0;
int velocidade = 30;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(LED_VD, OUTPUT);
pinMode(LED_VM, OUTPUT);
digitalWrite(LED_VD, LOW);
digitalWrite(LED_VM, LOW);
s1.attach(servo1);
s1.write(0);
}
void loop() {
if (irrecv.decode()) {
uint8_t codigoRecebido = irrecv.decodedIRData.command;
if (irrecv.decodedIRData.flags != IRDATA_FLAGS_IS_REPEAT) {
Serial.print("Código recebido: ");
Serial.println(codigoRecebido);
}
if (codigoRecebido == 22) piscarLeds(); // Inicia sistema
if (codigoRecebido == 13) apagarLeds(); // Desliga sistema
if (codigoRecebido == 69) movimentarServo180();
if (codigoRecebido == 71) movimentarServo0();
irrecv.resume();
}
}
void movimentarServo180() {
if (sistema == true && anguloIO == 0) {
for (int angulo = anguloIO; angulo <= 180; angulo++) {
s1.write(angulo);
delay(velocidade);
digitalWrite(LED_VD, !digitalRead(LED_VD));
}
anguloIO = 180;
digitalWrite(LED_VD, HIGH);
digitalWrite(LED_VM, LOW);
}
}
void movimentarServo0() {
if (sistema == true && anguloIO == 180) {
for (int angulo = anguloIO; angulo >= 0; angulo--) {
s1.write(angulo);
delay(velocidade);
digitalWrite(LED_VM, !digitalRead(LED_VM));
}
anguloIO = 0;
digitalWrite(LED_VD, LOW);
digitalWrite(LED_VM, HIGH);
}
}
Considerações Finais
Este projeto demonstra a integração entre protocolos de comunicação e controle mecânico. A lógica de movimento gradual (usando o loop for) é essencial para evitar picos de corrente no servo motor e proporcionar um movimento realista, servindo de base para trincas eletrônicas e braços robóticos.