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