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.
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.
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:
Outras fotos....
![]() |
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:
Muito bom, parabéns pelo trabalho
Obrigado Tonny... em breve postarei outros. abraço
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
Sua bateria é de quantos Volts ?
Minha bateria é de 9 volts.
O que sua aplicação faz e quais componentes você usa ?
Fiz a mesma aplicação do carrinho com o servo orientando a direção e seguindo a luz.
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
Como seria o código se fosse com motor DC, no mesmo projeto?
Em breve farei um novo post usando um motor DC. valeu
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!
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.
MUITO OBRIGADO PELO ESCLARECIMENTO!
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?
Bom dia, O mais barato, se eu não me engano é o de 1/8 w
Chefe estou a fazer um projecto, gostaria de saber se posso utilizar um arduino uno?
Aguardo a resposta o mais rapidamente possível.
Obrigado!
Sim, pode usar o Uno.
Não a nenhum defeito em trocar o Due pelo uno? Não é preciso fazer nenhum modificação nos programas?
Obrigado!
O código é o mesmo e provavelmente as portas também.
E não tem como o senhor me passar os circuitos sem ser uma imagem como está aqui no seu site?
Obrigado desde já!
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
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.
Postar um comentário