Custom Search

sexta-feira, 11 de maio de 2012

Tutorial : Arduino + Robô seguidor de luz ( Light follower Robot )



Olá pessoal após os pequenos projetos Arduino LDR e Arduino Servo Motor resolvi criar um projeto um pouco maior: Robô seguidor de luz.
Se alguém quiser entender um pouco melhor sobre pequenas partes como LDR e Servo Motor, sugiro que vejam o link referenciado acima.

Gostaria de avisar que o robô apenas segue a luz, ou seja caso a luz incidente seja maior no lado direito ele segue para a direita, caso  a luz incidente seja maior no lado esquerdo segue para a esquerda senão segue em frente (caso não tenha luz ou a luminosidade seja homogênea). 

E como eu sei onde tem mais luz ?
Para verificar a incidência de luz utilizei os LDR´s

E como mudar a direção ?
Para mudar a direção utilizei um Sero Motor.

Antes de começar o tutorial propriamente dito, gostaria de fazer um agradecimento a um amigo e grande jogador de StarCraft 2: Mateus Makarov Souza pelo apelido de Hellion ao robô. Só falta o jato de Fogo... rsrsrs

Robô Seguidor de Luz

Hellion - StarCraft 2

Vamos começar.

Lista de componentes:
1 - Arduino Duemilanove
2 - Servo
3 - 2 * LDR 5mm
4 - 2 * Resistor de 10k
5 - Bateria
6 - Protoboard
7 - Fios
8 - 2 carrinhos de brinquedo + pilhas

Passo 1

Fazer uma extensão para os LDRs. Isso faz com que as variações de luz sejam mais evidentes, além de criar um visual com a forma de um inseto, como se o robô tivesse antenas.

Se você tiver um cabo de rede velho ou que não irá usar, corte e retire dois pares de fios.

Cabo de rede

Em seguida solde os fios aos LDRs e use fita isolante. 

Soldar os fios a LDR

Antena LDR

Obs.: Tente deixar os fios trançados como mostra a foto acima.

Pra quem quiser e tiver material pode deixar as antenas um pouco mais amigáveis utilizando o tubo termo retrátil.

Inserindo o tubo
Aquecendo para fixar

Resultado final

Faça para os dois LDR´s

Passo 2

Assim que estiver pronto podemos fazer o nosso primeiro circuito. A figura abaixo mostra o circuito  do LDR. Caso você queira ver como funciona um LDR pode ver nesse link.

Circuito LDR

Foto - Circuito LDR

Foto - Circuito LDR

Em seguida rode o seguinte código e veja se está funcionando normalmente. O resultado será apenas via serial.

int pinLDRDir = 5; // pino analógico 5 direita
float LDRDir = 0;  // receberá o valor do LDR da direita
int pinLDREsq = 0; // pino analógico 0 esquerda
float LDREsq = 0;  // receberá o valor do LDR da esquerda

void setup() {
  Serial.begin(9600);
}
void loop(){
  //O valor lido da porta será no intervalo (0 a 1023)
  LDRDir = analogRead(pinLDRDir);
  LDREsq = analogRead(pinLDREsq);

  //Mostra na serial
  Serial.print("LDR Dir= ");
  Serial.println(LDRDir);
  Serial.print("LDR Esq= ");
  Serial.println(LDREsq);

  //Se 75% de LDREsq >= LDRDir - Vira a esquerda
  if( LDREsq*0.75 >= LDRDir)
    Serial.println("Vira a esquerda");
  //Senão se 75% de LDRDir >= LDREsq - Vira a direita
  else if( LDRDir*0.75 >= LDREsq)
    Serial.println("Vira a direita");
  else
    Serial.println("Centro");
  delay(500);
}

Passo 3

Após montar o circuito LDR, partimos para as ligações do Servo Motor. Essa parte é a mais fácil pois o Servo não precisa de nenhum circuito adicional, apenas das ligações com os pinos do arduino.

O servo motor possui 3 fios:

Amarelo : Fio de dados
Vermelho: VCC (5v)
Marrom: GND (terra)

Portanto devemos apenas ligar um fio ao pino 9 do arduino, que será o de dados, outro ao vcc e outro ao terra. A figura abaixo mostra essas ligações. Caso você queira ver como funciona um Servo Motor, clique no link.

Fios Para o Servo

Passo 4

Chegou o grande momento de montarmos o nosso robô. Pegue o primeiro carrinho e desmonte, utilizaremos suas rodas da frente para controlar a direção do nosso robô.

Carro 1 - Normal

Carro 1 - Desmontado

Carro 1 - Retire as rodas da frente.

Passo 5

Em seguida, de alguma maneira (rsrs), cole as rodas ao servo motor.

OBS.: Antes de colar as rodas ao Servo, certifique-se que ele esteja posicionado em 90º. Você tem duas maneiras de fazer isso. A primeira é girar o eixo até o final para ambos os lados e tentar achar o centro. A segunda eh fazer via software.

No software você deve fazer as seguinte ligações:

