Índice general Foros Modelismo y Maquetas Ferroviarias Nuestras Colecciones y Material El Mundo de Tatán

El Mundo de Tatán


Nota 17 Mar 2019 02:55

Desconectado
Mensajes: 11
Ubicación: Oviedo, Spain
Registrado: 30 May 2018 09:37

Hola de nuevo:

Uno de los asuntos que más me costó echar a andar fue el tema de los sonidos. Ya desde la inauguración de la maqueta, una amiga me había sugerido que hubiese sonidos de la estación y cosas así, y el reto me gustó. 4 meses más tarde logré los primeros resultados, pero una conexión errónea me quemó la placa. Cuando tuve repuestos volví a la carga y en diciembre pude llamar a quien me retó a que viese el resultado:



Estuve buscando por Internet varias posibilidades y hay fundamentalmente dos, paso a explicarlas brevemente y los resultados:

La primera es usar una MicroSD que debes leer desde el Arduino con un lector de tarjetas y es el mismo Arduino el que descodifica el archivo, que necesariamente tiene que estar en formato WAV. La tarjeta tiene que conectarse al Arduino por unos pines específicos, que dependen del modelo de Arduino que estemos usando. En el caso de la Mega 2560 son los 51-53. Hice bastantes pruebas y no conseguí reproducir ningún archivo, pero no debe ser imposible a juzgar por gente que lo ha hecho:
http://intelirobot.com.mx/blog/arduino/toca-sonidos-wav-en-arduino/
Para quien lo quera intentar las placas son éstas:
https://www.amazon.es/dp/B06XHJTGGC?ref_=ams_ad_dp_ttl

La segunda, que fue la solución adoptada, es mediante un reproductor MP3, el DFPlayer que se conecta con el Arduino mediante una conexión serie, es decir que en el caso del Arduino Mega 2560 se pueden usar cualquiera de los pares RX/TX de los que dispone: 0-1 (RX), 19-18 (RX1), 17-16 (RX2), 15-14 (RX3). La placa se puede adquirir en Amazon por poco dinero, como no es difícil quemarlas (yo me cargué 2 ó 3), las venden en packs de 3 ó de 5:
https://www.amazon.es/gp/product/B07911V1NL/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1
Para conectarlas conviene tener alguna placa protoboard:
https://www.amazon.es/gp/product/B071ZGC75Y/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1
Y para probarlo todo vale cualquier altavoz pequeño que tengamos a mano, pero si no disponemos de ninguno, estos altavoces son suficientes:
https://www.amazon.es/cylewet-di%C3%A1metro-ohmios-altavoz-est%C3%A9reo/dp/B06XT5ZHM3/ref=pd_bxgy_23_img_2/257-6594454-4287244?_encoding=UTF8&pd_rd_i=B06XT5ZHM3&pd_rd_r=19f4ce25-4853-11e9-80f5-471b8392310f&pd_rd_w=vWStL&pd_rd_wg=XyQCG&pf_rd_p=7b8b17e5-e2e0-413e-bf77-272aa9f4139c&pf_rd_r=MQZ4WQQ91ER711WGMVKM&psc=1&refRID=MQZ4WQQ91ER711WGMVKM

Este decodificador MP3 ya incluye un lector de tarjetas MicroSD (aunque las lee un poco a su aire, ya veremos), decodifica los MP3 y los envía, bien a un altavoz a través de un pequeño amplificador integrado de 3W, bien a un amplificador. El esquema de pines es el siguiente:

Imagen

El esquema de conexión básico lo tomo prestado también de inforepuesto.com:

Imagen

Aquí tengo que hacer algunas consideraciones: HAY que colocar dos resistencias de 1 kohm entre los conectores RX/TX en AMBAS conexiones y no sólo en la RX como aparece en la figura, si no, salen unos ruidos horribles por los altavoces. Para que todo funcione bien HAY que conectar las dos masas (pines GND del DFPlayer con la masa del Arduino). En mi caso, también he conectado el pin BUSY a una entrada del Arduino para poder saber cuándo está reproduciendo un sonido y poder dar la orden de reproducir otro a continuación.

Para las pruebas el altavoz directo es suficiente, pero para colocar en la maqueta, el volumen es muy bajo. Por ello he añadido un mini-amplificador como el siguiente:
https://www.amazon.es/dp/B06XCC4F4F/ref=dp_cerb_3
que hay que soldar con cuidado y este amplificador no se conecta a la salida de altavoces, sino a los pines DAC_R y DAC_I del reproductor. A este amplificador es al que he puesto unos altavoces más apañados, que aun con todo les cuesta competir con el ruido producido por los trenes:
https://www.amazon.es/gp/product/B00JHERC8I/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
Como se puede ver, son altavoces JVC diseñados para coche, por lo que las vibraciones de la maqueta no creo que los dañen.
Otro día os cuento de la programación de este dispositivo, pero ya os adelanto que tiene su propia librería y que mediante ella no os dará mayores problemas.
Saludos
Última edición por miguelssm el 17 Mar 2019 21:17, editado 3 veces en total

