martes, 5 de abril de 2011

Adaptador de control de SNES a USB (Paso a paso).

ADVERTENCIA: esta entrada de blog puede contener información que puede resultar perturbadora para videojugadores que no aprecien el "retrogamming".

Después de unos días de investigación, desarrollé dos mejoras de los adaptadores de Hobbyelektronik, uno que emplea el microcontrolador ATTINY25 y otro que utiliza el ATTINY2313. Antes que nada quiero agradecer y dar crédito a las personas que con sus proyectos, apoyo y asesoría colaboraron a la realización de estas necedades: Raphaël Assénat, Christof Rueß, Primož Kranjec, Paul Qureshi, Chris Judevine, andreq, ChaN y Dash.

El adaptador que emplea el ATTINY25 soporta un control de SNES, mientras que el adaptador que utiliza el ATTINY2313 soporta dos controles.

Hechas las aclaraciones pertinentes, pasemos a la lista de compras:
Para el adaptador de un control con el ATTINY25 se necesita:
  • Un ATTINY25-20PU (DIP).
  • Una base DIP de 8 pines.
  • Una resistencia de 2.2 KOhm a 0.25 Watt.

Para el adaptador de un control con el ATTINY2313 se necesita:
  • Un ATTINY2313-20PU (DIP).
  • Una base DIP de 20 pines.
  • Una resistencia de 1.5 KOhm a 0.25 Watt.
  • Dos capacitores cerámicos de 47, 33 o 27 pF (tienen impresos los números 47, 33 o 27).
  • Un cristal de cuarzo de 12 MHz.
  • Una placa para circuito impreso.

Para ambos proyectos:
  • Cables.
  • Dos diodos zener de 3.6 Volts.
  • Dos resistencias de 47 o 68 Ohms a 0.25 Watt.
  • Un capacitor electrolitico de 10 uF (opcional).
  • Un capacitor cerámico de 0.1 uF (opcional)(tiene impreso el número 104)
  • Un cable USB tipo A.
  • Coples para control de SNES.
  • Un programador de microcontroladores AVR.

El adaptador con el ATTINY25 es tan compacto que puede armarse soldando directamente los componentes y colocando todo en un bloque de plástico o en la carcasa de un conector DB9.

El adaptador con el ATTINY2313 requiere de un circuito impreso y un gabinete, el cual puede ser un bloque de plástico tipo LEGO.

Los diagramas empleados son los siguientes:

Adaptador de un control de SNES a USB con ATTINY25


Adaptador para dos controles de SNES a USB con ATTINY2313


Para el proyecto con el ATTINY25, los fusibles quedan configurados de la siguiente forma:
  • Low fuse: 0xE1
  • High fuse: 0xDD

Para el proyecto con el ATTINY2313, los fusibles quedan configurados de la siguiente forma:
  • Low fuse: 0xDF
  • High fuse: 0x99

Hay que precisar que el firmware con el ATTINY25 cuenta con calibración automática del oscilador. Ambos firmwares ocupan el PID/VID de los proyectos de Hobbyelektronik, debido a que son derivados de los mismos. Los dispositivos han sido probados en Linux y Windows XP. Por cuestiones de espacio en memoria estos dispositivos no tienen asignado un nombre, por lo que al conectarlos en Windows XP y entrar en la opción de Dispositivos de juego, muy probablemente veremos un caracter raro en vez del nombre de un gamepad. Si deseas que en vez de esos caracteres raros aparezca un nombre más cool, es posible modificar el registro de Windows para arreglar ese detalle, basta con copiar la siguiente información en un archivo de texto y guardarlo como oemname.reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\MediaProperties\PrivateProperties\Joystick\OEM\VID_4242&PID_E131]
"OEMName"="Super NES Controller"
"OEMData"=hex:20,00,00,10,08,00,00,00

Dar doble click sobre el archivo oemname.reg, reiniciar la computadora y al conectar de nuevo el adaptador, aparecerá con el nombre Super NES Controller. Pueden ponerle el nombre que quieran, sin embargo, el nombre del dispositivo que aparece en el control es:
Super NES Controller
MODEL NO. SNS-005

Los códigos fuente y firmwares compilados están en las siguientes ligas:
Adaptador con ATTINY25
Adaptador con ATTINY2313

Adaptador de control de SNES a USB (Round 2).

Con más confianza que conocimiento de causa compré un par de microcontroladores ATTINY25-20PU, a un precio unitario de 40 pesos mexicanos. Mi escaso conocimiento sobre la programación de los microcontroladores (no es lo mismo diseñar el firmware que sólo quemarlo) me llevó a una nueva aventura.

Mi pensamiento simple me llevó a sacar conclusiones equivocadas, basándome en premisas equivocadas, lo cual me llevó a hacer mi primer programa en microcontroladores para no terminar con un par de chips caros sin poder utilizar. La primera fue pensar que el código necesario para realizar la conexión USB utilizando V-USB era compacto. La segunda fue pensar que el leer el estado de un control de SNES era simple. La tercera y peor equivocación fue pensar que el código del ATTINY2313 me serviría para el ATTINY25.

En la página de Hobbyelektronik hay dos versiones del firmware para el ATTINY45, la primera con un valor de calibración del oscilador interno fijo y la segunda con calibración automática. En palabras simples, el ATTINYx5 puede funcionar a una alta frecuencia de operación utilizando su oscilador interno, lo que elimina la necesidad de utilizar un cristal oscilador como señal de reloj. Ahora bien, el oscilador no es muy preciso, por lo que puede tener desviaciones en su periodo de hasta el 5 por ciento. Dicha incertidumbre es inadmisible en un sistema que se conecta al puerto USB, donde los tiempos deben ser precisos, con una incertidumbre máxima del 1 por ciento. Es por ello que el oscilador debe calibrarse, colocando un valor en el registro OSCCAL (primer byte de la EEPROM del microcontrolador).

Ahora bien, la calibración del oscilador obedece a dos factores principales: el voltaje y el calor. Una variación en el voltaje de unos cuantos milivolts o una variación en la temperatura de operación puede variar la frecuencia del oscilador, por lo que el microcontrolador es incapaz de mantener la comunicación con el puerto USB. Si el firmware usa un valor de calibración fijo, dicho valor debe modificarse de forma manual en el firmware y volverse a grabar en el microcontrolador, en un proceso de prueba y error, hasta que se logre la comunicación entre el adaptador y el puerto USB. Cuando se emplea la calibración automática, el microcontrolador se sincroniza con el puerto USB en cada ciclo de RESET. La desventaja de la calibración automática es que si el adaptador comparte el hub USB con otros dispositivos, es muy probable que nunca pueda calibrarse.

Además, la rutina de calibración utiliza espacio en memoria muy valioso, ante todo cuando sólo se dispone de 2048 bytes. En primera instancia la opción ganadora es el firmware con calibración automática, sin embargo el firmware de Hobbyelektronik tiene dos problemas: el primero es que utiliza más de 2048 bytes y el segundo es que según su autor, no funciona.

En Instructables, un usuario llamado Andreq realizó unas optimizaciones que permitián utilizar un microcontrolador de 2kB para hacer el adaptador. Sin embargo el firmware de Andreq no contaba con la calibración automática. Con estos antecedentes, decidí poner manos a la obra con dos objetivos en mente: lograr optimizar el código lo suficiente como para entrar en un ATTINY25 y la segunda, implementar una función de calibración automática optimizada.

lunes, 4 de abril de 2011

Adaptador de control de SNES a USB (Here comes a new challenger!!!).

Con un prototipo funcional (en protoboard, pero al cabo funcional) decidí poner manos a la obra. Pero antes, se me ocurrió la "brillante" idea de investigar más a fondo sobre los adaptadores de controles de consolas al puerto USB, sobre todo porque revisando los números me percaté que estaba utilizando sólo un tercio de la capacidad en memoria del microcontrolador. Ante esta circunstancia me saltaron en la mente dos alternativas: la primera era darle una mayor compatibilidad al adaptador (agregar soporte para más controles) y la segunda era optimizar el adaptador (utilizar un microcontrolador más barato y con menor capacidad).

Como ejemplo de la primera alternativa encontré el proyecto de Retro Adapter de Paul Qureshi, en el cual se usa un microcontrolador de 16 kB de memoria para dar compatibilidad a un chorro de controles. El ejemplo de la segunda alternativa la encontré en el proyecto de Hobbyelektronik, donde con un microcontrolador de 4 kB sincronizado por software y con un microcontrolador de 2 kB sincronizado con cristal de cuarzo realizan el adaptador.

Debo admitirlo, soy un fanático de la optimización, así que el proyecto de Hobbyelektronik me pareció una mejor alternativa que el prototipo que ya había comenzado. Además, de forma completamente "misteriosa" los microcontroladores ATMEGA8 y los cristales de cuarzo de 12 MHz (los necesarios para sincronizar el microcontrolador con el puerto USB) subieron de precio como la espuma de un chesco agitado... Pero a diferencia de la espuma, los precios se han mantenido altos desde aquella fecha.

Así que decidí armar el adaptador que utilizaba el ATTINY2313. Cabe mencionar que si bien, el microcontrolador recomendado debe tener una frecuencia de operación de 20 MHz (terminación 20PU), es posible usar el de frecuencia de 10 MHz (10PU) y "overclockearlo" con el cristal de 12 MHz. Inclusive, el desarrollador original de la interfaz de los microcontroladores AVR a USB hizo sus primeros experimentos con un AT90S2313 (antecesor de los ATTINY2313) de 10 MHz.

Así que puse manos a la obra, compré un ATTINY2313-20PU (en uno de los locales del número 24 de la calle de República del Salvador), reutilizé todos los componentes del prototipo anterior, quemé el firmware en el microcontrolador y todo funcionó de maravilla.

Las pruebas fueron satisfactorias, el adaptador fue sumamente estable, sin lag o retrasos en los botones, barato y sobre todo, cumplió con mis expectativas de optimización. El circuito quedó muy padre, dentro de un bloque de plástico de 3x7 cm. Hice un cople adaptador del control de SNES a conector DB9. El conector DB9 se conectaba al bloque de plástico que contenía el circuito adaptador y éste se conectaba por otro cable al puerto USB.

Conector casero para controles de SNES.
Chasis fabricado a partir de un "FacoBlock" (MegaBlock genérico X_x)
Nótese la pulcritud y profesionalismo del acabado X_x.


Hasta aquí todo podría quedar en un final feliz... Sin embargo todo es perfectible, todo puede mejorar, y además AG trajo los ATTINY25 a un precio bastante competitivo, así que decidí poner manos a la obra... una vez más.

Festival de cables n_n.

Adaptador de control de SNES a USB (renacimiento).

Después del fracaso del capítulo anterior, hacer rabieta, desquitarme con el mundo, pellizcarle el trasero (de forma completamente accidental debo aclarar) a unas maids en una convención de cómics, meditar (es decir, escuchar rock n_n), jugar Bayonetta y terminar Super Metroid en el ZSNES usando el control del XBOX360 (en efecto, ya contaba con un control USB a mi disposición) me sentí lo suficientemente tranquilo para darme otra oportunidad (si, a veces me cuesta trabajo superar mis depresiones).

Esta vez compré un microcontrolador ATMEGA8-16PU (encapsulado DIP o de "cucaracha") a 40 pesos mexicanos (aun no subían de precio) y todos los componentes fueron de los "normales" (o thru-hole para los expertos). Monté el prototipo en una protoboard, grabé el microcontrolador, esperé un rato (tres segundos), conecté el prototipo a la PC y ahora si, Windows reconoció el dispositivo. Esto me levantó la moral como pocas veces en mi vida. Sin embargo surgieron nuevas dificultades, conectar los controles de SNES al dichoso adaptador y hacer una nueva placa de circuito impreso. Dispuesto a poner manos a la obra veo mi calendario y ¡¡¡Oh sorpresa!!! Al día siguiente entraba a clases en la facultad X_x.

Así el proyecto quedó en el tintero todo un semestre. Vinieron de nuevo las vacaciones de invierno de 2010, recibí el Año Nuevo con toda mi familia (Cami se agregó junto con Maika, Neela y Yuki), finjí mi muerte en las redes sociales (no hay lugar ahí para un antisocial como yo), jugué Sakura Wars ~So long my love en PS2 (el mejor juego de PS2 que hay hasta la fecha) y el proyecto del adaptador... bien gracias n_n!

Adaptador de control de SNES a USB (primer brick)

En este capítulo de su melodrama predilecto "Un pseudo-nerd que cree que se rifa pero nel"...
Siguiendo al pie de la letra las instrucciones del sitio de Raphael, me dispuse a construir el mejor adaptador de controles de SNES a USB sobre la faz de la tierra. Mi adaptador iba a ser perfecto, es decir, iba a ser compacto, de diseño pulcro, acabados espectaculares, funcionalidad a toda prueba y lo mejor... la envidia de todos mis cuates, pues iba a ser el primer proyecto casero utilizando componentes SMD (componentes microscópicos que requieren de gran pericia para ser soldados) que muchos verían con sus propios ojos...

Después de dos días de diseño y construcción terminé el prototipo. Era hermoso pues tenía un excelente acabado y la placa de circuito impreso era negra (como en las tarjetas de video de gama alta). Llegó la hora de programar, conecté el programador a la PC, abrí el avrdude, le pasé los parámetros adecuados, presioné ENTER, esperé unos segundos (tres o cuatro por mucho) y todo parecía haber salido bien...

Conecté el adaptador al puerto USB de la PC mientras preparaba mi garganta para dar el mayor grito de logro de todas las vacaciones del verano de 2010... y salió en la barra de tareas de Windows XP un globito amarillo que decía (palabras más, palabras menos) lo siguiente: "El dispositivo USB no puede ser reconocido... bla... bla... lamer... jajajaja... bla... verifique las conexiones... bla..."

Acostumbrado a los fracasos del primer intento, desconecte el adaptador, lo conecté al programador para volver a grabar el firmware (o sea, seguramente ese era el error, mi diseño era perfecto...) y casi me "retoco el maquillaje" en mis pantalones cuando el avrdude se negó de forma autoritaria a reconocer el microcontrolador. No pude evitar sentirme deprimido, mi primer acercamiento con los microcontroladores y los circuitos SMD había sido un rotundo fracaso; dos días de diseño, un microcontrolador de 36 pesos mexicanos (aún estaban baratos), una placa de circuito impreso y algunos cuantos componentes más se fueron a la basura...

domingo, 3 de abril de 2011

Adaptador de control de SNES a USB (Dash y ChaN al rescate).

Seguimos con el relato del adaptador de controles de SNES a USB.

Hace muchos meses (pero muchísimos meses), mi amigo Dash me cedió una laptop Toshiba T4700CT, una 486DX de 66 MHz con 8 MB de RAM, bajo la encomienda de que hiciera "cosas chéveres" con ella.
La venerable Family.

Esta computadora y Dash salvaron el día, ya que dicha computadora (cuyo nombre de cariño es la "Family") cuenta con puerto serial, puerto paralelo, sistemas operativos Windows 3.1 (basura) y DOS 6.2 (el mejor que existe). Así que sólo era cuestión de armar uno de esos programadores seriales o paralelos que hay en la red, comprar el microcontrolador (ATMEGA8 para el USBASP o ATTINY2313 para el USBtinyISP), hacer un circuito impreso, soldar unos cuantos componentes, conectar unos cuantos cables, cargar el firmware en el programa que transfiere los datos al chip y... ¡Un momento!... ¡¡¡Ni PonyProg ni AVRdude funcionan en entornos de 16-bits!!!... ¡¡¡Rayos!!!

