Piano con Arduino

Introducción

¿Quieres convertir tu Arduino en un instrumento musical? En este proyecto te enseñamos a construir un Piano Electrónico Interactivo usando pulsadores y un zumbador (buzzer). Pero no nos quedamos solo en el sonido: vamos a añadir 5 LEDs que se iluminarán sincronizados perfectamente con cada tecla que toques.

Es el proyecto perfecto para entender cómo controlar entradas y salidas, aprendiendo a crear una interfaz física que responde a tus dedos en tiempo real.

Materiales Necesarios

  • Placa Arduino UNO (o Nano/Mega).

  • 5 LEDs (Mezcla colores: Rojo, Amarillo, Verde, Azul).

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

  • 5 Pulsadores (Push buttons).

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

  • Protoboard y cables Jumper.

Esquema de Montaje

A diferencia del proyecto automático, aquí necesitamos conectar tanto los «dedos» (botones) como las «voces» (LEDs y Buzzer).

Conexiones:

  • LEDs (x5): Conecta los pines positivos (patas largas) a los pines digitales 9, 10, 11, 12 y 13 del Arduino. Los pines negativos (patas cortas) van con su resistencia de 220Ω a GND.

  • Pulsadores (x5): Conecta una pata de cada botón a los pines digitales 3, 4, 5, 6 y 7. La otra pata del botón va directa a GND (Usaremos la resistencia interna del Arduino para ahorrar cables).

    • Nota: Dejamos libre el Pin 2 (por si necesitas conectar tu servomotor habitual) y los pines 0 y 1 (comunicación serie).

  • Zumbador (Buzzer):

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

    • Pin Negativo (-) → GND.

Código arduinio


const int buttonPins[] = {3, 4, 5, 6, 7};
const int ledPins[]    = {9, 10, 11, 12, 13};
const int buzzerPin = 8;

const int numKeys = 5;

#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392

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

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

void loop() {
  bool keyActive = false;

  for (int i = 0; i < numKeys; i++) {

    if (digitalRead(buttonPins[i]) == LOW) {
      tone(buzzerPin, keyNotes[i]);
      digitalWrite(ledPins[i], HIGH);
      keyActive = true;
    } 
    else {
      digitalWrite(ledPins[i], LOW);
    }
  }

  if (!keyActive) {
    noTone(buzzerPin);
  }
}

Cómo Funciona

Este programa combina la lectura digital con la generación de audio para crear una respuesta inmediata. Aquí te explicamos los tres conceptos clave que hacen que funcione:

1. Mapeo de Hardware (Arrays)

En lugar de escribir un bloque de código diferente para cada tecla («Si toco botón 1 haz esto, si toco botón 2…»), usamos Arrays (listas) paralelas:

  • buttonPins[]: Lista de dónde están conectados los botones.

  • ledPins[]: Lista de dónde están los LEDs.

  • keyNotes[]: Lista de qué nota corresponde a esa posición. El código recorre estas listas constantemente, vinculando automáticamente el botón 1 con el LED 1 y la Nota 1.

2. La Voz del Arduino

Al igual que en el villancico, usamos la función tone(). Esta instrucción envía la frecuencia exacta al pin 8.

  • La diferencia: Aquí no hay tiempos predefinidos (delay). El sonido se mantiene activo (tone) mientras tu dedo mantenga el circuito cerrado (digitalRead == LOW), y se corta (noTone) en el instante exacto en que levantas el dedo.

3. Lógica de «Pull-Up» Interna

Esta es la parte inteligente del montaje. En el código usamos INPUT_PULLUP.

  • Esto activa una resistencia interna dentro del chip del Arduino.

  • Nos permite conectar los botones directamente a Tierra (GND) sin poner resistencias externas en la protoboard.

  • Ojo: La lógica se invierte. Cuando NO tocas el botón, el Arduino lee HIGH (1). Cuando lo tocas, lee LOW (0). Por eso el if busca un LOW.

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!