Você já imaginou como funciona um robô seguidor de luz? Já tentou criar algum projeto similar? Sim? Então, esse post é para você!
Aqui você vai aprender a criar um robô seguidor de luz bastante simples. Além disso, o projeto é bem personalizável, pois é possível fazer ajustes de sensibilidade da luz no código e ajuste de velocidade de giro do servo motor através do potenciômetro.
O robô possui uma estrutura em madeira (palitos de picolé) no estilo DIY (faça você mesmo). Então, este projeto é ideal se você é daquelas pessoas que gosta de criar projetos diferentes e interativos.
Este projeto pode, também, ser facilmente utilizado em salas de aula, por educadores e alunos a fim de ensinar e aprender robótica de forma descomplicada e inovadora.
Este projeto não tem segredos e este tutorial conta com tudo que você precisa saber para fazer o robô funcionar. Vamos aos tópicos que você vai aprender:
- Montar o circuito do projeto;
- Construir a estrutura externa usando os palitos de madeira;
- Escrever o código de forma passo a passo.
Portanto, mãos na massa!
Componentes utilizados
Os componentes utilizados para este projeto são os seguintes:
- 1x Servo motor;
- 2x Foto-resistores LDR;
- 1x Potenciômetro 10 KΩ;
- 2x Resistores de 10 KΩ;
- 1x Arduino UNO;
- 1x Protoboard média;
- 7x Palitos de picolé;
- 2x Alfinetes;
- Alguns jumpers e fios.
Já para construir a base de sustentação do servo, Arduino e da protoboard indica-se que você tenha em mãos as seguintes ferramentas:
- Alicate de corte ou estilete;
- Cola adesiva instantânea, cola quente ou cola básica para madeira.
Montagem do circuito do projeto
Veja na ilustração abaixo a montagem dos componentes do projeto:

As conexões são as seguintes:
- O pino digital 11 do Arduino é ligado no sinal do Servo Motor;
- Os pinos analógicos 0 e 2 são conectados nos fotoresistores;
- O pino analógico 1 é conectado no sinal do potenciômetro;
- Toda a alimentação é fornecida através dos pinos GND e +5V do Arduino.
Agora, na imagem abaixo, você encontra o esquema elétrico do circuito:

A alimentação do Arduino é feita através da conexão ao USB do seu computador. No entanto, a mesma alimentação pode ser feita através de uma fonte externa como uma bateria.
O fotoresistor funciona da seguinte forma: quando a luz o atinge, os fótons da luz excitam os elétrons na banda de valência, aumentando seus níveis de energia e permitindo que cruzem a lacuna de energia para a banda de condução. Como mais elétrons estão disponíveis para conduzir eletricidade, a resistência do fotoresistor diminui. Já quando não há luz, a resistência do fotoresistor aumenta.
Construção da estrutura do projeto seguidor de luz
Não há muito segredo na montagem dos palitos de picolé. O que você realmente deve possuir são 7 palitos, uma boa cola e um alicate/estilete.
Primeiro corte ao meio 2 palitos e pegue 1 deles para unir os dois palitos que servirão de base para o Arduino e a protoboard.
Dessa forma, veja:

Agora, é hora de unir outros 2x palitos pequenos (os que resultaram do corte de 1x palito inteiro) e colá-los de forma que as hastes do servo motor fiquem para cima, assim:

Para fixar nosso servo motor, é preciso passar uma fita isolante (ou qualquer outra fita que tiver) a fim de evitar que a madeira do palito se rompa no momento que inserirmos o parafuso de fixação do servo motor:

Recomendo você posicionar o servo motor no topo (não tem medida exata para a altura) e inserir os parafusos no local para aparafusar de forma que fure a madeira e deixe o servo firme.
Já para prender os seus fotoresistores, basta unir dois palitos e colocar os dois componentes entre a madeira. Recomendo colar a parte de cima (cabeça) do fotoresistor na madeira.
Observe as imagens abaixo:

Atente-se às setinhas vermelhas, pois elas indicam a posição dos alfinetes. Essa parte da estrutura do projeto é importante pois é feita a fixação do atuador do servo no palito de picolé para ser possível sua rotação.
Aqui você pode optar por criar o robô seguidor de luz utilizando outros materiais. Não se prive em utilizar somente os palitos de picolé, é a sua criatividade maker que importa!
Além disso, se você for um educador, é uma ótima ideia usufruir da ideia faça você mesmo (ou DIY, em inglês) para introduzir outros projetos de robótica como o braço robótico Arduino feito de palito de picolé também. Com esse tipo de projeto, conceitos de eletrônica, elétrica e programação com o Arduino são mais fáceis de serem aprendidos quando o aluno se envolve com esse tipo de projeto maker.
Código utilizado
Veja abaixo o código utilizado no projeto:
/* Código do Robô Seguidor de Luz. Feito por: Flávio Babos Para: MakerHero */ // Inclua a biblioteca do Servo Motor #include <Servo.h> // Dê um nome ao objeto Servo Servo servoMG; // Declare suas primeiras variáveis int sensor1; int sensor2; int diferenca; float pot; float potconvertido; // Valor usado para setar o ângulo incial no SERVO int val = 90; // Valor de leitura usado para comparar os valores dos sensores const int valorpadrao = 20; void setup() { // Declare os pinos dos sensores e do potenciômetro como entrada pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); // Declare o pino que o servo está e rotacione para ele em val (90º) servoMG.attach(11); servoMG.write(val); // Inicie a comunicação serial com o Arduino à 9600 bps Serial.begin(9600); } void loop() { // Colete os dados dos dois sensores e tire a diferença entre eles sensor1 = analogRead(A0); sensor2 = analogRead(A2); diferenca = abs(sensor1-sensor2); // Leia o potencionemtro e converta o valor lido // Ele vai ser utilizado para setar a velocidade do servo motor em seguir a luz pot = analogRead(A1); potconvertido = pot/180; // Printando na tela os valores dos sensores e a diferença entre eles Serial.print("Sensor 1: "); Serial.print(sensor1); Serial.print(" Sensor 2: "); Serial.print(sensor2); Serial.print(" Diferença: "); Serial.print(diferenca); // Aqui a diferença precisa ser maior que o padrão que você colocou lá no começo "valorpadrao" // Também, o valor lido no sensor2 precisa ser maior que sensor1 if ((sensor2 > sensor1) && (diferenca > valorpadrao)) { if (val < 180) { // Incrementa no valor do ângulo o valor convertido do potenciometro val = val + potconvertido; servoMG.write(val); } } // Aqui a diferença precisa ser maior que o valor padrão incial // Também, o valor lido no sensor1 precisa ser maior que sensor2 if((sensor1 > sensor2) && (diferenca > valorpadrao)) { if (val > 0) { // Decresce no valor do ângulo o valor convertido do potenciometro val = val - potconvertido; servoMG.write(val); } } // Printa o valor do ângulo que o servo está rotacionando Serial.print(" ngulo: "); Serial.println(val); // Espera por 50 milisegundos delay(50); }
Explicação do código
A lógica utilizada no algoritmo é muito simples de implementar e não tem muitas complicações para entendê-la.
#include <Servo.h> Servo servoMG;
Primeiro, você inclui a biblioteca do servo motor e depois declara um objeto servoMG para ser utilizado ao longo do código.
int sensor1; int sensor2; int diferenca; float pot; float potconvertido;
Essas são as primeiras variáveis do programa e servem para ler o estado atual dos componentes, como os fotoresistores (sensor 1 e 2) e o potenciômetro (pot).
Já a variável diferença nada mais é do que a diferença de leitura do fotoresistor de um lado e do outro.
E a variável potconvertido irá servir para ajustar a velocidade com que o servo motor irá rotacionar para seguir a luz de acordo com o ajuste feito no potenciômetro.
int val = 90; const int valorpadrao = 20;
Essas últimas variáveis servem de leitura e representam, a primeira, o valor do ângulo que o servo motor desempenha assim que o Arduino é ligado e durante a execução do código, e a segunda, representa a sensibilidade (diferença de leitura) dos fotoresistores.
Ou seja, quanto maior for o valorpadrao, menos sensível o robô será à luz enquanto que, o inverso, representa maior sensibilidade.
Esse valor serve para que o servo vá para o lado onde há maior incidência de luz no fotoresistor, ou seja, menor resistência.
O número que iremos colocar aqui será de 20, mas você pode variar de acordo com o ambiente em que estiver.
void setup() { pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT);
No void setup primeiramente definimos em qual porta está cada sensor, no caso:
· A0 = sensor1
· A1 = potenciômetro
· A2 = sensor2
servoMG.attach(11); servoMG.write(val); Serial.begin(9600);
Agora, é feito uma leitura da porta do servo motor (porta digital 11) e, após, mandamos o servo rotacionar o valor de val (90°).
Finalmente, iniciamos a comunicação com o monitor serial a 9600 bps.
void loop() { sensor1 = analogRead(A0); sensor2 = analogRead(A2); diferenca = abs(sensor1-sensor2);
Para começar no void loop lemos o estado dos fotoresistores e tiramos a diferença de suas leituras.
pot = analogRead(A1); potconvertido = pot/180;
Também, não podemos deixar de ler o potenciômetro que é crucial em nossa lógica de programação para definir a velocidade de giro do servo motor.
Serial.print("Sensor 1: "); Serial.print(sensor1); Serial.print(" Sensor 2: "); Serial.print(sensor2); Serial.print(" Diferença: "); Serial.print(diferenca);
Para acompanhar ao vivo a atuação do robô, escrevemos esses Serial.print’s onde você pode ver o valor dos sensores e a diferença dada entre eles.
if ((sensor2 > sensor1) && (diferenca > valorpadrao)) { if (val < 180) { val = val + potconvertido; servoMG.write(val); } }
Essa condição if() apenas é executada quando o valor do sensor2>sensor1 e a diferença entre eles seja maior do que 20.
Isso serve para identificar para que lado o servo motor irá girar, sentido horário ou anti-horário servoMG.write(val).
if((sensor1 > sensor2) && (diferenca > valorpadrao)) { if (val > 0) { // Decresce no valor do ângulo o valor convertido do potenciometro val = val - potconvertido; servoMG.write(val); } }
Já se a luz estiver incidindo mais de um lado do que do outro, essa condição fará com que o servo motor mude de rotação e gire o valor val até que a condição da diferença seja menor do que o valorpadrao seja atendida.
Serial.print(" ngulo: "); Serial.println(val); delay(50);
Finalizamos nosso projeto com um Serial.print indicando qual o valor que o servo está desempenhando e imprimindo esse valor no monitor serial do Arduino.
Não nos esqueçamos de colocar um delay de 50ms de forma a eliminar qualquer erro de leitura do código.
Projeto robótico finalizado
Assim que terminar seu projeto e ter enviado o código ao Arduino, faça alguns testes incidindo o flash do seu telefone nos fotoresistores ou, senão, utilize uma lâmpada convencional como foi feito neste vídeo.
Além disso, seu projeto deve se parecer muito com o da imagem abaixo:
Gostou desse projeto de robótica com Arduino?
Então comente aqui abaixo para sabermos sua opinião, e participe da nossa Comunidade no Facebook.