top of page

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.

Diagrama

remotoIR.png

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");

  }

}

bottom of page