Joystick d'Arcade USB -1-
Par makoto doushite le lundi, 21 mars 2011, 23:44 - Électronique - Lien permanent
On 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…
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 :
- 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…
À 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 !
Suffit de câbler tous les composants sur la plaquette et de faire les connexions avec des fils
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.
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 !
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
Commentaires
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. ^^
@++
Bon apres verification ... tu a de la chance tu est tombe sur un des modeles avec la resistance intégre !!
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é-
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 !!)
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
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 ^^
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.
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 !
Merci pour ton soutien.
Ne pas croiser D- et D+ ça aide aussi beaucoup.
CA MARCHE !!! ^^