Afinador Universal de instrumentos
Arduino UNO R3
Conector Jack base Hembra 0.85€
Condensador cerámico multicapa 100nF 0.13€
Condensador electrolítico radial 10uF 0.05€
Circuito integrado TL082 0.83€
Resistencia carbón 1/4W 150 OHMIOS 0.21€
Resistencia carbón 1/4W 100K OHMIO 0.21€
Resistencia carbón 1/4W 22K OHMIO 0.21€
Conector adaptador Jack 6.3 Macho 0.87€
Teclado matricial 4X4 4.95€
Pantalla LCD 15€
Conecto Jack, Stereo -> Mono 2€
LEDs 0’15€
Total 24.42€
Tras
haber analizado detenidamente la lógica de nuestro afinador universal,
comenzamos a probar la pantalla LCD para poder así empezar a implementar
la interfaz gráfica. Aquí surge nuestro primer problema, que tuvo fácil
solución: por más que nuestro programa de Arduino se compilase y
subiese correctamente, nuestra pantalla no se iluminaba. Nos dimos
cuenta de que el contraste de la pantalla estaba al mínimo y que por
eso, por mucho que cambiásemos el código, seguía haciendo lo mismo.
Una
vez resuelto esto, ya pudimos probar la implementación de la interfaz.
Esto nos trajo varios problemas. Primero habíamos implementado en el
loop lo siguiente: Al principio, el booleano que nos indicaba si hay
algún instrumento seleccionado estaba a false, y hasta que un usuario no
pulsase la tecla de “OK” para confirmarlo, no se almacenaba el valor
del instrumento a afinar. Teníamos una llamada que mostraba los todos
los instrumentos que se pueden afinar y éste era el que detectaba las
pulsaciones y en función de ello actúa de una forma u otra (por ejemplo,
si un usuario pulsa la flecha hacia abajo, éste método avanza en la
lista de instrumentos para así mostrar el siguiente). Como teníamos una
única llamada en el loop a un método que controlaba todo esto, el
resultado no fue el esperado: cuando un usuario pulsaba el “OK”, y
siguiendo la lógica de nuestro afinador, se debe seleccionar el tipo de
afinación deseado: de oído o automático. Llegados a éste punto, cuando
el usuario utilizaba las flechas para moverse entre los dos tipos de
afinación, se detectaban las pulsaciones bien pero las relacionaba con
las explicadas anteriormente para recorrer los distintos instrumentos.
Para solucionarlo hemos añadido distintas condiciones que nos permiten
localizar si un instrumento ha sido seleccionado, al igual con la
afinación, y en función de que tecla ha sido pulsada con qué instrumento
y tipo de afinación seleccionados hará una cosa u otra.
ésta imagen podemos apreciar las distintas condiciones y acciones de
las cuales hablamos. En este caso se mostraran los instrumentos
siguiendo el orden deseado, es decir si la pulsación es ‘2’, nos
referimos a la flecha arriba y si es ‘8’ recorremos los instrumentos
hacia abajo. Cuando el usuario pulse tecla ‘5’, que se corresponde con
el OK, actualizamos las correspondientes variables, como por ejemplo el
tipo de instrumento seleccionado, y mostramos la afinación.
otro lado, primero pongamos en situación: afinar por oído tanto la
flauta como el saxofón utilizamos las notas “Mi-bemol” y “Si-bemol”. Por
lo tanto se puede utilizar el mismo array para ambos instrumentos.
Teníamos implementado lo siguiente:
cuando lo subíamos, no salía el resultado esperado puesto que cuando
recorríamos el array correspondiente a éstos: String flauta [] =
{«Mi-b», «Si-b»}; nos aparecían ambos valores pero cuando pulsábamos las
flechas de arriba o abajo para seguir recorriendo mostraba Si-b y en
vez de volver a Mi-b, que es lo que hace con el resto de instrumentos,
en este caso mostraba todas las posibles cuerdas a afinar. Nos dimos
cuenta de que era porque teníamos dos condiciones parecidas, pero
distintas, que llaman al mismo método “mostrar (flauta, pulsación);”. La
solución fue reducir estas dos condiciones en una única que se cumple
en el caso de que el tipo de instrumento seleccionado es el saxofón o la
flauta:
otro lado, si estamos en el caso en el que hemos seleccionado tanto el
tipo de instrumento como el de afinación, decidimos que por tema de
reutilización de código lo mejor era crear un único método, mostrar
(string v[], pulsación) que recibía como parámetro en v el string
asociado al instrumento, por ejemplo si hemos seleccionado la guitarra,
la correspondiente llamada seria: mostrar(guitarra, pulsación); Otra vez
no se produjo el resultado esperado puesto que probando los distintos
instrumentos, primero era la guitarra, mostraba bien sus respectivas
cuerdas pero al probar con el siguiente instrumento, si nos mostraba
bien sus componentes a afinar, pero al terminar de recorrer el array,
tanto por arriba (pulsando la flecha arriba) que por abajo (pulsando la
flecha abajo) no sabemos porque empezaba a mostrar las cuerdas de la
guitarra, luego los dos tipos de afinación y luego empezaban a aparecer
símbolos raros en la pantalla hasta que petaba. Decidimos probar a
solucionar esto implementando métodos independientes para cada tipo de
instrumento y realizar una llamada al respectivo método según
instrumento en vez de distintas llamadas al mismo método. Con esto
conseguimos resolver nuestro problema.
Por
otro lado, a la hora de realizar la afinación de manera automática,
hemos tenido problemas al captar las frecuencias emitidas por los
instrumentos. Inicialmente habíamos pensado implementarlo de la
siguiente manera. El principal problema es que el zumbador emite los
distintos sonidos que se corresponden con los componentes del
instrumento seleccionado en función de las frecuencias establecidas pero
el micrófono no las detecta bien y por lo tanto no se ajustan con los
valores de afinación de cada instrumento, que son los que permiten
diferenciar si un instrumento está bien afinado o no. En el caso de no
estarlo, detectar también sí el sonido emitido es demasiado grave o
agudo… Lo primero que pensamos fue en comprar un amplificador para la
entrada de audio pero finalmente optamos por que la mejor solución era
un conector Jack. De hecho esta es la que hemos utilizado.
Una
vez puesta en marcha la fabricación de nuestro afinador universal,
formado por una caja de cartón, hemos decidido fijar el teclado
matricial a la parte superior de ésta. Como los usuarios deben pulsar en
él para tomar decisiones, debe de estar bien fijado para no hundirse.
Para ello, fijamos el teclado a la caja con cinta adhesiva, y, entre
otros, pegamos, apretando bien, tres barras de madera. Resaltamos el
“apretando bien”, ya que debido a esto, algunas se han quedado pulsadas y
fijadas. Esto es un problema nuevo ya que las teclas pulsadas
posteriormente no se detectan bien siempre a la primera, insistiendo si,
puesto que no es un problema de código.
último, para el instrumento Batería, no hemos logrado implementar la
acción que permitiese grabar los sonidos reproducidos por ésta para
poderla afinar posteriormente.
La realización de éste proyecto ha sido de manera conjunta.
a la gran cantidad de código que hay en este proyecto preferimos
mostrar un link de descargar de mega, en el cual descargar el archivo
.ino.