Robô movido a energia solar controlado por lanterna usando Arduino

Robot con energía solar controlado por una linterna mediante Arduino

Este proyecto es un robot sensible al gradiente de luz con capacidad de carga solar, es decir, busca la luz para cargarse. Este comportamiento lo logra con un conjunto de cuatro fotorresistores sensibles a la luz en circuitos divisores de voltaje, la unidad Arduino lee los cuatro valores que corresponden a la intensidad de la luz recibida por los sensores a través de sus pines de lectura analógica. Luego aplica un alto voltaje a través de un interruptor de láminas que completa un circuito entre una batería de 9 V y dos motores de juguete, lo que resulta en un giro o movimiento hacia la luz.

Protótipo de tanque robótico controlado por luz movido a energia solar baseado em Arduino

Figura 1: Prototipo de tanque robótico controlado por luz y alimentado por energía solar basado en Arduino

Estos motores no se pueden activar directamente con Arduino; si puede conseguir motores lo suficientemente pequeños, la parte de conmutación de este proyecto se puede omitir sin pérdida de funcionalidad. Si alguno de los cuatro fotodiodos registra mucho más alto que los demás, detecta qué fotodiodo está recibiendo la señal amplificada y gira o se mueve en esa dirección mientras se recibe la señal amplificada. Este algoritmo de seguimiento de la luz se puede utilizar para programar paneles solares para que sigan el sol o para controlar el robot mediante una linterna, como se demuestra aquí. Para este proyecto, el lector necesita conocimientos básicos sobre Arduino .

Las imágenes y diagramas del circuito completo serían un poco confusos en este caso, así que puse en la caja los componentes principales que se repiten 4 y 2 veces respectivamente en el proyecto real. El primer subsistema del circuito es el divisor de voltaje basado en un fotorresistor que se repite cuatro veces, con cada fotorresistor colocado en un lado diferente de su robot. El fotorresistor varía la resistencia según la señal de luz recibida a través de la fotoconductividad del material semiconductor receptor. La resistencia variable produce una corriente variable en el circuito según la ley de Ohm, V=iR donde el voltaje V es constante (5V). Tenga cuidado de no alargar demasiado los cables que conducen a los fotodiodos, ya que puede perder la señal debido a la resistencia interna del cable y las conexiones de soldadura. El voltaje se suministra a esta parte del circuito directamente desde los pines 5V/Gnd del Arduino UNO. La línea de 5V pasa por una resistencia de 10k Ohm, pasa por el fotodiodo y regresa a tierra. Se lee una señal analógica entre la resistencia y el fotodiodo a través de los pines analógicos del Arduino. Una adición opcional es el indicador LED que se muestra yendo desde el otro lado de la resistencia (positivo) a tierra (negativo), este LED cambiará de intensidad según la señal recibida por el fotodiodo. Si estos LED están demasiado cerca de uno de los fotodiodos, su máquina puede entrar en una especie de circuito de retroalimentación analógica en esa dirección, donde gira en la dirección de sus propios LED. Creo que codifiqué contra esta posibilidad, pero si ve este comportamiento, intente quitar los LED, ya que solo son útiles al depurar esta parte del circuito. Se deben conectar cuatro pines analógicos a cuatro iteraciones de este bloque de circuito. En principio, puede aumentar el número de iteraciones para aumentar la sensibilidad direccional, pero esto no es necesario para esta aplicación. El boceto que acompaña este proyecto es sensible a una diferencia en la intensidad de la luz recibida; Si todas las señales entrantes son muy similares, el robot continuará tomando muestras de su entorno pero permanecerá estacionario. Tan pronto como cualquiera de las señales sea mayor que las demás en un valor umbral, el programa ingresa a su ciclo de movimiento. Determina qué fotorresistor está recibiendo la señal máxima y luego aplica corriente al motor que mueve el robot en la dirección correcta correspondiente. Esta acción continúa mientras el fotorresistor esté recibiendo la máxima intensidad y exista una diferencia suficientemente grande entre los valores leídos.

Imagem mostrando as conexões do circuito do resistor fotográfico no tanque robótico para detecção de lanterna

Figura 2: Imagen que muestra las conexiones del circuito de fotorresistencia en el tanque robótico para la detección de linterna

La segunda parte bloqueada del circuito sólo es necesaria si necesitas más potencia para los motores de la que Arduino puede suministrar directamente desde sus pines de salida PWM. Mi chasis/orugas/motor es de un juguete chino, el Arduino tenía problemas para manejar los motores con las orugas encendidas, así que construí un bloque de conmutación en el circuito que permite que la salida PWM encienda un relé de lengüeta que completa un circuito para una batería de 9V. El relé de láminas funciona mediante un electroimán que, cuando se activa con la corriente más baja (Arduino), hace que los puntos de contacto dentro del interruptor se magneticen y cierren el circuito. En principio, con este concepto se pueden accionar motores eléctricos muy grandes seleccionando el relé de láminas adecuado. No necesitaba mucha más energía así que una batería de 9V fue suficiente, la clave que usé está en la sección de repuestos para el no. Como este componente funciona a través de un campo electromagnético, es necesario un diodo de protección transitorio, ya que el colapso del campo magnético (cuando se apaga el interruptor) puede causar un pico de corriente que regresará al Arduino, como lo predicen las ecuaciones de Maxwell. . Aquí puede encontrar una buena discusión sobre cómo implementar este interruptor de relé de láminas específico sin causar daños a su placa.

Imagem mostrando as conexões do circuito dos fios da bateria no tanque robótico

Figura 3: Imagen que muestra las conexiones del circuito de cables de la batería en el tanque robótico

Esta parte del circuito se repite dos veces correspondientes a dos motores y, como se indicó, si puedes alimentar tus motores directamente con el Arduino, puedes omitir esta parte del proyecto sin pérdida de funcionalidad.

Diagramas de circuitos y componentes utilizados.

Diagrama de circuito

Divisor de voltaje

Diagrama de circuito da rede divisora ​​de tensão usada para detecção de lanterna

Figura 4: Diagrama de circuito de la red divisora ​​de voltaje utilizada para la detección de linternas

circuito de conmutación

Diagrama de circuito do controlador de motor DC usado para navegação guiada por luz de carro robótico

Figura 5: Diagrama de circuito del controlador de motor de CC utilizado para la navegación guiada por luz de un automóvil robótico

Consulte la guía del diagrama de circuito para conocer el circuito completo utilizado en el proyecto.

Componentes utilizados

Arduino UNO

Resistencia 4x, 10 K ohmios

4x fotorresistor sensible a la luz fotoresistencia, resistencia óptica 5mm GL5516 5516

4xLED

Panel Solar RadioShack® 1.5W 9V

Pistas/plataformas/motores de juguete (2)

2 interruptores de láminas (OMR-C-105H)

Código fuente del proyecto

