▷ Piano con Arduino v2.0 - Cambio de Escalas Musicales

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

Diagrama de conexiones para piano Arduino v2.0 con 10 pulsadores

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 control
boolean 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 0
  NOTE_D2,  // RE - Posición 1
  NOTE_E2,  // MI - Posición 2
  NOTE_F2,  // FA - Posición 3
  NOTE_G2,  // SOL - Posición 4
  NOTE_A2,  // LA - Posición 5
  NOTE_B2,  // SI - Posición 6
  NOTE_C3,  // DO - Posición 7
  NOTE_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 entradas
  pinMode(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 escala
  pinMode(pSubir, INPUT);
  pinMode(pBajar, INPUT);
 
  // Configurar pin del altavoz como salida
  pinMode(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 SUBIR
  if (subir != estadoAnteriorSubir) {
    if (subir == 1) {
      escala++;  // Subir a escala superior
    }
    delay(50);  // Anti-rebote
  }
  estadoAnteriorSubir = subir;

  // Detectar pulsación en botón BAJAR
  if (bajar != estadoAnteriorbajar) {
    if (bajar == 1) {
      escala--;  // Bajar a escala inferior
    }
    delay(50);  // Anti-rebote
  }
  estadoAnteriorbajar = bajar;

  // Limitar el rango entre 1 y 6 escalas
  if (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 escalas
  if (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 12

boolean estadoAnteriorSubir = 0;
boolean estadoAnteriorbajar = 0;

short tiempo = 100;
byte escala = 1;

// Array completo de notas musicales
int nota[] = {
  NOTE_C2, NOTE_D2, NOTE_E2, NOTE_F2, NOTE_G2, NOTE_A2, NOTE_B2,  // Escala 1
  NOTE_C3, NOTE_D3, NOTE_E3, NOTE_F3, NOTE_G3, NOTE_A3, NOTE_B3,  // Escala 2
  NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4,  // Escala 3
  NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5,  // Escala 4
  NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6,  // Escala 5
  NOTE_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 correspondiente
  if (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...
}

0/Deja un comentario/Comentarios

¡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.