Tutorial : Arduino + Robô seguidor de luz ( Light follower Robot )
Autor: José Maria Vasconcelos Dias | Publicado: 2012-05-11T14:41:00-04:00


<!--
google_ad_client = "ca-pub-5050320647282598";
/* Bloco no início */
google_ad_slot = "9608639678";
google_ad_width = 336;
google_ad_height = 280;
//-->







Olá pessoal após os pequenos projetos&nbsp;Arduino LDR&nbsp;e&nbsp;Arduino Servo Motor&nbsp;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&nbsp;
a luz incidente seja maior&nbsp;no lado esquerdo segue para a esquerda senão segue em frente (caso não tenha luz ou a luminosidade seja homogênea).&nbsp;

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

E como mudar a direção ?
Para mudar a direção utilizei um&nbsp;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.&nbsp;




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 &nbsp;do LDR. Caso você queira ver como funciona um LDR pode ver nesse&nbsp;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; &nbsp;// receberá o valor do LDR da direita
int pinLDREsq = 0; // pino analógico 0 esquerda
float LDREsq = 0; &nbsp;// receberá o valor do LDR da esquerda

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

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

&nbsp; //Se 75% de LDREsq &gt;= LDRDir - Vira a esquerda
&nbsp; if( LDREsq*0.75 &gt;= LDRDir)
&nbsp; &nbsp; Serial.println("Vira a esquerda");
&nbsp; //Senão se 75% de LDRDir &gt;= LDREsq - Vira a direita
&nbsp; else if( LDRDir*0.75 &gt;= LDREsq)
&nbsp; &nbsp; Serial.println("Vira a direita");
&nbsp; else
&nbsp; &nbsp; Serial.println("Centro");
&nbsp; 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.&nbsp;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&nbsp;mostra como fazer.

Em seguida rode o código:


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


*/
#include &lt;servo.h&gt;
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&nbsp;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&nbsp;rode o seguinte programa:



/*

&nbsp; &nbsp; **************************************
&nbsp; &nbsp; &nbsp; &nbsp; Teste do Servo
&nbsp; &nbsp; &nbsp; &nbsp; José Maria DVD
&nbsp; &nbsp; &nbsp; &nbsp; http://josemdvdf.blogspot.com.br/
&nbsp; &nbsp; --------------------------------------
&nbsp; 
*/
#include&nbsp;
&lt;servo.h&gt;
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') ){
&nbsp; pos = 10;
}else if (lado == 'r'){
&nbsp; pos = 170;
} else pos = 90
lado = 'n';
servo1.write(pos);
delay(350);
}


OBS.: É necessário abrir o serial monitor do skd&nbsp;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&nbsp;ao servo, lembrando que o fio AMARELO é&nbsp;de dados, o &nbsp;VERMELHO&nbsp;é o VCC (5v) e o MARROM&nbsp;o GND (terra). Em seguida rodar o código:



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

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








Veja o Making Off






















  window.___gcfg = {lang: 'pt-BR'};

  (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();



Outras fotos....



























<!--
google_ad_client = "ca-pub-5050320647282598";
/* Retângulo grande 336 x 280 */
google_ad_slot = "3694939704";
google_ad_width = 336;
google_ad_height = 280;
//-->