Nota 17 Mar 2019 07:43

Desconectado
Mensajes: 807
Ubicación: Madrid
Registrado: 25 Sep 2011 12:16
Hola Miguel. Tu historia me ha parecido preciosa. En parte por que lo es, así, sin más, pero también porque me encanta ver cómo una y otra vez se repite "el ciclo de la vida" con trenes Märklin por el medio. Esto es así hasta el punto de que la propia marca de Goppingen sacó estas Navidades un anuncio basado en historias como la tuya (y la mía). Siendo yo, además, también asturiano, pues para qué te digo más.
Vaya por delante que soy un absoluto ignorante en cuestiones eléctricas/electrónicas/informáticas, hasta el punto de que mi maqueta es totalmente digital (todo se maneja con los dedos). Creo que fué Arthur C. Clarke quien dijo que "cualquier tecnología suficientemente avanzada es indistinguible de la magia". Y magia me parecen a mi las cosas que hacéis algunos en vuestras maquetas.
Sin embargo tus explicaciones son claras y detalladas y se ve que te apasiona lo que haces. Estoy seguro de que serán utilísimas para cualquiera que se quiera meter en el mundo del Arduino para trenes.
Otra cosa que me parece flipante es cómo unos juguetes que tienen casi (o sin casi) 60 años, puedan seguir funcionando como si tal cosa (y casi sin mantenimiento). Cada vez que saco una de las viejas locomotoras de mi abuelo y la pongo en la maqueta me asombro como la primera vez.

Y ahora viene la parte tocapelotas: ten muchísimo cuidado con tus viejos transformadores. Pueden ser peligrosos.
Se sabe desde hace algún tiempo que muchos de esos trafos azules de Märklin pueden tener un problema con su cableado interno: Al parecer, aunque el recubrimiento externo del cable de alimentación parezca estar en buen estado, puede estar deteriorado en su recorrido interior. En muchos casos el cable se ha terminado pelando del todo, dando salida a la tensión a la carcasa metálica externa, con el consiguiente riesgo eléctrico.
Te pongo un link al foro Märklin Users. Está en inglés, pero tiene buenas fotos que explican lo que te digo.

https://www.marklin-users.net/forum/posts/t25901-Older-Metal-Transformer-Danger

Ya nos contarás.
Gracias por tu hilo y a seguir disfrutando de tus viejos trenes.

Nota 22 Mar 2019 00:15

Desconectado
Mensajes: 11
Ubicación: Oviedo, Spain
Registrado: 30 May 2018 09:37

Hola de nuevo:

Ante todo gracias a todos por vuestras sugerencias y buenos consejos. Los tendré en cuenta!

Completo hoy el asunto de los sonidos con un ejemplo de programación de Arduino Mega 2560 que utiliza el teclado de 16 teclas y el reproductor de MP3 con unos cuantos archivos para probarlo todo. Aquí va el código completo del programa:

// Programa de pruebas de sonido usando el keypad

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Keypad.h>  //Librería Keypad.h para el teclado

int serial1 = 19;
int serial2 = 18;

SoftwareSerial mySoftwareSerial(serial1, serial2); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

#define pilotorojo 13

#define BUSYP 36

int orden = 0;
int contador1 = 8;
unsigned long timer = 0;

int val1 = 0;
int val2 = 0;
int val4 = 0;
int val8 = 0;
int val16 = 0;
int ordensup = 0;
int musicasi = 0;
int estadoMUSIC = 0;
int playerbusy = 0;
int volumen = 20;

char codigo[2]; 
char modo01[]="01";
char modo02[]="02";   
char modo03[]="03";
char modo04[]="04";
char modo05[]="05";
char modo06[]="06";
char modo07[]="07";
char modo08[]="08";
char modo09[]="09";
char modo10[]="10";
char modo11[]="11";
char modo12[]="12";
char modo13[]="13";
char modo14[]="14";
char modo15[]="15";
char modo16[]="16";
char modo17[]="17";
char modo18[]="18";
char modo19[]="19";
char modo20[]="20";
char modo21[]="21";

char modoAA[]="AA"; // Modo subir volumen
char modoDD[]="DD"; // Modo bajar volumen

const byte ROWS = 4; //Numero de filas del teclado que se esta usando
const byte COLS = 4; //Numero de columnas del teclado que se esta usando
 
char hexaKeys[ROWS][COLS] =  //Aquí ponemos la disposición de los caracteres tal cual están en nuestro teclado
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
 
byte rowPins[ROWS] = {4, 5, 6, 7}; //Seleccionamos los pines en el arduino donde van conectadas las filas
byte colPins[COLS] = {50, 48, 46, 44}; //Seleccionamos los pines en el Arduino donde van conectadas las columnas
 
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //inicializa el teclado

