Nivel 2 - Inputs + Outputs

P4: GIRASOL

Una flor robotica que sigue la luz, como un girasol de verdad. Dos sensores de luz compiten para decidir hacia donde girar el servo.

60
Minutos
6
Componentes
83
Lineas de codigo
01

Que vamos a conseguir?

Un girasol que gira su cabeza hacia donde hay mas luz. Si mueves una linterna, la flor la sigue.

512
512

Mueve el sol con el slider:

Servo: 90 grados

Lo que aprenderas:

  • 1 Como funciona una fotorresistencia (LDR)
  • 2 Comparar dos sensores para tomar decisiones
  • 3 Usar la libreria Servo.h
  • 4 Crear un divisor de voltaje
02

Hardware necesario

Los LDRs son sensores de luz baratos. El servo convierte senales electricas en movimiento angular.

Arduino UNO
El cerebro
2x LDR
Fotorresistencias
Servo SG90
Motor de posicion
2x Resistencia 10k
Para divisor de voltaje

El divisor de voltaje

Por que necesitamos la resistencia de 10k? 5V LDR Luz = baja R Oscuro = alta R A0 10k GND Como funciona: Mucha luz: LDR baja, A0 cerca de 5V Poca luz: LDR alta, A0 cerca de 0V

Diagrama de conexion

ARDUINO UNO 5V A0 A1 ~9 GND LDR Izquierda LDR Derecha 10k 10k SERVO SG90 SIG 5V GND A0: LDR Izquierda A1: LDR Derecha Pin 9: Servo 10k: Divisor voltaje

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:

Girasol

Petalos amarillos, tallo verde

Buho

Cabeza que gira buscando luz

Radar

Antena de seguimiento

Panel Solar

Que sigue el sol

03

El codigo explicado

Este programa compara dos sensores y mueve el servo hacia donde hay mas luz.

p4_girasol.ino
// 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:

1

#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.

2

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.

3

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.

4

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.

5

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).

6

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.

7

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 /=.

04

Simulador interactivo

En Wokwi puedes simular LDRs y servos. Cambia la luz haciendo clic en los sensores.

Wokwi Simulator

Abrir en Wokwi

Configurar 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".

05

Paso a paso

Monta tu girasol robot en 9 pasos.

1

Monta el primer divisor de voltaje (LDR izquierda)

5V - LDR - punto medio - resistencia 10k - GND. El punto medio se conecta a A0.

2

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.

Tip: Coloca los LDRs en los "ojos" de tu construccion LEGO, mirando ligeramente hacia afuera para detectar mejor la direccion de la luz.
3

Identifica los cables del servo

Naranja/Amarillo = Senal (pin 9). Rojo = 5V. Marron/Negro = GND.

4

Conecta el servo

Cable de senal al pin 9. Rojo a 5V. Marron a GND.

Cuidado: Si conectas varios servos, pueden necesitar alimentacion externa. Un servo SG90 solo consume ~200mA, Arduino lo aguanta.
5

Sube el codigo

Conecta Arduino, abre Arduino IDE, pega el codigo y subelo. El servo deberia moverse al centro (90 grados).

6

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).

7

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.

8

Ajusta el umbral

Si el girasol es muy nervioso, sube UMBRAL a 80-100. Si no reacciona, bajalo a 20-30.

9

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.

06

Experimentos

Mejora tu girasol con estas modificaciones.

Facil

Ajusta sensibilidad

Cambia UMBRAL a 20 (muy sensible) o 100 (menos reactivo). Encuentra el valor ideal para tu entorno.

Facil

Cambia velocidad

VELOCIDAD = 5 hace movimientos rapidos. VELOCIDAD = 1 es suave y natural.

Medio

Modo vampiro

Invierte la logica: que EVITE la luz en lugar de seguirla. Cambia -= por += y viceversa.

Medio

LED indicador

Anade un LED que brille segun la luz total recibida: analogWrite(LED, (luzIzq + luzDer) / 8)

Desafio

Dos ejes

Anade un segundo servo y 2 LDRs mas para movimiento arriba/abajo. Panel solar 2D!

Desafio

Modo busqueda

Si no detecta luz suficiente, que "busque" girando lentamente de lado a lado.