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.
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.
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.
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
Figura 4: Diagrama de circuito de la red divisora de voltaje utilizada para la detección de linternas
circuito de conmutación
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 | ![]() |