Interfaz Puerto Paralelo

#2680

Cómo utilzar el puerto paralelo como decodificador de botones (key encoder)

Cuando conectamos nuestro ordenador a la maca en lugar de utilizar la placa base original (entre otras cosas para usar MAME) necesitamos que los botones y palancas del panel de control de la maca se comuniquen con nuestro PC. En el mercado existen soluciones comerciales tales como la tarjeta IPAC / JPAC distribuidas por Ultimarc. Esta tarjeta se conectan por un lado al conector JAMMA que trae la maca, y por otro se saca un cable hasta el puerto PS/2 del PC. De esta manera al pulsar los botones de la maca o mover las palancas, la tarjeta JPAC recibe esos impulsos, los convierte en señales eléctricas como si provenieran de un teclado, y las manda al puerto PS/2 del PC. De esta manera el PC recibe pulsaciones de tecla, aunque en realidad provienen del panel control de la maca. Esto es lo que se conoce con el nombre de Key Encoder.

El problema está en que estas soluciones comerciales suelen ser caras. Aquí os presentamos un método casero para construirnos un Key Encoder al que por un lado recibe todos los cables que salen del panel de control de la maca (botones y palancas) y por el otro se enchufa al puerto paralelo (el de la impresora) del PC, en lugar de al puerto PS/2 como en el caso del JPAC.

Ventajas del sistema

  • Bajo coste: No se necesitan sino componentes electrónicos simples como son los diodos y un cable de impresora. Se puede construir todo el interfaz por unos 10?, aunque si disponemos ya de algún cable paralelo por casa (cosa común pues las impresoras que se conectaban al puerto lpt han quedado desfasadas), el interfaz queda casi gratis.
  • Reconocido por windows como joystick: Así que podemos usar el panel de control en todos los emuladores y además en casi todos los juegos de pc sin ningún programa extra o configuración extraña.
  • Posibilidad de uso de Joytokey al ser reconocido como un joystick: Lo que nos abre la posibilidad de configuraciones casi ilimitadas, por ejemplo asignarle Alt M F4 a un solo botón para cerrar los emuladores más rebeldes y mover el ratón con nuestro joystick.
  • Elevado número de botones: ¡60!, así que es perfecto para paneles de control de cuatro jugadores.
  • Funcionamiento perfecto sin 'ghosting' ni 'blocking': Nunca tendremos una mala respuesta por rápido que manejemos los botones ni aunque presionemos muchos a la vez. Además, el interfaz es reconoce las pulsaciones a muy alta velocidad, teóricamente hasta unas 66.000 pulsaciones por segundo.
  • Construcción muy sencilla: No necesita de conocimientos de electrónica ni componentes complicados. Incluso no es necesaria ninguna soldadura.
  • NOVEDAD: El interfaz por puerto paralelo es compatible con Windows (98 en adelante), Linux (gracias al driver programado por D_Skywalk) y MS-DOS (Gracias al driver programado por Manofwar).

Inconvenientes

  • Hay que tener un poco de cuidado al ir construyendo el montaje para que todo funcione bien, ¡qué menos!
  • Las placas base modernas están dejando de traer puerto paralelo, así que en un futuro habría que comprar alguna tarjeta de expansión o similar.
  • El driver oficial ppjoy tiene un par de fallos que hacen que la configuración sea un poco más liosa de lo que debería. Además, dicho driver ya no será continuado por su autor. Estando prevenidos no supone ningún problema.

Ante todo agradecer a todos los marcianos que han estado trabajando estas semanas desinteresadamente en la investigación y construcción de este sistema y que me han hecho posible recopilar todos sus conocimientos, imágenes, comentarios, etc para poder llegar a hacer este tutorial que espero sea del agrado de todos, y que se convierta en definitiva en un método sencillo (en pocas horas te lo puedes construir y sin necesidad de conocimientos de electrónica), barato (menos de 3 euros) y eficaz (permite 60 botones!!!) para conectar un PC a una máquina recreativa.

Teoría

Antes que nada vamos a ver en qué se basa este sistema. El puerto paralelo se implementa mediante un conector llamado DB25, que tiene 25 pines numerados.

01.jpg

Según el protocolo de este puerto, los pines 10, 11, 12, 13 y 15 son capaces de enviar datos (corriente eléctrica) y vienen indicados de color rojo en el esquema; mientras, los pines del 1 al 9, y los pines 14, 16 y 17 son para leer datos (si les llega corriente eléctrica) y vienen de color azul en el esquema. El resto de pines, es decir, los pines 18 a 25, no tienen utilidad para nosotros (de color verde en el esquema).

