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:
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:
Ref
Description
U2
Un 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.
R1
Résistance de 1.5k. Ordinaire au carbone 1/4 watt.
R2, R3
Résistance de 68 ohms. Ordinaire au carbone 1/4 watt.
D2, D3
Diodes Zener de 3.6 volts.
Y1
Crystal de 12 mhz
C2, C3
Condensateurs de 18 pf. Si votre cristal recommande une autre valeur, utilisez la.
C1
Condensateur de 1 uf. Installer près du ATmega8.
J2
Connecteur 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')
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
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
#
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 manette
Bouton USB
Action haut
1
Action gauche
2
Action droite
3
Touche 1
4
Touche 2
5
Touche 3
6
Touche 4
7
Touche 5
8
Touche 6
9
Touche 7
10
Touche 8
11
Touche 9
12
Touche CLEAR
13
Touche 0
14
Touche ENTER
15
Touches 4 + CLEAR
17
Touches 5 + 0
18
Touches 6 + Enter
19
Touches 2 + 9
20
Touches 2 + 7
21
Touches 0 + 4
22
Touches 0 + 6
23
Touches 4 + ENTER
24
Note: Les boutons USB 17 à 24 ne sont disponible que depuis la version 1.3.
Voici quelques screenshots d'utilisation avec des émulateurs:
OpenEMU
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)
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.