Creamos un Piano cn arduino

Arduino + BUZZER = Piano 

Piano con matriz de 16 botones y buzzer

🔹 Conexión
La matriz tiene 8 pines: 4 para las filas (R1–R4) y 4 para las columnas (C1–C4).
Al presionar un botón, se conecta una fila con una columna.
Se conecta así al Arduino:
R1 → pin 2
R2 → pin 3
R3 → pin 4
R4 → pin 5
C1 → pin 6
C2 → pin 7
C3 → pin 8
C4 → pin 9
El buzzer en el pin 10.


🔹 Código ejemplo

Este código usa la librería Keypad.h (incluida en el IDE de Arduino).

#include <Keypad.h>

const byte FILAS = 4; // 4 filas
const byte COLUMNAS = 4; // 4 columnas
const int buzzer = 10;

// Definición de pines
byte pinesFilas[FILAS] = {2, 3, 4, 5};
byte pinesColumnas[COLUMNAS] = {6, 7, 8, 9};

// Mapa de teclas (puedes asignar DO-RE-MI, etc.)
char teclas[FILAS][COLUMNAS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

// Crear objeto teclado
Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS);

// Frecuencias musicales (DO a DO alto)
int notas[] = {262, 294, 330, 349, 392, 440, 494, 523,
               587, 659, 698, 784, 880, 988, 1047, 1175};

void setup() {
  pinMode(buzzer, OUTPUT);
}

void loop() {
  char tecla = teclado.getKey(); // Leer tecla
  if (tecla) {
    int index;
    // Convertir tecla a índice (ej. '1' → 0, '2' → 1, etc.)
    if (tecla >= '0' && tecla <= '9') index = tecla - '0';
    else if (tecla == 'A') index = 10;
    else if (tecla == 'B') index = 11;
    else if (tecla == 'C') index = 12;
    else if (tecla == 'D') index = 13;
    else if (tecla == '*') index = 14;
    else if (tecla == '#') index = 15;

    // Reproducir nota correspondiente
    tone(buzzer, notas[index], 200);
  }
}




🔹 Desarrollo de la clase
1. Explicación previa: Mostrar cómo funciona una matriz (filas y columnas).
2. Montaje: Conectar la matriz al Arduino y buzzer.
3. Prueba básica: Hacer que cada botón muestre su número en el monitor serial.
4. Versión musical: Asignar frecuencias musicales a cada tecla.
5. Reto creativo: Que los estudiantes toquen una melodía sencilla o inventen una propia.

Clase: Mini-Piano con Arduino (50–70 min)

1) Objetivos de aprendizaje

  • Identificar la relación frecuencia–nota musical (ciencia del sonido).

  • Construir un circuito simple con entradas (botones) y salida (buzzer).

  • Programar Arduino para generar tonos y mapearlos a notas.

  • Iterar un prototipo con pruebas y mejoras rápidas (mentalidad ingenieril).

2) Materiales (por equipo)

  • 1 Arduino UNO/Nano (o compatible)

  • 1 buzzer pasivo (no el de zumbido fijo)

  • 4 a 8 botones/pulsadores (o teclas impresas en 3D/cartón)

  • 8 resistencias 10kΩ (pull-down) + 1 resistencia 220Ω para el buzzer (si es necesario)

  • Protoboard y jumpers

  • Opcional: potenciómetro (volumen/efectos), LDR (theremín de luz), o sensor capacitivo (toque)

3) Reto de ingeniería (para motivar)

“Construye un piano de 4 notas en 20 minutos. Luego amplíalo a 8 notas y agrega un modo escala o modo efectos controlado por un botón extra.”

4) Circuito (versión con 4 notas)

  • Buzzer: positivo → D9, negativo → GND

  • Botones: un pin de cada botón → D2, D3, D4, D5; el otro pin → +5V

  • Resistencias de 10kΩ: entre D2–D5 y GND (pull-down)

  • (Alternativa: usar pinMode(x, INPUT_PULLUP) y cablear el botón a GND → lógica invertida)

5V ── botón ── D2   (con 10kΩ de D2 a GND)
5V ── botón ── D3   (con 10kΩ de D3 a GND)
5V ── botón ── D4   (con 10kΩ de D4 a GND)
5V ── botón ── D5   (con 10kΩ de D5 a GND)
D9 ──(+)Buzzer(−)── GND

