Proyectos Esenciales de Programación Arduino: Sensores, Actuadores y Lógica
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 9,5 KB
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);
}
}