Tutorial: Robô de Papel - Faça o seu Garabot Controlado por IR

Adquira estes componentes na Loja do Lab de Garagem

Hoje iremos ensinar como fazer o Garabot, um robô com uma face de papel e alguns componentes eletrônicos. Ele será comandado por um Arduino através de um controle IR.

 

Lista de materiais:

1 x Arduino Uno R3 original ou Garagino

1 x Protoboard

1 x Resistor de 120Ω

2 x Servomotores Pequenos

1 x IR Control Kit

1 x Cola bastão

1 x  Fita dupla-face esponjosa

1 x Tesoura

1 x A4  paper (da cor que desejar)

Alguns jumpers

 

Funcionamento

Comandos IR

 

O IR ou Infravermelho é uma frequência que esta fora do espectro visível para o olho humano como mostra a figura 1  (o comprimentos de onda visível esta compreendido entre 400 a 750nm). E é por isto que não enxergamos o LED do controle piscando.

Figura 1 -  Espectro visível (em destaque na parte superior) e outros espectros com seus respectivos usos e características(abaixo)

Os comandos enviados nada mais são que trens de pulso onde o tempo de duração determina se o valor dele é 0 ou 1.  O Arduino através do receptor IR, identifica e transforma estes pulsos em um dado que é depois transformando em um valor inteiro.

Baseado no exemplo que acompanha  IR Control Kit, conseguimos identificar com o Arduino as teclas pressionadas no controle IR. Com as teclas identificadas podemos delegar para cada uma delas uma função para que o Garabot execute. A figura 2 mostra o que cada tecla fará com o Garabot.

Figura 2 -  Controle com os comandos

Servomotores

O servomotor é um componente eletromecânico que consistem de um motor DC controlado por um circuito de controle que recebe um sinal PPM (Pulse Position Modulation)  que controla sua angulação dentro de seu range de atuação que é de 180º. Na figura 3 você vê como são os típicos sinais de controle de um servo motor.

Figura 3 -  Características dos sinais de controle do servo motor

Eles normalmente conectados um sistema mecânico de engrenagens conhecido como "redutor" que tem o intuito de reduzir a velocidade de saída em relação a de entrada, mas com isto gera um ganho na força de atuação (torque). O sistema mecânico realimenta o circuito de controle por um potenciômetro. Além disto uma das engrenagens tem o papel de delimitar a área de atuação servomotor.

Cada servomotor tem sua especificação, e deve ser utilizado de acordo com a velocidade e carga que o mesmo vai atuar. Fique atento!!!

 

Montando da Estrutura de papel

Abaixo segue um passo a passo de como dobrar e montar o Garabot.(clique no"i" para obter mais informações)

Depois que a estrutura estiver montada não esqueça de deixar fios longos para não danificar a estrutura de papel.

 

O Circuito

Na Figura 4 podemos ver o circuito proposta que foi montado.

Figura 4 -  Montagem proposta para controlar o Garabot

Verifique se o circuito esta corretamente montado e faça o upload do sketch.

O Sketch

//Ângulos do Servomotor

#define abre 90
#define fecha 180
#define centro 90
#define esquerda 0
#define direita 180
// Definições dos Pinos
#define olhos 8
#define irPin 2

#include <Servo.h>

Servo servoboca,servocabeca;

int start_bit = 2200; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)

boolean powerstatus = false;
boolean statuscentrocabeca = false;
boolean cabecaesq = true;
boolean cabecadir = false;
boolean bocafechada = true;

void setup()
{
  pinMode(olhos, OUTPUT);
  pinMode(irPin, INPUT);

servoboca.attach(9);
  servocabeca.attach(10);

servoboca.write(fecha);
  servocabeca.write (135);
  digitalWrite(olhos, LOW);
}

