EXPLORAÇÃO TÉCNICA

Explorando o Controle de Servo Motor via Receptor Infravermelho (IR)

Uma análise sobre comunicação sem fio de curta distância e controle de precisão com Arduino.

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

Protótipo IR e Servo Motor

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.