まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Joystick d'Arcade USB -1-

atmega8.pngOn m'avait déjà parlé de ces bestioles appelées microcontrôleur (µC), mais je ne m'y étais pas intéressé plus que ça…
Disons que les applications qu'on peut fabriquer avec, sans être dénuées d'intérêt m'ont paru inintéressantes… elles ne me faisaient pas rêver…
Peut-être que mes cours d'électronique pas sexy du tout et parfois de 9H d'affilées sur le µC MC68HC11 ne m'ont pas laissés un si bon souvenir…
Mais c'était avant que je découvre qu'on pouvait concevoir autre chose que de lugubres applications industrielles sans âmes, comme par exemple faire des périphériques USB !!
J'ai trouvé le concept simplement fascinant, entrainant tout un tas de possibilités ^^
Preuve encore une fois, que c'est lorsqu'on est intéressé qu'on met en œuvre les choses… Il ne faut alors pas s'étonner, quant la pédagogie est nulle ou que la matière ne nous intéresse pas, de se retrouver avec des notes assez basse à l'école…
Aujourd'hui je pense qu'il y a plein de choses à bidouiller qui devraient intéresser les élèves, si tant est que l'informatique soient déjà un hobby…

ps3-soul-caliber-iv-joystick.png Bref, ma dernière lubie, fabriquer un joystick d'arcade pour l'ordinateur ou pour tout autre appareil compatible USB (Console PS3, etc)
Un truc dans ce genre là :

Après quelques recherches, j'ai trouvé ces deux sites que sont l'excellent raphnet.net qui en plus de donner schéma et sources, vends ses créations en kit ou tout assemblés à destination des non bidouilleurs.
Et également la page de denki.world3.net sur laquelle j'étais passé, d'abord sans y faire attention, puis redirigé dessus à grand renfort de «c'est ça qu'il te faut !!» (merci Toons)
Je vais donc réaliser ces montages pour disposer du circuit électronique permettant de faire l'interface entre le joystick et ses boutons avec l'USB.


Principe :

Une architecture USB est construite autour d'une puce Atmel (µC atmega8) contenant un descripteur USB HID (c'est à dire qui ne requiert pas de driver pour l'ordinateur) et les fonctions d'une manette de jeux.

Comment est-ce possible ??
Tout simplement grâce à un programme chargé dans la puce… Aie, et c'est là que c'est compliqué… Je sais pas programmer !!! Et pi programmer quoi ?? Ça n'a aucun rapport avec la programmation d'un logiciel pour ordinateur… Mis à part le langage de programmation qui est en commun, puisque c'est du «C».

En fait le µC contient plein de fonctions (port, oscillateur, registre, eeprom… voir le «Block Diagram» page 3 de la datasheet en fichier attaché à ce billet) qu'il faut programmer en leurs demandant de se causer entres-elles pour effectuer une tâche particulière…
J'en dirais pas plus, c'est des trucs d'électronicien hardcore… Peut-être qu'un jour je m'y mettrais sérieusement afin de faire mes propres programmes.
Fort heureusement, le programme qui nous intéresse est fournit avec le schéma, et il est compilé en plus !

Réalisation du programmateur :

Avant toute chose donc, il va nous falloir de quoi programmer le µC avec le fichier compilé.
Pour cela il nous faut un programmateur qu'on va devoir fabriquer (à défaut d'en acheter un) et un logiciel qu'on va installer sur un ordinateur muni d'un port parallèle (port imprimante).
Voici le schéma du programmateur stk200 (interface port parallèle-ISP) et la liste des principaux composants :
stk200.png
- 1 Connecteur DB25 mâle
- 1 Circuit intégré 74HC244
- 1 Condensateur 100nF
- 1 Résistance 100k Ohm
- 1 Diode 1N4148

Avec ce genre de bidouille, il vaut mieux tout câbler au plus court, ainsi j'ai coincé une carte à trou directement sur le connecteur DB25 mâle et relié tout le circuit avec des fils…
dsc07357.jpg dsc07360.jpg
dsc07359.jpg

À défaut de pouvoir souder les composants sur une véritable carte epoxy gravée (çf. Illumination Stargate Atlantis, 4 - Fabrication de la carte Electronique), l'utilisation d'une carte à trou nécessite d'être rigoureux lors du câblage, et de tout checker avant utilisation. On évite ainsi d'oublier quelques connexions au passage…
À la vérif j'en avais oublié deux et en avais inversé deux autres…

Le programmateur est terminé, reste à installer le logiciel de programmation sur Ubuntu.

  • Il s'agit d'AVRdude
sudo apt-get install avrdude


Réalisation du montage sur plaquette labo :

Il est temps d'effectuer le montage qui nous intéresse.
Ici celui de denki.world3, que j'ai pris soins de modifier, le connecteur USB dessiné pouvant prêter à confusion !
denki.world3.png

Suffit de câbler tous les composants sur la plaquette et de faire les connexions avec des fils
dsc07354.jpg

