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