Robô seguidor de luz DIY Deixe um comentário

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.

Robô seguidor de luz DIY

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:

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:

Robô seguidor de luz DIY
Ilustração da 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:

Robô seguidor de luz DIY
Ilustração da montagem do esquema elétrico do projeto

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.

Robô seguidor de luz DIY

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:

Robô seguidor de luz DIY
Una os 2x palitos da base com um outro palito menor como na imagem acima

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:

Robô seguidor de luz DIY
2x palitos colados na base para dar suporte as 2x hastes do servo motor

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:

Robô seguidor de luz DIY
Indicação da posição do servo motor e de seus parafusos

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:

Robô seguidor de luz DIY
Indicação da fixação do atuador do servo motor com uso de 2x alfinetes

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:

Robô seguidor de luz DIY

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.

Faça seu comentário

Acesse sua conta e participe