Adaptation d'une manette Intellivision à USB

Résumé du projet

On m'a demandé d'essayer de convertir une manette d'Intellivision 1 à USB et j'ai relevé le défi. Le résultat final est visible sur la photo à gauche.

Une partie amusante de ce projet a été d'avoir à découvrir le fonctionnement de la manette moi même. En effet, mes recherches ne m'ont pas permis d'obtenir de l'information pertinante sur le fonctionnement de la manette. Mais ne vous en faites pas, j'ai au moins pris le temps de documenter son fonctionnement dans la section fonctionnement.

Les caractéristiques principales du résultat sont:
  • Les 16 directions (+ la position centrale) du disque sont fonctionnelles
  • Les 12 boutons "Téléphone" fonctionnent
  • Les 4 boutons sur les côtés fonctionnent (Mais les deux boutons supérieurs sont équivalents)
  • Pas de pilotes nécéssaires. L'adaptateur est conforme au standard USB HID (Human Input Device)




Schéma

Voici le schéma:
schéma
Une table faisant correspondre les numéros de fils avec des couleurs est donnée dans la section Fonctionnement.

Important:
Ces numéros de fils sont pour les manette d'Intellivision 1 seulement! Pour le moment, je n'ai aucune idée du câblage des autres manettes similaires. Si vous souhaitez essayer avec une autre manette, je vous suggère d'utiliser l'information de la section fonctionnement pour comparer avec votre manette. N'oubliez pas de me faire connaître vos résultats!

Liste des composantes:
RefDescription
U2Un microcontroleur ATmega8. ATMEGA8-16PC, ATMEGA8-16PI, ATMEGA8-16PJ ou ATMEGA8-16PU. Ne pas utiliser un ATMEGA8L-*, car l'horloge de 12Mhz dépasserait la limite.
R1Résistance de 1.5k. Ordinaire au carbone 1/4 watt.
R2, R3Résistance de 68 ohms. Ordinaire au carbone 1/4 watt.
D2, D3Diodes Zener de 3.6 volts.
Y1Crystal de 12 mhz
C2, C3Condensateurs de 18 pf. Si votre cristal recommande une autre valeur, utilisez la.
C1Condensateur de 1 uf. Installer près du ATmega8.
J2Connecteur 2x3 (6 broches), espacement 2.54mm. Pour la programmation du ATmega8.

Pour la connection USB, simplement dénuder un cable USB et souder les fils directement sur le circuit. USB utilise des couleurs de fils standardisés, mais faites attention, il y a parfois des exceptions.

Couleur Description
  Rouge +5 volts
  Noir Ground
  Vert D+
  Blanc D-



Firmware