void loop()
{
  int key = getIRKey(); //Fetch the key
  if(key != 0)
  {
    if (key == 149) //Botão de Power
    {
      powerstatus = powerstatus ^1;
      if(powerstatus == 1)
      {
        digitalWrite(olhos, HIGH);
        servocabeca.write (centro);
        delay(300);
        servoboca.write(abre);
        delay(100);
        servoboca.write (fecha);
        delay(135);
        cabecadir = false;
        cabecaesq = false;
      }
    }

if (powerstatus == 1)
    {

      switch(key)
      {

case 144: //CH Down - Fecha a Boca
        if (bocafechada == LOW)
        {
          servoboca.write(fecha);
          delay(500);
          bocafechada = HIGH;
          break;
        }
        else //Pisca os olhos se a boca já estiver fechada
        {
          digitalWrite(olhos, LOW);
          delay(150);
          digitalWrite(olhos, HIGH);
          delay(150);
          digitalWrite(olhos, LOW);
          delay(150);
          digitalWrite(olhos, HIGH);
          break;
        }

case 145: //CH Up - Abre a boca
        if (bocafechada == HIGH)
        {
          servoboca.write(abre);
          delay(500);
          bocafechada = LOW;
          break;
        }
        else //Pisca os olhos se a boca já estiver aberta
        {
          digitalWrite(olhos, LOW);
          delay(150);
          digitalWrite(olhos, HIGH);
          delay(150);
          digitalWrite(olhos, LOW);
          delay(150);
          digitalWrite(olhos, HIGH);
          break;
        }

case 146: //VOL Right - Move a cabeça para direita
        if (cabecadir == false & cabecaesq == false || cabecadir == true & cabecaesq == false)
        {
          servocabeca.write(direita);
          delay(150);
          cabecadir = true;
          break;
        }
        else if (cabecadir == false & cabecaesq == true)
        {
          servocabeca.write(centro);
          delay(150);
          cabecaesq = false;
          break;
        }

case 147: //VOL Left - Move a cabeça para esquerda
        if (cabecadir == false & cabecaesq == false ||cabecadir == false & cabecaesq == true)
        {
          servocabeca.write(esquerda);
          delay(150);
          cabecaesq = true;
          break;
        }
        else if (cabecadir == true & cabecaesq == false)
        {
          servocabeca.write(centro);
          delay(150);
          cabecadir = false;
          break;
        }

case 148: //Botão Mute - Faz SIM com a cabeça e pisca os olhos
        servoboca.write(abre);
        delay(150);
        digitalWrite(olhos, LOW);
        servoboca.write(fecha);
        delay(150);
        digitalWrite(olhos, HIGH);
        servoboca.write(abre);
        delay(150);
        digitalWrite(olhos, LOW);
        servoboca.write(fecha);
        delay(200);
        digitalWrite(olhos, HIGH);
        break;

case 165: // Botão AV/TV - Faz NÃO com a cabeça e pisca os olhos
        servocabeca.write(45);
        delay(150);
        servocabeca.write(135);
        delay(150);
        digitalWrite(olhos, LOW);
        servocabeca.write(45);
        delay(150);
        digitalWrite(olhos, HIGH);
        servocabeca.write(135);
        delay(150);
        digitalWrite(olhos, LOW);
        servocabeca.write(centro);
        delay(150);
        digitalWrite(olhos, HIGH);

         cabecadir = false;

         cabecaesq = false;

         break;

      }
    }
    else
    {
      servoboca.write(180);
      delay(150);
      servocabeca.write(135);
      delay(300);
      digitalWrite(olhos, LOW);
    }
  }
}

int getIRKey()
{
  int data[12];
  int i;

while(pulseIn(irPin, LOW) < start_bit); //Wait for a start bit

for(i = 0 ; i < 11 ; i++)
    data[i] = pulseIn(irPin, LOW); //Start measuring bits, I only want low pulses

for(i = 0 ; i < 11 ; i++) //Parse them
  {
    if(data[i] > bin_1) //is it a 1?
      data[i] = 1;
    else if(data[i] > bin_0) //is it a 0?
      data[i] = 0;
    else
      return -1; //Flag the data as invalid; I don't know what it is! Return -1 on invalid data
  }

int result = 0;
  for(i = 0 ; i < 11 ; i++) //Convert data bits to integer
      if(data[i] == 1) result |= (1<*i); // Atenção - Substitua o * por outro Sinal de menor que (<) 

return result; //Return key number // Limitação do editor usado pelo Site
}
//Fim do sketch

Em pouco tempo e com um pouco de imaginação podemos fazer o Garabot para nos divertir. O que esta esperando? Faça o seu também!!!

 

Referências

http://quarknet.fnal.gov/fnal-uc/quarknet-summer-research/QNET2010/...

http://en.wikipedia.org/wiki/Electromagnetic_spectrum

http://www.sparkfun.com/tutorials/291

http://pt.wikipedia.org/wiki/Espectro_vis%C3%ADvel

Exibições: 26025

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de jorge rocha em 26 abril 2013 às 19:04

Pode a potencia da bateria não ser suficiente para alimentar os servos.

Que remote voce usou?

Comentário de Hélio Vaz Prieto em 25 abril 2013 às 22:50

Oi pessoal eu ainda não entendi o programa do garabot para vazer as mudanças para utilizar meu controle então resolvi fazer outro programa sou iniciante por isso axo que cometi alguns erros o programa quando o arduino esta conectado via usb funciona perfeito mas quando ligo o arduino em uma bateria o programa funciona mas quando o servo chega em seu ângulo se passa alguns segundos e ele começa a voltar a posição anterior sem nenhum comando agradeço se alguem dizer oque esta acontecendo obrigado

 

#include "IRremote.h"
#include "Servo.h"
#define centro 90 // coloca a cabeça no centro
#define moveesq 0 // cooca a cabeça para esquerda
#define movedir 180 // coloca a cabeça para direita
#define abre 0 // abre a boca
#define fecha 90 // fecha a boca

int receiver = 11;
Servo cabeca, boca ;


IRrecv irrecv(receiver);         
decode_results results;        


void setup()  
{
  cabeca.attach(9);
  boca.attach(10);
  /*cabeca.write(centro);
  delay(2000);
  cabeca.write(moveesq);
  delay(2000);
  cabeca.write(movedir);
  delay(2000);
  cabeca.write(centro);
  delay(2000);
  boca.write(abre);
  delay(2000);
  boca.write(fecha);*/
  Serial.begin(9600);
  Serial.println("IR Receiver Raw Data + Button Decode Test");
  irrecv.enableIRIn();

}


void loop()  
{
  if (irrecv.decode(&results))

  {
  Serial.println(results.value, HEX); 
    translateIR();
    irrecv.resume();
  } 
}


void translateIR() 

{

  switch(results.value)

  {

  case 0xFD609F: 
    Serial.println(" Seta para frente            ");
    cabeca.write(moveesq);
    break;

  case 0xFD20DF:
  cabeca.write(movedir);
    Serial.println(" Seta para tras             ");
    break;

  case 0xFDA05F:
  cabeca.write(centro); 
    Serial.println(" Pause            ");
    break;

  case 0xFD50AF: 
    Serial.println(" Seta para cima           ");
    boca.write(abre);
    break;

  case 0xFD10EF: 
    Serial.println(" Seta para baixo           ");
    boca.write(fecha);
    break;

 
  default:
    Serial.println(" other button   ");

  }

  delay(500);


}

 

Comentário de Laboratório de Garagem em 22 abril 2013 às 12:51

A trecho do código abaixo:

  if(data[i] == 1) result |= (1<*i); // Atenção - Substitua o * por outro Sinal de menor que (<) 

É exatamente o que o texto diz...

Por uma limitação no nosso site não podemos colocar dois sinais de "<" (menor que) em sequência.

Comentário de Thiago Luiz da Silva em 20 abril 2013 às 20:48

Provavelmente por algum problema na conversão do HTML ou no funcionamento interno do site. Isso serve para mover os bits. Veja com detalhes aqui: http://arduino.cc/en/Reference/Bitshift.

ps: Você conseguiu fazer o controle funcionar?

Comentário de Mauricio Passos Ferreira em 20 abril 2013 às 20:38

Sou iniciante. Já perdi muito tempo com erros de programas. Por isso, antes de realizar novas experiências costumo verificar primeiramente os programas sugeridos. Neste, em particular, aparece erro na linha:  

    if(data[i] == 1) result |= (1<*i); // Atenção - Substitua o * por outro Sinal de menor que (<) 

Tenho que substituir o "*" por "< " , por que? Se assim é, por que existe essa observação?

Comentário de Thiago Luiz da Silva em 20 abril 2013 às 20:24

Meu controle não funciona (ou não consegui colocar ele pra funcionar!).

A primeira vez que pressiono uma tecla, aparece zero e a segunda aparece 4. Isso para todas as teclas.

Se eu seguro qualquer tecla, aparece 292. Alguém já teve este problema?

Comentário de Hélio Vaz Prieto em 2 abril 2013 às 23:10

ok vou tentar algumas mudanças aki 

Comentário de Laboratório de Garagem em 1 abril 2013 às 10:32

Vocês podem utilizar outro controle remoto, mas devem fazer algumas modificações no switch() e adicionar uma biblioteca que entenda o protocolo do controle remoto que vocês irão utilizar. 

Comentário de Hélio Vaz Prieto em 29 março 2013 às 0:37

Olá galera estou com um problema

- estou tentando montar meu Garabot mas meu controle é diferente do usado acima, eu ja fiz a leitura dos valores que cada botão vale em hex e decimal queria uma dica de onde mudo o programa para utilizar meu controle

ate mais 

Comentário de jorge rocha em 8 março 2013 às 3:02

Isso! tambem queria usar outro IR control.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço