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.
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.
Cada servomotor tem sua especificação, e deve ser utilizado de acordo com a velocidade e carga que o mesmo vai atuar. Fique atento!!!
O Circuito
Na Figura 4 podemos ver o circuito proposta que foi montado.
//Â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!!!
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
ServomotoresO 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!!!
Postar um comentário
0 comentários