Les micrôcontroleurs sont des composantes qui doivent être programmés pour qu'elles fassent quelque chose d'utile. Vous trouverez les fichiers .hex à programmer dans le tableau ci-dessous. (Note: Les fichiers se terminant par .m168.hex sont destinés au Atmega168, les autres au Atmega8.

Le code source est disponible sous licence GPL et se compile avec avr-gcc. Pour éviter des conflits, veuillez ne pas distribuer de versions où le report descriptor a été modifié sans d'abord remplacer le Vendor ID et Product ID par les vôtres.

Version 1.3
7 octobre 2016 (Vendredi)
  • Ajout du support pour la pression simultanée des boutons 1 et 9
  • Ajout de boutons USB supplémentaires (contrôlés par diverses combinaisons de boutons)
  • Nouveau VID/PID USB
  • Nouveau nom de périphérique (Maintenant 'Intellivision controller')
Fichier(s):
intellivusb-1.3.tar.gz (68.7 KB)
intellivusb-1.3.hex (8.6 KB)
intellivusb-1.3.m168.hex (8.9 KB)
Afficher les versions précédentes
Version 1.2
16 septembre 2016 (Vendredi)
Ajout du support des puces Atmega168
Fichier(s):
intellivusb-1.2.tar.gz (68.6 KB)
intellivusb-1.2.hex (8.1 KB)
intellivusb-1.2.m168.hex (8.4 KB)
Version 1.1
11 février 2016 (Jeudi)
Maintenance: Corrige la compilation avec les version modernes de gcc-avr
Fichier(s):
intellivusb-1.1.tar.gz (67.3 KB)
intellivusb-1.1.hex (8.2 KB)
Version 1.0
1 mars 2008 (Samedi)
Première version
Fichier(s):
intellivusb-1.0.tar.gz (72.8 KB)
intellivusb-1.0.hex (8.7 KB)
Ce projet est aussi disponible sur GitHub!
Pour suggérer de nouvelles fonctionnalités, signaler un problème ou contribuer au projet, vous pouvez m'écrire ou utiliser le dépôt GitHub:
https://github.com/raphnet/intellivusb
Plusieurs microcontrôleurs possèdent quelque chose qu'on appelle 'Fuse bytes'. Il s'agit de valeurs numériques qui servent à configurer certains paramètres du microcontrôleur (ex: Quel type d'horloge? Crystal? Résonateur? Oscillateur RC interne? Permettre la programmation par ISP?)
Il est impératif de configurer les fuse bytes avec les bonnes valeurs. L'utilisation de mauvaises valeurs peut rendre le microcontrôleur inutilisable.

Pour ce projet, voici les bonnes valeurs:
  • Pour Atmega8: High byte = 0xc9, low byte = 0x9f
  • Pour Atmega168: High byte = 0xd5, low byte = 0xd7, extended byte = 0x01

Pour de l'information sur la programmation d'un AVR, visitez ma page sur la programmation d'AVR




Circuit imprimé pour montage en surface

La version en montage en surface utlise mon circuit imprimé Multiuse PCB2. Voici à quoi ce projet ressemble lorsque ce circuit est utilisé:
Multiuse PCB2:
Câblage pour Intellivision 1:



Fonctionnement

Au début du projet j'ai cherché sur le net pour de l'information concernant le fontionnement de la manette mais je n'ai rien trouvé d'utile. J'ai donc du découvrir le fonctionnement moi même. Ce fut bien intéressant. Voici donc comment la manette fonctionne. (D'après mes observations).

La manette possède 12 boutons placés comme sur un clavier de téléphone, 4 boutons sur les côtés (Les boutons supérieurs de chaque côté sont équivalents), et un disque rotatif.

La manette que j'ai utilisé (Intellivision 1) possède 9 conducteurs et le connecteur est prévu pour être branché à l'intérieur de la console. Voici une table associant les couleurs et les numéros de fils:
Intellivision 1

Intellivision 1

#Couleur
1 Brun
2 Rouge
3 Orange
4 Jaune
5 Vert
6 Bleu
7 Violet
8 Gris foncé
9 Gris pâle

Considérant qu'il y a seulement 9 fils et qu'il n'y a pas d'électronique dans la manete, il est évident que les boutons sont organisés sous forme de matrice. Il faut donc en faire le balayage en logiciel. Voici un tableau montrant la relation entre les fils et les boutons:


Le disque détecte 16 directions différentes. La direction actuelle est transmise en utilisant 6 fils (#2 à #6, #1 commun). On constate que ces fils entrent en conflit avec ceux du clavier 'téléphone'. Ces pourquoi les 12 boutons 'téléphone' ne peuvent pas être utilisés en même temps que le disque. On remarque qu'il y a toujours qu'un seul bit qui change entre les directions adjacentes. Cela vous rappelle le code Gray?

Lorsqu'aucun des fils #2 à #6 est relié au fil 1, le disque est à la position de repos (Aucune direction/Centré).



Utilisation

L'adaptateur apparaît comme joystick HID standard. Les boutons sont assignés ainsi:

Bouton manetteBouton USB
Action haut1
Action gauche2
Action droite3
Touche 14
Touche 25
Touche 36
Touche 47
Touche 58
Touche 69
Touche 710
Touche 811
Touche 912
Touche CLEAR13
Touche 014
Touche ENTER15
Touches 4 + CLEAR17
Touches 5 + 018
Touches 6 + Enter19
Touches 2 + 920
Touches 2 + 721
Touches 0 + 422
Touches 0 + 623
Touches 4 + ENTER24

Note: Les boutons USB 17 à 24 ne sont disponible que depuis la version 1.3.


Voici quelques screenshots d'utilisation avec des émulateurs:

OpenEMU

OpenEMU

jzintv-1.0 beta 4 (Linux)

jzintv-1.0 beta 4 (Linux)



Pour jzintv, voici un fichier kbdhack qui assigne les boutons de l'adaptateur correctement. Spécifiez le chemin d'accès à ce fichier via l'option --kbdhackfile de la ligne de commande.

  • Adaptateur version 1.3 et plus: hackfile.txt (4 + Clear: Pause, 5 + 0: Reset, 6 + Enter: Quitter)
  • Adaptateur Version 1.2 et moins: raphnet.map
Sous jzintv-1.0-beta4, j'obtenais toujours le message d'erreur Fatal error (argument too long?) parsing kbdhackfile. J'ai fait un petit patch pour résoudre le problème: jzintv-1.0-beta4-kbdhack-patch.diff
(Note: Le problème est résolu dans les versions dites Current Stable Dev Version)

Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.