En esta versión mejorada del piano con Arduino, mantenemos los 8 pulsadores para reproducir tonos pero añadimos 2 pulsadores adicionales que permiten cambiar entre 6 escalas musicales diferentes, expandiendo significativamente las posibilidades musicales del proyecto.
Novedad en v2.0: Dos pulsadores adicionales (pSubir y pBajar) permiten navegar entre 6 escalas musicales diferentes, desde octavas bajas hasta altas.
Materiales necesarios
- 1 Arduino UNO
- 10 Pulsadores
- 10 Resistencias de 1k Ω
- 1 Piezo eléctrico (Buzzer/Altavoz)
- Cables de conexión
- Protoboard
Diagrama de conexiones
Explicación del código
Configuración de pines y variables
#include "pitches.h"#define altavoz 8// Pulsadores principales (teclas musicales)#define p1 A0#define p2 A1#define p3 A2#define p4 A3#define p5 A4#define p6 A5#define p7 11#define p8 6// Pulsadores para cambio de escala#define pSubir 2#define pBajar 12// Variables de controlboolean estadoAnteriorSubir = 0;boolean estadoAnteriorbajar = 0;short tiempo = 100;byte escala = 1;
Array completo de notas musicales
Contiene todas las notas desde C2 hasta B7 organizadas secuencialmente:
int nota[] = {NOTE_C2, // DO - Posición 0NOTE_D2, // RE - Posición 1NOTE_E2, // MI - Posición 2NOTE_F2, // FA - Posición 3NOTE_G2, // SOL - Posición 4NOTE_A2, // LA - Posición 5NOTE_B2, // SI - Posición 6NOTE_C3, // DO - Posición 7NOTE_D3, // RE - Posición 8// ... continúa hasta NOTE_B7};
Función Setup - Configuración inicial
void setup() {Serial.begin(9600);// Configurar pines de los pulsadores como entradaspinMode(p1, INPUT);pinMode(p2, INPUT);pinMode(p3, INPUT);pinMode(p4, INPUT);pinMode(p5, INPUT);pinMode(p6, INPUT);pinMode(p7, INPUT);pinMode(p8, INPUT);// Pulsadores de cambio de escalapinMode(pSubir, INPUT);pinMode(pBajar, INPUT);// Configurar pin del altavoz como salidapinMode(altavoz, OUTPUT);}
Función comprovarB - Control inteligente de escalas
Esta función maneja los pulsadores de cambio de escala con sistema anti-rebote:
void comprovarB() {bool subir = digitalRead(pSubir);bool bajar = digitalRead(pBajar);// Detectar pulsación en botón SUBIRif (subir != estadoAnteriorSubir) {if (subir == 1) {escala++; // Subir a escala superior}delay(50); // Anti-rebote}estadoAnteriorSubir = subir;// Detectar pulsación en botón BAJARif (bajar != estadoAnteriorbajar) {if (bajar == 1) {escala--; // Bajar a escala inferior}delay(50); // Anti-rebote}estadoAnteriorbajar = bajar;// Limitar el rango entre 1 y 6 escalasif (escala > 6 && escala < 8 || escala == 0) {escala = 1;}}
Bucle principal - Reproducción de notas
Cada pulsador reproduce una nota diferente según la escala seleccionada:
void loop() {comprovarB(); // Verificar cambios de escala// Pulsador 1 - Nota DO en diferentes escalasif (digitalRead(p1)) {int x;switch (escala) {case 1: x = 0; break; // DO en escala 1 (C2)case 2: x = 7; break; // DO en escala 2 (C3)case 3: x = 14; break; // DO en escala 3 (C4)case 4: x = 21; break; // DO en escala 4 (C5)case 5: x = 28; break; // DO en escala 5 (C6)case 6: x = 35; break; // DO en escala 6 (C7)}tone(altavoz, nota[x], tiempo);}// Estructura similar para los otros 7 pulsadores...}
Mapa de notas y escalas (hasta la escala #3 )
| Escala | Nota Inicial | Rango | Pulsador 1 | Pulsador 2 | Pulsador 3 | Pulsador 4 | Pulsador 5 | Pulsador 6 | Pulsador 7 | Pulsador 8 |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | C2 | C2 - C3 | C2 | D2 | E2 | F2 | G2 | A2 | B2 | C3 |
| 2 | C3 | C3 - C4 | C3 | D3 | E3 | F3 | G3 | A3 | B3 | C4 |
| 3 | C4 | C4 - C5 | C4 | D4 | E4 | F4 | G4 | A4 | B4 | C5 |
💡 Consejo importante: Necesitarás el archivo "pitches.h" que contiene las definiciones de las frecuencias de las notas. Este archivo viene incluido en los ejemplos de Arduino o puedes descargarlo de la documentación oficial.
Código completo
Repositorio de github aquí
#include "pitches.h"#define altavoz 8// Pulsadores para las notas#define p1 A0#define p2 A1#define p3 A2#define p4 A3#define p5 A4#define p6 A5#define p7 11#define p8 6// Pulsadores para cambiar escalas#define pSubir 2#define pBajar 12boolean estadoAnteriorSubir = 0;boolean estadoAnteriorbajar = 0;short tiempo = 100;byte escala = 1;// Array completo de notas musicalesint nota[] = {NOTE_C2, NOTE_D2, NOTE_E2, NOTE_F2, NOTE_G2, NOTE_A2, NOTE_B2, // Escala 1NOTE_C3, NOTE_D3, NOTE_E3, NOTE_F3, NOTE_G3, NOTE_A3, NOTE_B3, // Escala 2NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, // Escala 3NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, // Escala 4NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6, // Escala 5NOTE_C7, NOTE_D7, NOTE_E7, NOTE_F7, NOTE_G7, NOTE_A7, NOTE_B7 // Escala 6};void setup() {Serial.begin(9600);// Configurar todos los pines...pinMode(p1, INPUT); pinMode(p2, INPUT); pinMode(p3, INPUT);pinMode(p4, INPUT); pinMode(p5, INPUT); pinMode(p6, INPUT);pinMode(p7, INPUT); pinMode(p8, INPUT); pinMode(pSubir, INPUT);pinMode(pBajar, INPUT); pinMode(altavoz, OUTPUT);}void comprovarB() {bool subir = digitalRead(pSubir);bool bajar = digitalRead(pBajar);if (subir != estadoAnteriorSubir) {if (subir == 1) {escala++;}delay(50);}estadoAnteriorSubir = subir;if (bajar != estadoAnteriorbajar) {if (bajar == 1) {escala--;}delay(50);}estadoAnteriorbajar = bajar;if (escala > 6 && escala < 8 || escala == 0) {escala = 1;}}void loop() {comprovarB();// Verificar cada pulsador y reproducir la nota correspondienteif (digitalRead(p1)) {int x;switch (escala) {case 1: x = 0; break;case 2: x = 7; break;case 3: x = 14; break;case 4: x = 21; break;case 5: x = 28; break;case 6: x = 35; break;}tone(altavoz, nota[x], tiempo);}// Repetir estructura similar para p2 hasta p8...}
Publicar un comentario
¡Hola! Nos alegra mucho que hayas llegado hasta aquí y que estés leyendo este artículo en Edeptec.
Este formulario es un espacio abierto para ti: puedes dejar un comentario con tus dudas, sugerencias, experiencias o simplemente tu opinión sobre el tema tratado.
» ¿Te resultó útil la información?
» ¿Tienes alguna experiencia personal que quieras compartir?
» ¿Se te ocurre algún tema que te gustaría ver en próximos artículos?
Recuerda que este espacio es para aprender y compartir, por eso te animamos a participar de manera respetuosa y constructiva. Tus comentarios pueden ayudar a otros lectores que están en el mismo camino, ya sea en electrónica, programación, deportes o tecnología.
¡Gracias por ser parte de esta comunidad de aprendizaje! Tu participación es lo que hace crecer este proyecto.