Servo
OBS.: Não esqueça de usar uma bateria para alimentar o arduino. Caso você não tenha uma bateria com o plug para o arduino, esse link mostra como fazer.

Em seguida rode o código:

/*
**************************************
Colocando o Servo em 90º
José Maria DVD
http://josemdvdf.blogspot.com.br/
--------------------------------------


*/
#include <servo.h>
Servo servo1;
void setup() {
servo1.attach(9);
servo1.write(90);
}
void loop(){}

Com o Servo posicionado de maneira correta, fixe-o de alguma forma. Peço desculpas pois não sou muito habilidoso nesses detalhes, o trabalho ficou um pouco feio porque usei fitas e abraçadeiras.

Servo + Rodas


Passo 6


Agora chegou a vez do segundo carro. Faça o mesmo processo, a diferença é que agora você ficará com as rodas traseiras que servirá de tração, com a base do carrinho que servirá de suporte para o protoboard (circuito completo) e chassis, além do motor e as pilhas que farão o nosso robô andar.

No meu caso, tive que desmontar todo o carrinho pois ele tinha outras funções que não me serviriam. Também estava com sorte pois o carrinho já tinha duas chaves, uma para ligar/desligar e outra para fazer o carro ir para frente ou ré. Caso o seu não tenha, basta ele andar mesmo :D.

Carro 2 - Desmontado


Passo 7


Após desmontar o carrinho, verifique se o motor e as chaves estão funcionando normalmente. Na hora de testar o ideal é usar as pilhas (observe que não usei :/ ), pois com elas podemos ter certeza que o suporte está normal.Veja o vídeo.



Passo 8


Após os testes, remonte e deixe as rodas traseiras, o suporte para a pilha, e toda a parte de tração.


Carro 2 - Remontado

Carro 2 - Remontado, com tração completa



Passo 9


Bom, agora que tudo está funcionando vamos começar a integração. Junte o servo/rodas dianteiras ao chassis. Nesse passo tive vários problemas por falta de material rsrsrs, mas no fim deu tudo certo.

Integração - Rodas dianteiras

Integração - Rodas Dianteiras


Passo 10


Agora vamos testar o servo integrado ao chassis. Use as mesmas ligações da figura servo no passo 5 e rode o seguinte programa:


/*
    **************************************
        Teste do Servo
        José Maria DVD
        http://josemdvdf.blogspot.com.br/
    --------------------------------------
 
*/
#include  <servo.h>
Servo servo1;
int pos = 90;
char lado = 'n';
void setup()
{
servo1.attach(9); // Porta de dados do servo
Serial.begin(9600); // inicializa porta serial
servo1.write(pos);
}
void loop(){
lado = Serial.read();
if (lado == 'l') ){
  pos = 10;
}else if (lado == 'r'){
  pos = 170;
} else pos = 90
lado = 'n';
servo1.write(pos);
delay(350);
}

OBS.: É necessário abrir o serial monitor do skd e digitar a letra 'l' para esquerda e 'r' para a direita.

Veja o vídeo de demonstração.



Passo 11


Próximo passo é integrar o circuito do passo 3 ao servo, lembrando que o fio AMARELO é de dados, o  VERMELHO é o VCC (5v) e o MARROM o GND (terra). Em seguida rodar o código:


#include <servo.h>
int pinLDRDir = 5; // pino analógico 5 direita
float LDRDir = 0;  // receberá o valor do LDR da direita
int pinLDREsq = 0; // pino analógico 0 esquerda
float LDREsq = 0;  // receberá o valor do LDR da esquerda
Servo servo1;
int pos = 90;
void setup() {
  servo1.attach(9);
  servo1.write(pos);
}
void loop(){
  //O valor lido da porta será no intervalo (0 a 1023)
  LDRDir = analogRead(pinLDRDir);
  LDREsq = analogRead(pinLDREsq);
  //Se 75% de LDREsq >= LDRDir - Vira a esquerda
  if( LDREsq*0.75 >= LDRDir){
    pos = 10;
  }
  //Senão se 75% de LDRDir >= LDREsq - Vira a direita
  else if( LDRDir*0.75 >= LDREsq){
    pos = 170;
  }
  //Senão - centro
  else{
    pos = 90;
  }
  servo1.write(pos);
  delay(350);
}

Veja os vídeos.






Passo 12

Agora integre o circuito completo ao chassis do robô. Usei uma liga pra fixar o arduino ao protoboard e uma abraçadeira plástica para fixar o protoboard ao chassis.

Robô seguidor de luz - final

Robô seguidor de luz - final

Agora com o robô completo refaça os testes.



Perceba que o robô tem uma reação um pouco demorada, portanto mude a última linha de código do passo 11 para delay(100); e veja como a resposta aos comandos fica mais rápido.




Passo 13 - FINAL


Após alguns testes em campo, percebi que o robô não conseguia fazer as curvas direito. Isso acontecia porque o ângulo que o servo rotacionava era muito alto, então fiz alguns ajustes e cheguei a um ponto bom. Você pode fazer isso com o seu também, faça vários testes e veja qual o melhor ângulo de posicionamento possível. Segue o código final:


#include <servo.h>
int pinLDRDir = 5; // pino analógico 5 direita
float LDRDir = 0;  // receberá o valor do LDR da direita
int pinLDREsq = 0; // pino analógico 0 esquerda
float LDREsq = 0;  // receberá o valor do LDR da esquerda
Servo servo1;
int pos = 90;
void setup() {
  servo1.attach(9);
  servo1.write(pos);
}
void loop(){
  LDRDir = analogRead(pinLDRDir);
  LDREsq = analogRead(pinLDREsq);

  //Se 75% de LDREsq >= LDRDir - Vira a esquerda
  if( LDREsq*0.75 >= LDRDir){
    pos = 60;
  }
  //Senão se 75% de LDRDir >= LDREsq - Vira a direita
  else if( LDRDir*0.75 >= LDREsq){
    pos = 120;
  }
  else{
    pos = 90;
  }
  servo1.write(pos);
  delay(100);
}


Veja o Making Off






Outras fotos....










22 comentários:

Antonio Thomacelli Gomes disse...

Muito bom, parabéns pelo trabalho

Unknown disse...

Obrigado Tonny... em breve postarei outros. abraço

Anônimo disse...

E ai tudo certo? Muito bacana a aplicação, parabéns.
Queria tirar só uma duvida. Tenho um Arduino Mega2560 e fiz a adaptação para conectar uma bateria ao arduino mais quando ligo somente a bateria a ele a aplicação não funciona. O led de sinal acende, mas, a aplicação não roda oque pode estar acontecendo?
Grato,

Milton

Unknown disse...

Sua bateria é de quantos Volts ?

Anônimo disse...

Minha bateria é de 9 volts.

Unknown disse...

O que sua aplicação faz e quais componentes você usa ?

Anônimo disse...

Fiz a mesma aplicação do carrinho com o servo orientando a direção e seguindo a luz.

Marcelo Vilar disse...

Muito bom, parabéns pelo tutorial, se alguém estiver precisando de Arduino ou módulos acesse o site abaixo:
http://www.vilartec.com.br

Summer disse...

Como seria o código se fosse com motor DC, no mesmo projeto?

Unknown disse...

Em breve farei um novo post usando um motor DC. valeu

DUARTE. disse...

SAUDAÇÕES JOSÉ. VC COLOCA O CODIGO DO ARDUINO PRIMEIRO E DEPOIS O DO SERVO. UM ATRAS DO OUTRO? SOU INICIANTE EM ARDUINO, DESCULPE AI A PERGUNTA.OBRIGADO!

Unknown disse...

Bom dia Duarte, não entendi muito bem a sua pergunta, mas vou tentar responder. O código é apenas um. Em alguns passos eu coloquei alguns códigos isolados apenas para Testar se os módulos estavam funcionando. O código completo é o que consta no passo 13.

Obrigado.

DUARTE. disse...

MUITO OBRIGADO PELO ESCLARECIMENTO!

Unknown disse...

Boa tarde Senhor José Maria de quanto Watt tem que ser esse resistor de 10k sou iniciante quando fui compra na loja de eletrônica não tinha a resposta?

Unknown disse...

Bom dia, O mais barato, se eu não me engano é o de 1/8 w

Unknown disse...

Chefe estou a fazer um projecto, gostaria de saber se posso utilizar um arduino uno?
Aguardo a resposta o mais rapidamente possível.
Obrigado!

Unknown disse...

Sim, pode usar o Uno.

Unknown disse...

Não a nenhum defeito em trocar o Due pelo uno? Não é preciso fazer nenhum modificação nos programas?

Obrigado!

Unknown disse...

O código é o mesmo e provavelmente as portas também.

Unknown disse...

E não tem como o senhor me passar os circuitos sem ser uma imagem como está aqui no seu site?

Obrigado desde já!

Unknown disse...

Boa tarde Senhor José Maria quero montar o seu projeto o Senhor por gentileza pode ver se essa relação de material é adequada principalmente o Duemilanove e o Sensor fotoelétrico muito obrigado por sua atenção?

1- Duemilanove 2009 AVRmega328P-PU com cabo USB para Arduino
http://www.dx.com/p/arduino-duemilanove-2009-avrmega328p-pu-with-usb-cable-118036#.VX3CU_lViko

2 - Jtron LDR 5537/5 milímetros Sensor fotoelétrico
http://www.dx.com/p/jtron-photoresistor-5537-5mm-photoelectric-sensor-silver-coffee-10-pcs-276082#.VX3EJflViko

3- Solderless Breadboard - Branco (tamanho grande)
http://www.dx.com/p/solderless-breadboard-white-large-size-121529#.VX3EAvlViko

Unknown disse...

Olá Land Kelly, esses materiais estão corretos. No entanto se você procurar na sua cidade em qualquer loja de eletrônica vai encontrar o sensor e o Breadboard facilmente.