![[IC]Convertí joystick de Sega a uno de PC y te lo muestro [IC]Convertí joystick de Sega a uno de PC y te lo muestro](https://storage.posteamelo.com/assets-adonis/assets/2016/01/11/661-T1p-3UZ4_BO.webp)
Hola gente! En esta ocasión les voy a estar mostrando y explicando este proyecto en el que vengo trabajando hace días.
Objetivo
Nota: Todos los archivos de código los dejo mas abajo para su descarga.
Usar un joystick de Sega como joystick USB que funcione en CUALQUIER juego.
Nota: Todos los archivos de código los dejo mas abajo para su descarga.

Parte 1: El control
Lo primero fué saber como funcionaba un joystick de Sega. Abrí el control y me fijé sus conexiones.

Como se puede observar hay un circuito integrado el cual desconocía, por lo que tuve que buscar info en internet al respecto. Después de varias horas junté toda la información para saber su funcionamiento.
El control de Sega se basa en un circuito multiplexor, como la mayoría de los controles. Esto lo que hace es reducir la cantidad de salidas(datos) respecto de las entradas(botones). De esta manera se consigue que teniendo muchos botones tengamos una cantidad menor de cables con la información de los mismos.
Este circuito integrado es el 74HC157 (con una leve modificación de parte de Sega) el cual se explicará a continuación.
Nota: Para entender esta parte se requiere conocimiento en compuertas y funciones lógicas.
Recomiendo abrir la imagen en nueva pestaña para visualizarla mejor.
Recomiendo abrir la imagen en nueva pestaña para visualizarla mejor.
Como podemos observar al cambiar el estado del interruptor "Select" podemos alternar entre un grupo de botones u otro. Esto quiere decir que con 9 señales (8 botones+1 select) tendremos 4 salidas que dependeran del estado del select.
La modificación mencionada anteriormente se debe a que Sega sacó un control con 4 botones mas lo que obligaba a usar un nuevo sistema de multiplexado y como consecuencia perder la compatibilidad con las consolas y juegos anteriores. Para solucionarlo decidieron seguir usando el mismo sistema solo que para agregar esas 4 salidas extra agregaron una función al select. Como vimos antes el select podía optar por valores de 0 o 1 y depende este valor sacaba un grupo u otro, con esta modificación esto se mantubo pero también se agrego que si se mandan 3 pulsos (es decir, 10101) en un determinado periodo el control lee el 3er grupo de botones (que corresponden a los botones X, Y, Z y Select). Para volver al modo anterior solo bastaba con mandar un pulso (01) nuevamente.
Solo bastaba saber la conexión de cada pin del conector del control que con una búsqueda rápida en google se encuentra.
En rojo marqué los pines que son de alimentación y el de select.
Una vez comprendido esto hice el programa en Arduino, por qué en Arduino? Por que es la manera mas rápida de poder hacer prototipos de esta clase de proyectos, además me provee un conversor USB-Serie integrado el cual usuaremos en la siguiente parte.
El programa lo que hace es sencillo, se leen las 4 salidas con el Select en 1, luego con el Select en 0 y luego se mandan 3 pulsos con un periodo de 40 microsegundos cada una (20us en 0 y 20us en 1).
Esos datos se guardan en una variable y los saco por el puerto serie dependiendo cada uno de los botones.
El resultado es el siguiente:

Parte 2: La interfaz
Bien, en este punto es donde se me puso complicado el asunto ya que mi idea era hacer un joystick compatible con CUALQUIER juego y no todos soportan ser jugados con joystick (por ejemplo World of Warcraft o juegos viejos de emulador que no detectan los joystick USB).
Buscando una solución al problema se me ocurrió que en vez de ser un joystick sea un teclado con forma de joystick. La ventaja de esto es que cualquier juego se puede jugar con teclado por lo que el problema de compatibilidad queda descartado. La pequeña desventaja es que al presionar un botón estaríamos escribiendo un caracter lo que nos imposibilita movernos y escribir a la vez en un juego online por ejemplo, pero no me interesaba así que me decidí a usar esta opción.
Para lograrlo hay que entender como funciona un teclado USB:

Como se observa en la imagen anterior se envían 8 bytes (paquetes de 8 bits) de los cuales el primero tiene la información de las teclas modificador (Shift, Control, Alt, Windows/Mac), el segundo siempre va vació (no se utiliza) y los siguientes 6 son las teclas que se presionan. Por deducción podríamos decir que se pueden tener hasta 6 teclas presionadas a la vez. Los valores de las teclas vienen dados por una tabla estandarizada del protocolo USB la cual se puede encontrar en el documento "USB HID Usage Tables", capítulo 10 (link al final).
En esta etapa de prueba los pulsadores eran unos botones comunes en un protoboard con sus respectivas conexiones.
El código de esta parte fué lo que mas tiempo me llevó, aproximadamente una semana en poder resolverlo y solucionar todos los errores, ya que a pesar de no ser algo complejo lo que tenemos que manejar son bytes enteros a diferencia de bits que se manejan comunmente. Después de días de escribir, borrar, reemplazar, probar y optimizar logré tener un código funcional. Lo subí a la placa Arduino y lo probé con 6 botones comunes, dando el siguiente resultado:
Seguramente te estarás preguntando como hice para que la pc me detecte la PC como un teclado HID USB y no como una placa Arduino. Para realizarlo tuve que cambiar el firmware (programa controlador) del conversor USB-Serie a TecladoHID-Serie. Si querés mas info al respecto te invito a pasar por mi post POSTBATERIA en el que explico como se logra este cambio de firmware, en ese post transformando el conversor en MIDI-Serie.

Parte 3: El teclado-joystick
Esta parte es sencilla. Se agarra el código del control y se lo agrega al código de la interfaz, modificando algunas lineas para ajustar las conexiones y optimizar código.
Usando la USB HID Usage Table tuve que mapear el joystick con una tecla en cada botón, quedando de la siguiente manera:

El resultado final:
![[IC]Convertí joystick de Sega a uno de PC y te lo muestro [IC]Convertí joystick de Sega a uno de PC y te lo muestro](https://storage.posteamelo.com/assets-adonis/assets/2018/06/13/508.png-w1MQ6qrhBCW.webp)
Parte 4: Certificadas


Links útiles:
Taringa no me deja publicar el post con los links de los códigos, si alguno los quiere mande MP y con gusto se los mando.
Código final: TARINGA! NO ME DEJA PONERLO
Firmware Teclado (para Arduino Mega 2560): TARINGA! NO ME DEJA PONERLO
Firmware Teclado (para Arduino Uno R3): TARINGA! NO ME DEJA PONERLO
USB HID Usage Tables: Click acá
Todos los los archivos de descarga son de mi propiedad y los comparto para su libre uso sin fines de lucro.

Como siempre, un gusto compartir conocimiento.
Espero que les haya sido instructivo, educativo y que les haya gustado el post.
¡No te vayas sin dejar tu comentario!
Espero que les haya sido instructivo, educativo y que les haya gustado el post.
¡No te vayas sin dejar tu comentario!
¡Saludos!