02.gif

Este sistema de selección de canal nos va a permitir lo siguiente: conectar 5 datos al canal 1, 5 datos al canal 2, así hasta el canal 12, con lo que si las matemáticas no nos fallan, podemos realizar hasta 12x5 conexiones, es decir 60. Teniendo en mente las 60 conexiones posibles que permite el puerto paralelo, podemos empezar a hacer todo tipo de combinaciones. Sólo hay que tener en cuenta que cada palanca consume 4 conexiones (una para cada dirección) y cada botón una.

El monedero también actuaría como una conexión más. Así podemos tener p.ej. 1 palanca y 8 botones para cuatro jugadores: 4 + 8 = 12 conexiones por jugador, 12 * 4 jugadores = 48 conexiones. Le podemos añadir el start de cada jugador, y algunos botones más de mantenimiento (p.ej. Escape para salir del juego, P para pausar el juego, Tabulador para entrar en opciones,...). 60 conexiones dan para muchas posibilidades.

Por cierto, ten en cuenta que este esquema que está a la izquierda es una vista anterior del conector DB25, mientras que la imagen anterior es una vista posterior. De ahí a que aparezcan los pines numerados a la inversa.

Para entender más fácilmente el sistema de los 5 datos por canal y los 12 canales, podemos imaginarnos una estructura matricial. En las filas van los 12 canales, y en las columnas los 5 datos de cada canal:

Pin 10 (E) Pin 11 (E) Pin 12 (E) Pin 13 (E) Pin 15 (E)
Pin2(R)
Pin3(R)
Pin4(R)
Pin5(R)
Pin6(R)
Pin7(R)
Pin8(R)
Pin9(R)
Pin1(R)
Pin14(R)
Pin16(R)
Pin17(R)
  • (E) significa que por ese cable se envían datos.
  • (R) significa que por ese cable se leen datos.

El sistema funciona como el juego de los barquitos de toda la vida, se envía una señal (corriente eléctrica) por uno de los cables (E) y se comprueba en cuál de los cables (R) se recibe la misma. Y listos, ya se sabe qué botón se ha pulsado... ¡tocado y hundido!

Una vez que tengamos claro cuántos jugadores podrán usar nuestra maca y cuántos botones tendrá cada uno, solo queda distribuir sus pulsaciones en la matriz del interfaz por puerto paralelo. En este ejemplo, vamos a diseñar un panel para 4 jugadores, con 8 botones para el jugador 1, 8 para el 2, 4 para el 3, 4 para el 4, y start y coin (moneda) para cada uno de los 4. Rellenamos siguiendo cierto orden:

Pin10(E) Pin11(E) Pin12(E) Pin13(E) Pin15(E)
Pin2(R) 1-arriba 1-abajo 1-izquierda 1-derecha 1-boton_1
Pin3(R) 1-boton_2 1-boton_3 1-boton_4 1-boton_5 1-boton_6
Pin4(R) 1-boton_7 1-boton_8 1-start 1-moneda
Pin5(R) 3-arriba 3-abajo 3-izquierda 3-derecha 3-boton_1
Pin6(R) 3-boton_2 3-boton_3 3-boton_4 3-start 3-moneda
Pin7(R)
Pin8(R) 2-arriba 2-abajo 2-izquierda 2-derecha 2-boton_1
Pin9(R) 2-boton_2 2-boton_3 2-boton_4 2-boton_5 2-boton_6
Pin1(R) 2-boton_7 2-boton_8 2-start 2-moneda
Pin14(R) 4-arriba 4-abajo 4-izquierda 4-derecha 4-boton_1
Pin16(R) 4-boton_2 4-boton_3 4-boton_4 4-start 4-moneda
Pin17(R)

Ya tenemos el diseño lógico de nuestro panel de control. Ahora tenemos que entrar en el diseño físico del asunto. Sólo hay que tener en cuenta dos puntos:

  1. Todos los botones de una fila comparten el cable de recepción de datos (R), que llamaremos (mal llamado) 'Tierra'. En nuestro ejemplo, las cuatro direcciones del juegador 1 y su primer botón comparten esa 'Tierra'. Es decir, sólo necesitamos un cable que vaya desde el interfaz al primer micro-interruptor de '1-arriba', de ahí se alarga hasta '1-abajo', etc...
  2. Los cables de envío de datos (E) se dividen para ir a parar a los distintos micro-interruptores utilizando diodos. Estos diodos (tipo 1N4148 o similar) son IMPRESCINDIBLES para evitar el 'ghosting'.

El diseño de esta estructura quedaría como sigue:

3a.jpg

03.jpg

En este ejemplo, para conectar la dirección 'arriba' del jugador uno, utilizaríamos las conexiones superiores de la izquierda. Un cable saldría del lugar marcado como ARRIBA y el segundo desde la conexión ligeramente superior que pone 2.

Dichos cables los conectaríamos al micro-interruptor del modo habitual, uno a la patilla inferior del micro (normalmente llamada tierra del interruptor, masa o común) y el otro a la patilla marcada como 'NO' ('Normally Open' o normálmente abierto en castellano).

Y por último, el diseño real realizado sobre una base de cartón para pruebas, con regletas (¡sin soldaduras!, más fácil imposible):

04.jpg

En la parte superior podemos observar el cableado que termina en el conector DB25 del puerto paralelo.

Todo esto puede parecer así un poco complicado y engorroso, pero nada más lejos de la realidad. Para facilitar las cosas, vamos a mostrar un caso práctico paso a paso, construyendo un panel para un jugador sólamente.

Práctica

Diseñaremos un panel para un jugador que constará de :

  • Una palanca
  • 6 botones
  • 1 botón de start
  • 1 botón para monedas (coin)
  • 1 botón para ESCAPE
  • 1 botón para ENTER
  • 1 botón para PAUSA
  • 1 botón para TABULADOR
  • 1 botón para RESET

Por tanto necesitamos 4 conexiones para la palnca, más 13 para botones. 17 en total.

Lo primero es rellenar la matriz:

Pin10(E) Pin11(E) Pin12(E) Pin13(E) Pin15(E)
Pin2(R) 1-arriba 1-abajo 1-izquierda 1-derecha 1-boton_1
Pin3(R) 1-boton_2 1-boton_3 1-boton_4 1-boton_5 1-boton_6
Pin4(R) 1-start 1-moneda ESCAPE ENTER PAUSA
Pin5(R) TABULADOR RESET
Pin6(R)
Pin7(R)
Pin8(R)
Pin9(R)
Pin1(R)
Pin14(R)
Pin16(R)
Pin17(R)

Siguiendo las reglas básicas, tendremos que:

  • Unir todos las lecturas (R) de cada micro-interruptor del mismo canal. En este caso, uniríamos 1-arriba + 1-abajo + 1-izquierda + 1-derecha + 1-boton_1. Haríamos lo mismo para las lecturas (R) 3, 4 y 5. Es decir, que desde nuestro interfaz hasta el panel de control irían tres cables de lectura de datos, también mal llamadas 'Tierras'.
  • Dividir los cables de envío de datos (E) utilizando diodos para que lleguen a todos los micro-interruptores. En este caso:
    • Los cables 10 y 11 se dividen en 4
    • Los cables 12, 13 y 15 se dividen en 3

05.jpg

Mirando la zona inferior de la imagen vemos el canal de recepción (R) 2 en celeste, el (R) 3 en fuxia y el (R) 4 en amarillo.

En la siguiente foto vemos la construcción de este cableado. Se observa perféctamente el uso de las 'Tierras' comunes si nos fijamos, por ejemplo en el cable amarillo.

06.jpg

Ya solo queda conectar esos cables 21 cables (17 señales ya divididas y 4 'Tierras') al interfaz propiamente dicho. Como cada uno tiene un color diferente, no habrá ninguna problema de confundir los cables.

07.jpg

Al final de la cadena vemos el cable paralelo (conector DB25), esperando a ser conectado al PC para comenzar a jugar... pero antes debemos colocar los 17 diodos.

08.jpg

Y aquí vemos a Lord Hiryu, que fue el primer marciano en experimentar el invento con cara de decir '¡¡¡Bien, esto funciona!!!'. Ese botellín de cerveza y ese bote de ketchup no pueden faltar en la dieta de todo marciano que se precie Carcajada

09.jpg

Pinchamos el conector DB25 en el puerto paralelo, y ya sólo nos queda configurar con una utilidad de Windows las asociaciones de cada botón. Así va quedando la cosa:

10.jpg

Configuración de botones en windows

Bueno, una vez que tenemos todo el tema del cableado resuelto, nos queda lo más sencillo, que es instalar una utilidad llamada PPJoy (Parallel Port Joystick), con la que se le dice la función de cada botón que hemos diseñado en la matriz.

