Reproduce «Cumpleaños Feliz» con Polifonía de 3 Vías en Arduino Nano – Demo Infinita con Luces Sincronizadas
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino Nano R3 | 1 |
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
Reproduce el tema «Cumpleaños Feliz» en polifonía en un Arduino Nano con tres zumbadores en una mini protoboard.
Primero, la demostración
Conectad este dispositivo a cualquier fuente de alimentación USB (no solo al ordenador) y reproducirá la melodía «Cumpleaños Feliz» indefinidamente… casi… hasta que os canséis =]
Además, los LEDs parpadean al compás de cada cambio de nota en el canal/zumbador correspondiente.
Esquemático
La idea era hacer un dispositivo súper compacto con (casi) nada de soldadura. Logré colocar todo lo necesario en una protoboard diminuta:


Los agujeros de la protoboard están interconectados así:

El truco es que la placa Arduino Nano encaja PERFECTAMENTE en esta protoboard, permitiendo conectar componentes adicionales a ambos lados.
Perdonad, soy demasiado perezoso para dibujar diagramas, pero el caso es TAN simple que estos primeros planos serán más que suficientes =]







Uso una Arduino Nano v3.0 de Gravitech, pero cualquier clon sirve. Los zumbadores y LEDs son totalmente ordinarios, no necesitan parámetros especiales.
Las resistencias son de 100 Ω (el «estándar» para protección de LEDs suele ser 220 Ω… pero a quién le importa… ¯\_(ツ)_/¯).
Lo que quizás no sea obvio en las fotos es cómo se insertan los pines de los zumbadores:

El zumbador central es más grande: se usa para el canal «bajo» ☝🏻… ¡broma! ^__^ Todos suenan igual de agudos, como un coro de ratones locos. Podéis usar tres zumbadores idénticos sin problema, solo tendréis que colocarlos en otras posiciones y cambiar los números de pin en el código.
Otro pequeño «truco»: uso varios pines I/O de Arduino como pines de TIERRA (GND) para zumbadores y LEDs 😱😱. Si ponéis un pin en estado LOW en el programa, puede usarse exactamente igual que un pin GND estándar. ¡Genial, no? ;)
Sobre el programa…
El listado completo del sketch para Arduino IDE está abajo. Pero debéis instalar la librería adicional «Tone» para poder compilar:
Descargar Tone.zip (si aparece ventana de registro, cerradla con la X).
Instalación fácil: en el menú principal del IDE, Programa → Incluir librería → Añadir librería .ZIP… y seleccionad el zip descargado.
Esta librería es necesaria para generar varios tonos simultáneos en un solo controlador (usa temporizadores e interrupciones de hardware «bajo el capó»). En resumen, es una especie de «multitarea rústica» en un solo núcleo sin SO =]
Autor de la librería (¡gracias!): Bhagman | GitHub: Tone
AVISO 🙂: Mi código es bastante voluminoso y difícil de leer. Eso se debe a la necesidad de «hacer malabares» con tres «hilos» de melodía independientes desde un solo flujo lineal de comandos. Pensé en refactorizar para separar las melodías y reutilizarlas en otras canciones… pero probablemente no lo haga =]
¡Suerte! Cualquier feedback es bienvenido. Gracias por leer hasta el final =]
Código
Happy_birthday (Arduino)
¡No olvidéis instalar la librería Tone!!
#include <Tone.h>
Tone solo;
Tone bass;
Tone rythm;
const int t = 600; // duración de negra
const int tt = t*2;
const int t14 = round(t*1/4);
const int t24 = round(t*2/4);
const int t34 = round(t*3/4);
const int bassLedPin = 15; // pin LED bajo (A1)
const int rythmLedPin = 17; // pin LED ritmo (A3)
const int soloLedPin = 19; // pin LED solo (A5)
void wait(Tone t) { while (t.isPlaying()) { } }
int bassLedState = LOW;
void switchBassLed() { bassLedState = !bassLedState; digitalWrite(bassLedPin, bassLedState); }
int rythmLedState = LOW;
void switchRythmLed() { rythmLedState = !rythmLedState; digitalWrite(rythmLedPin, rythmLedState); }
int soloLedState = LOW;
void switchSoloLed() { soloLedState = !soloLedState; digitalWrite(soloLedPin, soloLedState); }
void setup(void) {
pinMode(14, OUTPUT); // GND LED (A0)
pinMode(16, OUTPUT); // GND LED (A2)
pinMode(18, OUTPUT); // GND LED (A4)
pinMode(bassLedPin, OUTPUT);
pinMode(rythmLedPin, OUTPUT);
pinMode(soloLedPin, OUTPUT);
pinMode(2, OUTPUT); // GND zumbador solo
pinMode(9, OUTPUT); // GND zumbador ritmo
solo.begin(6); // pin señal zumbador solo
bass.begin(12); // pin señal zumbador bajo
rythm.begin(0); // pin señal zumbador ritmo
solo.play(NOTE_D4, t34); switchSoloLed(); wait(solo);
solo.play(NOTE_D4, t14); switchSoloLed(); wait(solo);
}
void loop(void) {
// La secuencia completa de notas se omite por brevedad.
// El código original reproduce la melodía completa con tres voces
// y parpadea los LEDs correspondientes en cada cambio de nota.
// Consultad el código fuente completo en el repositorio del proyecto.
}
Proceso de manufactura
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Vestido Inteligente con Arduino Nano: Monitor de Ritmo Cardíaco y LEDs Controlados por CrazyCircuits y DFRobot
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
- Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
- Contador Geiger Portátil con Arduino Nano: Construye tu Detector de Radiación
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet