Objetivo: Construir un piano con las siete notas y con la posibilidad de cambiar de octava.
Comentarios:
Hemos querido profundizar en el séptimo proyecto del libro, con la construcción de un piano con siete botones rojos, uno por cada nota; y tres botones azules, uno para cada octava. No hemos puesto más octavas porque no nos cabían más botones :)
Para llevar acabo el proyeto nos han sido útiles las siguientes páginas web:
Es importante comentar que los valores que puede tomar la variable ValorTeclaPulsada depende del valor de las resistencias y que aún así varia considerablemente dependiendo de la ocasión (lo achacamos a que los componentes no están soldados a la placa). Los intervalos los hemos obtenido a partir de los valores observados mediante Serial.println(ValorTeclaPulsada).
También hemos conectado un alzavoz en vez del zumbador. Con ello hemos mejorado mucho la calidad del sonido.
Vídeo:
Componentes: Arduino Uno 3R, 10 pulsadores, 7 LED rojos, 3 LED verde2, 3 resistencias de 220Ω , 3 de 10KΩ, 1 de 150Ω, 1 de 1KΩ, 1 de 2KΩ, 1 de 4,6KΩ, 1 de 6,8kΩ, 20kΩ y 1 de 2,2KΩ y un altavoz.
Imagen del circuito:
Código:
int escala = 2; //Información de las notas y frecuencias extraída del web: https://openwebinars.net/tutorial-de-arduino-sonidos-con-arduino/, de Antonio Guillermo Pérez Coronilla
int c[5]={131,262,523,1046,2093}; // frecuencias 4 octavas de Do int cs[5]={139,277,554,1108,2217}; // Do# int d[5]={147,294,587,1175,2349}; // Re int ds[5]={156,311,622,1244,2489}; // Re# int e[5]={165,330,659,1319,2637}; // Mi int f[5]={175,349,698,1397,2794}; // Fa int fs[5]={185,370,740,1480,2960}; // Fa# int g[5]={196,392,784,1568,3136}; // Sol int gs[5]={208,415,831,1661,3322}; // Sol# int a[5]={220,440,880,1760,3520}; // La int as[5]={233,466,932,1866,3729}; // La# int b[5]={247,494,988,1976,3951}; // Si void setup() { for ( int i = 2; i< 5; i ++){ pinMode(i, OUTPUT); //para los LEDs pinMode(i+6, INPUT); //para los botones } pinMode(7, OUTPUT); digitalWrite(6-escala, HIGH); Serial.begin(9600); } void loop() { if (digitalRead(10) == HIGH){ cambiarEscala(2); //Octava 3 } else if (digitalRead(9) == HIGH){ cambiarEscala(3); //Octava 4 } else if (digitalRead(8) == HIGH){ cambiarEscala(4); //Octava 5 } int ValorTeclaPulsada = analogRead(A0); Serial.println(ValorTeclaPulsada); if(ValorTeclaPulsada >980 && ValorTeclaPulsada<1035){ tone(7, c[escala]); //Do } else if(ValorTeclaPulsada >920 && ValorTeclaPulsada<960){ tone(7, d[escala]); //Re } else if(ValorTeclaPulsada >665 && ValorTeclaPulsada<725){ tone(7, e[escala]); //Mi } else if(ValorTeclaPulsada >500 && ValorTeclaPulsada<565){ tone(7, f[escala]); //Fa } else if(ValorTeclaPulsada >300 && ValorTeclaPulsada<350){ tone(7, g[escala]); //Sol } else if(ValorTeclaPulsada >220 && ValorTeclaPulsada<280){ tone(7, a[escala]); //La } else if(ValorTeclaPulsada >75 && ValorTeclaPulsada<125){ tone(7, b[escala]); //Si } else{ noTone(7); } } void cambiarEscala (int e) { escala = e; for (int i = 2; i<5;i++){ digitalWrite(i, LOW); } digitalWrite(6-escala, HIGH); }