Proyectos de programación Arduino: semáforo, pulsador, LDR, servo y seguidor de luz

Informática y TelecomunicacionesActualizado el 9,5 KB

Resumen

Recopilación de ejemplos de código para Arduino que van desde el control básico de LEDs y semáforos hasta proyectos con sensores y actuadores, como juegos de reflejos, alarmas con fotorresistencia, generadores de tono y seguidores de luz con servomotor. Cada ejemplo incluye código fuente con comentarios explicativos para entender su lógica e implementarlo.

Puntos clave

  • Un semáforo se simula encendiendo tres LEDs (verde, ámbar y rojo) en secuencia con retardos de tiempo mediante delay().
  • Con INPUT_PULLUP el pulsador lee HIGH cuando no está pulsado y LOW cuando se presiona.
  • El LDR es una fotorresistencia cuyo valor leído con analogRead() va de 0 a 1023, y el voltaje se calcula como luz * (5.0 / 1023.0) en un Arduino de 5V.
  • El juego de reflejos usa un tiempo aleatorio entre 1 y 10 segundos y una variable game_over para que solo gane el primer jugador que pulsa.
  • La función map() convierte el rango de lectura analógica 0-1023 en un rango de frecuencia de 50 a 5000 Hz para generar tonos con tone().
  • El seguidor de luz gira el servo hacia el LDR que recibe más luz, usando una zona muerta (ZONA_ZERO) para evitar movimientos constantes.
  • El limpiaparabrisas simulado mueve el servo de 0 a 180 grados y de vuelta con bucles for y pausas de 20 ms.

Ponte a prueba

Este documento presenta una colección de ejemplos de código para Arduino, cubriendo desde el control básico de LEDs y semáforos hasta proyectos más complejos como juegos de reflejos, seguidores de luz y simulaciones de limpiaparabrisas. Cada sección incluye el código fuente y comentarios explicativos para facilitar su comprensión e implementación.

Control de Semáforo con Arduino

Este código simula el funcionamiento de un semáforo utilizando tres LEDs (verde, ámbar y rojo) conectados a pines digitales de Arduino. La secuencia de luces se controla mediante retardos de tiempo.

// Código para semáforo
#define PIN_VERDE  3
#define PIN_AMBAR  7
#define PIN_ROJO  10

void setup() {
  pinMode(PIN_VERDE, OUTPUT);
  pinMode(PIN_AMBAR, OUTPUT);
  pinMode(PIN_ROJO, OUTPUT);
}

void loop() {
  digitalWrite(PIN_VERDE, HIGH);
  delay(7000); // Verde encendido por 7 segundos
  digitalWrite(PIN_VERDE, LOW);
  digitalWrite(PIN_AMBAR, HIGH);
  delay(2000); // Ámbar encendido por 2 segundos
  digitalWrite(PIN_AMBAR, LOW);
  digitalWrite(PIN_ROJO, HIGH);
  delay(8000); // Rojo encendido por 8 segundos
  digitalWrite(PIN_ROJO, LOW);
}

Control de LED con Pulsador

Este ejemplo muestra cómo encender y apagar un LED utilizando un pulsador. Se configura el pin del pulsador con INPUT_PULLUP para simplificar el circuito, lo que significa que el botón estará en estado HIGH cuando no esté presionado y LOW cuando se presione.

// LED con pulsador
int pinLed = 3;
int pinPulsador = 4;

void setup() {
  // Configuramos el pin del botón como entrada con pull-up interno
  pinMode(pinPulsador, INPUT_PULLUP);
  // Configuramos el pin del LED como salida
  pinMode(pinLed, OUTPUT);
}

void loop() {
  // Leemos el estado del pulsador
  // En configuración pull-up, guardará LOW si está pulsado, HIGH si no
  int estadoPulsador = digitalRead(pinPulsador);

  // Utilizamos un condicional para controlar el LED
  if (estadoPulsador == LOW) {
    // Encendemos el LED si el botón está pulsado
    digitalWrite(pinLed, HIGH);
  } else {
    // Apagamos el LED cuando se suelte el botón
    digitalWrite(pinLed, LOW);
  }
}

Juego de Reflejos con Arduino

Este proyecto implementa un sencillo juego de reflejos para dos jugadores. Un LED central (salida) se enciende aleatoriamente, y el primer jugador en presionar su botón correspondiente enciende su propio LED, indicando que ha ganado la ronda.

// Juego de reflejos
#define PIN_LED_1   11  // Pin LED del jugador 1
#define PIN_BOTON_1 12  // Pin botón del jugador 1
#define PIN_LED_2   2   // Pin LED del jugador 2
#define PIN_BOTON_2 3   // Pin botón del jugador 2
#define PIN_SALIDA  7   // Pin LED verde de salida