Premiers tests :

Pour valider le programmateur, on va le connecter sur le µC comme indiqué par le schéma, en utilisant le connecteur ISP.
Il s'agit donc de connecter le fil MISO du programmateur sur la pin 18 de l'atmega8, MOSI sur 17, SCK sur 19, RESET sur 1, VCC sur la pin 1 de l'USB et GND sur la pin4 de l'USB.
dsc07353.jpg Puis de brancher de connecteur DB25 du programmateur sur le port imprimante de l'ordinateur, et… d'alimenter le µC et le programmateur !!
Pour faire simple on va brancher le connecteur USB sur l'ordinateur pour qu'il alimente le µC et au travers du connecteur ISP, le programmateur.
On peut alors vérifier entre les pin 10 et 20 du CI (74HC244) du programmateur si on a bien 5V, et entre les pin 7 et 8 du µC (atmega8) également.

  • Dans un terminal la commande suivante va afficher les dernier évènements de l'ordinateur.
dmesg

Elle donne :

[  466.216025] usb 5-1: new low speed USB device using uhci_hcd and address 2
[  466.336065] usb 5-1: device descriptor read/64, error -71
[  466.560034] usb 5-1: device descriptor read/64, error -71
[  466.776021] usb 5-1: new low speed USB device using uhci_hcd and address 3
[  466.896020] usb 5-1: device descriptor read/64, error -71
[  467.120060] usb 5-1: device descriptor read/64, error -71
[  467.336023] usb 5-1: new low speed USB device using uhci_hcd and address 4
[  467.744041] usb 5-1: device not accepting address 4, error -71
[  467.856024] usb 5-1: new low speed USB device using uhci_hcd and address 5
[  468.264027] usb 5-1: device not accepting address 5, error -71
[  468.264055] hub 5-0:1.0: unable to enumerate USB device on port 1

Le montage électronique est bien vu par l'ordi, mais il lui est inconnu !
Normal, le µC ne contient pas encore de programme.

Maintenant on va tester si le programmateur fonctionne, et donc s'il voit le µC qui lui est connecté par l'ISP.

  • Par exemple en lisant la mémoire flash de l'atmega8
sudo avrdude -p atmega8 -P /dev/parport0 -c stk200 -U flash:r:-:i -E noreset

Ce qui devrait répondre ainsi :

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9307
avrdude: reading flash memory:

Reading | ################################################## | 100% 2.66s

avrdude: writing output file "<stdout>"
:00000001FF

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Super !! Ça fonctionne !

Un peu d'explications :
sudo, car on a besoin d'accéder à la ressource matérielle du port parallèle.
-p atmega8, indique le modèle de µC.
-P /dev/parport0, spécifie le port sur lequel est connecté le programmateur (port parallèle).
-c stk200, indique le nom du programmateur.
-U flash:r:-:i -E noreset, pour s'adresser à la mémoire flash du µC en mode lecture.


Programmation de la puce :

Reste à programmer le µC pour y mettre le fichier .hex donné par le site denki.world3.net.
(fichier contenu dans JoystickControllerV1.1.zip recopié en annexes de ce billet)

  • Programmer un fichier HEX dans la mémoire flash
sudo avrdude -p atmega8 -P /dev/parport0 -c stk200 -Uflash:w:/chemin vers le fichier/Arcade_Joystick.hex

Ce qui renvoie :

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/home/makoto/Arcade_Joystick.hex"
avrdude: input file /home/makoto/Arcade_Joystick.hex auto detected as Intel Hex
avrdude: writing flash (2226 bytes):

Writing | ################################################## | 100% 0.93s

avrdude: 2226 bytes of flash written
avrdude: verifying flash memory against /home/makoto/Arcade_Joystick.hex:
avrdude: load data flash data from input file /home/makoto/Arcade_Joystick.hex:
avrdude: input file /home/makoto/Arcade_Joystick.hex auto detected as Intel Hex
avrdude: input file /home/makoto/Arcade_Joystick.hex contains 2226 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.76s

avrdude: verifying ...
avrdude: 2226 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Bien, c'est fini ??
Un nouveau dmesg montrera que le montage USB est toujours inconnu…
Il manque une étape cruciale, la programmation des bits fusibles.
En effet, sans cela l'oscillateur @12Mhz du montage ne sera pas pris en compte par le µC qui continuera d'utiliser son oscillateur interne.

denki.world3 nous indique en fichier texte que les bit fusibles doivent recevoir les valeurs 0xc9 et 0x9f.

  • On fait cela avec la commande suivante :
sudo avrdude -p atmega8 -P /dev/parport0 -c stk200 -Uhfuse:w:0xc9:m -Ulfuse:w:0x9f:m

Ce qui donne :

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xc9"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xc9:
avrdude: load data hfuse data from input file 0xc9:
avrdude: input file 0xc9 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0x9f"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x9f:
avrdude: load data lfuse data from input file 0x9f:
avrdude: input file 0x9f contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.



Test final :

  • Sans rien toucher, le montage devrait être instantanément reconnu comme un périphérique USB.
dmesg

Dit :

[ 2573.624031] usb 5-1: new low speed USB device using uhci_hcd and address 42
[ 2573.799441] usb 5-1: configuration #1 chosen from 1 choice
[ 2573.843349] input: Paul Qureshi Arcade Joystick v1.1 as /devices/pci0000:00/0000:00:08.0/0000:01:09.1/usb5/5-1/5-1:1.0/input/input8
[ 2573.846966] generic-usb 0003:8282:8001.0004: input,hidraw0: USB HID v1.01 Gamepad [Paul Qureshi Arcade Joystick v1.1] on usb-0000:01:09.1-1/input0

Reste à utiliser son logiciel préféré pour tester le «joystick» en reliant à la masse successivement les sorties du µC, pour simuler l'appuie sur les boutons.

jstest /dev/input/js0


Sur La console de jeux qu'est Windows®, ça marche aussi !
GameControllers01.jpg GameControllers02.jpg



Quelques commandes utiles :

  • Lire l'état des bits de sécurités
sudo avrdude -p atmega8 -P /dev/parport0 -c stk200 -U lock:r:-:i -E noreset
  • Lire l'état des bits fusibles
sudo avrdude -p atmega8 -P /dev/parport0 -c stk200 -Uhfuse:r:-:i -E noreset
  • Effacement total du µC
sudo avrdude -p atmega8 -P /dev/parport0 -c stk200 -e



À suivre…

Commentaires

1. Le mardi, 22 mars 2011, 13:25 par Toons

Hello,

Je vais réussir a te convertir au UC. LE composant multifonction !! Un jour porte des étoiles, le lendemain, piccgroove et le surlendemain Interface Arcade.. la limite de ces composants, ton imagination !! ;)

Bon faut que tu pense a rajouter tout de meme une resistance de 10k sur RESET si tu veux pas avoir des choses bizarres qui se passe lorsque ton programmateur n'est pas connecter. ^^

@++

2. Le mardi, 22 mars 2011, 13:33 par Toons

Bon apres verification ... tu a de la chance tu est tombe sur un des modeles avec la resistance intégre !! ;)

3. Le mardi, 15 janvier 2013, 22:46 par asthro

glop,
après réception de mes pcb, mon dmesg m'indique toujours qu'il ne reconnait rien... en regardant tes photos la résistance de 2,2K n'est pas rouge-rouge-rouge, d'où mon interrogation sur la valeur de cette résistance ! Si tu as les couleurs de celle-ci, je suis preneur - et intrigué-

4. Le mercredi, 16 janvier 2013, 11:22 par MaKoTo

Tu veux parler de cette photo ?
http://burogu.makotoworkshop.org/pu...
Oui c'est bien une 2,2k, codifiée sur 5 anneaux :
rouge rouge noir marron marron
http://www.dcode.fr/code-couleur-re...
Lorsque j'ai eu des soucis de non reconnaissance du périphérique USB, c'était dû essentiellement à trois facteurs : l'oscillateur qui ne marchait pas (résonateur, ou quartz, bit fusibles !!), le µC qui délirait (sans savoir pourquoi, j'en ai un qui n'a jamais voulu fonctionner), ou encore les diodes zener (500mW max !!)

5. Le mercredi, 16 janvier 2013, 22:50 par asthro

Merci beaucoup,
Après avoir remplacé TOUT les composants, reflashé le uC dans un Arduino, remonté une carte comlète avec des composants neufs ... bref, 3 soirées bien ennervantes pour un montage si simple :
les couleurs de mon cable USB sont inversées !!! les lignes Data sont à l'envers dans mon cable .... la loose...
Y'a plus quà jouer maintenant !
A bientôt

6. Le jeudi, 17 janvier 2013, 11:01 par MaKoTo

Arfff !! bah oué ça aide pas c'est sûr !
Maintenant que t'en parle, je crois me souvenir que Toons a eu ce tour là lui aussi…
Bon amusement ^^

7. Le mercredi, 12 juin 2013, 06:54 par Ricol@

Slt MaKoTo,

je viens vers toi pour un soucis majeur. J'ai bien tout comme toi mais malheureusement mon montage sort "PERIPHERIQUE USB NON RECONNU".
Y-a-t-il d'autres manips soft ou hard pour que le montage fonctionne.
Je suis sous SEVEN ou XP si ça peut faire avancer le chmilbick.

Cordialement.

8. Le mercredi, 12 juin 2013, 08:53 par MaKoTo

Il n'y a pas d'autres manip…
Si comme décrit plus haut, tu as utilisé des composants aux références/caractéristiques correctes, programmé le µC et configuré ses bits fusibles, sauf erreur de cablage, ça doit marcher !

9. Le mercredi, 12 juin 2013, 12:51 par ricol@

Merci pour ton soutien.

Ne pas croiser D- et D+ ça aide aussi beaucoup.
CA MARCHE !!! ^^

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet