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: 21581

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 Wandel Bamonde Junior em 23 junho 2015 às 2:14

poderiam lançar um novo tutorial com o kit do garabot.

Comentário de Anderson Carvalho em 30 agosto 2013 às 1:25

ok, transferi tudo para o nano e tá tudo certo, obrigado novamente!

Comentário de Hélio Vaz Prieto em 29 agosto 2013 às 20:15

Sim em todos os comando fiz com que retorna-se ao centro é só você dar uma examinada no código e fazer as mudanças que você quiser e assim ele vai girar pra onde você programar ok. 

Comentário de Anderson Carvalho em 29 agosto 2013 às 13:14

só uma coisa, ele gira pra esquerda e direita normalmente, mas não tem a opção de girar e ficar, todos retornam pro centro imediatamente apos o comando.

Comentário de Anderson Carvalho em 29 agosto 2013 às 12:21

Encontrei os valores abaixo e agora deu certo, muito obrigado, não sabe o quanto fiquei feliz kkk!  vou tentar passar para o NANO e livrar o UNO.

1FE48B7
1FE58A7
1FE7887
1FE807F
1FE40BF
1FEC03F
1FE20DF
1FEA05F
1FE609F
1FEE01F
1FE10EF
1FE906F
1FE50AF
1FED827
1FEF807
1FE30CF
1FEB04F
1FE708F
1FE00FF
1FEF00F
1FE9867

Comentário de Hélio Vaz Prieto em 28 agosto 2013 às 21:46

Bom Anderson se o controle é diferente é preciso primeiro ler o valor de cada botão de seu controle remoto porque esse valor pode variar de um controle para outro então vamos lá.

Primeiro eu criei um programa para ler os valores de meu controle e anotei em uma folha

o programa é o seguinte:

// Programa leitura controle remoto e resposta em hexadecimal

 

#include <IRremote.h> // inclue biblioteca do IR

 

int RECV_PIN = 11;// declara o pino de entrada do sinal do receptor

 

IRrecv irrecv(RECV_PIN);

 

decode_results results;

 

void setup()

{

  Serial.begin(9600);// velocidade da comunicação serial

  irrecv.enableIRIn(); // Começa a receber

}

 

void loop() {

  if (irrecv.decode(&results)) {

    Serial.println(results.value, HEX);

    irrecv.resume(); // Receive the next value

  }

}

Com esse programa você vai apertando os botão do controle e vendo oque aparece serial monitor para ver o valor , agora vem o programa meu do garabot é diferente do que eles passam ai em cima mais o meu funcionou normalmente.

#include "IRremote.h"

#include "Servo.h"

#define centro 30 // coloca a cabeça no centro

#define moveesq 0 // cooca a cabeça para esquerda

#define movedir 60 // coloca a cabeça para direita

#define abre 0 // abre a boca

#define fecha 60 // fecha a boca

 

int Ledolho1 = 12;

int Ledolho2 = 13;

 

int receiver = 11;

Servo cabeca, boca ;

 

 

IRrecv irrecv(receiver);         

decode_results results;        

 

 

void setup()  

{

  cabeca.attach(10);

  boca.attach(9);

  cabeca.write(centro);

  boca.write(fecha);

  pinMode(Ledolho1, OUTPUT);

  pinMode(Ledolho2, OUTPUT);

  digitalWrite(Ledolho1,LOW);

  digitalWrite(Ledolho2,LOW);

 

 

  irrecv.enableIRIn();

 

}

 

 

void loop()  

{

  if (irrecv.decode(&results))

 

  {

 

    translateIR();

    irrecv.resume();

  } 

}

 

 

void translateIR() 

 

{

 

  switch(results.value)

 

  {

 

  case 0xFD609F://aki é onde voce coloca o valor do botao escolhido depois do 0x... 

    cabeca.write(moveesq);

    delay(500);

    cabeca.write(centro);

    break;

 

  case 0xFD20DF://aki tambem e assim por diante

    cabeca.write(movedir);

    delay(500);

    cabeca.write(centro);

    break;

 

  case 0xFD50AF: 

    boca.write(abre);

    delay(500);

    boca.write(fecha);

    break;

 

  case 0xFD30CF:

    digitalWrite(Ledolho1, HIGH);

    digitalWrite(Ledolho2, HIGH);

    cabeca.write(movedir);

    delay(400);

    cabeca.write(moveesq);

    delay(400);

    cabeca.write(movedir);

    delay(400);

    cabeca.write(moveesq);

    delay(400);

    cabeca.write(centro);

    digitalWrite(Ledolho1, LOW);

    digitalWrite(Ledolho2, LOW);

    break;

 

  case 0xFD08F7:

digitalWrite(Ledolho1, HIGH);

digitalWrite(Ledolho2, HIGH);

    boca.write(abre);

    delay(400);

    boca.write(fecha);

    delay(400);

    boca.write(abre);

    delay(400);

    boca.write(fecha);

    digitalWrite(Ledolho1, LOW);

    digitalWrite(Ledolho2, LOW);

    break;

   

    case 0xFD8877:

    digitalWrite(Ledolho1,HIGH);

    digitalWrite(Ledolho2,HIGH);

    delay(300);

    digitalWrite(Ledolho2,LOW);

    digitalWrite(Ledolho1,LOW);

    break;

 

    delay(500);

  }

 

}

 

Pronto agora você pega os valores de seu controle em HEX e muda nesse programa onde eu comentei ok testa ai qualquer dúvida tamos ai.

 

 

 

 

 

Comentário de Anderson Carvalho em 28 agosto 2013 às 12:32

O controle é diferente sim, me explica como faço a mudança por gentileza, ele é daquela caixinha pequena que é só conectar o pendrive e ela toca (camelô) bem parecido com esse teu acima, alem desse, tenho uns 3 de central de ar novo que iriam ser jogados fora pela loja.

Mais se não funcionar dessa maneira, quero sim a postagem que me informou, e só aproveitando que consegui falar com alguém, criei um tópico com uma dúvida a respeito de uma configuração usando Opencv+arduino com web e servos, até agora não consegui criar, pois ninguém explica passo a passo com configurar. Obrigado!

Comentário de Hélio Vaz Prieto em 26 agosto 2013 às 20:01

Olá Anderson ,

 oque exatamente esta acontecendo?

Se estiver usando um controle diferente o do tutorial terá que fazer mudanças no programa.

Agora se ainda estiver com problemas em meu Garabot eu utilizei um programa mais simples e funcionou normalmente se você quiser posto o programa e um vídeo dele funcionando ok

até mais. 

Comentário de Hélio Vaz Prieto em 28 abril 2013 às 21:28

jorge rocha 

liguei o arduino em uma fonte de 12V e funcionou perfeitamente

valeu a dica logo posto ele funcionando

Comentário de Hélio Vaz Prieto em 28 abril 2013 às 20:14

Então a bateria é uma de 9V

e o controle é um que comprei na net parece o usado acima so que tem mais teclas

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço