Por puerto USB (2)

De WikiNES-77
Saltar a: navegación, buscar

La idea

Cuando se juega a juegos de NES y SNES con un emulador lo mejor es usar siempre el mando original

Mucha gente como yo ha sido feliz con adaptadores por paralelo pero hoy en día estos conectores son más y más raros. USB es ahora el futuro de estos dispositivos y por esto he decidido hacerme mi propio adaptador SNES/NES a USB.

El problema de esto que el adaptador USB es mucho más complicado.

NOTA: Aquí puedes ver una versión para 4 adaptadores de NES o SNES.


Actualizaciones

Marzo 7, 2007

  • Nuevo esquema para la rev D disponible. Arregla errores de la revisión C (el conector PD1 y PD0 deben estar conectados juntos, no PD1 y PD2!)

Diciembre 3, 2006

  • Nuevo firmware v1.4: Arreglado un problemas en modo NES que hacía que windows detectara la placa. Eso es lo que pasa por testearlo sólo en linux.
  • Se añade soporte para mandos estilo Atari. Más detalles aquí.

Octubre 29, 2006

  • Nuevo firmware v1.3: Arreglado un problema que ocurre cuando ningún mando esta conectado, mejora el soporte al mando NES y soporte para la placa C.
  • Nueva placa rev C: Los diodos ahora tienen un lugar para ser soldados y la placa es un poco más pequeña.

Octubre 2, 2006

  • Nuevo firmware v1.2: Añade soporte del ratón de SNES. En modo SNES el ratón se autodetecta. Los 3 niveles de sensibilidad del ratón son seleccionable manteniendo pulsado los botones cuando se conecta el cable USB.

Julio 12, 2006

  • Me gustaría ver como se hacen otros proyectos. Envíame las fotos y las pondré en su sección.

Julio 11, 2006

  • Añadidas fotos y liberación el firmware 1.1, el cual va mejor en Windows y MacOS X.


Introducción

Manusb21snesusb component1.jpg

He creado mi adaptador usando un ATmega8 de Atmel. Este microcontrolador no soporta USB en hardware con lo que hay que usar un drivers only-USB de Objective Development. Este driver permite a un microcontrolador AVR como el ATmega8 "hablar USB" con unos componentes mínimos. Gracias a esto, el interface puede ser barato y fácil.

Dependiendo de tu habilidad, podrías crear el interface usando como componentes una placa de breadboard y un thru-hole o una versión montada sobre la superficie con la foto que doy. También vendo componentes hechos y un Atmega8 preprogramado.

No se necesita driver. Eso es así, desde que se definieron las clases USB del standard USB. Estoy usando el HID (Human Input Device) el cual me permite decirle al computador que el dispositivo USB conectado es un joystick y tiene 2 ejes y 4/8 botones. Otra buena cosa sobre esto es que el adaptador debería de funcionar en todos los SO que soporten dispositivos HID.


Esquema

Foto:

Manusb2sch-revD.png


Una versión en pdf esta también disponible (se puede ver e imprimir más fácilmente): sch-revD.pdf

Lista de Componentes:

  • U2: Microcontrolador Atmega8 . ATMEGA8-16PC, ATMEGA8-16PI, ATMEGA8-16PJ oATMEGA8-16PU. No usar ATMEGA8L-*, El reloj de 12Mhz es muy alto.
  • R1: Resistencia 1.5k . La capa de 1/4 de vatio con carbón ordinario deberían valer.
  • R2, R3: Resistencia de 68 ohm. La capa de 1/4 de vatio con carbón ordinario deberían valer.
  • D2, D3: Diodo zener de 3.6 voltios.
  • R4: No instalar, no se usará más.
  • D1: No instalar, no se usará más.
  • Y1: Cristal 12 Mhz.
  • C2, C3: Condensadores 27pf. Si la ficha del cristal pone otro valor utilízalo.
  • C1: Condensador 10uf. Instalarlo cerca del ATmega8.
  • JP1, JP2: Jumpers. Puedes usar también switches de máquinas, switches o soldaduras.
  • J2: De 6 pines, con 2.54mm de espaciado. Se necesita para la programación del ATmega8.

Para la conexión USB, sólo coge el cable USB y suelda los cables directamente a la placa. Usa cable de colores standard:

Color	Descripción
Rojo	+5 voltios
Negro	  Tierra
Verde	   D+
Blanco	   D-


Esquemas anteriores de revisiones:


Programando el microcontrolador

Un microcontrolador es un componente que debe de ser programado para hacer algo útil. Aquí está el archivo hexadecimal que debe ser subido al microcontrolador:

nes_snes_db9_usb-1.7.hex

  • Detección automática de 6 botones en Genesis/Mega Drive
  • El botón MODE de Genesis/Mega Drive es ahora usable.
  • Soporte para Multi-Pad de Sega (testeado sólo con MK-1654) (Información Técnica en inglés)
  • Añadido soporte a mando TGFX

nes_snes_db9_usb-1.6.hex

  • Cambiado los IDs de los botones. Los mandos de Atari y SMS fueron preparados para usar los botones 2 y 3 pero algunos emuladores necesitan el botón 1.
  • Añadida una forma para forzar el modo 6 botones en los mandos de MegaDrive. En el caso que los 6 botones no sean detectados, mantiene pulsado "Start" cuando conectes el cable USB para usar esta característica.

nes_snes_db9_usb-1.5.hex

  • Añadido soporte para mandos de 3 y 6 botones de Genesis/MegaDrive.
  • Todos los mandos DB9 (Genesis/MegaDrive 3/6, SMS, Atari style 1 o 2 botones y compatibles) se autodetectan.
  • El cableado es ahora diferente para los mandos de DB9. Así es más fácil cablear a la placa multiuso.
  • Mandos de NES se detectan en modo SNES, esto hace que funcione como en los mandos de Nintendo. Si tienes problemas con los clones usa sólo originales.
  • El proyecto se lanza con licencia GPL v2.

nes_snes_db9_usb-1.4.hex

  • Se añade soporte para joysticks Atari (Atari, Commodore, etc). Se soportan dos variaciones de botones.
  • Se añade el reporte de la descripción. Esto hace que funcione bajo Windows.

nes_snes_db9_usb-1.3.hex

  • Arreglado un error que da al botón de cambiar sin ningún mando conectado.
  • Ahora el Modo NES tiene su propio ID.
  • PD1 se deja en la entrada (y no sale hacia arriba) porque PD1 y PD0 se deben cortocircuitar en la placa C.

nes_snes_db9_usb-1.2.hex

  • Añadido soporte al ratón de SNES.

nes_snes_db9_usb-1.1.hex

  • Se reconstruye el descriptor para un mejor comportamiento en Windows y MacOS X.

snes_nes_usb-1.0.hex

  • Primera versión.

Muchos microcontroladores tienen algo llamado "Fuse Bytes/Bytes de Fusible". En el caso del ATmega8 hay 2 bytes: El byte alto y el bajo. Estos byte se usan para configurar algunos aspectos del microcontrolador. Que tipo de reloj usa, cristal, resonador, reloj interno RC, si se permite configurar via ISP... es muy importante fijar estos datos con los valores correctos. Si se usan datos erróneos puedes dejar a tu MCU inservible.

Para este proyecto, aquí están los valores apropiados para los fusibles: byte alto = 0xc9, byte bajo = 0x9f

Para detalles de como programar en AVR, visita este link.


Código Fuente

Para aquellos que quieran modificar el dispositivo o soportar otros mandos, aquí esta el código fuente. Desde la versión 1.5 se lanza bajo licencia GPL v2. Las demás se lanzan bajo Objective Development license que es GPL + extensiones para cubrir el Hardware. Ver License.txt para más información.


nes_snes_db9_usb-1.7.tar.gz

  • Detección automática de 6 botones en Genesis/Mega Drive
  • El botón MODE de Genesis/Mega Drive es ahora usable.
  • Soporte para Multi-Pad de Sega (testeado sólo con MK-1654) (Información Técnica en inglés)
  • Añadido soporte a mando TGFX

nes_snes_db9_usb-1.6.tar.gz

  • Cambiado los IDs de los botones. Los mandos de Atari y SMS fueron preparados para usar los botones 2 y 3 pero algunos emuladores necesitan el botón 1.
  • Añadida una forma para forzar el modo 6 botones en los mandos de MegaDrive. En el caso que los 6 botones no sean detectados, mantiene pulsado "Start" cuando conectes el cable USB para usar esta característica.

nes_snes_db9_usb-1.5.tar.gz

  • Añadido soporte para mandos de 3 y 6 botones de Genesis/MegaDrive.
  • Todos los mandos DB9 (Genesis/MegaDrive 3/6, SMS, Atari style 1 o 2 botones y compatibles) se autodetectan.
  • El cableado es ahora diferente para los mandos de DB9. Así es más fácil cablear a la placa multiuso.
  • Mandos de NES se detectan en modo SNES, esto hace que funcione como en los mandos de Nintendo. Si tienes problemas con los clones usa sólo originales.
  • El proyecto se lanza con licencia GPL v2.

nes_snes_db9_usb-1.4.tar.gz

  • Se añade soporte para joysticks Atari (Atari, Commodore, etc). Se soportan dos variaciones de botones.
  • Se añade el reporte de la descripción. Esto hace que funcione bajo Windows.

nes_snes_db9_usb-1.3.tar.gz

  • Arreglado un error que da al botón de cambiar sin ningún mando conectado.
  • Ahora el Modo NES tiene su propio ID.
  • PD1 se deja en la entrada (y no sale hacia arriba) porque PD1 y PD0 se deben cortocircuitar en la placa C.

nes_snes_db9_usb-1.2.tar.gz

  • Añadido soporte al ratón de SNES.

nes_snes_db9_usb-1.1.tar.gz

  • Se reconstruye el descriptor para un mejor comportamiento en Windows y MacOS X.

nes_snes_db9_usb-1.0.tar.gz

  • Primera versión. Soporte para Snes y Nes.

Por favor contacta conmigo en raph@raphnet.net si tienes alguno cambio útil.


Modificaciones de Objective Development driver

La selección del modo mediante jumpers para NES/SNES cambian el reporte del descriptor HID. Tuve que cambiar el driver de Objective Development para que funcionara. Aquí hay un diff del driver para el HIDKeys.2006-03-14:

usbdrv-diff


USB Vendor ID/Product ID pair

Porfavor no re-uses mi par VID/PID para deribar o para nuevos proyectos. Compré mi par VID/PID de mecanique, y son mucho más baratos que los 2000$ que cuesta conseguir un ID de vendedor desde el Forum de implementadores USB.


Placa para la versión montada en la superficie

Manusb2snesusb revC pcb.jpg

La placa rev C tiene muchas ventajas:

  • Muy pequeña (sobre 1"1/4 x 3/4" o 32mm x 20mm).
  • Encaja dentro de tuberías de 3/4 de pvc. Ideal para instalar en línea con un conector USB.
  • Puede ser instalada directamente dentro de un mando de NES o SNES.
  • Menos cables para soldar dentro del interface. Esto la hace más fácil de montar.
  • Parece más profesional.
  • Puedes usar la placa para otros propósitos (Después de todo no tienes más que una MCU re-programable con un USB y pines de E/S)

Por otro lado la superficie soldada por los componentes montados es más dura si no tienes materiales adecuados o eres un principiante.

Aquí hay una lista de cosas de la placa rev.C:

Manusb2pcb revC composite.png

Como referencia, aquí esta la vista general de la placa B: snes_nes_usb_pcb_revB.png

Aquí estan los archivos Gerber para que te construyas tu propia PCB:


Ensamblaje de la versión montada en superficie (rev.C)

Paso 1: Usa la visión, el esquema y la lista de componentes para descubrir donde esta cada componentes. Soldar todo en el lugar correspondiente y tratar con cuidado la placa. IMPORTANTE: Soldar un puente entre PD1 y PD0 (ver foto).

Paso 2: Usa el diagrama apropiado para soldar el USB, ISP y los cables del mando/joystick en los sitios correctos. El cable ISP puede ser creado con un cabecero de 2x3 y una pieza de cable llano. El número de los pin en el diagrama casa con el Standard Atmel de 6 pines AVR ISP.

Manusb2snes nes usb pcb isp pins.jpg


Paso 3: Si vas a usar un mando de NES, cierra JP1 con un puente soldado o una pequeña pieza de cable. Para mandos DB9, cierra JP1 y JP2. Mira las fotos como ejemplos.

Manusb2solder mode select0.jpgManusb2solder mode select1.jpg


Paso 4: Conecta los cables ISP y USB. Usa tu programador para subir el archivo hex al ATmega8. Para acabar ajusta los valores de los fusibles (byte alto=0xc9, byte bajo=0x9f).

Paso 5: Testea el adaptador con un juego. Si lo has hecho bien, puedes quitar el cable ISP si no planeas cambiar el firmware. Ahora encuentra una forma de proteger la placa. Si puedes ponla dentro de una caja pequeña, una pieza de tubería de PVC o lo que sea. También añade añadiendo pegamento caliente cerca de los cables que sueldas en la placa protegerás los cables de roturas cerca de los puntos de soldadura.

Paso 6: Diviértete.


Ensamblaje de la versión montada en superficie (rev.C) (rev.A and rev.B)

Paso 1: Usa la visión, el esquema y la lista de componentes para descubrir donde esta cada componentes. Soldar todo en el lugar correspondiente y tratar con cuidado la placa.

Paso 2: Usa la foto de la izquierda para soldar el cable USB y el ISP. El cable ISP puede construirse con una cabeza de 2x3 y un trozo de cable plano. Puedes ver el paso completo en las fotos.

Manusb2snes nes usb pcb isp pins.jpg Manusb2snesusb isp1.jpg


Paso 3: Si vas a usar un mando de NES, cierra JP1 con un puente soldado o una pequeña pieza de cable. Mira las fotos como ejemplos.

Manusb2solder mode select0.jpg Manusb2solder mode select1.jpg


Paso 4: Conecta los cables ISP y USB. Usa tu programador para subir el archivo hex al ATmega8. Lo siguiente es ajustar los valores de los fusibles (byte alto=0xc9, byte bajo=0x9f). Ahora testea todo reconectando el cable USB. Fíjate en las luces cuando reconectas el cable USB. En modo SNES (JP1 abierto), el led debería parpadear 2 veces. En modo NES (JP1 cerrado), el led solo parpadeará una vez.

Manusb2led.jpg


Paso 5: Conecta tu mando de NES o SNES como en la foto y mira el esquema para ver los pines del mando de NES o SNES. Puedes quitar el cable ISP si no planeas cambiar el firmware.

Manusb2snes nes usb pcb gamepad pins.jpg


Paso 6: Testea el adaptador con un juego. Si va todo bien, el siguiente paso es proteger la placa. Si puedes ponla dentro de una caja pequeña, una pieza de tubería de PVC o lo que sea. También añade añadiendo pegamento caliente cerca de los cables que sueldas en la placa protegerás los cables de roturas cerca de los puntos de soldadura.

Paso 7: Diviértete.


Fotos y pantallazos

Mi primer prototipo, fue construido con una breadboard y componentes thru-hole:


Fotos de la superficie y la version montada:



Fotos de los usuarios

Me ha gustado como otros han creado su adaptador. Porfavor envíame tus fotos y las pondré. Tobias Schulte, de Alemania, me envió esto:


Tjerk Kuperus lo construyó así y mi mando tipo arcade para SNES en una simple placa:


Andreas Kronawetter, de Austria, lo construyó dentro de un mando de NES:


JP de Holanda hizo un mando usb de SNES:


Responsabilidad

No puedo ser responsable de posibles daños que pudieran ocurrirte a ti o a tu equipo mientras haces algo de esta página. Además, NO DOY NINGUNA GARANTÍA de la corrección o de la usabibilidad de la información de esta página. Tengo que decir todo el procedimiento ha funcionado en mi caso sin problemas o daños.

Ahora no puedes decir que no te avisé si algo va mal.



Agradecimientos: Texto extraído de aquí (2008-07-23).