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?
Se você tiver dúvidas, sugestões ou experiências para compartilhar, fique a vontade para deixar um comentário abaixo. E para não perder nenhum conteúdo como este, não deixe de nos seguir no Instagram.
Para que esse projeto pode ser utilizado?
Olá Vitoria.
Esse robô tem um propósito de aprendizado (eletrônica, mecânica e programação). Porém, ele pode servir como base, por exemplo, para alguma aplicação de painel solar na qual os painéis ficam com a sua face apontada para o sol. Ou seja, painéis solares que “seguem” o sol.
Att.
Vitor Mattos.
Suporte Técnico MakerHero.