Proyecto: Mando arcade casero de 9 botones – Parte 3: Diagrama y código

Una vez visto el exterior del mando queda la otra mitad: el circuito y el software.

Como expliqué en la primera parte, opté por basarme en el código de un mando muy parecido al mio. Lo primero que hice fue descargármelo e intentar compilarlo. La compilación fallaba debido a que la librería que se encarga del funcionamiento como dispositivo USB tenía fragmentos de código obsoletos que había que actualizar.

Una vez compiló y probé que funcionaba me puse a investigarlo internamente. Resumiendo un poco, el mando al conectarse presenta un descriptor o cabecera en la que se identifica (indica que tipo de dispositivo es, cuantos botones tiene, de que tipo son…) y luego va haciendo lecturas periódicas de su estado y generando el «report» o informe que se le presenta en cada iteración al equipo al que está enchufado. Visto esto me encontré con dos problemas:

  • Para representar el estado del mando se utilizaban 3 bytes y se estaban utilizando completamente, ya que uno era para el eje vertical (0-255), otro para el eje horizontal (0-255) y del tercero un bit era para cada botón. Lo que hice fue incluir un byte mas en el report aunque únicamente se utilizaría un bit. Para ello tuve que modificar el descriptor y declarar tanto el botón como el espacio vacío del byte.
  • Para acelerar el proceso las entradas se leían en bloques. En el código se leían los bloques B (B0-B5) y C (C0-C5) pero todas las entradas se estaban utilizando, bien para un botón o para una dirección. Por suerte el pin D7 estaba libre así que ese fue el que utilicé.

Por último (esto ya es opcional) cambié el nombre del fabricante y del dispositivo. Lo suyo es cambiar también las IDs pero como yo no tengo ninguna y esto es un prototipo experimental utilicé las que venían en el código en el que me basé. El autor de este código indica en su web que si alguien distribuye su código cambie las IDs así que yo, en el código que he subido, no las he incluido.

Y eso es todo. Me he quedado con las ganas de meterle alguna entrada analógica (el stick de direcciones es digital), algún interruptor o quizás algún sistema de turbo… ¡lo dejaremos para futuras mejoras!

El diagrama del circuito por si alguien se anima a hacerse uno es el siguiente:

Esquemático mando 9 botones

Código Descripción
R1 Resistencia de 1,5 K (las de carbón de 1/4 w sirven).
R2, R3 Resistencias de 68 Ohmios (las de carbón de 1/4 w sirven).
D2, D3 Diodos Zener de 3,6 V.
Y1 Cristal de 12 Mhz.
C1 Condensador de 10 uF. Colocarlo lo más cerca posible del ATmega8.
C2, C3 Condensadores de 27 pF.
J1 Conector USB.
J2 Conector de 6 pines para progamar el circuito.

 La parte del ISP (arriba del ATmega8 en el diagrama) es para poder reprogramar el controlador. Yo lo que hice fue ponerle un socket al ATmega8 para poder quitarlo y ponerlo cuando quisiera y conectar la patilla de RESET a 5 voltios (poniéndole una resistencia de 10K para prevenir que se resetee).

Sobre el código, lo he colgado en github. ¡Quedo a la espera de vuestros pull requests!

Proyecto: Mando arcade casero de 9 botones – Parte 1: Prototipo

Proyecto: Mando arcade casero de 9 botones – Parte 2: Carcasa

Comparte: