Documentation
Rechercher…
Pilote de joystick GPIO Raspberry Pi
Le mk_arcade_joystick_rpi est entièrement intégré dans la distribution de Recalbox.
La branche hotkeybtn supporte désormais un bouton supplémentaire par joueur à la place du support MCP23017

Introduction

Le Raspberry Pi est un outil incroyable que j'ai découvert il y a un mois. Le projet Recalbox m'a donné envie de construire ma propre borne d'arcade avec de simples boutons et manettes d'arcade.
J'ai donc commencé à relier mes joysticks et mes boutons à mon Raspberry Pi et j'ai écrit la première moitié de ce pilote afin de relier mes joysticks et mes boutons directement aux ports GPIO de celui-ci..
Cependant, le Raspberry Pi B Rev 2 a un maximum de 21 ports GPIO utilisables, ce qui n'est pas suffisant pour câbler tous les 28 interrupteurs (2 joysticks et 20 boutons) qu'un panneau standard requiert.
UPDATE 0.1.5 : Ajout de la personnalisation GPIO
UPDATE 0.1.4 : Compatibilité avec le Raspberry Pi 2
UPDATE 0.1.3 : Compatibilité avec 3.18.3 :
L'installation du pilote fonctionne maintenant avec le noyau 3.18.3, diffusé avec le dernier firmware.
UPDATE 0.1.2 : Downgrade vers la 3.12.28+ :
Comme le module ne se charge pas avec un noyau et des en-têtes récents, nous ajoutons la possibilité de rétrograder votre firmware vers une version compatible, jusqu'à ce que nous trouvions une solution.
UPDATE 0.1.1 : Version Raspberry Pi B+ :
La nouvelle révision de Raspberry Pi B+ nous a apporté 9 ports GPIO supplémentaires, nous sommes donc maintenant en mesure de connecter 2 joysticks et 12 boutons directement aux ports GPIO. J'ai mis à jour le pilote afin de prendre en charge les 2 joysticks dans la configuration des ports GPIO.

Encore plus de joysticks

Une petite puce bon marché appelée MCP23017 vous permet d'ajouter 16 GPIO externes, et ne prend que deux ports GPIO sur le Raspberry Pi. La puce vous permet d'utiliser les GPIO en entrée ou en sortie ; l'entrée est ce que nous recherchons si nous voulons encore plus de joysticks.
Si vous souhaitez utiliser plus d'une puce, le protocole i2c vous permet de choisir différentes adresses pour le périphérique connecté, mais toutes utilisent les mêmes SDA et SCL GPIO.
En théorie, vous pouvez connecter jusqu'à 8 puces, donc 8 joysticks.

Le logiciel

Le pilote du joystick est basé sur le pilote gamecon_gpio_rpi de marqs.
Il est écrit pour 4 joysticks directionnels et 8 boutons par joueur. L'utilisation d'un MCP23017 étend les numéros d'entrée à 16 : 4 directions et 12 boutons.
Il peut reconnaître un joystick + boutons câblés sur les ports GPIO du Raspberry Pi (deux joysticks sur la révision RPi B+) et jusqu'à 5 autres joysticks + boutons provenant de puces MCP23017. Un MCP23017 est nécessaire pour chaque joystick.
Il utilise des pull-up internes de Raspberry Pi et de MCP23017, de sorte que tous les interrupteurs doivent être directement connectés à son GPIO correspondant et à la terre (GROUND).

Cas courants : Joysticks connectées à des ports GPIO

Pinout

Considérons un panneau de commande à 6 boutons avec cet ordre de boutons :
1
↑ Ⓨ Ⓧ Ⓛ
2
← → Ⓑ Ⓐ Ⓡ
3
↓
Copied!
Avec R = TR et L = TL
Voici le résumé du brochage des ports GPIO rev B :
​​
​
​
Si vous avez un Raspberry Pi Rev B+ 1 ou 2 :
​​
​
​
Bien sûr, la terre peut être commune à tous les interrupteurs.

Installation

Script d'installation

    Téléchargez le script d'installation :
1
mkdir mkjoystick
2
cd mkjoystick
3
wget https://github.com/recalbox/mk_arcade_joystick_rpi/releases/download/v0.1.4/install.sh
Copied!
    Mettre à jour votre système :
1
sudo sh ./install.sh updatesystem
2
sudo reboot
Copied!
    N'oubliez pas de redémarrer (ou la partie suivante ne fonctionnera pas) et de relancer le script sans aucun argument :
1
sudo sh ./install.sh
Copied!
Maintenant, rendez-vous à la partie Chargement du pilote.

Installation manuelle

Mise à jour du système :
1
sudo apt-get update
2
sudo apt-get upgrade
3
sudo rpi-update
Copied!
1 - Installez tout ce dont vous avez besoin :
1
sudo apt-get install -y --force-yes dkms cpp-4.7 gcc-4.7 git joystick
Copied!
2 - Installez les derniers en-têtes de noyau :
1
sudo apt-get install -y --force-yes raspberrypi-kernel-headers
Copied!
3.a - Installer le pilote de la version (de préférence) :
1
wget https://github.com/recalbox/mk_arcade_joystick_rpi/releases/download/v0.1.4/mk-arcade-joystick-rpi-0.1.4.deb
2
sudo dpkg -i mk-arcade-joystick-rpi-0.1.4.deb
Copied!
3.b - Ou compilez et installez avec dkms :
3.b.1 - Télécharger les fichiers :
1
git clone https://github.com/pinuct/mk_arcade_joystick_rpi/tree/customgpio
Copied!
3.b.2 - Créer un dossier sous "/usr/src/module-module-version/"
1
mkdir /usr/src/mk_arcade_joystick_rpi-0.1.5/
Copied!
3.b.3 - Copiez les fichiers dans le dossier :
1
cd mk_arcade_joystick_rpi/
2
cp -a * /usr/src/mk_arcade_joystick_rpi-0.1.5/
Copied!
3.b.4 - Compiler et installer le module :
1
dkms build -m mk_arcade_joystick_rpi -v 0.1.5
2
dkms install -m mk_arcade_joystick_rpi -v 0.1.5
Copied!

Chargement du pilote

Le pilote est chargé avec la commande modprobe et prend un paramètre nommé "map" représentant les joysticks connectés. Lorsque vous devez charger le pilote, vous devez passer une liste de paramètres qui représentent la liste des joysticks connectés. Le premier paramètre sera le joystick mappé sur /dev/input/js0, le second sur /dv/input/js1 etc.
Si vous avez connecté un joystick sur les ports GPIO du Raspberry Pi (joystick 1 sur l'image du pinout), vous devez passer "map=1" comme paramètre. Si vous êtes sur la révision B+ et que vous avez connecté 2 joysticks, vous devez passer map="1,2" en paramètre.
Si vous avez un joystick connecté sur votre version Raspberry Pi B ou B+, vous devrez exécuter la commande suivante :
1
sudo modprobe mk_arcade_joystick_rpi map=1
Copied!
Si vous avez deux joysticks connectés sur votre version Raspberry Pi B ou B+, vous devrez exécuter la commande suivante :
1
sudo modprobe mk_arcade_joystick_rpi map=1,2
Copied!
Si vous avez un écran TFT connecté sur votre Raspberry Pi B+, vous ne pouvez pas utiliser tous les ports GPIO. Vous pouvez exécuter la commande suivante pour n'utiliser que les GPIO non utilisés par l'écran TFT (Attention, tous les écrans TFT n'utilisent pas les mêmes broches. Les GPIOs utilisés avec cette carte sont : 21, 13, 26, 19, 5, 6, 22, 4, 20, 17, 27, 16) :
1
sudo modprobe mk_arcade_joystick_rpi map=4
Copied!
Si vous ne voulez pas utiliser tous les pins ou si vous voulez utiliser une carte avec GPIO personnalisé :
1
sudo modprobe mk_arcade_joystick_rpi map=5 gpio=pin1,pin2,pin3,.....,pin12
Copied!
Où pinx est le numéro du port GPIO que vous souhaitez. Il existe 12 GPIO possibles avec commande par bouton : Y-, Y+, X-, X+, Start, Select, A, B, TR, Y, X, TL. Utilisez -1 pour les broches non utilisées. Par exemple gpio=21,13,26,19,-1,-1,22,24,-1,-1,-1,-1,-1 utilise les ports GPIO 21, 13, 26, 19 pour les axes et les ports 22 et 24 pour les boutons A et B, le reste des boutons sont inutilisés.
Les actions du joystick 1 seront rapportées au fichier "/dev/input/js0" et les actions du joystick 2 seront rapportées au fichier "/dev/input/js1".

Chargement automatique au démarrage

Ouvrez /etc/modules :
1
sudo nano /etc/modules
Copied!
Ajoutez la ligne que vous utilisez pour charger le pilote :
1
mk_arcade_joystick_rpi
Copied!
Ensuite, créez le fichier /etc/modprobe.d/mk_arcade_joystick.conf :
1
sudo nano /etc/modprobe.d/mk_arcade_joystick.conf
Copied!
Ajoutez la configuration du module :
1
options mk_arcade_joystick_rpi map=1,2
Copied!

Test

Utilisez la commande suivante pour tester les actions des joysticks :
1
jstest /dev/input/js0
Copied!

Autres cas de joysticks : MCP23017

Voici le résumé du brochage du MCP23017 :
MCP23017 Interface

Préparation du Raspberry Pi pour le MCP23017

Suivez les instructions d'installation des standards.
Activez i2c sur votre Pi :
1
sudo nano /etc/modules
Copied!
Ajoutez les lignes suivantes afin de charger automatiquement les modules i2c :
1
i2c-bcm2708
2
i2c-dev
Copied!
Et si le fichier /etc/modprobe.d/raspi-blacklist.conf existe :
1
sudo nano /etc/modprobe.d/raspi-blacklist.conf
Copied!
Vérifiez si vous avez une ligne avec :
1
i2c-bcm2708
Copied!
Ajoutez un # au début de la ligne pour supprimer la liste noire. Redémarrez ou chargez les deux modules :
1
modprobe i2c-bcm2708 i2c-dev
Copied!

Préparation de la puce MCP23017

Vous devez mettre les broches A0, A1 et A2 à 0 ou 1 afin de définir l'adresse i2c de la puce.
Si vous n'avez qu'une seule puce, connectez les 3 broches à la terre. Il suffit de connecter l'une des broches au 3,3V pour mettre son état à 1 et modifier l'adresse i2c de la MCP23017.
Vous devez également connecter la broche RESET au 3.3V.

Configuration

Lorsque vous voulez charger le pilote, vous devez vérifier une liste de paramètres qui représentent la liste des joysticks connectés. Le premier paramètre sera le joystick mappé sur /dev/input/js0, le second sur /dev/input/js1, etc.
Si vous avez connecté un joystick sur les GPIO du Pi, vous devez entrer "1" comme paramètre.
Si vous avez connecté un ou plusieurs joysticks avec la puce MCP23017, vous devez entrer l'adresse des périphériques I2C connectés, que vous pouvez obtenir grâce à la commande :
1
sudo i2cdetect -y 1
Copied!
La configuration de chaque MCP23017 se fait en réglant les pads A0, A1 et A2 sur 0 ou 1.
Si vous avez configuré votre MCP23017 avec A0, A1 et A2 connectés à la terre, l'adresse renvoyée par i2cdetect devrait être 0x20.
Donc, si vous avez un joystick connecté à des GPIO sur le Pi et un joystick sur une puce MCP23017 avec l'adresse 0x20, pour charger le pilote, vous devez exécuter la commande suivante :
1
sudo modprobe mk_arcade_joystick_rpi map=1,0x20
Copied!
Les actions du joystick sur GPIO seront signalées dans le fichier "/dev/input/js0" et les actions du joystick de la puce MCP23017 seront signalées dans le fichier "/dev/input/js1".
J'ai testé jusqu'à 3 joysticks ; un sur ports GPIO, un sur une MCP23017 à l'adresse 0x20, un sur une MCP23017 à l'adresse 0x24 :
1
sudo modprobe mk_arcade_joystick_rpi map=1,0x20,0x24
Copied!

Bugs connus

    Si vous essayez de lire ou d'écrire sur i2c avec un outil comme i2cget ou i2cset lorsque le pilote est chargé, vous allez passer un sale quart-d'heure...
    Si vous essayez i2cdetect lorsque le pilote est en cours d'exécution, il vous montrera des adresses de périphériques étranges...
    La version 256MB du Raspberry Pi Model B n'est pas supporté par le pilote actuel. Si vous voulez que le pilote fonctionne sur votre ancien Pi, vous devrez changer l'adresse de BSC1_BASE en (BCM2708_PERI_BASE + 0x205000) afin d'utiliser la bonne adresse i2c, et recompiler.
Dernière mise à jour 7mo ago