Gramola o Jukebox



En este proyecto vamos a ver el proceso de diseƱo y fabricaciĆ³n de una mĆ”quina Jukebox o Gramola, perfecta para escuchar mĆŗsica en casa o para utilizarla en nuestras fiestas. 

Para fabricar esta gramola tenemos que combinar algo de carpinterĆ­a, electricidad, electrĆ³nica, programaciĆ³n (Arduino), impresiĆ³n 3D, diseƱo grĆ”fico (yo propondrĆ© mis diseƱos, pero cada uno es libre...), etc...

EmpezarĆ© por el funcionamiento, que es lo que mĆ”s interesa, imagino. CircuiterĆ­a utilizada, diseƱo, implementaciĆ³n, cĆ³digos y todo lo demĆ”s. DespuĆ©s, pues el tema del bricolaje, medidas del mueble, plantillas, materiales, piezas 3D, construcciĆ³n y todos los detalles. El tutorial puede ser algo largo, pero he intentado especificar cada paso todo lo posible.

Es un proyecto para hacer poco a poco ya que son bastantes cosas. IrĆ© dejando los enlaces de algunos componentes y materiales, aunque a veces lo mejor es tener alguna tienda de componentes electrĆ³nicos y una buena ferreterĆ­a cerca. A mi me ha resultado muy entretenido hacerla y espero que el que se decida lo disfrute tambiĆ©n. 





Se trata de una gramola como las que habĆ­a en los bares, en la que puedes seleccionar 80 canciones mediante un sistema de coordenadas con nĆŗmeros y letras que introduces a travĆ©s de la botonera.


El proyecto estƔ basado en Arduino, aunque tiene unas cuantas cosas mƔs.

Las canciones estĆ”n almacenadas en una tarjeta de memoria microSD insertada en un shield MP3 para Arduino UNO, que es lo que se encarga de reproducirlas y que estĆ” controlada por un cĆ³digo del que mĆ”s adelante estĆ” el enlace para descargar. El shield que en cuestiĆ³n es el siguiente:



Se trata del VS1053B y se puede conseguir fƔcilmente en varios sitios.

Shield MP3 VS1053B en AliExpress

Shield MP3 VS1053B en Amazon

La placa Arduino UNO se encarga del control de reproducciĆ³n de los archivos MP3 con este shield, pero tambiĆ©n de la selecciĆ³n de Ć©stos, gestionando los pulsadores y encendiendo los leds indicadores, lo cual nos plantea de entrada dos problemas:

 · Hay 18 pulsadores y no tenemos tantas entradas.
 · Hay 18 leds y tampoco tenemos tantas salidas.

La soluciĆ³n a estos problemas es la siguiente:


¡¡CHACHAAAN!!

Empezamos por los pulsadores.

Se han utilizado dos entradas analĆ³gicas, una para los 10 pulsadores numĆ©ricos (1 al 0) y otra para los 8 pulsadores con las letras (A hasta H).


Las entradas analĆ³gicas en Arduino no son del todo analĆ³gicas, sino que pueden tomar 1024 valores (0 a 1023), correspondiendo el valor 0 a 0V. y el valor 1023 a 5V, que es el mĆ”ximo admisible. Siendo asĆ­, se pueden utilizar divisores de tensiĆ³n para asignar voltajes a rangos de valores de entrada, que se corresponderĆ”n con cada pulsador.

Como vamos a usar 10 pulsadores, vamos a dividir esos 5V en 10 partes, de las que tomaremos aproximadamente el valor central del voltaje de cada tramo para calcular las resistencias del divisor de tensiĆ³n. Los valores que he utilizado son: 0.25, 0.7, 1.2, 2, 2.5, 3, 3.4, 3.9, 4.3 y 4.8 V.

Con estos valores aplicamos la siguiente fĆ³rmula:


Donde R1 es la fija del divisor de tensiĆ³n, Vcc es la tensiĆ³n de referencia cogida del pin 5V del Arduino, Vout la tensiĆ³n que queremos a la salida del divisor de tensiĆ³n y R2 es el valor de la resistencia que queremos calcular para cada pulsador.


Utilizando una resistencia R1 de 3.3K, que es un valor apropiado para nuestro caso, nos salen los siguientes valores de resistencias: 62.7k, 20.27k, 10.45k, 4.95k, 3,3k, 2.2k, 1.55k, 930 ohm, 537 ohm, y 137 ohm.

Todos estos valores si los aproximamos a valores de resistencias estƔndar nos quedarƭan:

68k, 20k, 10k, 5.1k, 3.3k, 2.2k, 1,5k, 1k, 510 ohm y 150 ohm

que son los que vamos a utilizar.

Tenemos dos botoneras, una con 10 nĆŗmeros y otra con 8 letras. No vamos a hacer otro cĆ”lculo para 8 valores, utilizaremos el mismo sin las dos Ćŗltimas resistencias, asĆ­ no complicamos esto mĆ”s, y en el cĆ³digo casi podemos hacer un copia-pega en esta parte.




Eso por ahƭ, ahora vamos la parte de los leds que es mƔs divertido todavƭa.

Los leds marcan el botĆ³n pulsado y se mantienen encendidos mientras se reproduce la canciĆ³n seleccionada para indicar cual es la que se estĆ” reproduciendo. Una vez finalizada la reproducciĆ³n se apagan. Hay 18 leds, un grupo de 10 que corresponde a los nĆŗmeros y otro grupo de 8 que corresponde a las letras. Se deberĆ”n encender simultĆ”neamente uno de cada grupo, pero no es necesario que se enciendan a la vez dos del mismo grupo. Las canciones se seleccionan mediante un nĆŗmero y un letra, o sea, una matriz de 10 x 8 que hace el total de 80 canciones.

En el Arduino no tenemos 18 salidas, pero al consistir en dos grupos de leds vamos a usar en dos salidas digitales para encenderlos, aunque tendremos que usar otra salida mƔs para efectuar resets.

¿CĆ³mo encendemos cada led del grupo con una sola salida?, pues la soluciĆ³n estĆ” en los contadores decimales.

Un contador decimal es un circuito integrado que cuenta pulsos, o mƔs bien cuenta cambios de estado, por ejemplo, si en su entrada haces 0-1-0-1-0-1, contarƔ 3, y se activarƔ su salida 3.


Concretamente vamos a utilizar el CD4017BE. Necesitaremos tres.


AquĆ­ tenĆ©is de Datasheet por si alguien lo quiere consultar. Datasheet CD4017B

Al ser un contador decimal tiene 10 salidas, del '0' al '9'. El '0' se activa cuando aĆŗn no se ha contado nada, por lo que nos obliga a utilizar un contador extra para el grupo de 10, ya que uno sĆ³lo contarĆ” hasta nueva, por lo que para el Ćŗltimo botĆ³n del grupo hay que pones otro en cascada al primero. Para el grupo de 8 pulsadores nos basta con un contador.


El primer led de la izquierda de cada grupo lo he incluido en el simulador, pero no va en el circuito, ya que se enciende al iniciar los contadores al ser el '0' del contador.

Otra cosa que no estĆ” en el esquema del simulador  y que es muy importante es la resistencia que lleva en serie cada led. Yo he usado leds amarillos con una resistencia en serie de 470 ohmios.

He utilizado el simulador de circuitos electrĆ³nicos SimulIDE, que es fĆ”cil de usar y con descarga libre.


Si querĆ©is probar el circuito aquĆ­ tenĆ©is el archivo para el SimulIDE y el cĆ³digo de prueba.


Descarga cĆ³digo prueba arduino

Para ver el funcionamiento del contador de forma sencilla se puede observar el siguiente circuito, donde los pulsos a contar los proporciona un IC555.


Tanto el reset como el enable tienen que estar a nivel bajo para permitir el funcionamiento. Los pulsos para contar van al pin clock. El pin 12, que no se detalla en este esquema es el de acarreamiento, y se utiliza para conectar un segundo contador en cascada. Se activa a nivel bajo cuando se ha contado un ciclo completo. Este pin lo tendremos que usar en uno de los contadores como dije anteriormente.






La salida digital 3 del Arduino saca los pulsos de conteo para el grupo de 10 pulsadores, la salida digital 4 del Arduino el para el grupo de 8 pulsadores, y la salida digital 5 es la que resetea los contadores cuando es necesario.







Aquƭ tenƩis unas fotos del cableado de esta parte.


En las fotos hay varias placas para implementar toda la circuiterĆ­a anterior, y esto es porque lo he ido montando y probando por partes. Todo esto lo he unificado en un mismo circuito para placa universal, con lo que puede resultar menos engorroso y ahorrarnos unos cuantos cables intermedios.


Esta es la parte correspondiente a las pistas.

Bueno, vamos ahora con el shield MP3 VS1053B que es el que nos va a reproducir los archivos.

Para hacer funcionar esta placa, compilar el cĆ³digo, trastear con Ć©l y subirlo al Arduino, tenemos que descargarnos e instalar las librerĆ­as. Para ello tenemos que entrar en la siguiente pĆ”gina:





Desplegar en la flechita del botĆ³n 'Code' y download ZIP





Una vez que tenemos el archivo ZIP, desde el IDE de Arduino seguimos estos pasos:


MenĆŗ Programa > Incluir LibrerĆ­a > AƱadir librerĆ­a .ZIP...


Y al seleccionar la librerĆ­a se instala.









En la carpeta de librerĆ­as de Arduino estarĆ”n ya los archivos, asĆ­ como los cĆ³digos de ejemplo.

Comprueba en menĆŗ Programa > Incluir LibrerĆ­a, que aparece en el listado de librerĆ­as instaladas.



TambiĆ©n estarĆ”n los ejemplos en el menĆŗ Archivo > Ejemplos. Recomiendo trastear con ellos para comprobar el funcionamiento del shield. El "FirePlayer" es un reproductor completo y con muchas funciones. Se controla desde el monitor serie del IDE poniendo el bitrate a 115200. Renombrar los archivos mp3 como "track001.mp3", "track002.mp3", ...
PodƩis conectar unos auriculares a la salida de audio del shield para hacer las pruebas. MƔs adelante esa salida irƔ a la entrada del amplificador,




El esquema del shield es este:


Y el datasheet:


Las clases por si querĆ©is profundizar el la programaciĆ³n de la placa:


Asƭ como una guƭa del fabricante muy interesante. EstƔ en inglƩs, pero se traduce y listo.


Como se puede comprobar en la documentaciĆ³n anterior, esta placa utiliza los pines D2, D6, D7, D8 y D9, por lo que no los podemos utilizar para otras funciones del proyecto. Disponemos de los pines D5, D10, los RX y TX, o sea el '0' y el '1', y en nuestro caso tambiĆ©n los D3 y D4, que aunque la placa los utiliza para algunas funciones, aquĆ­ no los necesita. Los pines D11, D12 y D13, se pueden usar para interactuar con otros componentes SPI, Sin embargo, no pueden usarse para ningĆŗn otro propĆ³sito que no sea SPI.

El cĆ³digo del reproductor para la gramola lo tenĆ©is aquĆ­, pero tened en cuenta que sĆ³lo funcionarĆ” si tenĆ©is todo el montaje anterior.


// GRAMOLA // Antonio Naharro. 11/12/2020 #include <SPI.h> #include <SdFat.h> #include <SFEMP3Shield.h> SdFat sd; SFEMP3Shield MP3player; int8_t current_track = 0; int reset1 = 0; // A cero permite seguir eligiendo nĆŗmeros tras resetear la opciĆ³n pulsada y cambia a 1 para impedir el reset el elegir letra int reset2 = 0; // A cero permite seguir eligiendo letras tras resetear la opciĆ³n pulsada y cambia a 1 para impedir el reset al elegir nĆŗmero int resetcont = 0; // Cuando se deje de reproducir el archivo, si estĆ” a 1 resetea los contadores int bloq = 0; // Bloquea botones con valor 1 int temp = 0; // Valor del contador para temporizador de pulsado int play = 0; // Se pone a 1 cuando se selecciona archivo para reproducir int push1 = 0; // Variable que tendrĆ” el valor del botĆ³n pulsado (botonera de nĆŗmeros) int push2 = 0; // Variable que tendrĆ” el valor del botĆ³n pulsado (botonera de letras) void setup() { Serial.begin(115200); if (!sd.begin(9, SPI_HALF_SPEED)) sd.initErrorHalt(); if (!sd.chdir("/")) sd.errorHalt("sd.chdir"); MP3player.begin(); MP3player.setVolume(40, 40); // Define pines digitales como salida pinMode(3, OUTPUT); // Salida de pulsos para contador (grupo de nĆŗmeros) pinMode(4, OUTPUT); // Salida de pulsos para contador (grupo de letras) pinMode(5, OUTPUT); // Salida para reset de contadores pinMode(10, OUTPUT); // Salida para activar el fader digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(10, LOW); } void loop() { int dat1 = analogRead(0); // Entrada analĆ³gica para botonera de nĆŗmeros int dat2 = analogRead(1); // Entrada analĆ³gica para botonera de letras if (dat1 > 10) { Serial.println(dat1); if (dat1 > 20 && dat1 < 100) // Pulsa el 1 { Serial.println("b1"); reset1 = 1; push1 = 1; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 1; x++) { digitalWrite(3, LOW); // Genera un pulso para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 101 && dat1 < 200) // Pulsa el 2 { Serial.println("b2"); reset1 = 1; push1 = 2; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 2; x++) { digitalWrite(3, LOW); // Genera 2 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 201 && dat1 < 300) // Pulsa el 3 { Serial.println("b3"); reset1 = 1; push1 = 3; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 3; x++) { digitalWrite(3, LOW); // Genera 3 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 301 && dat1 < 450) // Pulsa el 4 { Serial.println("b4"); reset1 = 1; push1 = 4; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 4; x++) { digitalWrite(3, LOW); // Genera 4 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 451 && dat1 < 570) // Pulsa el 5 { Serial.println("b5"); reset1 = 1; push1 = 5; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 5; x++) { digitalWrite(3, LOW); // Genera 5 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 571 && dat1 < 650) // Pulsa el 6 { Serial.println("b6"); reset1 = 1; push1 = 6; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 6; x++) { digitalWrite(3, LOW); // Genera 7 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 651 && dat1 < 740) // Pulsa el 7 { Serial.println("b7"); reset1 = 1; push1 = 7; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 7; x++) { digitalWrite(3, LOW); // Genera 7 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 741 && dat1 < 830) // Pulsa el 8 { Serial.println("b8"); reset1 = 1; push1 = 8; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 8; x++) { digitalWrite(3, LOW); // Genera 8 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 831 && dat1 < 930) // Pulsa el 9 { Serial.println("b9"); reset1 = 1; push1 = 9; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 9; x++) { digitalWrite(3, LOW); // Genera 9 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } else if (dat1 > 931 && dat1 < 1023) // Pulsa el 0 { Serial.println("b0"); reset1 = 1; push1 = 10; if (reset2 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 10; x++) { digitalWrite(3, LOW); // Genera 10 pulsos para contar delay(30); digitalWrite(3, HIGH); delay(30); } } } } if (dat2 > 10) { Serial.println(dat2); if (dat2 > 20 && dat2 < 100) // Pulsa la A { Serial.println("bA"); reset2 = 1; push2 = 1; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 1; x++) { digitalWrite(4, LOW); // Genera 1 pulso para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 101 && dat2 < 200) // Pulsa la B { Serial.println("bB"); reset2 = 1; push2 = 2; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 2; x++) { digitalWrite(4, LOW); // Genera 2 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 201 && dat2 < 300) // Pulsa la C { Serial.println("bC"); reset2 = 1; push2 = 3; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 3; x++) { digitalWrite(4, LOW); // Genera 3 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 301 && dat2 < 450) // Pulsa la D { Serial.println("bD"); reset2 = 1; push2 = 4; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 4; x++) { digitalWrite(4, LOW); // Genera 4 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 451 && dat2 < 570) // Pulsa la E { Serial.println("bE"); reset2 = 1; push2 = 5; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 5; x++) { digitalWrite(4, LOW); // Genera 5 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 571 && dat2 < 650) // Pulsa la F { Serial.println("bF"); reset2 = 1; push2 = 6; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 6; x++) { digitalWrite(4, LOW); // Genera 6 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 651 && dat2 < 740) // Pulsa la G { Serial.println("bG"); reset2 = 1; push2 = 7; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 7; x++) { digitalWrite(4, LOW); // Genera 7 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } else if (dat2 > 741 && dat2 < 830) // Pulsa la H { Serial.println("bH"); reset2 = 1; push2 = 8; if (reset1 == 0) { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } if (bloq == 0) { for (int x = 0; x < 8; x++) { digitalWrite(4, LOW); // Genera 8 pulsos para contar delay(30); digitalWrite(4, HIGH); delay(30); } } } delay(200); } // Selecciona archivo para reproducir if (push1 == 1 && push2 == 1) { current_track = 1; bloq = 1; } else if (push1 == 2 && push2 == 1) { current_track = 2; bloq = 1; } else if (push1 == 3 && push2 == 1) { current_track = 3; bloq = 1; } else if (push1 == 4 && push2 == 1) { current_track = 4; bloq = 1; } else if (push1 == 5 && push2 == 1) { current_track = 5; bloq = 1; } else if (push1 == 6 && push2 == 1) { current_track = 6; bloq = 1; } else if (push1 == 7 && push2 == 1) { current_track = 7; bloq = 1; } else if (push1 == 8 && push2 == 1) { current_track = 8; bloq = 1; } else if (push1 == 9 && push2 == 1) { current_track = 9; bloq = 1; } else if (push1 == 10 && push2 == 1) { current_track = 10; bloq = 1; } else if (push1 == 1 && push2 == 2) { current_track = 11; bloq = 1; } else if (push1 == 2 && push2 == 2) { current_track = 12; bloq = 1; } else if (push1 == 3 && push2 == 2) { current_track = 13; bloq = 1; } else if (push1 == 4 && push2 == 2) { current_track = 14; bloq = 1; } else if (push1 == 5 && push2 == 2) { current_track = 15; bloq = 1; } else if (push1 == 6 && push2 == 2) { current_track = 16; bloq = 1; } else if (push1 == 7 && push2 == 2) { current_track = 17; bloq = 1; } else if (push1 == 8 && push2 == 2) { current_track = 18; bloq = 1; } else if (push1 == 9 && push2 == 2) { current_track = 19; bloq = 1; } else if (push1 == 10 && push2 == 2) { current_track = 20; bloq = 1; } else if (push1 == 1 && push2 == 3) { current_track = 21; bloq = 1; } else if (push1 == 2 && push2 == 3) { current_track = 22; bloq = 1; } else if (push1 == 3 && push2 == 3) { current_track = 23; bloq = 1; } else if (push1 == 4 && push2 == 3) { current_track = 24; bloq = 1; } else if (push1 == 5 && push2 == 3) { current_track = 25; bloq = 1; } else if (push1 == 6 && push2 == 3) { current_track = 26; bloq = 1; } else if (push1 == 7 && push2 == 3) { current_track = 27; bloq = 1; } else if (push1 == 8 && push2 == 3) { current_track = 28; bloq = 1; } else if (push1 == 9 && push2 == 3) { current_track = 29; bloq = 1; } else if (push1 == 10 && push2 == 3) { current_track = 30; bloq = 1; } else if (push1 == 1 && push2 == 4) { current_track = 31; bloq = 1; } else if (push1 == 2 && push2 == 4) { current_track = 32; bloq = 1; } else if (push1 == 3 && push2 == 4) { current_track = 33; bloq = 1; } else if (push1 == 4 && push2 == 4) { current_track = 34; bloq = 1; } else if (push1 == 5 && push2 == 4) { current_track = 35; bloq = 1; } else if (push1 == 6 && push2 == 4) { current_track = 36; bloq = 1; } else if (push1 == 7 && push2 == 4) { current_track = 37; bloq = 1; } else if (push1 == 8 && push2 == 4) { current_track = 38; bloq = 1; } else if (push1 == 9 && push2 == 4) { current_track = 39; bloq = 1; } else if (push1 == 10 && push2 == 4) { current_track = 40; bloq = 1; } else if (push1 == 1 && push2 == 5) { current_track = 41; bloq = 1; } else if (push1 == 2 && push2 == 5) { current_track = 42; bloq = 1; } else if (push1 == 3 && push2 == 5) { current_track = 43; bloq = 1; } else if (push1 == 4 && push2 == 5) { current_track = 44; bloq = 1; } else if (push1 == 5 && push2 == 5) { current_track = 45; bloq = 1; } else if (push1 == 6 && push2 == 5) { current_track = 46; bloq = 1; } else if (push1 == 7 && push2 == 5) { current_track = 47; bloq = 1; } else if (push1 == 8 && push2 == 5) { current_track = 48; bloq = 1; } else if (push1 == 9 && push2 == 5) { current_track = 49; bloq = 1; } else if (push1 == 10 && push2 == 5) { current_track = 50; bloq = 1; } else if (push1 == 1 && push2 == 6) { current_track = 51; bloq = 1; } else if (push1 == 2 && push2 == 6) { current_track = 52; bloq = 1; } else if (push1 == 3 && push2 == 6) { current_track = 53; bloq = 1; } else if (push1 == 4 && push2 == 6) { current_track = 54; bloq = 1; } else if (push1 == 5 && push2 == 6) { current_track = 55; bloq = 1; } else if (push1 == 6 && push2 == 6) { current_track = 56; bloq = 1; } else if (push1 == 7 && push2 == 6) { current_track = 57; bloq = 1; } else if (push1 == 8 && push2 == 6) { current_track = 58; bloq = 1; } else if (push1 == 9 && push2 == 6) { current_track = 59; bloq = 1; } else if (push1 == 10 && push2 == 6) { current_track = 60; bloq = 1; } else if (push1 == 1 && push2 == 7) { current_track = 61; bloq = 1; } else if (push1 == 2 && push2 == 7) { current_track = 62; bloq = 1; } else if (push1 == 3 && push2 == 7) { current_track = 63; bloq = 1; } else if (push1 == 4 && push2 == 7) { current_track = 64; bloq = 1; } else if (push1 == 5 && push2 == 7) { current_track = 65; bloq = 1; } else if (push1 == 6 && push2 == 7) { current_track = 66; bloq = 1; } else if (push1 == 7 && push2 == 7) { current_track = 67; bloq = 1; } else if (push1 == 8 && push2 == 7) { current_track = 68; bloq = 1; } else if (push1 == 9 && push2 == 7) { current_track = 69; bloq = 1; } else if (push1 == 10 && push2 == 7) { current_track = 70; bloq = 1; } else if (push1 == 1 && push2 == 8) { current_track = 71; bloq = 1; } else if (push1 == 2 && push2 == 8) { current_track = 72; bloq = 1; } else if (push1 == 3 && push2 == 8) { current_track = 73; bloq = 1; } else if (push1 == 4 && push2 == 8) { current_track = 74; bloq = 1; } else if (push1 == 5 && push2 == 8) { current_track = 75; bloq = 1; } else if (push1 == 6 && push2 == 8) { current_track = 76; bloq = 1; } else if (push1 == 7 && push2 == 8) { current_track = 77; bloq = 1; } else if (push1 == 8 && push2 == 8) { current_track = 78; bloq = 1; } else if (push1 == 9 && push2 == 8) { current_track = 79; bloq = 1; } else if (push1 == 10 && push2 == 8) { current_track = 80; bloq = 1; } if ((push1 > 0) && (push2 > 0)) { MP3player.playTrack(current_track); delay (200); push1 = 0; push2 = 0; resetcont = 1; digitalWrite(10, HIGH); delay (200); } if ((!MP3player.isPlaying()) && (resetcont == 1)) // Cuando se deje de reproducir el archivo, si estĆ” a 1 resetea los contadores { reset1 = 0; reset2 = 0; bloq = 0; push1 = 0; push2 = 0; resetcont = 0; temp = 0; digitalWrite(10, LOW); { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } } if ((!MP3player.isPlaying()) && (((push1 >= 1 ) && (push2 == 0)) || ((push2 >= 1 ) && (push1 == 0)))) // Resetea los contadores si pasa un tiempo despuĆ©s del primer pulsado { temp = temp + 1; Serial.println(temp); if (temp == 30000) { reset1 = 0; reset2 = 0; bloq = 0; push1 = 0; push2 = 0; temp = 0; { digitalWrite(5, HIGH); // Genera un pulso para resetear el contador delay(20); digitalWrite(5, LOW); delay(20); } } } if (MP3player.isPlaying()) // Cuando se pulsa el botĆ³n 1 y el H a la vez se para la reproducciĆ³n { if ((dat1 > 20 && dat1 < 100) && (dat2 > 741 && dat2 < 830)) { MP3player.stopTrack(); } } }

El cĆ³digo tiene descripciones para interpretar el funcionamiento y que sirven de guĆ­a. Explicar el cĆ³digo de forma pormenorizada puede resultar bastante tedioso, pero voy a comentar por encima lo que hace.

La nomenclatura de los archivos tiene que ser "trackxxx.mp3", donde xxx es el nĆŗmero del archivo y marca su orden, por lo que en nuestro caso irĆ”n desde el "track001.mp3" hasta el "track080.mp3".

Haced una lista en texto, excel, o lo querĆ”is, con los archivos, su cĆ³digo de reproducciĆ³n y tĆ­tulo, para llevar un control de la siguiente manera:

track001 A1 Radiohead - Just
track002 A2 Diesel park west - All the myths on sunday
track003 A3 Queen - Another One Bites The Dust
track004 A4 Pixies - Here Comes Your Man
track005 A5 JAMES - Getting Away With It
track006 A6 ACDC - Highway To Hell
track007 A7 U2 - Pride (In the Name of Love)
track008 A8 Blur - Parklife
track009 A9 Dandy Warhols - Bohemian Like You
track010 A0 Ecobelly - Insomniac
track011 B1 Garbage - Only Happy When it Rains
track012 B2 Green Day - She
track013 B3 MidnightT Oil - Beds Are Burning
track014 B4 Joy Zipper - 1
track015 B5 Nada Surf - Always Love
track016 B6 Oasis - Live Forever
track017 B7 Live - Beauty Of Grey
track018 B8 Lush - Ladykillers
track019 B9 Morrissey - Suedehead
track020 B0 Muse - Starlight
track021 C1 Pearl Jam - Alive
track022 C2 Popguns - Waiting For The Winter
track023 C3 REM - The One I Love
track024 C4 Sister Hazel - All For You
track025 C5 Suede - Beautiful Ones
.
.
.

AsĆ­ sabrĆ©is en todo momento lo que se reproduce en cada posiciĆ³n, y serĆ” fĆ”cil ir actualizando canciones teniendo este listado al dĆ­a.

Las entradas analĆ³gicas '0' y '1' estĆ”n conectadas a los grupos de pulsadores de nĆŗmeros y letras respectivamente, y el valor analĆ³gico correspondiente a la tensiĆ³n en esas entradas se almacena en las variables dat1 y dat2, que se someten a una comparaciĆ³n, para que por un lado se generen el nĆŗmero de pulsos adecuado para se encienda el led correspondiente, y tambiĆ©n para asignar a las variables push1 y push2 el valor de ese pulsador, para que otro 'if' posterior seleccione el archivo que se tiene que reproducir.

La selecciĆ³n puede hacerse pulsando en el orden que se quiera, por ejemplo podemos seleccionar una canciĆ³n pulsado 7-E o pulsando E-7, asĆ­ como tambiĆ©n podemos cambiar la opciĆ³n antes de pulsar el botĆ³n del otro grupo de selecciĆ³n. Por ejemplo, si queremos seleccionar la canciĆ³n 4D y por error pulsamos el 3, podemos pulsar el 4 antes de pulsar la letra, rectificĆ”ndose la selecciĆ³n. Hay una temporizaciĆ³n de unos 20 segundos desde que se pulsa un botĆ³n, pasado ese tiempo se resetea la selecciĆ³n si no se ha seleccionado nada.

TambiĆ©n podemos parar la reproducciĆ³n en curso pulsando a la vez el primer botĆ³n y el Ćŗltimo, o sea, e '1' la 'H'.

Como comentĆ© anteriormente, se configuran los pines digitales 3 y 4 como salidas. Estas salidas mandan trenes de pulsos a los contadores que se generan mediante bucles 'for', cambiando estados alto-bajo tantas veces como proceda en cada caso. El pin 5 tambiĆ©n es una salida digital que resetea los contadores cuando toca, y eso es, al inicio, por un cambio de selecciĆ³n, tras una temporizaciĆ³n sin selecciĆ³n, al parar una reproducciĆ³n en curso y al finalizar una reproducciĆ³n seleccionada.

TambiĆ©n se configura como salida el pin digital 10, que como se indica en el cĆ³digo se utiliza para realizar un "fader", o sea, una reducciĆ³n progresiva del volumen de reproducciĆ³n. MĆ”s adelante veremos para que lo usamos, ¡es interesante!. šŸ˜Ž

Vamos ahora con lo que da la chicha al asunto. El amplificador y los altavoces.

Mi idea fue encontrar una placa amplificadora barata, potente, que sonara suficientemente bien, con controles de tono y volumen  y de tamaƱo adecuado.

Buscando, buscando, encontrƩ esta:



y no me pareciĆ³ mal, a si es que la comprĆ©. Dejo el enlace, aunque estas cosas aparecen y desaparecen, o cambian de vendedor. He insertado la foto para que podĆ”is buscarla en caso que no estĆ© disponible, o alguna similar.

Enlace del amplificador en Ebay

Este amplificador, como muchos otros, necesita doble alimentaciĆ³n en alterna, por lo que el transformador tiene que tener doble secundario.


Al estar la tensiĆ³n de alimentaciĆ³n comprendida entre 15 y 22V, he elegido el siguiente transformador:



El transformador se conecta de la siguiente manera:




El transformador, al tener dos secundarios, tenemos que unir los comunes de referencia que marcan  0V, que son el cable negro y el naranja. Estos cables van al pin central de los tres que tiene la entrada de alimentaciĆ³n el transformador.
Los otros dos cables, el amarillo y el rojo que tienen 18V cada uno, van uno a cada pin de los extremos del conector, sin importar el orden. El primario, que son los cables marrĆ³n y azul, obviamente van a la red. Estos colores no son un estĆ”ndar absoluto, con otro fabricante puede ser diferente, mirad siempre la documentaciĆ³n disponible. AĆŗn asĆ­ lo suyo es comprobar las tensiones en los secundarios con el polĆ­metro antes de conectarlo al amplificador.  Tened cuidado con esto, porque si os equivocĆ”is... ¡PUM!

Pues para que esto empiece a sonar ya sĆ³lo necesitamos unos altavoces.

El mueble lo he ajustado para que me quepa un juego de altavoces de 6,5 pulgadas. He pillado estos a buen precio, pero como todas estas cosas, los precios y los modelos van cambiando. Yo preguntƩ en su dƭa y me los recomendaron, sugiero que si no lo tenƩis claro hagƔis lo mismo.



Son unos altavoces de coche que suenan bien y aguantan bastante guerra. Son de 50 W pero aguantan picos de 150 W, o al menos eso dicen. El juego trae cuatro altavoces, un altavoz principal y un twiter con su filtro por cada canal.

Pero como he dicho, tanto el amplificador como los altavoces son a gusto del consumidor.


Si tenemos todo bien hecho y conectado, el cĆ³digo cargado y los archivos renombrados en la tarjeta, ¡¡esto ya funciona!!. Tenemos una gramola muy chula donde podemos seleccionar nuestras canciones  favoritas y escucharlas al momento.

Si, es muy chula, pero ocurre una cosa. Si queremos utilizarla para poner mĆŗsica en nuestra casa, en fiestas o donde se nos ocurra, no podemos estar constantemente seleccionando canciones para que la mĆŗsica no pare.

Para solucionar esto vamos a ampliar el proyecto para que a la vez que gramola sea tambiĆ©n un reproductor Bluetooth. ¿¿¡¡Mola no!!??

El proceso es el siguiente. Mientras no se reproduce ninguna selecciĆ³n estarĆ­a sonando el audio del Bluetooth, pero al escoger una canciĆ³n de nuestra lista, Ć©sta se reproduce, dejando de sonar la fuente de audio Bluetooth, que se recuperarĆ­a al terminar de reproducirse el mp3.

Si queremos que esto quede bien se nos plantea un problema. Al seleccionar una canciĆ³n cortamos el audio que se estĆ” reproduciendo, pero no lo podemos hacer de forma brusca, ya que quedarĆ­a horroroso, como un "hachazo". SerĆ­a muy fĆ”cil hacerlo asĆ­, por ejemplo con un juego de relĆ©s activados por una salida del Arduino, pero vamos a hacerlo bonito aunque se complique bastante el asunto. MerecerĆ” la pena.


Para los cambios vamos a mezclar las dos fuentes de audio, la del reproductor MP3 y la del Bluetooth, haciendo un 'fader', como si de una mesa de mezclas se tratase. Y ya que estamos, pues por poco mĆ”s  tambiĆ©n vamos a controlar el volumen del amplificador por Bluetooth, jejeje!!

Hay varios esquemas de circuitos mezcladores para fabricar si buscas en internet, pero tampoco nos vamos a complicar la vida si no es necesario.

Hay una placa mezcladora de de dos canales que estĆ” muy bien y nos viene perfecta.


Esta placa tiene dos entradas de audio, una para el reproductor MP3 y otra para el Bluetooth, y una salida, que irĆ” al amplificador lĆ³gicamente. La placa estĆ” alimentada con 5-12V DC, con lo que nos vale con un alimentador normal para Arduino, que nos da 9V. Inicialmente compartĆ­ el alimentador del Arduino con esta placa, pero tuve que ponerle uno independiente ya que por alguna razĆ³n que aĆŗn no he descubierto mete ruido al iniciarse el shield para reproducir un archivo.


Para poder controlar los niveles de las entradas electrĆ³nicamente tenemos que cambiar los potenciĆ³metros analĆ³gicos por potenciĆ³metros digitales que podamos gobernar con cĆ³digo. Para la placa mezcladora sĆ³lo tenemos que cambiar uno, el correspondiente a la entrada del Bluetooth, ya que la otra estarĆ” permanentemente abierta al mĆ”ximo.

El potenciĆ³metro digital para este caso es el MCP4251.


Este integrado tiene distintas variantes segĆŗn la resistencia del potenciĆ³metro que se necesite. El potenciĆ³metro de la placa mezcladora es de 5K, por lo que tenemos que escoger uno con ese valor.
La variante de 5K es el MCP4251-502e/p.


Buscadlo en varios sitios porque hay mucha diferencia de precios y realmente no son componentes caros.
De este potenciĆ³metro digital hay variantes de 5K, 10K, 50K y 100K, asĆ­ como distintos encapsulados, etc...

Aquƭ estƔ la pƔgina del fabricante y el datasheet. Echadles un vistazo porque es interesante.



TambiĆ©n vamos a necesitar la variante de 100K para controlar el volumen del amplificador mediante bluetooth,  en el caso de que hayĆ”is elegido el que indiquĆ© anteriormente. Este es un valor muy habitual en los potenciĆ³metros de los amplificadores, pero es mejor asegurarse si vais a montar otro porque puede variar. La arquitectura es la misma en todas las variantes del chip, sĆ³lo cambia el valor de Ć³hmico.

La variante de 100K es el MCP4251-104e/p


En los siguientes videos se aprecia el funcionamiento del control de volumen en la protoboard con los pulsadores (primer video) y el fader cuando se pone a 1 la entrada de control (segundo video). Los leds corresponden al volumen. Tened en cuenta que los leds empiezan a iluminar pasada la mitad del potenciĆ³metro, pero para ver el funcionamiento es suficiente.



Para montar todo este sistema vamos a utilizar un segundo Arduino UNO, al que vamos a colocar un shield personalizado.


En este caso es mĆ”s cĆ³modo y prĆ”ctico que una placa, ya que evitamos cableado y ahorramos espacio.



El circuito que tenemos que construir es este:



Con el siguiente esquema:


El circuito de la izquierda estĆ” visto desde arriba, la parte de los componentes, y el circuito de la derecha es la vista desde abajo, la de las pistas. Las lĆ­neas azules corresponden a las pistas y las rojas son puentes por la parte superior.

Recomiendo poner zĆ³calos para los integrados, ya que asĆ­ los protegemos de calentamientos al soldarlos, y los podemos sustituir fĆ”cilmente en caso de averĆ­a, aparte de que si cambiamos de amplificador y el nuevo tiene potenciĆ³metros con otro valor podemos sustituir fĆ”cilmente el integrado por otro del nuevo valor.


TambiĆ©n he usado unos conectores hembra para pinchar los cables y el bluetooth. Los podĆ©is comprar sueltos en cualquier tienda de elctrĆ³nica o pillar un kit si vĆ”is a usar mĆ”s en otros proyectos.










Y para completar la placa tambiĆ©n pondremos un mĆ³dulo bluetooth para controlar el volumen general con el mĆ³vil. Es recomendable el HC-05 original con pines.










Para controlar este mĆ³dulo Bluetooth funciona muy bien esta aplicaciĆ³n:



Seleccionando la funciĆ³n slider podemos regular el volumen con un ajuste deslizante. En configuraciĆ³n entraremos en Range y le daremos un valor de 255, que es el mĆ”ximo admisible por el potenciĆ³metro. TambiĆ©n podemos programar botones con valores, etc.

Para enlazar el Bluetooth, por defecto hay que marcar 1234.

Hay mĆ”s aplicaciones de este tipo por si querĆ©is probar, o si sĆ³is unos mĆ”quinas podĆ©is hacer una vosotros. šŸ˜œ

Esta es la composiciĆ³n de la placa con los integrados montados. El MPC4251-104E/P en el zĆ³calo de la izquierda para el volumen general y el MPC4251-502E/P a la derecha para la mezcla, segĆŗn se muestra en la imagen.


Vamos a montar dos pulsadores para subir y bajar el volumen en la parte trasera de la gramola, y que conectaremos a esta placa.




Se conectarĆ”n segĆŗn este esquema a las entradas analĆ³gicas A1 y A2
Una vez que tenemos esto, vamos a desoldar los potenciĆ³metros manuales que queremos controlar con esta placa, uno del amplificador para el volumen general y otro de la placa mezcladora, sustituyendo Ć©stos por unos conectores para pines.


Se conectan con sus correspondientes potenciĆ³metros digitales respetando la misma posiciĆ³n que tenĆ­an en sus placas los que hemos retirado. En la imagen se aprecia, ya que nos guiamos usando colores.


Ahora tenemos que comunicar dos Arduinos con un cable, para que el Arduino que se encarga de la reproducciĆ³n, envĆ­e una seƱal al que controla la mezcla y le avise de que tiene que hacer el fader cuando seleccionamos una canciĆ³n de nuestra lista.
Este cable sale del pin digital 10 del Arduino con el MP3 y entra al pin digital 8 del Arduino que controla el volumen.

Para que esto funcione asĆ­, es muy importante que los dos Arduinos compartan la misma fuente de alimentaciĆ³n, y tambiĆ©n debemos unir las masas de los dos Arduinos con otro cable para mĆ”s seguridad. Si no hacemos esto, no tendrĆ”n el mimo 'cero' de referencia y no funcionarĆ”.

Esto estƔ ya casi terminado, quedan un par de cosas mƔs por montar. La primera es una pareja de relƩs que es muy recomendable para proteger nuestros altavoces en el encendido. El arranque del amplificador es bastante brusco, y la carga de los Arduinos tambiƩn produce ruidos, lo cual genera picos desagradables y peligrosos. Los relƩs derivan la carga del amplificador en el encendido a unas resistencias de 8 ohmios evitando que los altavoces sufran, y transcurridos unos segundos, cuando ya se ha estabilizado todo, los relƩs conmutan a los altavoces.



Las resistencias deben ser de 8 ohmios, y con una potencia de 50W es suficiente. HarƔn falta dos, una para cada canal.


El esquema es simple.


La alimentaciĆ³n y la masa tienen que ser del mismo Arduino que le manda seƱal de activaciĆ³n, por la cuestiĆ³n de mantener las referencias. Los dos relĆ©s tienen que activarse a la vez, por lo que los pines IN1 e IN2 van ambos conectados al pin digital 8 del Arduino que controla el volumen. Los pines JD-Vcc y Vcc tienen que estar unidos por un jumper que suele traer puesto por defecto. Si no lo trae se pueden soldar los dos pines y listo. Al unir estos pines, la placa de relĆ©s comparte la alimentaciĆ³n de su electrĆ³nica de control con la de los bobinados de los relĆ©s. Si los separamos hay que alimentar los relĆ©s por separado. Esto se utiliza para algunas aplicaciones en las que puede interesar por seguridad separar los dos circuitos, pero en nuestro caso no es necesario.

La otra cosa que es recomendable instalar para proteger nuestros altavoces es un par de snubbers en el interruptor. ¿Y que es un snubber?, pues es un pequeƱo y simple circuito RC que absorbe chispazos y amortigua transitorios que son muy habituales en los interruptores, y que en un equipo de sonido se traduce en un desagradable chasquido en los altavoces al encender y apagar el aparato.
Este es el circuito. Es muy econĆ³mico y lo podĆ©is encontrar facilmente en internet. TambiĆ©n lo podemos hacer nosotros con un condensador no polar de 100 nf de 400 o 640 V. y una resistencia de 100 ohmios y 1 o 2 W en serie. Este circuito ademĆ”s lleva un varistor que proteje la entrada de sobretensiones. Snubber en Aliexpress

Necesitaremos dos, ya que este interruptor corta tanto fase como neutro. Se instala en paralelo con los contactos del interruptor. En nuestro caso, como son dos juegos de contactos necesitamos dos, uno para fase y otro para neutro. Si el interruptor tuviera Ćŗnicamente un juego de contactos para fase o neutro, sĆ³lo instalarĆ­amos uno.


Este elemento se puede montar a posteriori, no es algo imprescindible ya que puede que montĆ©is un amplificador o una alimentaciĆ³n que no produzca chasquido. Yo lo montĆ© despuĆ©s, al ver que me ocurrĆ­a esto con los componentes que he utilizado.

 EsquemĆ”ticamente serĆ­a algo asĆ­.
Como hemos dicho, la gramola, mientras no reproduce ninguna selecciĆ³n, tiene abierto un canal para otra seƱal de audio. Esta seƱal procede de un audio bluetooth, aunque servirĆ­a cualquier otra fuente de audio sin amplificar.

Yo he instalado el siguiente receptor que ya estaba usando para otras cosas y confirmo que va muy bien, pero cualquiera similar valdrĆ­a.


¡Pues ya tenemos todo!

Bueno, falta el cĆ³digo para el Arduino que controla el volumen, la mezcla, el bluetooth y los relĆ©s, y lo tenĆ©is a continuaciĆ³n.


/*
CONTROL DEL VOLUMEN AUTOMƁTICO CON FADERS - CONTROL DEL VOLUMEN GENERAL CON PULSADORES Y BLUETOOTH
Antonio Naharro. 11/12/20 Wiper 0 write Wiper 0 read Wiper 1 write
SHDN - a pin digital 7 con resistencia 4.7k pull down
Wiper 1 read TCON write TCON read VSS - a GND VDD - a +5v
SDO - a pin digital 12 (MISO pin)
CS - a pin digital 10 (SS pin) SDI - a pin digital 11 (MOSI pin) CLK - a pin digital 13 (SCK pin) */
int faderPin = 4; // Pin digital de entrada (1 para fader- y 0 fader+)
#include <SPI.h> #include <SoftwareSerial.h> SoftwareSerial BT1(5, 6); // RX | TX
char cadena[4]; //Creamos un array de caracteres de 4 posiciones
int speakPin = 8; // Pin que habilita altavoces mediante relƩ int fader = 0; int i = 0; //TamaƱo actual del array
const int shutdownPin = 7;
const int slaveSelectPin = 10; // Pin enable PotenciĆ³metro Fader const int slaveSelectPin2 = 9; // Pin enable PotenciĆ³metro Volumen general const int wiper0writeAddr = B00000000;
const int tcon_0off_1off = B00000000;
const int wiper1writeAddr = B00010000; const int tconwriteAddr = B01000000; const int tcon_0off_1on = B11110000; const int tcon_0on_1off = B00001111; const int tcon_0on_1on = B11111111; int vol = 254;
pinMode (slaveSelectPin, OUTPUT);
int volgrl = 50; int speaker = 0; int start = 1; void setup() { Serial.begin(9600); BT1.begin(9600); pinMode (faderPin, INPUT); pinMode (speakPin, OUTPUT); // Asigna slaveSelectPin como salida:
SPI.begin();
pinMode (slaveSelectPin2, OUTPUT); // Asigna shutdownPin como salida: pinMode (shutdownPin, OUTPUT); // Empieza con los potenciĆ³metros apagados digitalWrite(shutdownPin, LOW); // Inicializa SPI:
char dato = BT1.read(); //Guarda los datos carƔcter a carƔcter en la variable "dato"
// Inicia con relƩs de altavoces apagados digitalWrite(speakPin, HIGH); } void loop() { // Si se envƭan datos, se leen y se guardan en la variable de estado (Bluetooth) if (BT1.available()) {
if (i > 3) {
cadena[i++] = dato; // Vamos colocando cada carƔcter recibido en el array "cadena" Serial.print(cadena); // Visualizamos el comando recibido en el Monitor Serial volgrl = atol(cadena); if (volgrl >= 200) { volgrl = 200; } clean(); } }
fader = digitalRead(faderPin);
if (!BT1.available()) { clean(); } int button1 = analogRead(1); int button2 = analogRead(2); digitalWrite(shutdownPin, HIGH); // Activa el apagado // Con estado alto en pin 4 fader-, con estado bajo en pin 4 fader+ en potenciĆ³metro del bluetooth hablilitado en pin 10
delay(20);
if (fader == LOW) { if (vol <= 254) { Serial.println("SUBE MUSICA BLUETOOTH"); for (vol = 1; vol <= 254; vol++) { digitalPotWrite(wiper0writeAddr, vol); // Set wiper 0 digitalPotWrite(wiper1writeAddr, vol); // Set wiper 1 Serial.println(vol); } } }
delay(20);
else if (fader == HIGH) { if (vol >= 2) { Serial.println("BAJA MUSICA BLUETOOTH"); for (vol = 254; vol >= 1; vol--) { digitalPotWrite(wiper0writeAddr, vol); // Set wiper 0 digitalPotWrite(wiper1writeAddr, vol); // Set wiper 1 Serial.println(vol); } } }
volgrl = volgrl + 1;
Serial.println(vol); Serial.println(fader); digitalPotWrite(wiper0writeAddr, vol); // Set wiper 0 digitalPotWrite(wiper1writeAddr, vol); // Set wiper 1 // Pulsa para subir o bajar volumen general (potenciĆ³metro habilitado en pin 9) if (volgrl >= 0 && volgrl <= 200) { if (button1 >= 1000 && button2 <= 50) {
(volgrl = 0);
if (volgrl > 200) { (volgrl = 200); } { digitalPotWrite2(wiper0writeAddr, volgrl); // Set wiper 0 digitalPotWrite2(wiper1writeAddr, volgrl); // Set wiper 1 delay(20); } } else if (button1 <= 50 && button2 >= 1000) { volgrl = volgrl - 1; if (volgrl < 0) { } {
// Retardo hasta que se estabiliza el amplificador para activar altavoces
digitalPotWrite2(wiper0writeAddr, volgrl); // Set wiper 0 digitalPotWrite2(wiper1writeAddr, volgrl); // Set wiper 1 delay(20); } } } digitalPotWrite2(wiper0writeAddr, volgrl); // Set wiper 0 digitalPotWrite2(wiper1writeAddr, volgrl); // Set wiper 1 delay(20); if (start == 1) { delay (100); digitalWrite(speakPin, LOW); start = 0; } }
void digitalPotWrite2(int address, int value) {
// Esta funciĆ³n se encarga de enviar datos SPI al potenciĆ³metro void digitalPotWrite(int address, int value) { // Pin SS bajo para seleccionar el chip digitalWrite(slaveSelectPin, LOW); // Envia la direcciĆ³n y el valor a travĆ©s de SPI SPI.transfer(address); SPI.transfer(value); // Pin SS alto para deseleccionar el chip digitalWrite(slaveSelectPin, HIGH); } // Pin SS bajo para seleccionar el chip digitalWrite(slaveSelectPin2, LOW);
}
// Envia la direcciĆ³n y el valor a travĆ©s de SPI SPI.transfer(address); SPI.transfer(value); // Pin SS alto para deseleccionar el chip digitalWrite(slaveSelectPin2, HIGH); } //Limpia el array void clean() { for (int cl = 0; cl <= i; cl++) { cadena[cl] = 0; }
i = 0;

El cĆ³digo, como el anterior estĆ” detallado en los comentarios, y analizĆ”ndolo un poco creo que se entiende con unos conocimientos mĆ”s o menos bĆ”sicos en programaciĆ³n de este tipo.

¡Pues listo!, ¡ahora si!. Con todos los cables conectados en su sitio, alimentaciones, comunicaciones, audios, potenciĆ³metros, etc., y con los cĆ³digos cargados, podemos montar la fiesta. 



PARTE II

Ahora empezamos la segunda parte del tutorial donde construimos el mueble. Este es mi diseƱo, pero para gustos colores, aquĆ­ las posibilidades son infinitas y dependen de cada uno. Yo os indico como lo he hecho y si os gusta pues estupendo. PodĆ©is personalizar partes, mejorar el diseƱo o hacer algo completamente distinto. ¡ImaginaciĆ³n al poder!

Mis herramientas de carpinterĆ­a son las que puede tener cualquiera en casa, a si es que algunas cosas me han costado quedarlas bien a base de lija šŸ˜…, pero echando ratos termina saliendo. Si tenĆ©is algĆŗn amigo carpintero que os eche una mano pues mejor. Es recomendable leer todo antes de empezar para no hacer algo antes de tiempo o para resolver mejor los pasos.

Ahora es cuando ponemos la musiquilla de Bricomanƭa, que no se porquƩ motiva bastante, y empezamos.

Partimos de tablero de contrachapado de 10 mm. donde marcamos las siguiente plantillas para cortar.



Luego cortar el pico de forma vertical para que quede 0,5 cm en vertical, ya que ahĆ­ irĆ” un perfil.



El ancho del mueble es un estĆ”ndar de 43,5 cm utilizado en los equipos de mĆŗsica, por lo que el tablero para la base y la parte superior medirĆ” 41,5 cm de largo. Cortaremos un tablero rectangular de 41,5 x 20 cm para la base y para la parte superior otro de 41,5 de por lo que corresponda, es mejor medirlo.




TambiĆ©n cortaremos otro de 41,5 x 4,5 cm para la botonera que utilizaremos mĆ”s tarde. Lo pegaremos con cola como en la foto. La parte de la base que queda libre la haremos de contrachapado de 0,5 cm, para ajustar el espacio. Si lo hacemos de 1 cm andaremos pillados de sitio y tendremos problemas. Si querĆ©is podĆ©is darle algo mĆ”s de altura en esa parte y hacer la base del tirĆ³n, como querĆ”is. Yo lo he ajustado al lĆ­mite. Tened en cuenta que ahĆ­ tambiĆ©n irĆ” un perfil metĆ”lico de 0,5 cm. como podĆ©is ver en alguna foto de los altavoces.


Una vez hecho esto cortamos tambiƩn la parte frontal donde irƔn los altavoces. SerƔ de contrachapado de 10 mm, de 41,5 cm por la altura que midƔis. Al pegarlo tenƩis que dejar una distancia de unos 0,8 cm hasta el borde, ya que ahƭ irƔ encajada la rejilla frontal. Para esto no dejo plantilla, ya que dependerƔ de los altavoces que pongƔis. Los altavoces suelen traer plantilla, aunque presentadlos antes de hacer los agujeros para aseguraros de que cabe todo. Esta pieza habrƔ que lijarla con la pendiente del lateral, tenedlo en cuenta para la medida, ya que deberƔ sobresalir un poco para no quedaros cortos.

Para la parte superior de las ventilaciones usad contrachapado de 0,5 cm. y una vez pegado al mueble realizad los huecos para encajar las rejillas. Hacedlo asĆ­ ya que el corte va ajustado a la parte superior.


La pieza para la rejilla la podĆ©is descargar de aquĆ­: Rejilla de ventilaciĆ³n


Para conseguir el tamaƱo adecuado imprimidla al 63% del original. Imprimid al menos una para coger la medida de los huecos donde van encajadas.

Vamos con la botonera. Utilizad esta plantilla para hacer los agujeros donde irƔn los pulsadores y los leds en la pieza que tenemos ya cortada.




Los pulsadores que he instalado son estos:

Medid la parte del pulsador que entra en el panel antes de taladrar. La plantilla puede no ser exacta en ese sentido.







Luego he usado leds estƔndar amarillos de 5mm que he embutido en soportes para chasis.











MƔs adelante irƔ quedando asƭ, pero antes de colocar los pulsadores y los portaleds de forma definitiva hay que hacer cosas antes.


En la foto, la botonera ya tiene la serigrafĆ­a correspondiente y con un acabado brillante.
Una vez hechos los taladros hay que colocar un vinilo adhesivo y despuƩs abrir los agujeros con un cutter y mucho cuidado. Para darle el acabado brillante he aplicado una capa de resina de epoxi, que ademƔs protege al vinilo de araƱazos, manchas, etc.

Antes de seguir con el mueble vamos al tema de los vinilos. He diseƱado estos vinilos combinando imĆ”genes, dando un aire aƱos 50. Como dije antes, esto es cuestiĆ³n de gustos. Os dejo con resoluciĆ³n el vinilo del panel de tĆ­tulos y el de la botonera por si los querĆ©is usar, pero los de los laterales y el frontal los dejo en baja resoluciĆ³n ya que he utilizado distintas imĆ”genes que he ido encontrado por internet y puede haber problemas si alguna tiene derechos de autor. Es cuestiĆ³n de ponerse un poco creativo.





Y aquĆ­ los archivos en pdf: Vinilos

Hice los vinilos en una imprenta de mi localidad, que ademƔs es de un amigo y se porta, jejeje!!

Haced algunas pruebas de tamaƱo en casa imprimiendo partes en folios y aseguraros de las medidas cuando los llevĆ©is a imprimir, apuntĆ”dselas en una nota si hace falta, porque una vez hecho no hay vuelta atrĆ”s, y a veces dependiendo de la resoluciĆ³n de la imagen y del software que se utilice para imprimir puede cambiar el tamaƱo.


Todos los vinilos son opacos menos uno. El que va en el frontal retroiluminado se imprime en un vinilo transparente y va pegado en policarbonato blanco translĆŗcido.








Seguimos ahora con el panel de tĆ­tulos. Es una de las cosas que mĆ”s me costĆ³ quedar bien. Lo ideal es disponer de una CNC para cortarlo perfecto, pero como no es mi caso pues con paciencia y cuidado.

Para esta parte he usado un tablero de DM de 5 mm. Me pareciĆ³ mĆ”s adecuado porque tiene que quedar completamente recto y el contrachapado se curva mĆ”s fĆ”cilmente.


DespuĆ©s de cortar el DM a la medida adecuada presentĆ© el vinilo encima colocado en su lugar y con un punzĆ³n fino marquĆ© puntos para dibujar las lĆ­neas de corte. Una vez hecho esto hice taladros interiores sin llegar a las lĆ­neas. DespuĆ©s peguĆ© el vinilo y abrĆ­ los huecos con el disco de la Dremel, pero sin apurar, dejando distancia. Luego esa distancia se rebaja con mucho pulso utilizando los accesorios de lija rotativa. Os vendrĆ” bien un juego de estos: Recambios lijas Dremel


No peguĆ©is nada aĆŗn, primero vamos a pintar un poco y despuĆ©s nos liamos con los demĆ”s vinilos.


El color rojo del vinilo coincide con una pintura de la marca Monto del tipo esmalte sintƩtico color rojo claro 154. De este color pintaremos la parte superior y la inferior, pero antes aplicaremos por todo el mueble un tapa poros. Hay que dar una primera capa y esperar a que seque. DespuƩs se pasa una lija fina de grano 500 o 600, y ya se puede aplicar la segunda capa. Cuando se seque ya se puede pintar. La parte donde van los altavoces la pintaremos de negro.


Antes de poner los vinilos en el mueble vamos a colocarle unas patas. El tamaƱo de las que indico en el enlace es bastante adecuado. Miden 7,8 mm de altura x 31,5 mm de diƔmetro. Lo suyo es que no se vayan mucho de esas medidas.









Para colocar los vinilos vamos a preparar un bote de spray con una mezcla de agua y algunas gotas de jabĆ³n. El de fregar los platos es perfecto.

Si habƩis colocado vinilos antes ya sabrƩis porquƩ. Hay que pulverizar esta mezcla sobre la superficie donde va el vinilo o sobre la parte adhesiva y despuƩs lo colocamos, de esta manera lo podremos mover para ajustarlo en su sitio. Con una espƔtula adecuada o una bayeta iremos quitando burbujas que nos pueden quedar. No usƩis nada rƭgido o que roce porque rayarƩis el vinilo. Esperad hasta el dƭa siguiente para que seque bien el agua y el adhesivo para recortar con un cutter el sobrante. Si queda alguna burbuja la podƩis pinchar con un alfiler para sacar el aire.



Para hacer los cantos de la mƔquina he utilizado perfiles de aluminio de 10 mm que he torneado con la forma del lateral.


DespuƩs lo he pegado con cinta de montaje de doble cara. La cinta la he cortado transversalmente ya que es demasiado ancha. Queda un pequeƱo hueco entre el perfil y la madera que hay que tapar con masilla para madera y luego pintar con cuidado utilizando pintura plateada para disimularlo. Es un proceso algo complicado y tedioso.

TambiĆ©n se podrĆ­a colocar primero el perfil y despuĆ©s el vinilo para ajustarlo mejor. 



Otra opciĆ³n es utilizar molduras plateadas de las que se utilizan para los coches y que las hay en distintos grosores. No lo he probado, pero creo que lo harĆ© para la prĆ³xima.






TambiĆ©n colocaremos estos perfiles entre los altavoces y los tĆ­tulos. En la parte de arriba y en la parte  la inferior de los altavoces van estos perfiles en L.



Una vez tengamos todo esto resuelto le echamos la resina.

Aunque la resina queda muy bien es opcional, aunque hay que proteger los vinilos de alguna manera, si no es asĆ­ pues con algĆŗn protector plĆ”stico adhesivo. No utilicĆ©is barnices ni disolventes con los vinilos porque atacan a la impresiĆ³n. Voy a explicar el tratamiento con resina que es la terminaciĆ³n que yo he dado.

Si no habƩis laminado con resina tenƩis que practicar un poco antes. PodƩis aplicar resina a una fotografƭa, dibujo o alguna superficie para aprender a usarla.



He utilizado varias resinas y esta me ha dado muy buenos resultados. Para laminar nivela muy bien y sirve para otras muchas aplicaciones.


La resina epoxi no huele, pero eso no significa que sea inocua. Hay que usar mascarilla (FFP2 mĆ­nima) y guantes durante su manejo.


Para preparar esta resina se mezclan los dos componentes en proporciĆ³n de dos partes de resina y una de catalizador. No todas las resinas siguen esta proporciĆ³n, depende de la marca o del tipo de resina. Leed la informaciĆ³n del fabricante antes de hacer la mezcla donde vendrĆ” esto indicado, asĆ­ como el tiempo de manipulaciĆ³n y de endurecimiento. Esta resina da un tiempo de trabajo aproximado de 20 minutos, y el curado aproximadamente un dĆ­a, aunque realmente no obtiene toda su dureza hasta los 7. Esto depende mucho de la temperatura, con calor los tiempos se reducen. Todo estĆ” en la ficha tĆ©cnica del producto y es recomendable leerlo.

Hay que mezclar bien los dos componentes, y una vez hecho esto lo podemos verter en la superficie extendiĆ©ndolo poco a poco y de forma homogĆ©nea. La superficie de aplicaciĆ³n tiene que estar horizontal y lo mĆ”s nivelada posible. Por su alta tensiĆ³n superficial, la resina se puede ajustar al borde con cuidado y no se verterĆ” si no nos pasamos de cantidad. Cubrid bien todo lo que no deba mancharse con resina, porque lo que se manche de resina no se quita. Es normal que se formen burbujas en la resina al removerla aunque se haga con cuidado. Esas burbujas se quitan bien con una fuente de calor, por ejemplo acercando la llama de un mechero. Un mechero de cocina es perfecto para esto. Vigilad el secado de la resina al principio del proceso para aseguraros de que va todo bien, y cuidado con polvo, pelos o cualquier cosa que pueda caer, ya que una vez endurezca quedarĆ” ahĆ­ para siempre.

Aunque he dado algunas pautas, hay muchos tutoriales en Internet sobre este tema que estĆ”n muy bien. 


Cuando hayamos aplicado resina a los laterales y la botonera lo montamos como en la foto.

El panel de los tĆ­tulos irĆ” pegado dejando un hueco para el metacrilato que lo cubrirĆ”. Este metacrilato tendrĆ” un grosor de 3 mm.

TambiĆ©n se pegarĆ”n unos perfiles  de aluminio como los de los laterales pero de 5 mm en las uniones para cubrirlas.

Una vez pegado y sellado aplicamos resina a la parte superior, a la de las ventilaciones y por Ćŗltimo al frontal retroiluminado, al que habremos colocado la pieza que simula la entrada de monedas. Todo esto por partes y siguiendo la instrucciones anteriores. Protegiendo bien lo que estĆ© terminado y no se deba manchar.



Vamos a imprimir las piezas donde van los tĆ­tulos, y una vez impresas las pintaremos con spray efecto cromado. El efecto cromado queda mejor si se aplica sobre color negro.


Este es el archivo del monedero, que imprimiremos y pintaremos tambiƩn con el spray cromado.







Las piezas van pegadas por debajo ajustadas al hueco, y una vez hecho esto se pueden colocan los acetatos y los tĆ­tulos. Un acetato por debajo y otro por encima de los tĆ­tulos que van impresos en papel normal.

Esta es la plantilla para los tƭtulos, y sus dimensiones son de 10 x 14,3 cm. Los acetatos tendrƔn la mismas dimensiones y van doblados por el medio para darle forma.






El metacrilato tiene que encajar en la zona de tƭtulos, por lo que tendrƔ el ancho del hueco. Para el alto fijaos que tiene que entrar un poco por arriba en el hueco quedado para ello, y quedar asƭ encajado para fijarlo abajo con un pequeƱo tornillo. Tened en cuenta que el mueble es tambiƩn caja de altavoces, por lo que estarƔ sometido a vibraciones, sobre todo con los tonos graves, y cualquier cosa que no quede bien asentada vibrarƔ y provocarƔ ruidos. De hecho tuve que poner una pequeƱa tira de esponja donde encaja el metacrilato para que quedara mƔs firme y amortiguar vibraciones.


Ahora ya podemos instalar todo el interior empezando por los altavoces. DespuĆ©s podemos colocar la electrĆ³nica y hacer todo el cableado.

Para montar el transformador podĆ©is usar este soporte que se puede imprimir ajustado a las medidas que se necesiten. Soporte transformador toroidal en Thingiverse


Y para las placas podĆ©is imprimir separadores Separadores para montaje de circuitos en Thingiverse.

TambiĆ©n podemos ir haciendo la parrilla delantera. Para esto hay que medir el hueco y cortar la pieza en contrachapado de 10 mm. Tiene que ir justa ya que irĆ” encajada, aunque tened en cuenta el grosor de la tela que la recubre. Esta tela tiene que ser especial para altavoces y hay muchos modelos y precios. Esta de Aliexpress es econĆ³mica y da buen resultado. Tela para altavoces en Aliexpress


Las letras las podĆ©is descargar aquĆ­. Texto Jukebox en Thingiverse

Van pintadas con el spray efecto cromado y pegadas con un poco de cianocrilato sobre la tela ya montada.


Para la puerta trasera cortamos una pieza de contrachapado de 10 mm. con las dimensiones del hueco, dejando un poco de holgura para que encaje fƔcilmente. Tened en cuenta la pintura.

La puerta trasera, de la que insertƩ una imagen cuando hablamos de los pulsadores para el volumen, va cogida con una bisagra de barra. Estas bisagras se encuentran fƔcilmente en las ferreterƭas.







La puerta lleva una tira de leds por dentro para la retroiluminaciĆ³n. Estas tiras de leds se pueden cortar para ajustar la medida por las partes seƱaladas en la misma tira. 



Para el cable de red se instala este conector con interruptor. Quedo indicado el conexionado.







Para el cierre se instalan dos imanes para muebles, y para el asa de la puerta podĆ©is imprimir esta pieza con las dimensiones adecuadas. Asa en Thingiverse

Para iluminar los tĆ­tulos por debajo he instalado unas lĆ”mparas en una pieza hecha del contrachapado de 5 mm. donde he montado unos casquillos E14, que cableamos en paralelo y va directamente a la alimentaciĆ³n de red.


Las lĆ”mparas que he utilizado son led de tono cĆ”lido de 1W. El cristal es esmerilado para difuminar mĆ”s la luz.  LĆ”mpara LED en Amazon

La distribuciĆ³n y el aspecto final del montaje quedarĆ” mĆ”s o menos asĆ­.


Pues si no se me ha pasado nada, aquĆ­ hemos terminado. Espero que os haya gustado y os haya resultado interesante.

Si os animƔis a fabricarla seguro que la vƔis a disfrutar.


No hay comentarios:

Publicar un comentario