Que vamos a conseguir?
Un girasol que gira su cabeza hacia donde hay mas luz. Si mueves una linterna, la flor la sigue.
Mueve el sol con el slider:
Lo que aprenderas:
- Como funciona una fotorresistencia (LDR)
- Comparar dos sensores para tomar decisiones
-
Usar la libreria
Servo.h - Crear un divisor de voltaje
Hardware necesario
Los LDRs son sensores de luz baratos. El servo convierte senales electricas en movimiento angular.
El divisor de voltaje
Diagrama de conexion
LDR - Light Dependent Resistor
La fotorresistencia cambia su resistencia segun la luz que recibe. Mas luz = menos resistencia (puede bajar a ~1kohm). Menos luz = mas resistencia (puede subir a ~10Mohm). Con el divisor de voltaje, convertimos ese cambio de resistencia en un voltaje que Arduino puede leer.
Servo SG90 - Los 3 cables
Naranja (Signal): Recibe la senal PWM que indica el angulo (0-180 grados).
Rojo (VCC): Alimentacion 5V.
Marron (GND): Tierra.
El servo SG90 puede girar de 0 a 180 grados. La posicion 90 es el centro.
Ideas para construir con LEGO
El nino construye la flor mientras tu preparas la electronica:
Petalos amarillos, tallo verde
Cabeza que gira buscando luz
Antena de seguimiento
Que sigue el sol
El codigo explicado
Este programa compara dos sensores y mueve el servo hacia donde hay mas luz.
// P4: Girasol Robot - EigenRobotics
#include <Servo.h>
const int LDR_IZQ = A0;
const int LDR_DER = A1;
const int SERVO_PIN = 9;
const int UMBRAL = 50; // Diferencia minima para moverse
const int VELOCIDAD = 1; // Grados por paso
Servo servo;
int posicion = 90; // Empezar en el centro
void setup() {
servo.attach(SERVO_PIN);
servo.write(posicion);
Serial.begin(9600);
Serial.println("Girasol Robot activado!");
delay(500);
}
void loop() {
// Leer ambos sensores
int luzIzq = analogRead(LDR_IZQ);
int luzDer = analogRead(LDR_DER);
int diferencia = luzIzq - luzDer;
// Mostrar valores
Serial.print("Izq: ");
Serial.print(luzIzq);
Serial.print(" | Der: ");
Serial.print(luzDer);
Serial.print(" | Pos: ");
Serial.println(posicion);
// Decidir movimiento
if (diferencia > UMBRAL && posicion > 0) {
posicion -= VELOCIDAD; // Girar izquierda
}
else if (diferencia < -UMBRAL && posicion < 180) {
posicion += VELOCIDAD; // Girar derecha
}
servo.write(posicion);
delay(20);
}
Explicacion linea por linea:
#include <Servo.h>
Incluye la libreria Servo. Las librerias son codigo pre-escrito
que anade funcionalidades. Servo.h nos da funciones para controlar servos
facilmente sin tener que generar las senales PWM manualmente.
Servo servo;
Crea un objeto de tipo Servo llamado "servo". Es como declarar una variable, pero en lugar de guardar un numero, guarda todo lo necesario para controlar un servo.
servo.attach(SERVO_PIN);
Conecta el objeto servo al pin 9. A partir de ahora, cuando usemos
servo.write(), Arduino enviara la senal correcta por ese pin.
int diferencia = luzIzq - luzDer;
Calculamos la diferencia entre los dos sensores.
Si diferencia > 0, hay mas luz a la izquierda.
Si diferencia < 0, hay mas luz a la derecha.
Si es cercana a 0, la luz esta equilibrada.
if (diferencia > UMBRAL && posicion > 0)
Solo nos movemos si la diferencia es significativa (mayor que 50). Esto evita que el girasol tiemble por pequenas variaciones. Tambien comprobamos que no estemos ya en el limite (0 o 180 grados).
posicion -= VELOCIDAD;
-= es una forma corta de escribir posicion = posicion - 1.
Reducimos la posicion en 1 grado (girar hacia la izquierda).
El movimiento es suave porque solo cambiamos 1 grado cada 20ms.
servo.write(posicion);
Mueve el servo a la posicion indicada (0-180 grados). El servo mantiene esa posicion hasta que le digamos otra cosa. 90 grados es el centro.
Conceptos clave:
Libreria Servo.h
attach(pin): conectar servo.
write(angulo): mover a posicion (0-180).
read(): leer posicion actual.
Comparar sensores
Con dos sensores identicos, la diferencia entre ellos indica hacia donde esta la fuente (luz, sonido, calor...).
Umbral (threshold)
Un valor minimo para actuar. Evita reaccionar a ruido o pequenas variaciones. Ajustalo segun la precision que necesites.
Operadores += y -=
x += 5 es igual a x = x + 5.
x -= 3 es igual a x = x - 3.
Tambien existen *= y /=.
Simulador interactivo
En Wokwi puedes simular LDRs y servos. Cambia la luz haciendo clic en los sensores.
Wokwi Simulator
Abrir en WokwiConfigurar el simulador
1. Copia el codigo del proyecto.
2. Anade 2 Photoresistor (LDR) desde componentes.
3. Anade 2 resistencias de 10k para los divisores de voltaje.
4. Anade un Servo y conectalo al pin 9.
5. En Wokwi, haz clic en los LDR para cambiar su nivel de luz.
6. Observa como el servo sigue la "luz".
Paso a paso
Monta tu girasol robot en 9 pasos.
Monta el primer divisor de voltaje (LDR izquierda)
5V - LDR - punto medio - resistencia 10k - GND. El punto medio se conecta a A0.
Monta el segundo divisor (LDR derecha)
Igual que el anterior pero conectando el punto medio a A1. Ambos LDRs deben estar separados unos 5-10cm entre si.
Identifica los cables del servo
Naranja/Amarillo = Senal (pin 9). Rojo = 5V. Marron/Negro = GND.
Conecta el servo
Cable de senal al pin 9. Rojo a 5V. Marron a GND.
Sube el codigo
Conecta Arduino, abre Arduino IDE, pega el codigo y subelo. El servo deberia moverse al centro (90 grados).
Calibra con el Monitor Serial
Abre el Monitor Serial y observa los valores de ambos LDRs. Con luz ambiente uniforme, deberian ser similares (~400-600).
Prueba con una linterna
Apunta una linterna hacia un lado. El servo deberia girar hacia ese lado. Si va al reves, intercambia las conexiones de A0 y A1.
Ajusta el umbral
Si el girasol es muy nervioso, sube UMBRAL a 80-100.
Si no reacciona, bajalo a 20-30.
Monta la flor LEGO!
Fija el servo al tallo. Conecta la cabeza de la flor al brazo del servo. Los LDRs van en la cabeza, mirando hacia adelante.
Experimentos
Mejora tu girasol con estas modificaciones.
Ajusta sensibilidad
Cambia UMBRAL a 20 (muy sensible) o 100 (menos reactivo).
Encuentra el valor ideal para tu entorno.
Cambia velocidad
VELOCIDAD = 5 hace movimientos rapidos.
VELOCIDAD = 1 es suave y natural.
Modo vampiro
Invierte la logica: que EVITE la luz en lugar de seguirla.
Cambia -= por += y viceversa.
LED indicador
Anade un LED que brille segun la luz total recibida:
analogWrite(LED, (luzIzq + luzDer) / 8)
Dos ejes
Anade un segundo servo y 2 LDRs mas para movimiento arriba/abajo. Panel solar 2D!
Modo busqueda
Si no detecta luz suficiente, que "busque" girando lentamente de lado a lado.