Si bien, Dash ya había puesto su grano de arena (el hardware) faltaba el software... El cual vino de manos de ChaN. En la página de ChaN hay varios circuitos electrónicos y programas útiles, entre ellos un set de programadores para entornos de 16-bits.

El programador serial a ISP.

Gracias a nuestros héroes (como viñeta de historieta de bajo presupuesto), pude hacer el USBtinyISP (primer gran logro de esta aventura) y proceder al próximo capítulo...

USBtiyISP en toda su gloria.

Adaptador de control de SNES a USB (el principio).

Hace varios meses, vagando por sitios de videojugadores "retro" (melancólicos suena muy gay) encontré una serie de artículos donde se detallaba como conectar los controles de SNES a la PC.

Hace ya bastante tiempo (tiempos de vocacional y de vagancia en general) construí un adaptador de cinco controles del SNES al PC, utilizando los en aquel entonces famosos drivers y diagramas de DirectPad Pro. DirectPad Pro funcionaba de maravilla, pero al cabo del tiempo se hicieron presentes dos enormes detalles, el primero es que los drivers trabajaban con instrucciones de bajo nivel y dejaron de ser útiles en sistemas como Windows XP o NT, donde el acceso a recursos de hardware no se hacia de la misma forma que en los Windows 9x. El otro detalle es que la conexión de los controles se hacia por puerto paralelo. Resumiendo, DirectPad Pro servía de maravillas en las computadoras promedio de 2000 o 2001.

Al pasar del tiempo, la interfaz paralela y Windows9x prácticamente desaparecieron de las computadoras. Por ahí existía otro set de drivers de la interfaz DirectPad Pro que funcionaba en Windows XP (PSXPad), aunque nunca la probé en mi propia PC, gracias al amigo Max pude verla en acción y disfrutar de ella en los buenos tiempos de las retas de Queen of Hearts 99.

Actualmente la interfaz USB existe en prácticamente todas las computadoras, así que resulta conveniente construir cualquier adaptador o hardware en general apuntando a la arquitectura de dicho puerto, siempre y cuando la aplicación lo amerite. En la pagina de Raphael Assenat se detalla como hacer un adaptador de uno o hasta cuatro controles de SNES/NES por USB. Este diseño utiliza un microcontrolador ATMEGA8. Si bien, dicho microcontrolador era relativamente barato y fácil de encontrar a principios de 2010 en las tiendas de la calle de República del Salvador (Ciudad de México), a mediados de 2010 sufrió una alza de precio de mas del doble (en la actualidad cuesta 123 pesos mexicanos (11 USD) en cierta tienda llamada AG). Además se requería de un programador de microcontroladores compatible con los AVR de ATMEL.

La complicación más fuerte surgió cuando vi que los programadores más económicos se conectaban por el puerto serial o el puerto paralelo de la computadora (de los cuales, mi computadora no tiene ni uno) y los programadores USB son sensiblemente caros. Existen dos programadores USB de código y diagrama abiertos llamados USBASP y usbtinyisp. Ambos son excelente opciones, muy completos y confiables pero tienen un defecto en común... ambos utilizan un microcontrolador AVR que debe ser programado para que puedan funcionar.

Es decir, me encontré ante el clásico dilema del huevo y la gallina. Necesitaba un programador USB para programar un microcontrolador, pero dicho programador requería de la programación previa de un microcontrolador (irónicamente de la misma clase del que mi proyecto requería)...

¡Feliz 2021! El retorno del debraye pandémico (Edición "Rompemuros").

Hola, ¿Cómo han estado? Espero que estén con bien, con buena salud y con muchas ganas de aburrirse una vez más con una ronda de debrayes. Es...