Gracias al chip MT8870, conectando las salidas de STQ, Q4, Q3, Q2 y Q1 a un transistor permitiendo abrir o cerrar los botones de un GAMEPAD, se puede decodificar tonos DTMF. Tan sólo necesitamos 5 pines (botones de mando). Se ha creado como prueba de concepto un simple programa en VB6 (para que funcione en equipos viejos W95) para poder leer los botones y traducirlo a tonos DTMF. El programa está sin optimizar, así que hay que enviar los tonos lentamente. Se puede usar el generador de la web http://mamclain.com/?page=RND_SOFTWARE_DTMF_WEB_APP
Se pueden hacer pruebas con el propio testeador de joystick de Windows
Se recomienda poner 500 ms en el ms Delay Between Digits a la hora de enviar.
Hasta aqui tenemos la parte lógica hardware. Por tanto, entramos en la sección de construir una aplicación que se encargue de traducir las pulsaciones de botones en los códigos binarios que al final son códigos DTMF.
- 0001 1
- 0010 2
- 0011 3
- 0100 4
- 0101 5
- 0110 6
- 0111 7
- 1000 8
- 1001 9
- 1010 10 0
- 1011 11 *
- 1100 12 #
- 1101 13 A
- 1110 14 B
- 1111 15 C
- 0000 16 D
El programa en Visual Basic, permite seleccionar que botones queremos usar del mando así, como a que pin del MT8870 está asociado. El mando que se ha usado se ha optado por:
- STQ (10)
- Q4 (01)
- Q3 (X1) He usado la cruceta mover derecho analógico
- Q2 (Y1) He usado la cruceta mover abajo analógico
- Q1 (9)
El X1 e Y1 son los Ejes X e Y (analógicos). En este caso, es así porque he usado el mando retro de NES usb y sólo se dispone de 4 botones digitales, siendo la cruceta analógica. En los ASIX (ejes) no se puede pulsar izquierda y derecha al mismo tiempo, así como arriba o abajo (tenerlo en cuenta a la hora de soldar), así que de los 4 botones, sólo se pueden usar 2. Recomiendo usar todo botones digitales, y el STQ usarlo siempre digital.
En las lecturas de los Asix (X1 e Y1) al ser analógico se comprueba por código un valor mayor de 33768 para que sea un 1 lógico, ya que significa que hemos pulsado el bóton o a la derecha (mayor a 32768 que sería el centro) o hacia abajo. El concepto es muy simple, estando la parte más dificil en las manualidades, para dejar el mando bien preparado. El MT8870 se puede alimentar con los 5 voltios del usb, que podemos sacarlo siguiendo los cables del mando con un mulitester. La masa, sigue el mismo concepto. Los botones de los mandos, normalmente suelen unir 2 circuitos, dejando la masa en común. Para estar seguros miraremos con un multitester la masa. Lo que nos interesa es soldar en la parte del botón que no es masa. Ese parte irá al colector del transistor. Como las masas son comunes, no necesitamos soldar todas esas partes. A la base de cada transistor, debemos conectar una resistencia de 100 Ohmios, como protección. El transistor vale cualquier NPN, en concreto he usado el 2N3904, que es el más simple y barato de conseguir. Cada salida del MT8870 (STQ, Q4, Q3, Q2 y Q1), van a la resistencia de 100 Ohmios, y esta en serie va a la base del transistor (2N3904), mientras que el colector lo únimos a la parte del botón del mando que queremos activar y el emisor a la masa del mando.Hay que destacar, que cuanto más barato sea el mando, menos posibilidades existen de que se pueda soldar bien a la parte del botón, por lo que deberemos asegurarnos de poner una vez soldado de manera simple, cola por encima para hacer presión.
Luego hacemos un agujero con el taladro para poder introducir el jack de audio del modulo MT8870 cuando queramos conectarlo para que quede bien, y terminado:
Una vez que probemos el programa, le debemos dar al botón de start joystick y por supuesto tener el gamepad conectado. Si todo es correcto, y se han elegido bien los botones, nos aparecerá el estado de hasta los 24 primeros botones del gamepad y debajo todos los codigos DTMF que se van decodificando en tiempo real, de la fuente de sonido que le hayamos conectado.
También se encuentra disponible una versión retro (GAMEPAD.PAS) compatible con 8086, para que funcione en cualquier equipo viejo (IBM PC XT), así como emulado por medio del DOSBOX, lo que se traduce en que funciona en casi cualquier plataforma, como por ejemplo ANDROID. El prototipo está en PASCAL. Se usa el puerto de joystick con la interrupción 0x15h, usando sólo los 3 bits altos 01110000b de los botones, similar a la versión de VB6, pero aqui no se puede modificar los botones.
- STQ (bit 7)
- Q4 (bit 6)
- Q3 He usado la cruceta mover derecho analógico
- Q2 He usado la cruceta mover abajo analógico
- Q1 (bit 5)
Debemos pues remapear desde el DOSBOX (pulsar ctrl+F1) los botones del joystick 1 y el 2, de forma que los botones de nuestro gamepad real apunten al joystick virtual a emular (IBM PC):
- 1 (Axis 1/2) - Q1
- 2 (Axis 1/2) - Q4
- 3 (Asix 3/4) - STQ
- cruceta derecha - Q3
- cruceta abajo - Q2
He dejado una versión minima (228 bytes), pero tiene fallos. Está realizada en C--, pero se puede reducir aún más su tamaño.
- stq - 2
- q4 - 3
- q3 - 4
- q2 - 5
- q1 - 6
Los botones del mando son:
- stq - 10
- q4 - 1
- q3 - 2
- q2 - 3
- q1 - 4
Se requiere previamente flashear el chip ATMEGA16u2 con:
https://github.com/harlequin-tech/arduino-usb
Se debe usar la herramienta FLIP y poner el chip en modo DFU.
He creado una versión html5 que lee desde gamepad el estado de los botones asociados a los pines del MT8870. Hace uso de p5js.
He creado un programa muy sencillo para leer desde el puerto de juego del AMSTRAD CPC 464 en BASIC. Permite decodificar los tonos siguiendo el mismo concepto que hasta ahora. Lo he probado en emulador, así que tienes que remapear los botones o adaptar el código para asignar los pines correctos:
- stq - Derecha
- q4 - Arriba
- q3 - Fuego 1
- q2 - Izquierda
- q1 - Abajo
He realizado un programa muy simple que lee el estado de los botones del mando de la PSX. Lo he realizado en emulador y remapeando los botones que necesito. Se ha usado el kit de desarrollo psyq.
- stq - Select
- q4 - R2
- q3 - Triangle
- q2 - Square
- q1 - Circle
Con esto conseguimos poder decodificar DTMF con un mando, sin falta de ningún microcontrolador intermedio, y lo más importante, que el concepto se puede aplicar a gamepads viejos (conector MIDI), y equipos retro (MSDOS), así como nuevos, como móviles, pudiendo portar el concepto a HTML5.
Si no queremos compilar el programa, podemos hacer uso de la versión ya compilada
GamePadDTMF.zip
- 2019/12/05 PSX port (psyq)
- 2019/12/04 AMSTRAD CPC 464 port
- 2019/07/23 Soporte HTML5
- 2019/07/21 Arduino R3 ATMEGA16u2 big_joystick_dtmf convierte MT8870 en HID joystick
- 2019/04/23 Creada la versión más pequeña del mundo MSDOS y DOSBOX en C-- (228 bytes)
- 2019/04/22 Corregida versión MSDOS (PASCAL) funciona OK
- 2019/04/19 Versión para MSDOS y DOSBOX (PASCAL).
- 2019/04/18 Versión semioptimizada que permite decodificar hasta con 150 milis de espera