int cont = 0;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);

  pinMode(serial1, INPUT);
  pinMode(serial2, OUTPUT);

  pinMode(BUSYP, INPUT);

  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  if (!myDFPlayer.begin(mySoftwareSerial, false)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    delay(10);
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.setTimeOut(500); //Set serial communication time out 500ms
 
   
  myDFPlayer.volume(volumen);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Locución de Bienvenida

  pinMode(pilotorojo,OUTPUT);
  digitalWrite(pilotorojo,LOW);
 
}

void loop()
{
  char customKey = customKeypad.getKey();   //se guarda en la variable customKey el caracter de la tecla presionada

  if (customKey != NO_KEY || cont>=5)         //se evalúa si se presionó una tecla
    {
    codigo[cont]=customKey;          //se guarda caracter por caracter en la matriz codigo[]
    cont=cont+1;              //incrementamos la variable cont
    if(cont==2)          //si ya fueron presionadas 2 teclas se evalúa el código introducido
    {
         
      if(codigo[0]==modo01[0]&&codigo[1]==modo01[1]) // Reproduce Sonido 1
      {
        myDFPlayer.play(1);
      }

      if(codigo[0]==modo02[0]&&codigo[1]==modo02[1]) // Reproduce Sonido 2
      {
        myDFPlayer.play(2);
      }

      if(codigo[0]==modo03[0]&&codigo[1]==modo03[1]) // Reproduce Sonido 3
      {
        myDFPlayer.play(3);
      }

      if(codigo[0]==modo04[0]&&codigo[1]==modo04[1]) // Reproduce Sonido 4
      {
        myDFPlayer.play(29);
      }

      if(codigo[0]==modo05[0]&&codigo[1]==modo05[1]) // Reproduce Sonido 5
      {
        myDFPlayer.play(30);
      }

      if(codigo[0]==modo06[0]&&codigo[1]==modo06[1]) // Reproduce Sonido 6
      {
        myDFPlayer.play(35);
      }

      if(codigo[0]==modo07[0]&&codigo[1]==modo07[1]) // Reproduce Sonido 7
      {
        myDFPlayer.play(19);
      }

      if(codigo[0]==modo08[0]&&codigo[1]==modo08[1]) // Reproduce Sonido 8
      {
        myDFPlayer.play(23);
      }

      if(codigo[0]==modo09[0]&&codigo[1]==modo09[1]) // Reproduce Sonido 9
      {
        myDFPlayer.play(38);
      }

      if(codigo[0]==modo10[0]&&codigo[1]==modo10[1]) // Reproduce Sonido 9
      {
        myDFPlayer.play(39);
      }
     
      if(codigo[0]==modoAA[0]&&codigo[1]==modoAA[1]) // Sube volumen en 1
      {
        volumen = volumen + 1;
        myDFPlayer.volume(volumen);
        Serial.print("Volumen: ");
        Serial.println(volumen);
      }

      if(codigo[0]==modoDD[0]&&codigo[1]==modoDD[1]) // Baja volumen en 1
      {
        volumen = volumen - 1;
        myDFPlayer.volume(volumen);
        Serial.print("Volumen: ");
        Serial.println(volumen);
      }
      delay(100);
      cont=0;  //resetear a 0 la variable cont
    }
   
   
  }
 
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}


Como puede verse, el programita incluye hasta cuatro librerías externas, una genérica, otra para la comunicación serie, otra para el reproductor y una última para el teclado.
En este sencillo programa se puede ver cómo se usa la función customKeypad.getKey() para leer una tecla del teclado y después una segunda tecla, cuando tenemos dos (se podría buscar una tercera y así trabajar con muchas más órdenes) se pasa a ejecutar el código que nos interese, marcado por la expresión if:

if(codigo[0]==modo05[0]&&codigo[1]==modo05[1])
{
// Aquí se ejecuta lo que queramos que haga con el código "05"
}

En esta caso lo que hace es reproducir el archivo de la SD "que se haya copiado en ella el nº 30":

myDFPlayer.play(30);

Sí, es un poco raro, pero el orden en el que se copian los archivos en la tarjeta es muy importante en esta librería. Por eso, además es recomendable que numeremos los archivos que queramos reproducir como "0001-loquesea.mp3"; "0002-otracancion.mp3", etc, porque así el sistema operativo los va a copiar en la carpeta usando este orden.
También recomiendo, cuando se quiera mantener un orden al añadir el nuevo archivo, renombrar, borrar toda la tarjeta y volver a copiarla, respetando la numeración. Es un poco latoso, pero funciona.
Espero que os valga para algo mi experiencia.
Un saludo

Anterior

Volver a Nuestras Colecciones y Material

Síguenos en Facebook Síguenos en Youtube Síguenos en Instagram Feed - Nuevos Temas
©2017   -   Información Legal
cron