Tras descomprimir lo descargado en una carpeta y ejecutar SETUP.exe quedará instalada la aplicación (Aceptar todos los mensajes como siempre).

Lo primero que vamos a hacer es hacer clic en el icono 'Configure Joysticks' recién creado, y configuraremos los joysticks. Se abrirá una pantalla, y haremos clic en Add para añadir un joystick. Seleccionamos en los menús desplegables los siguiente valores, y entonces pulsamos en el botón Add.

Una vez creado el joystick, lo seleccionamos y pinchamos sobre el botón 'Mapping' para empezar el mapeado de direcciones y botones.

11.gif

12.gif

Ahora viene lo importante del asunto, la definición del número de ejes y botones que queremos en nuetro joystick y el escaneo de las pulsaciones. En nuestro caso, necesitamos dos ejes (eje_x y eje_y) y trece botones. El número de 'POV_HATS', para un panel de control siempre lo dejaremos en cero ya que los 'pov_hats' son los sub-joysticks. Por ejemplo los podemos encontrar en los joysticks para simuladores de vuelo encargados de controlar el sistema de armamento y en el mando 'dual-shock' de Playstation 2.

Lo primero que nos pedirá el programa es que escaneemos los ejes que hayamos asignado. Para ello, presionamos el botón 'Scan' que tenemos al lado de cada dirección (4) con lo que se nos abrirá una ventana que pondrá: 'Reading Joystick Input. Please press/move desired control'. Al presionar la dirección deseada, dicha ventana deberá cerrarse automáticamente y al lado de la dirección mapeada deberá aparecer el código del botón o dirección presionada, por ejemplo 'Digital 2'.

Una vez terminemos con los ejes, le daremos a 'Next' y continuaremos mapeando tantos botones como hayamos definido.

Al acabar el proceso, podemos cerrar la utilidad de configuración del joystick que hemos creado y, a todos los efectos, windows reconocerá el joystick perfectamente. Para comprobar que todo ha ido bien, nos vamos al panel de control de windows y comprobamos dentro de dispositivos de juegos que todo funciona.

13.gif

14.gif

15.gif

Por fin, tenemos el joystick totalmente funcional. A partir de aquí, ya solo nos quedará configurar los emuladores como deseemos. Incluso podemos utilizar joytokey en combinación con nuestro joystick por puerto paralelo. Esto nos brinda la posibilidad de controlar cualquier emulador y aplicación con nuestro joystick arcade.

Particularidades en la instalación del driver

Tanto el interfaz por puerto paralelo como el driver ppjoy han sido ampliamente testeados y funcionan perfectamente. Sin embargo, el driver contiene una serie de fallos menores que hacen que su configuración sea un poco complicada si no somos conscientes de ellos. El driver no se continúa desarrollando y tampoco se va a liberar su código fuente por lo que en principio, estos errores no serán corregidos.

FALLO 1: Mapeo invertido de eje_y

En geometría cartesiana en dos dimensiones (X,Y), lo normal es que el eje X sea la dirección horizontal y el eje Y la dirección vertical. Además, el eje Y negativo es hacia abajo, positivo hacia arriba, el eje X negativo es hacia la izquierda y positivo hacia la derecha.

16.gif

Es decir, que cuando estamos mapeando ejes, lo lógico sería que cuando vamos a escanear 'Y Min' moviésemos la palanca hacia abajo. Pues bien, esto no es así, el eje 'Y' está invertido así que cuando escaneemos 'Y Min' debemos mover la palanca hacia arriba y cuando escaneemos 'Y Max', debemos mover la palanca hacia abajo.

FALLO 2: Separación total de joysticks

Imaginemos por un momento que queremos crear un joystick con 50 botones (para usar en un simulador de vuelo, por ejemplo). Pues bien, esto no es posible con el driver ppjoy ya que tiene una limitación máxima de 30 botones por joystick. Es decir, las primeras 30 entradas sólamente las podrá detectar el joystick 1 y las siguientes 30 el joystick 2.

La solución es bien sencilla, creamos dos joysticks y luego configuramos nuestros juegos y/o emuladores del modo deseado. Simplemente hay que tener en cuenta que en el cableado que se indica en este tutorial es el correcto y está en el orden adecuado. Es decir, que si utilizamos por error el cable 14 para el joystick físico 1, por mucho que intentemos escanear esta entrada en el driver del joystick 1, nunca detectaremos nada. Será necesario que creemos un segundo joystick en el driver para poder interpretar esta entrada 'mal cableada'.

Para mayor complicación, las entradas de datos de ambos joysticks se denominan igual en el driver. Es decir, la primera entrada del joystick 1 se llamará 'Digital 1' y la primera entrada del joystick 2 también se llama 'Digital 1' pese a que físicamente no son lo mismo ni el driver los interpreta como uno, sino como dos.

FALLO 3: Cableado 'caprichoso'

Esto está muy relacionado con el FALLO 2, si nos fijamos en las tablas ya expuestas, vemos que el orden de los cables de envío de datos y el de los de lectura no es consecutivo y es un poco caprichoso:

  • Cables de envío de datos (E): 10-11-12-13-15 (Se salta el cable 14)
  • Cables de recepción de datos (R): 2-3-4-5-6-7-8-9-1-14-16-17 (Orden poco evidente...)

Así que hay que prestar mucha atención al cableado si no queremos acabar con un joystick con 4 botones y otro con 16. Esto no supone ningún problema ya que los emuladores siempre nos brindan muchísimas opciones de configuración, pero si nos lo podemos ahorrar cableando bién todo será más 'elegante'.

Errores comunes y consejo final

Este interfaz ya ha sido construido por bastantes visitantes de la web y está sobradamente comprobado su buen funcionamiento. Así mismo, también hemos comprobado que se suele complicar la construcción si no se va con cuidado. Antes de empezar a construir el interfaz, conviene comprender su funcionamiento, que se trata de una matriz de cables donde unos envían corriente y otros la reciben. Sabiendo qué cable envía la señal y cuál la recibe, se identifica perfectamente el botón pulsado.

Los errores más comunes son, confundir los cables de envío (E) y recepción (R) de señal, colocar los diodos al revés e intentar leer entradas del segundo joystick con el driver del primero.

Conviene, para familiarizarse con la construcción del interfaz y la configuración del driver, avanzar poco a poco y no ponernos a tirar cables como locos. La primera prueba, para ver si somos capaces de identificar correctamente los cables y de instalar el driver debería ser configurar un solo botón, para lo que no nos hace falta ni siquiera diodos solo con unir un cable (E) y un cable (R), windows debería ser capaz de detectar la unión de dichos cables.

Respecto a PPjoy, sabemos que en un montaje de 30 entradas para un jugador, por ejemplo, cuatro han de ser para las direcciones y el resto para botones. Pues bien, una vez asignadas las direcciones seguimos disponiendo de 30 entradas para botones. es decir, si pulsamos en las propiedades del dispositivo de juego veremos como con cada pulsación aparece el detello del botón correspondiente, pero, curiosamente, cuando pulsamos también la palanca se moverá también la cruz en la dirección pulsada y, además, un botón. Esto origina el problema en Mame. Tendrémos que inhabilitar esos botones que parece funcionar a la vez que realizamos movimientos con la palanca. ¿Cómo se hace esto? Pues muy fácil, nos vamos al menú del PPjoy y navegamos por los menús del dispositivo en cuestión buscando los botones que han correspondido a los movimientos de los ejes y los inhabilitamos. Por ejemplo: 8, 10, 12 y 13; buscamos estos botones, pinchamos en la pestañita y navehgamos hasta el final de la lista y damos a "no funcion" (o algo así, es que no tengo el programa delante), y ya está.

Material Extra

Agradecimientos

Este sistema es una realidad. Algunos marcianos de nuestra comunidad ya están disfrutando de él. Pero esto ha sido posible gracias a una larga investigación, pruebas, comentarios, etc, de muchos marcianos:

  • Lord Hiryu por ser el primero en hacerlo realidad y por sus diseños
  • Quark, Skip, Macarro, Cangrejo, etc, etc, por sus sinfines de preguntas y respuestas sobre el tema.

Que lo disfutéis...

Fallos y soluciones

Al mover el joystick del jugador 2, también se mueve el jugador 1.

Problema original, aquí.

Tras revisar el cableado y comprobar que estaba todo en orden, se descubrió que el fallo provenía de las interferencias generadas por la televisión que pasaba por encima de los cables del IPP. Para solucionarlo, basta con 'apantallar' los cables con alguna clase de metal, una tubería de cobre, una manguera de ducha... también se puede buscar una ruta alternativa para los cables.

Playjodete, Bubu y Macarro

Publicidad