5) Código base (4 notas – DO RE MI FA)

Copia/pega, compila y prueba. Está pensado para pull-down (botón a 5V). Si usas INPUT_PULLUP, invierte la lógica de lectura.

// Mini-Piano 4 notas – Arduino
const int BUZZER_PIN = 9;
const int keys[4]   = {2, 3, 4, 5};      // pines de botones
const int notes[4]  = {262, 294, 330, 349}; // C4, D4, E4, F4 (Hz)

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(keys[i], INPUT); // pull-down externo de 10k a GND
  }
  pinMode(BUZZER_PIN, OUTPUT);
}

void loop() {
  bool pressed = false;
  for (int i = 0; i < 4; i++) {
    if (digitalRead(keys[i]) == HIGH) { // botón a 5V
      tone(BUZZER_PIN, notes[i]);
      pressed = true;
      break; // prioridad: primera tecla detectada
    }
  }
  if (!pressed) noTone(BUZZER_PIN);
}

Ampliación a 8 notas (escala C mayor: C4–C5)

  • Añade botones en D6, D7, D8, D10 (o los pines libres que prefieras).

  • Reemplaza arrays:

const int keys[8]  = {2,3,4,5,6,7,8,10};
const int notes[8] = {262,294,330,349,392,440,494,523}; // C D E F G A B C

6) Actividades guiadas (paso a paso)

  1. Explora: ¿Qué es frecuencia (Hz)? Relación con el tono. Escucha ejemplos (440 Hz = La4).

  2. Prototipa: Cablea buzzer y un botón → prueba una nota.

  3. Escala: Añade 3 botones más → 4 notas.

  4. Itera: Amplía a 8 notas. Añade “modo efecto” (ver abajo).

  5. Presenta: Cada equipo interpreta una melodía corta (ej.: “Do-Re-Mi”).

7) Extensiones (visión de futuro 🚀)

  • Modo efectos: un botón extra activa vibrato/portamento controlado por millis() o un potenciómetro (profundidad/velocidad).

  • Sensor de luz (LDR): mapea la luz a la frecuencia → mini-theremín.

  • Capacitivo: usar la librería CapacitiveSensor para teclas “touch”.

  • MIDI over USB/Serial: envía notas MIDI a un DAW (Ableton, GarageBand) con un convertidor Serial-MIDI en PC.

  • Machine Learning: reconocer patrones de melodías (TinyML) y dar retroalimentación.

  • Diseño 3D: imprimir teclas/caratula del piano y documentar el proceso (STEAM completo).

  • Versión ESP32: usar 2 salidas DAC (mejor calidad de audio) o Wi-Fi para compartir partituras vía web.

8) Variantes didácticas

  • 1 sola entrada analógica (resistor ladder): 8 teclas a A0 con resistencias distintas → lees rangos y decides la nota (menos cables).

  • Entradas Pull-Up internas: elimina resistencias externas y conecta botones a GND. Cambia pinMode(keys[i], INPUT_PULLUP) y condición digitalRead(...) == LOW.

9) Evaluación rápida (rúbrica breve – 10 pts)

  • Funcionamiento básico (4 pts): suenan las notas correctas sin falsos disparos.

  • Calidad del cableado (2 pts): orden, colores, seguridad.

  • Código (2 pts): legible, comentarios, arrays correctos.

  • Mejora/creatividad (2 pts): efectos, 8 notas, carcasa, melodía.

10) Checklist de clase

  • Probé el buzzer con tone(9, 440, 300)

  • Cada botón activa una nota única

  • Sin zumbidos cuando no hay botón presionado

  • Documenté conexión y código con 2 fotos

  • Toqué una melodía simple

11) Solución de problemas (rápido)

  • Suena siempre: invierte la lógica (¿usaste INPUT_PULLUP?), revisa noTone().

  • No suena: ¿buzzer pasivo? ¿pin correcto? Prueba tone(9, 440, 500) en setup().

  • Notas incorrectas: revisa el orden de keys[] vs notes[].

  • Botón rebota: agrega un retardo suave (delay(20)) o un filtro por tiempo con millis().



Comments

Popular posts from this blog

Python con Arduino + Interfaz

Te cuento mi aventura como mestra IB de Design y STEM

¡ParkingBot 3000! – Tu cochera con cerebro electrónico