Canción navideña con Arduino

Introducción

¿Quieres que tu Arduino cante villancicos? En este proyecto te enseñamos a programar la famosa canción de navidad «Jingle Bells» usando un zumbador (buzzer). Pero no nos quedamos solo en el sonido: vamos a añadir 8 LEDs que bailarán y se iluminarán siguiendo el ritmo exacto de la melodía.

Es el proyecto perfecto para sorprender estas fiestas, aprendiendo a sincronizar música y electrónica mediante código.

Materiales Necesarios

  • Placa Arduino UNO (o Nano/Mega).

  • 8 LEDs (Mezcla colores navideños: Rojo, Verde, Amarillo).

  • 8 Resistencias de 220Ω (para proteger los LEDs).

  • 1 Zumbador (Buzzer) Pasivo. (⚠️ Importante: Debe ser pasivo para poder hacer las notas musicales).

  • Protoboard y cables Jumper.

Esquema de Montaje

El módulo de sonido tiene 4 pines, pero solo usaremos 3: VCC, GND y D0 (Salida Digital). La salida D0 se pone en estado BAJO cuando el sonido supera el umbral fijado con el potenciómetro del módulo.

Conexiones:

  • LEDs (x8): Conecta los pines positivos (patas largas) a los pines digitales del 2 al 9 del Arduino.

    • Nota: Dejamos libres los pines 0 y 1 para evitar errores al subir el código.

    • Los pines negativos (patas cortas) van con su resistencia de 220Ω a GND.

  • Zumbador (Buzzer):

    • Pin Positivo (+) → Pin digital 10 del Arduino.

    • Pin Negativo (-) → GND.

Código Arduino


const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int numLeds = 8;
const int buzzerPin = 10;

#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_REST 0

int melody[] = {
  NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_E4, NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4,
  NOTE_F4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4,
  NOTE_E4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_D4,
  NOTE_G4,
  NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_E4, NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4,
  NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_F4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_D4, NOTE_D4, NOTE_E4, NOTE_D4, NOTE_G4
};

int noteDurations[] = {
  4, 4, 2,
  4, 4, 2,
  4, 4, 4, 4, 1,
  4, 4, 4, 8, 8,
  8, 8, 4, 4, 4,
  1,
  4, 4, 2,
  4, 4, 2,
  4, 4, 4, 4, 1,
  4, 4, 4, 4,
  4, 4, 4, 8, 8,
  4, 4, 4, 4, 1
};

void setup() {
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  int size = sizeof(melody) / sizeof(melody[0]);

  for (int thisNote = 0; thisNote < size; thisNote++) {

    int noteDuration = 1000 / noteDurations[thisNote];

    if (melody[thisNote] != NOTE_REST) {
        tone(buzzerPin, melody[thisNote], noteDuration * 0.9);
    }

    int currentLedIndex = thisNote % numLeds;
    digitalWrite(ledPins[currentLedIndex], HIGH);

    delay(noteDuration);

    digitalWrite(ledPins[currentLedIndex], LOW);
    noTone(buzzerPin);
  }

  delay(3000);
}

Cómo Funciona

Este programa combina programación musical con lógica matemática para sincronizar luz y sonido. Aquí te explicamos los tres conceptos clave que hacen que funcione:

La Partitura Digital

En lugar de escribir cientos de líneas de código para cada pitido, guardamos toda la canción en dos listas ordenadas llamadas Arrays:

  • melody[]: Contiene las frecuencias de las notas (qué tan agudo o grave suena).

  • noteDurations[]: Contiene el tiempo que dura cada nota (el ritmo). El bucle for recorre estas dos listas simultáneamente, leyendo la nota y su duración paso a paso, exactamente igual que un músico leyendo una partitura.

La Voz del Arduino

Para generar el sonido, usamos la función nativa tone(). Esta instrucción envía pulsos eléctricos al pin 10 a una velocidad exacta (frecuencia), haciendo vibrar la membrana del zumbador para producir notas musicales reales (Do, Re, Mi…).

  • El truco del «Staccato»: En el código verás que multiplicamos la duración por 0.9. Esto recorta un poquito cada nota para dejar un micro-silencio antes de la siguiente, haciendo que la melodía suene más alegre y definida («picadita») en lugar de un sonido continuo y borroso.

El Truco Matemático de las Luces

Esta es la parte más inteligente del código. Tenemos una canción con muchas notas, pero solo 8 LEDs. ¿Cómo asignamos un LED a cada nota sin volvernos locos? Usamos el operador Módulo (%).

La línea currentLedIndex = thisNote % numLeds; calcula el «resto» de la división entre el número de nota actual y el total de LEDs (8).

  • Esto garantiza que el resultado siempre sea un número entre 0 y 7.

  • Gracias a esto, las luces se encienden en ciclo (1, 2, 3… 8, 1, 2…) persiguiendo la música infinitamente, sin importar lo larga que sea la canción.

Material

Aquí os dejamos los materiales que nosotros compramos cuando empezamos. Si quieres darnos una pequeña ayuda puedes comprar desde este link. Gracias por leernos!