byte game_over; // Variable que indica si el juego ha terminado

void setup() {
  pinMode(PIN_LED_1, OUTPUT);
  pinMode(PIN_BOTON_1, INPUT);
  pinMode(PIN_LED_2, OUTPUT);
  pinMode(PIN_BOTON_2, INPUT);
  pinMode(PIN_SALIDA, OUTPUT);

  game_over = 0; // Al comienzo del juego, no ha terminado

  digitalWrite(PIN_LED_1, LOW); // Apagamos LEDs de jugadores
  digitalWrite(PIN_LED_2, LOW);

  digitalWrite(PIN_SALIDA, HIGH); // Encendemos el LED de salida (preparación)

  // Tiempo aleatorio entre 1 y 10 segundos antes del "pistoletazo"
  delay(random(1000, 10001)); 
  digitalWrite(PIN_SALIDA, LOW); // Pistoletazo de salida: apaga el LED central
}

void loop() {
  byte boton_1 = digitalRead(PIN_BOTON_1);
  byte boton_2 = digitalRead(PIN_BOTON_2);

  if ((boton_1 == HIGH) && (game_over == 0)) { // Jugador 1 gana
    digitalWrite(PIN_LED_1, HIGH);
    game_over = 1;
  }

  if ((boton_2 == HIGH) && (game_over == 0)) { // Jugador 2 gana
    digitalWrite(PIN_LED_2, HIGH);
    game_over = 1;
  }

  delay(10); // Pequeña pausa para evitar lecturas erráticas
}

Lectura de Sensor LDR (Fotorresistencia)

Este código demuestra cómo leer valores de un sensor LDR (Light Dependent Resistor o fotorresistencia) y mostrarlos en el monitor serie de Arduino. También calcula y muestra el voltaje correspondiente a la lectura.

// LDR
void setup() {
  // Configuramos la conexión serie: definimos la velocidad de transferencia de datos
  Serial.begin(9600);

  // Configuramos el pin analógico A0 como entrada (opcional para analogRead)
  pinMode(A0, INPUT);
}

void loop() {
  // Leemos la entrada analógica del LDR
  int luz = analogRead(A0);

  // Mostramos la lectura del LDR en el monitor serie
  Serial.print("Lectura: ");
  Serial.print(luz);

  // Mostramos los voltios que le llegan (para un Arduino de 5V)
  Serial.print(" Voltios: ");
  Serial.println(luz * (5.0 / 1023.0));

  delay(500); // Esperamos 0.5 segundos antes de la siguiente lectura
}

Alarma de Luz con LDR y Zumbador

Este proyecto utiliza un LDR para detectar cambios en la intensidad de la luz y activar un zumbador (buzzer) cuando la luz detectada cae por debajo de un umbral específico, funcionando como una alarma de oscuridad.

// LDR BUFFER (Alarma de luz)
#define PIN_LDR A0
#define PIN_BUZZER 2

void setup() {
  pinMode(PIN_LDR, INPUT); // Configura el pin del LDR como entrada
  pinMode(PIN_BUZZER, OUTPUT); // Configura el pin del zumbador como salida

  delay(5000); // Retardo inicial (opcional, para estabilización)
}

void loop() {
  // Leemos el valor del LDR
  int ldr = analogRead(PIN_LDR);

  // Si el valor de luz es bajo (oscuro), activa el zumbador
  if (ldr < 500) {
    digitalWrite(PIN_BUZZER, HIGH);
  } else {
    // Si hay suficiente luz, apaga el zumbador
    digitalWrite(PIN_BUZZER, LOW);
  }
}

Generador de Tono Variable con LDR

Este código transforma la lectura de un LDR (o un potenciómetro conectado a un pin analógico) en una frecuencia de tono variable, que se reproduce a través de un zumbador. La frecuencia del tono cambia en función de la cantidad de luz detectada.

// Generador de tono con LDR
#define PIN_TONO A0
#define PIN_BUZZER 2

void setup() {
  pinMode(PIN_TONO, INPUT); // Pin para la lectura analógica (LDR/potenciómetro)
  pinMode(PIN_BUZZER, OUTPUT); // Pin para el zumbador
}

void loop() {
  // Leemos el valor del sensor (LDR o potenciómetro)
  int ldr = analogRead(PIN_TONO);

  // Mapeamos el rango de lectura (0-1023) a un rango de frecuencia (50-5000 Hz)
  int frecuencia = map(ldr, 0, 1023, 50, 5000);

  // Reproducimos la nota en el zumbador con la frecuencia calculada
  tone(PIN_BUZZER, frecuencia);

  // Opcional: añadir un pequeño delay o noTone() si se desea un control más preciso
  // delay(10); // Pequeña pausa
}

Simulación de Limpiaparabrisas con Servo Motor

Este ejemplo utiliza un servomotor para simular el movimiento de un limpiaparabrisas. El servo se mueve repetidamente de 0 a 180 grados y viceversa, creando un movimiento oscilante.

// Limpiaparabrisas
#include <Servo.h> // Librería para servos

#define PIN_SERVO 9 // Pin al que conectamos la señal del servo

Servo myServo; // Instancia para el servo
int pos = 0;   // Variable para guardar la posición del servo

void setup() {
  myServo.attach(PIN_SERVO); // Declaramos la salida del servo
}

void loop() {
  // Movimiento del servo en un sentido (de 0 a 180 grados)
  for (pos = 0; pos <= 180; pos += 1) {
    myServo.write(pos);
    delay(20);
  }

  // Movimiento del servo en el otro sentido (de 180 a 0 grados)
  for (pos = 180; pos >= 0; pos -= 1) {
    myServo.write(pos);
    delay(20);
  }
}

Seguidor de Luz (Girasol Robótico) con Servomotor y LDRs

Este proyecto crea un seguidor de luz, similar a un girasol robótico, utilizando un servomotor y dos sensores LDR. El servomotor ajusta su posición para orientarse hacia la fuente de luz más intensa, comparando las lecturas de los dos LDRs.

// Girasol (Seguidor de luz)
#include <Servo.h> // Librería para servos

Servo myServo; // Creamos una instancia del objeto Servo

#define PIN_LDR_DCHA A4 // Pin analógico para el LDR derecho
#define PIN_LDR_IZDA A5 // Pin analógico para el LDR izquierdo
#define PIN_SERVO 3     // Pin para el servomotor

#define ZONA_ZERO 20    // Margen de "zona muerta" para evitar movimientos constantes

int pos = 90; // Ángulo de posición inicial del servo (centro)

// Declaración de funciones (prototipos)
void girar_dcha();
void girar_izda();

void setup() {
  // Los pines analógicos no necesitan pinMode explícito para analogRead, pero se puede incluir
  pinMode(PIN_LDR_DCHA, INPUT);
  pinMode(PIN_LDR_IZDA, INPUT);
  myServo.attach(PIN_SERVO);

  // Inicialmente en posición central (90°)
  myServo.write(pos);
}

void loop() {
  // Lectura de las LDRs
  int luz_dcha = analogRead(PIN_LDR_DCHA);
  int luz_izda = analogRead(PIN_LDR_IZDA);

  // Gira hacia el lado que ve más luz, considerando la zona cero
  if (luz_dcha > luz_izda + ZONA_ZERO) {
    girar_dcha();
  }
  if (luz_izda > luz_dcha + ZONA_ZERO) {
    girar_izda();
  }
  // Pequeña pausa para estabilización y evitar movimientos bruscos
  delay(50);
}

void girar_dcha() { // Función para girar a la derecha
  if (pos < 180) {
    pos++;
    myServo.write(pos);
    delay(20);
  }
}

void girar_izda() { // Función para girar a la izquierda
  if (pos > 0) {
    pos--;
    myServo.write(pos);
    delay(20);
  }
}

Descargar

PDF Word HTML

Preguntas frecuentes

¿Para qué sirve INPUT_PULLUP en un pulsador de Arduino?

Activa una resistencia interna de pull-up, de modo que el pin lee HIGH cuando el botón no está pulsado y LOW cuando se presiona. Así se simplifica el circuito porque no hace falta una resistencia externa.

¿Cómo se calcula el voltaje de un sensor LDR en Arduino?

Se multiplica la lectura analógica por 5.0/1023.0, lo que da el voltaje para un Arduino de 5V. El código del ejemplo lo muestra en el monitor serie junto con la lectura.

¿Cómo funciona el seguidor de luz con dos LDRs?

El programa compara la lectura de ambos LDRs y gira el servo hacia el lado con más luz. Si la diferencia no supera el margen ZONA_ZERO, el servo no se mueve, lo que evita oscilaciones constantes.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué secuencia sigue el semáforo del ejemplo?
2. ¿Qué valor lee el pin con INPUT_PULLUP cuando el pulsador está presionado?
3. ¿Entre qué valores de frecuencia se mapea la lectura del LDR en el generador de tono?
4. ¿Qué hace la variable game_over en el juego de reflejos?
5. ¿Qué rango de ángulos recorre el servo en la simulación del limpiaparabrisas?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.