###

 constintfrontPin = A0;
 constintleftPin = A1;
 constrightPin = A2;
 pinbackconstante = A3;
 motorconstintleft = 9;
 motorconsintright = 10;
 intthreshHold = 170;
 dirección interna;
 int dirección1;
 int dirección2;
 int Retraso = 25;
 int Retraso2 = 25;

 configuración vacía
 {

 pinMode (pin frontal, ENTRADA);
 pinMode (pin izquierdo, ENTRADA);
 pinMode(pinderecho, ENTRADA);
 pinMode(backPin, ENTRADA);
 pinMode(motor izquierdo, SALIDA);
 pinMode(motor derecho, SALIDA);
 escritura digital (motor izquierdo, ALTO);
 escritura digital (motor derecho, ALTO);
 retraso(100);
 escritura digital (motor izquierdo, BAJO);
 escritura digital (motor derecho, BAJO);
 retraso(100);
 escritura digital (motor izquierdo, ALTO);
 escritura digital (motor derecho, ALTO);
 retraso(100);
 escritura digital (motor izquierdo, BAJO);
 escritura digital (motor derecho, BAJO);
 retraso(1500);
 Serie.begin(9600);
 }

 bucle vacío
 {

 dirección interna;
 int dirección1;
 int dirección2;
 intfrontSignal = 1023 - analogRead(frontPin);
 intleftSignal = 1023 - analogRead(leftPin); 
intrightSignal = 1023 - analogRead(rightPin);
 intbackSignal = 1023 - analogRead(backPin);
 Serial.println(señal frontal);
 Serial.println(señal izquierda);
 Serial.println(señal derecha);
 Serial.println(backSignal);
 // señal frontal + señal izquierda + señal derecha + señal trasera<= umbralHold
 if (abs(señalfrontal-señalizquierda)+abs(señalfrontal-señalderecha)+abs(señalfrontal-señalposterior) >= threshHold)
 {
 Serial.println("bucle de movimiento");
 dirección1 = max(señal frontal, señal izquierda);
 dirección2 = max(señal derecha, señal trasera);
 Dirección = max(dirección1, dirección2);
 //Aquí se ingresa al bucle solo si la luz recibida no está distribuida uniformemente.
 if (señal frontal == dirección)
 {
 del
 {
 escritura digital (motor izquierdo, ALTO);
 escritura digital (motor derecho, ALTO); 
retraso(Retraso2);
 escritura digital (motor izquierdo, BAJO);
 escritura digital (motor derecho, BAJO);
 retraso(Retraso);
 frontSignal = 1023 - analogRead(frontPin);
 leftSignal = 1023 - analogRead(leftPin);
 señalderecha = 1023 - lectura analógica(pinderecha);
 backSignal = 1023 - analogRead(backPin);
 dirección1 = max(señal frontal, señal izquierda);
 dirección2 = max(señal derecha, señal trasera);
 Dirección = max(dirección1, dirección2);
 Serial.println("Adelante");
 
} while(frontSignal == Dirección && abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) >= threshHold);
 escritura digital (motor izquierdo, BAJO);
 escritura digital (motor derecho, BAJO);
 }
 else if (leftSignal == Direction) //La señal es mayor a la izquierda
 {
 del
 {
 Serial.println("Izquierda");
 escritura digital (motor derecho, ALTO);
 retraso(Retraso2);
 escritura digital (motor derecho, BAJO);
 retraso(Retraso);
 frontSignal = 1023 - analogRead(frontPin);
 leftSignal = 1023 - analogRead(leftPin); 
señalderecha = 1023 - lectura analógica(pinderecha);
 backSignal = 1023 - analogRead(backPin);
 dirección1 = max(señal frontal, señal izquierda);
 dirección2 = max(señal derecha, señal trasera);
 Dirección = max(dirección1, dirección2);
 } while(leftSignal == Dirección && abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) >= threshHold);
 escritura digital (motor derecho, BAJO);
 }
 else if (rightSignal == Direction) //La señal es mayor a la derecha.
 {
 del
 {
 Serial.println("Derecha");
 escritura digital (motor izquierdo, ALTO);
 retraso(Retraso2); 
escritura digital (motor izquierdo, BAJO);
 retraso(Retraso);
 frontSignal = 1023 - analogRead(frontPin);
 leftSignal = 1023 - analogRead(leftPin);
 señalderecha = 1023 - lectura analógica(pinderecha);
 backSignal = 1023 - analogRead(backPin);
 dirección1 = max(señal frontal, señal izquierda);
 dirección2 = max(señal derecha, señal trasera);
 Dirección = max(dirección1, dirección2);

 } while(rightSignal == Dirección && abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) >= threshHold);
 escritura digital (motor izquierdo, BAJO);
 } 
else if (backSignal == Direction) //La señal es mayor detrás.
 {
 del
 {
 Serial.println("Volver");
 escritura digital (motor izquierdo, ALTO);
 retraso(Retraso2);
 escritura digital (motor izquierdo, BAJO);
 retraso(Retraso);
 frontSignal = 1023 - analogRead(frontPin);
 leftSignal = 1023 - analogRead(leftPin);
 señalderecha = 1023 - lectura analógica(pinderecha);
 backSignal = 1023 - analogRead(backPin);
 dirección1 = max(señal frontal, señal izquierda);
 dirección2 = max(señal derecha, señal trasera); 
Dirección = max(dirección1, dirección2);
 } while(backSignal == Dirección && abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) >= threshHold);
 escritura digital (motor izquierdo, BAJO);
 }
 }
 else if(abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) <= umbralHold)
 {
 int diferencia = abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal);
 Serial.println("El diferencial de señal es igual a ");
 Serial.println(diferencia);
 escritura digital (motor izquierdo, BAJO);
 escritura digital (motor derecho, BAJO);
 retraso(1000); // De lo contrario, muestra el entorno a una velocidad de 10 hz.
 }
 demás
 {
 escritura digital (motor izquierdo, BAJO);
 escritura digital (motor derecho, BAJO);
 }

 }

###

Diagramas de circuito

Tanque robótico controlado por luz flash con energía solar Arduino basado en diagrama de circuito

Vídeo del proyecto

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.