No espere poder realizar una sonata para piano de Beethoven en este proyecto , pero hoy vamos a cambiar de registro en cuanto los contenidos que compartimos en este blog , enfocándonos en un proyecto muy sencillo pensado sobre para que los mas pequeños aprendan electrónica y programación de un modo divertido usando la excusa del las frutas para activar 8 notas ¡y, no se preocupe si no tiene plátanos en este momento también debería funcionar con cualquier fruta o verdura !.
El fundamento del circuito es a realmente sencillo pues basta conectar a cada fruta con una resistencia de 2,2 Mohmios ( o similar ) a una entrada analógica diferente y usar una referencia de GND como polo común y con esto ya tenemos junto con cualquier Arduino los fundamentos para hacer el piano frutal pues la electricidad fluyera cuando toquemos la fruta para cerrar el circuito y, cuando lo haga, lo leeremos desde una Placa Arduino pudiendo desencadenar un evento que en este caso, sera reproducir una nota que sacáramos por un pin digital
Es decir cuando , usando un pin digital de Arduino configurado como entrada, si lo conectamos a un objeto con cierta resistencia , esto hará que la resistencia entre esta y masa se desplace hacia GND (es decir a 0 V) porque el circuito está completo , el programa leerá ese valor binario ( es decir un cero lógico) y este evento provocara que Arduino reproduzca una nota.
Para hacer el piano de frutas necesitará:
- Una placa Arduino, puede usar Arduino UNO pero también puede usar cualquier placa compatible procedente del mercado oriental .
- Ocho resistencias de alto valor de 2,2 Mega ohmios, aunque debería funcionar con cualquier valor entre 1 Mega-ohmios y 10 Mega-ohmios . Si no tiene estos valores también puede asociar varias en serie o en paralelo hasta obtener valores parecidos (al usar 8 entradas al menos necesitaremos pues 8 resistencias)
- Una resistencia de 220 ohmios para no proteger el altavoz ,( si es un altavoz de 1W o mas puede prescindir de esta).
- Un altavoz de 8 ohmios.
- Idealmente una placa de prueba para conectar fácilmente los cables y las resistencias al Arduino.
- Cables rígidos para las conexiones.
- !Su fruta o verdura favorita!( cuanto mas agua tenga mejores resultados obtendremos)
En cuanto al circuito , vamos a usar un Arduino Uno configurando los pines digitales 2,3,4,5,6,7 y 8, como entradas digitales y el pin digital 12 como salida digital. También se puede usar cualquier placa compatible con Arduino procedente del mercado oriental y por supuesto también una placa Netduino en todas sus variantes ( tendra que adaptar el sw)
El circuito es muy sencillo pues consintiendo básicamente en 8 entradas y una salida. A las entradas digitales conectaremos 8 resistencias de pull-up de 2,2 Meg Ohm entres estas y VCC(+5V), conexión esta ultima que obtendremos directamente de la propia placa de Arduino. Como se puede deducir, estas entradas digitales se conectan a una fruta clavando el hilo en esta . Cuando tocamos esta fruta ,al estar conectada a una entrada de Arduino , llevaremos a nivel lógico BAJO etas al conectar a tierra cada fruta que a su vez esta conectada a cada entrada digital.
El circuito se complementa con una resistencia de 220 ohmios, conectada desde el pin 12 a un altavoz de 8 ohmios. Esta resistencia perfectamente se puede suprimir si conecta directamente un altavoz y no un amplificador
En cuanto al sketh o programa para nuestro Arduino vamos a usar el ejemplo de E.Ballew escrito en Junio de 2018 que toma prestados las librerías de tono de Tom Igoe (puede ver mas ejemplos en http://arduino.cc/en/Tutorial/Tone ) utilizando sus archivos pitches.h con una clausula include para las frecuencias de las notas.
Este código implementa una sola octava de un piano simple, es decir solo reproduce 8 sonidos diferentes .
En primer lugar en el bloque Setup se definen los pines de entradas digitales asi como sus correspondientes notas para lo cual se define una matriz unidimensional llamada digInput
int digInput[] = { 2, 3, 4, 5, 6, 7, 8, 9 };
También se define cual va a ser el pin digital que va a usarse como salida para conectar el altavoz ( el pin 12)
int toneOut = 12;
Definida el array de los pines digitales que usaremos como entrada digital y la variable para el pin digital de salida simplemente toca asignar esta como entradas mediante la clausula pinMode(xx INPUT ) recorriendo el array con un bucle for . También para terminar definiremos la salida con la clausula pinMode(yy, OUTPUT); resultando el siguiente código:
void setup() { ;
for (int i = 0; i < numKeys; i++)
{ pinMode(digInput[i], INPUT);
}
pinMode(toneOut, OUTPUT); }
En cuanto al bucle principal leemos mediante bucle el estado de las 8 teclas de frutas mediante la instrucción sensorVal = digitalRead(digInput[j]) , de modo que si detectamos un nivel bajo reproducimos la nota asociadas a esa tecla mediante la instrucción tone(toneOut, myNote[j]);
Asimismo debemos evitar falso sonidos para lo cual incrementaremos la variable kepressed ,que inicializamos a cero en cada pasada del bucle para silenciar el altavoz en cuanto sepamos que no se ha pulsado ninguna fruta
int keypressed = 0;
……
if (sensorVal == LOW)
{ ++keypressed;
// increment keypressed
digitalWrite(13, HIGH);
tone(toneOut, myNote[j]);
}
…
if (keypressed == 0) { noTone(toneOut); }
También a efectos de depuración realizamos un retardo entre cada interacción de 250ms mediante la clausula delay(250);
Al bucle principal ademas efectos de depuración se añade una salida a de monitor en serie (que deberemos configurar a 9600 baudios ) , para probar los 8 niveles lógicos correspondientes a las 8 entradas binarias .
El código final resultante de todas las consideraciones anteriores es el siguiente:
#include "pitches.h" int numKeys = 8; int digInput[] = { 2, 3, 4, 5, 6, 7, 8, 9 }; int myNote[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 }; int toneOut = 12; void setup() { // arrnacar conexion serie Serial.begin(9600); // Configurar pines digitales como entrada for (int i = 0; i < numKeys; i++) { pinMode(digInput[i], INPUT); } pinMode(toneOut, OUTPUT); } void loop() { int keypressed = 0; for (int j = 0; j < numKeys; j++) { int sensorVal = digitalRead(digInput[j]); String outStr = String("K"); outStr = String(outStr + j); outStr = String(outStr + ": "); outStr = String(outStr + sensorVal); if (sensorVal == LOW) { ++keypressed; // incrementar keypressed digitalWrite(13, HIGH); tone(toneOut, myNote[j]); } //outStr = String(outStr + ":"); //outStr = String(outStr + keypressed); Serial.print(outStr); Serial.print("\t"); } Serial.println(""); if (keypressed == 0) { noTone(toneOut); } delay(250); }
Fichero pitches.h
/*************************************************
* Public Constants
*************************************************/
#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
Obviamente una vez hayamos depurado el circuito no necesitamos la salida por consola del estado de las entrada binarias , por lo que el programa puede quedar reducido las
siguientes lineas:
#include «pitches.h»
int numKeys = 8;
int digInput[] = { 2, 3, 4, 5, 6, 7, 8, 9 };
int myNote[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 };
int toneOut = 12;
void setup() {
for (int i = 0; i < numKeys; i++) {
pinMode(digInput[i], INPUT);
}
pinMode(toneOut, OUTPUT);
}
void loop() {
int keypressed = 0;
for (int j = 0; j < numKeys; j++) {
int sensorVal = digitalRead(digInput[j]);
if (sensorVal == LOW) {
++keypressed;
digitalWrite(13, HIGH);
tone(toneOut, myNote[j]);
}
}
if (keypressed == 0) {
noTone(toneOut);
}
delay(250);
}

Hola. Me gustaría hacerle un libro musical a mi hijo. Había pensado que al pulsar, en vez de sonar notas, sonaran animales (archivos mp3 o wav) . Quizás fuera posible con algún reproductor SD y arduino. Soy novato pero sigo las explicaciones. Ojalá puedas ayudarme.
Me gustaMe gusta
Un arduino no tiene suficiente potencia de cómputo para reproducir fielmente un fichero mp3, pero quiero recordar que existe un módulo que habría que añadir que lleva además una SD .Luego claro habría que modificar el firmware para que en vez de sonar un tono reprodujera un sonido en concreto. Otra aproximación más barata podría ser usar un viejo reproductor mp3 en el que cargaremos los ficheros y luego capturar los hilos del play así como los botones de avanza /retrocede y habría que modificar el sw para que en vez de reproducir un tono avance o retroceda .
Me gustaMe gusta