Reparación Controlador TOMIX 22413
#8
aP89341 - Chip de sonido

Para mi era una gran incógnita saber cómo funcionaba el sonido. Sobretodo en un tipo de dispositivo que podríamos denominar como “simple”.

El chip aP89341 es un chip específico para este tipo de funcionalidad. En resumen tiene las siguientes características:
  • Capacidad de almacenar hasta 341 segundos de audio sampleado a 6KHz con una compresión 4-bit ADPCM (8 Mbits - 2016 bloques de voz)
  • Hasta 254 grupos de voz (después lo explico)
  • 3 modos de funcionamiento:
    • Señal de disparo
    • Entrada paralela desde CPU
    • Comandos serie
  • Salida digital paralela (8 bit) y salida de audio.
Para los que tengan conocimientos de electrónica, este es el diagrama de bloques del chip:

   

¿Y cómo funciona? Básicamente tiene una memoria en la que se graban los distintos grupos de voz. El chip tiene 2016 bloques de voz de unos 160ms cada uno. Por tanto, si queremos hacer un sonido más largo que 160ms tenemos que agrupar varios bloques. Para eso existen los Grupos de voz. 

Un ejemplo:

Supongamos que tenemos tres archivos de voz, que son "¿Cómo estás?", Efecto de sonido y Música. Cada uno de los archivos de voz se divide en varios bloques de voz de longitud fija y se almacenan en la memoria.
  • Archivo de voz 1: "¿Cómo estás?" se almacena en los bloques de voz B0 a B12.
  • Archivo de voz 2: el efecto de sonido se almacena en los bloques de voz B13 a B15.
  • Archivo de voz 3: la música se almacena en los bloques de voz B16 a B40.
Los bloques de voz se agrupan utilizando la tabla de voces para formar un grupo de voces para su reproducción:

   

Tenemos que saber exáctamente qué hemos puesto en cada bloque de voz, para luego poder crear los grupos que nos interesen.

El audio se graba en una memoria no volátil EPROM. Es un tipo de memoria que solo se puede grabar una vez y no se puede borrar, por lo que una vez grabados los sonidos y los grupos, no puedes corregirlos.

Como el chip está conectado al Microcontrolador, utiliza el modo de control serie, por lo que se utilizan 2 pins del microcontrolador para enviar comando, y un pin para monitorizar el estado de la reproducción de audio.

El chip acepta 8 comandos de los que se utilizan 5 para reproducir los sonidos en el sistema:

   
  • PUP2: Sirve para encender el módulo de Audio
  • PDN2: Sirve para apagar el módulo de Audio
  • PAUSE: Pausa la reproducción del Audio actual
  • RESUME: Reproduce el Audio actual
  • PREFETCH: Pre-carga el número de Grupo de Voz que queremos reproducir. 
La ventaja de este chip es que mientras se está reproduciendo un audio, puedes hacer la pre-carga del siguiente que quieres reproducir, Eso hace que se puedan reproducir diferentes Grupos de Voz de manera seguida sin que se pare la reproducción entre grupo y grupo.

Todos los comandos son de 1 Byte de longitud excepto el PREFETCH que es de 2 bytes de longitud para poderle indicar al chip que Grupo de Voz queremos reproducir.

Para saber que audios contiene el chip tuve que hacer un pequeño software que los reprodujera todos con un espacio de tiempo entre ellos para poder identificarlos unitariamente. Esta es la lista:

   

Para mandar el PREFETCH, tenemos que mandar primero el comando y luego el valor Hexadecimal del sonido, que se construye poniendo el número o letra MSB + LSB (Para los que no sepáis, el Hexadecimal es un sistema de contar en informática que va de 0 a 15. Los símbolos son 0-9, A-F, siendo A = 10 y F = 15)

Por tanto, si queremos mandar un sonido de abrir puertas tenemos que mandar: 0x71 + 0x24

Driver de potencia

El driver de potencia es un chip que convierte la señal PWM de 5V que llega del microcontrolador a una señal de 9V y 800mA para poder manejar el tren (Como os dije, este controlador es para la serie de trenes de TOMYTEC que se pueden motorizar, y que funcionan a 9V).

   

L significa 0V
H significa 5V

En este caso el chip LB1948MC, un chip de 10 patas que tiene 2 canales independientes de PWM (por decirlo simple, podríamos controlar 2 circuitos independientes). Pero si ponemos en paralelo los dos circuitos podemos alimentar 1 vía pero con más corriente de salida. Este es el montaje que tenemos en en circuito.

   

Es posible que el todo el circuito se pueda alimentar a 12V y correr trenes normales, pero después de todo el curro, prefiero no volver a cargarme la placa Sonrisa.

Software

Primero de todo os digo que el SW no está terminado. Para los que trabajamos en SW, nunca lo está. Funcionan todos los elementos pero falta depurar y añadir la gestión de errores. 

Los que tenéis alguna experiencia en Arduino o en Raspberry Pi, probablemente sepáis que son unos microprocesadores ARM de 32 bits y que funcionan con Sistemas Operativos (por ejemplo, Raspberry Pi funciona con Raspbian). 

En este controlador se utiliza un procesador mucho más simple, de 8 bits, y de propósito específico. Estos microcontroladores son los que pueden llevar pequeños dispositivos sin mucha necesidad de procesado, como podría ser una lavadora o un lavavajillas (que no se conecten a internet Guiño )

Por tanto, lo primero que tenemos que tener en cuenta es que un Sistema Operativo no cabe, por lo que tenemos que tirar de otras estrategias de programación.

Pasos de creación del SW

Se puede hacer de distintas maneras. Lo que yo he hecho es lo siguiente:

  • Poner en marcha el conversor Analógico Digital. Esto me permite comprobar que soy capaz de leer todos los valores analógicos que necesito:
    • Acelerador
    • Freno
    • Lectura Velocidad PWM 1
    • Lectura Velocidad PWM 2
    • Lectura Posición Indicador Velocidad
    • Lectura Posición Indicador Presión Freno
  • Poner en marcha los puertos Digitales, para leer o controlar dispositivos:LED Puertas (Salida)


    • LED Puertas (Salida)
    • Control Indicador Velocidad (Salidas)
    • Control Indicador Presión Freno (Salidas)
    • Interruptor Apertura/Cierre Puertas (Entrada)
    • Pulsador Bocina (Entrada)
    • Selector Dirección (Entradas)

  • Puesta en marcha de los PWM. Para eso hay que configurar el periférico que lleva el propio microcontrolador. Aquí descubrí que el Driver de potencia estaba estropeado, ya que la salida del microcontrolador funcionaba, pero una de las salidas de potencia, no.
  • Puesta en marcha del módulo de sonido. Para eso tuve que hacer un poco más de trabajo, por dos motivos:
    • Algunos de los puertos que van al módulo de sonido, son compartidos para la depuración del chip. Por este motivo, esta parte tuve que depurarla “offline”, es decir, hacer trozos de programa, grabarlos en el chip y ejecutar el programa, sin tener el depurador conectado.
    • Envío de comandos. Tuve que crear una función de SW especial para poder mandar los comandos al chip. Hay que llamar a la función, diciéndole los siguientes valores:
      • Valor del Comando
      • Valor del Grupo de Voz (Si corresponde. Si no, mandar un 0)
      • Longitud del comando (1 o 2)

Una vez todo puesto en marcha por separado, había que empezar a juntar las piezas del puzzle. Para ello, como no se puede utilizar un sistema operativo, monté un “scheduler”, es decir, en el bucle principal del programa se llaman a todas las funciones que tienen que hacer algo de manera secuencial y luego te esperas en un punto muerto hasta que pasa el ciclo de tiempo definido, para volver a empezar. 

Diagrama conceptual

  1. Función 1
  2. Función 2
  3. Función 3
  4. Función …
  5. Función n
  6. Espera marca de tiempo
  7. Salta a 1
En mi caso, he hecho un ciclo de 10ms, suficiente para que se ejecute todo y para, por ejemplo, que haya tiempo suficiente entre un loop y otro de que la aguja de velocidad aumente un paso.

Las funciones del SW son:

  1.         doors(): Gestión del interruptor de puertas. Comprueba la posición del interruptor y manda un mensaje a la función de sonido para indicar si tiene que reproducir el de abrir o cerrar puertas
  2.         gauge_pressure(): Gestión del indicador de presión del freno. Según la posición de la manivela de freno, sitúa el indicador en la posición adecuada. 
  3.         gauge_speed(): Gestión del indicador de presión del freno. Según la lectura de la salida PWM (según sentido), sitúa el indicador en la posición adecuada.
  4.         fsm_analog_manager(): Gestiona las lecturas analógicas. Se lanzan de manera secuencial, 1 en cada ejecución del bucle de programa. Hay 5 lecturas analógicas por lo que un valor en concreto se actualiza cada 50ms. Esto se hace así por que cada vez que cambias de canal analógico, se necesita un tiempo para que el chip pueda hacer la nueva lectura de manera correcta, sin colisiones con la lectura anterior.
  5.         mascon(): Gestion del MASter CONtroller o acelerador. Se lee la posición del actuador y se incrementa el valor del DUTY CYCLE del PWM paso a paso, en intervalos de tiempo controlados para poder simular una aceleración progresiva. Tal y como funciona en los trenes reales, cuando sueltas, mantiene la velocidad y es mediante el freno que se desacelera. El MASCON solo funciona si el freno no está accionado. En esta función también se lee el selector de dirección.
  6.         brake(): Gestion del freno. Se lee la posición del actuador y se decrementa el valor del DUTY CYCLE del PWM paso a paso, en intervalos de tiempo controlados para poder simular una desaceleración progresiva. Según si hay más o menos presión en el freno, el decremento del DC del PWM es más rápido o más lento. El freno solo funciona si el MASCON no está accionado.  
  7.         sound(): Gestión del sonido. Quizás es la función más complicada, ya que hay que gestionar todos los sonidos, dependiendo del estado en el que está el tren (parado, acelerando, desacelerando…), y dependiendo de las lecturas analógicas y las posiciones de los actuadores del sistema.
         * Cuando está parado, funcionan la bocina, apertura y cierre de puertas, y sonido de freno      * Cuando acelera, funciona el sonido de avance y la bocina con preferencia      * Cuando desacelera, funciona el sonido de avance hasta que llega una velocidad en que puedes cambiar al sonido de desaceleración . La bocina suena con preferencia.
Pues ese es todo el proceso de reparación del aparato. Diría que he tardado más en entender cómo funciona todo que en hacer el Software. Como he dicho antes, me falta hacer el Software robusto, pero la funcionalidad básica está ya asegurada.

Conclusion

Al cambiar el microcontrolador se me rompió alguna pista. Cuando lo sueldan con máquina, le añaden una cola para que el componente no se mueva hasta que pasa por el horno de soldadura. Estaba tan fuertemente pegado que tuve que hacer fuerza para sacarlo y se levantó alguna pista de cobre. He tenido que repararlo poniendo cables que suplen las pistas. 

Lo mismo pasó con el Driver de potencia. Tuve que romperlo para poder desoldarlo y cambiarlo, pero al menos, en este caso, no se me rompió ninguna pista de cobre, cambiando un poco la técnica que utilicé para el microcontrolador. Hay que aprender Sonrisa

Estoy contento. He convertido un “pongo” en algo funcional y además he disfrutado y sufrido a partes iguales. La satisfacción es, si cabe, mayor. Espero que os haya gustado la explicación. Si tenéis alguna pregunta, miraré de responderla.
[Imagen: 98662-h.gif]
Canal de YouTube: Nihon Densha
Responder


Mensajes en este tema
RE: Reparación Controlador TOMIX 22413 - por lluisgib - 07-09-2020, 14:55

Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Controlador PWM casero Biribu 9 1,121 04-09-2024, 15:47
Último mensaje: Kris Kelvin
  Controlador PWM casero abelmartinez90@outlook.com 2 2,243 14-07-2022, 19:15
Último mensaje: leptrain
  Controlador DC con arduino. Alberto_m 22 19,338 12-07-2022, 02:35
Último mensaje: abelmartinez90@outlook.com
  Consulta por controlador PWM ManuelBarcia 21 46,450 18-11-2016, 19:50
Último mensaje: Slanac69
  Controlador Analógico mandobala 2 9,415 10-01-2014, 20:47
Último mensaje: trendevapor

Salto de foro:


Usuarios navegando en este tema: 3 invitado(s)