raphnet.net banner

Adaptation d'une manette Intellivision à USB

twitter@raphnetlabs
Contenu: Résumé du projet | Schéma | Firmware | Circuit imprimé pour montage en surface | Fonctionnement | Utilisation | Avertissement

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:


goto top Retour en haut


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-

goto top Retour en haut


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)
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 fonctionalités, rapporter 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 de l'information sur la programmation d'un AVR, visitez ma page sur la programmation d'AVR


goto top Retour en haut


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:

goto top Retour en haut


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é).

goto top Retour en haut


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.

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.

goto top Retour en haut


Les marques de commerce utilisées dans ce site appartiennent à leurs propriétaires respectifs.
Copyright © 2002-2018, Raphaël Assénat
Site codé avecSite codé avec vimDernière mise à jour: 14 octobre 2016 (Vendredi)