π
<-
Chat plein-écran
[^]

Recalbox fonctionnel sur PiGRRL 2 avec un Raspberry Pi 3

Discussions scientifiques et scolaires

Recalbox fonctionnel sur PiGRRL 2 avec un Raspberry Pi 3

Message non lude Afyu » 24 Juin 2023, 20:34

Bonjour à toutes et à tous,

La carte électronique Raspberry Pi, dans ses différentes déclinaisons, permet de faire des choses fantastiques, dont des consoles de jeux portables, comme par exemple la PiGRRL 2, présentée sur le site d'Adafruit.

Le système d'exploitation proposé par défaut est Retropie. Mais on peut préférer faire fonctionner cette console avec le système d'exploitation Recalbox.

Il y a essentiellement deux points à traiter pour rendre cette console fonctionnelle avec Recalbox :
  • il faut envoyer l'affichage sur l'écran TFT qui est branché sur les ports GPIO
  • il faut faire reconnaître l'appui sur les boutons poussoirs de la console, eux aussi branchés sur les ports GPIO, comme étant l'appui sur des touches de clavier ou encore mieux des boutons de manettes.



1/ Avec Recalbox 9.0 :Go to top


Instructions : Mise à jour le 30/06/2023
Voici la procédure que je propose, suivie sur Linux OpenSUSE Tumbleweed, testée avec la version 9.0 Pulstar de Recalbox (dernière version disponible à la date de rédaction de ce tuto) sur une console PiGRRL 2 équipée d'un Raspberry Pi 3 B rev 1.2.

1) "Graver" l'image de Recalbox sur la carte SD.
On peut utiliser le fichier recalbox.img.xz directement avec Raspberry Pi Imager comme proposé sur le site de Recalbox ou Etcher ou tout autre logiciel approprié.
On peut également décompresser le fichier recalbox.img.xz pour récupérer un fichier recalbox.img (avec la commande Linux $ unxz recalbox.img.xz) puis utiliser la commande dd (dont je ne détaillerai pas l'utilisation ici).


2) Une fois la "gravure" effectuée, la carte SD est directement reconnue par l'ordi et est affichée comme un périphérique de stockage avec une seule partition nommée RECALBOX.
Ouvrir cette partition dans le gestionnaire de fichiers et à la fin du fichier recalbox-user-config.txt ajouter :
Code: Tout sélectionner
#Adafruit 2.8 TFT Screen
dtoverlay=pitft28-resistive,drm,rotate=180

Remarque : Oui, c'est 180 et pas 270, pour la rotation de l'affichage. Ne pas oublier le paramètre "drm" !!


3) Éjecter la carte SD puis la mettre dans le Raspberry Pi et faire un premier démarrage. Ce premier démarrage peut être long et atteindre les 5 min ! L'écran est d'abord éteint (le temps de l'initialisation du système et du partitionnementt automatique de la carte SD) puis s'allume pour afficher l'interface d'EmulationStation.

À ce stade, l'écran fonctionne mais les boutons ne sont pas reconnus. Brancher un clavier et faire Espace puis Q puis Q ou utiliser une manette et faire HotKey (a priori Select) puis le bouton d'action du bas (bouton X sur une manette de PlayStation, bouton B sur une manette Nintendo et bouton A sur une manette de XBox) 2 fois, pour éteindre le Raspberry Pi proprement. La musique se coupe et l'écran redevient blanc vif. Il est nécessaire d'attendre une dizaine de secondes avant de couper l'alimentation de la console pour être sûr que le système est bien éteint.

Remarque : Cette version de Recalbox est prévue pour un appairage automatique d'une manette sans fil pendant 5 min après le premier démarrage de la console.


4) Pour l'affichage sur l'écran TFT, c'est réglé. :D Il n'y a rien d'autre à modifier (il ne faut PAS activer fbcp comme c'était nécessaire avec les versions plus anciennes de Recalbox au risque de tout casser !).


Passons à la reconnaissance des boutons poussoirs :

5) La solution la plus simple et la plus efficace que j'ai trouvée à ce jour est la suivante :

Modifier SHARE/system/recalbox.conf :
→ dans la section D2, remplacer controllers.gpio.enabled=0 par controllers.gpio.enabled=1

Ensuite, si on veut configurer une seule manette (et perdre l'utilisation de 3 des 4 boutons à gauche de l'écran ) :
→ dans la section D2, remplacer la ligne controllers.gpio.args=map=1,2 par controllers.gpio.args=map=5 gpio=16,26,4,19,6,5,14,15,13,18,20,12,17

Ou bien, si on veut configurer deux manettes dont une qui n'a que 3 boutons :
→ dans la section D2, remplacer la ligne controllers.gpio.args=map=1,2 par controllers.gpio.args=map=5,6 gpio=16,26,4,19,6,5,14,15,13,18,20,12,17 gpio2=-1,-1,-1,-1,27,-1,23,22,-1,-1,-1,-1,-1 pour ne pas perdre l'usage des 3 boutons du haut à gauche de l'écran

C'est l'occasion de modifier les paramètres de langue et de localisation dans la section E :
→ modifier us_US en fr_FR et us en fr.

Et c'est terminé ! Il n'y a plus qu'à éjecter la carte SD, la mettre dans le Raspberry Pi et démarrer la console. Au démarrage, il sera peut-être demandé de mapper la manette qui est détectée.



2/ Avec Recalbox 7.2.2 :Go to top


Voici la procédure que je propose, suivie sur Linux OpenSUSE Tumbleweed, testée avec la version 7.2.2 de Recalbox sur une console PiGRRL 2 équipée d'un Raspberry Pi 3 B rev 1.2.

1) "Graver" l'image de Recalbox sur la carte SD.
On peut utiliser le fichier recalbox.img.xz directement avec Raspberry Pi Imager comme proposé sur le site de Recalbox ou Etcher ou tout autre logiciel approprié.
On peut également décompresser le fichier recalbox.img.xz pour récupérer un fichier recalbox.img (avec la commande Linux $ unxz recalbox.img.xz) puis utiliser la commande dd (dont je ne détaillerai pas l'utilisation ici).


2) Une fois la "gravure" effectuée, la carte SD est directement reconnue par l'ordi et est affichée comme un périphérique de stockage avec une seule partition nommée RECALBOX.
Ouvrir cette partition dans le gestionnaire de fichiers et à la fin du fichier recalbox-user-config.txt ajouter :
Code: Tout sélectionner
#Adafruit 2.8 TFT Screen
#same resolution for hdmi and tft
hdmi_force_hotplug=1
hdmi_cvt=320 240 60 1 0 0 0
hdmi_group=2
hdmi_drive=1
hdmi_mode=87
dtparam=spi=on
dtoverlay=pitft28-resistive:rotate=270


3) Éjecter la carte SD puis la mettre dans le Raspberry Pi et faire un premier démarrage, à l'aveugle (sans affichage sur l'écran). Ce premier démarrage peut être long et atteindre les 5 min ! Entendre la musique de l'interface de EmulationStation permet de savoir que le système a terminé son démarrage correctement. Mais je n'ai pas toujours le son au premier démarrage. :( Lors de ce démarrage à l'aveugle, si l'écran devient noir, alors c'est un bon signe.

À ce stade, l'écran est noir et les boutons ne sont pas reconnus. Brancher un clavier et faire Espace puis Q puis Q ou utiliser une manette et faire HotKey (a priori Select) puis le bouton d'action du bas (bouton X sur une manette de PlayStation, bouton B sur une manette Nintendo et bouton A sur une manette de XBox) 2 fois, pour éteindre le Raspberry Pi proprement. La musique se coupe et l'écran redevient blanc vif. Il est nécessaire d'attendre une dizaine de secondes avant de couper l'alimentation de la console pour être sûr que le système est bien éteint.


4) Éteindre le Raspberry Pi et remettre la carte SD dans l'ordi. Il y a maintenant 3 partitions qui sont visibles (en tous cas sous Linux) : RECALBOX, OVERLAY et SHARE.

Modifier SHARE/system/recalbox.conf :
→ dans la section A, remplacer system.fbcp.enabled=0 par system.fbcp.enabled=1
→ dans la section G, remplacer global.videomode=CEA 4 HDMI par global.videomode=default

C'est l'occasion de modifier les paramètres de langue et de localisation dans la section E :
→ modifier us_US en fr_FR et us en fr.

Pour l'affichage sur l'écran TFT, c'est réglé. :D


Passons à la reconnaissance des boutons poussoirs :

5) La solution la plus simple et la plus efficace que j'ai trouvée à ce jour est la suivante :

Modifier SHARE/system/recalbox.conf :
→ dans la section D2, remplacer controllers.gpio.enabled=0 par controllers.gpio.enabled=1
→ dans la section D2, remplacer la ligne controllers.gpio.args=map=1,2 par controllers.gpio.args=map=5 gpio=16,26,4,19,6,5,14,15,13,18,20,12,17
ou bien
→ dans la section D2, remplacer la ligne controllers.gpio.args=map=1,2 par controllers.gpio.args=map=5,6 gpio=16,26,4,19,6,5,14,15,13,18,20,12,17 gpio2=-1,-1,-1,-1,27,-1,23,22,-1,-1,-1,-1,-1 pour ne pas perdre l'usage des 3 boutons du haut à gauche de l'écran

Et c'est terminé ! Il n'y a plus qu'à éjecter la carte SD, la mettre dans le Raspberry Pi et démarrer la console. Au premier démarrage, il sera demandé de mapper la manette qui est détectée.



3/ Une alternative : retrogameGo to top


Pour aller plus loin, ou plutôt pour aller dans une autre direction, on peut se débrouiller pour que les boutons poussoirs soient reconnus comme des touches de clavier. Ça a ses avantages, mais aussi ses contraintes. Si ça vous intéresse, c'est par ici :



5bis) Récupérer le script retrogame écrit par Adafruit et disponible sur cette page ou directement ici.
Copier ce script dans SHARE/system.

Récupérer le fichier de configuration retrogame.cfg sur cette page ou directement ici
Renommer ce fichier en retrogame.cfg si nécessaire et le copier dans RECALBOX/.

Si besoin, le contenu de ce fichier est donné ci-dessous :
Show/Hide spoilerAfficher/Masquer le spoiler
Code: Tout sélectionner
# Sample configuration file for retrogame.
# Really minimal syntax, typically two elements per line w/space delimiter:
# 1) a key name (from keyTable.h; shortened from /usr/include/linux/input.h).
# 2) a GPIO pin number; when grounded, will simulate corresponding keypress.
# Uses Broadcom pin numbers for GPIO.
# If first element is GND, the corresponding pin (or pins, multiple can be
# given) is a LOW-level output; an extra ground pin for connecting buttons.
# A '#' character indicates a comment to end-of-line.
# File can be edited "live," no need to restart retrogame!

# Here's a pin configuration for the PiGRRL 2 project:

LEFT       4  # Joypad left
RIGHT     19  # Joypad right
UP        16  # Joypad up
DOWN      26  # Joypad down
LEFTCTRL  14  # 'A' button
LEFTALT   15  # 'B' button
Z         20  # 'X' button
X         18  # 'Y' button
SPACE      5  # 'Select' button
ENTER      6  # 'Start' button
A         12  # Left shoulder button
S         13  # Right shoulder button
ESC       17  # Exit ROM; PiTFT Button 1
1         22  # PiTFT Button 2
2         23  # PiTFT Button 3
3         27  # PiTFT Button 4

# For configurations with few buttons (e.g. Cupcade), a key can be followed
# by multiple pin numbers.  When those pins are all held for a few seconds,
# this will generate the corresponding keypress (e.g. ESC to exit ROM).
# Only ONE such combo is supported within the file though; later entries
# will override earlier.


On peut modifier ce fichier, si besoin, pour modifier le nom des touches de clavier. Celui que j'utilise est un peu différent (touche Echap sur le bouton poussoir du haut et non pas celui du bas, parmi les 4 boutons poussoirs de l'écran et quelques différences pour les autres boutons) et il contient :
Code: Tout sélectionner
# Here's a pin configuration for the PiGRRL 2 project:

LEFT       4  # Joypad left
RIGHT     19  # Joypad right
UP        16  # Joypad up
DOWN      26  # Joypad down
S         14  # 'A' button
A         15  # 'B' button
X         20  # 'X' button
Z         18  # 'Y' button
SPACE      5  # 'Select' button
ENTER      6  # 'Start' button
Q         12  # Left shoulder button
W         13  # Right shoulder button
1         17  # PiTFT Button 1
R         22  # L2; PiTFT Button 2
T         23  # R2; PiTFT Button 3
ESC       27  # Exit ROM; PiTFT Button 4


6) Créer un fichier custom.sh dans SHARE/system et y coller les lignes suivantes :
Code: Tout sélectionner
mount / -o rw,remount
cp /recalbox/share/system/retrogame /usr/bin/
chmod a+x /usr/bin/retrogame
echo "/usr/bin/retrogame &" > /etc/init.d/S32retrogame
chmod a+x /etc/init.d/S32retrogame
mv /recalbox/share/system/custom.sh /recalbox/share/system/custom_old.sh
reboot


7) Créer le fichier 10-retrogame.rules dans SHARE/system/udev/rules.d/ et y coller la ligne suivante :
Code: Tout sélectionner
SUBSYSTEM=="input", ATTRS{name}=="retrogame", ENV{ID_INPUT_KEYBOARD}="1"


8) On peut maintenant éjecter puis retirer la carte SD de l'ordi pour la mettre dans le Raspberry Pi et allumer la console. Le démarrage s'interrompt au moment de l'affichage de "Chargement" pour un redémarrage qui permet de terminer la configuration. Lors des démarrages suivants, il n'y aura pas de redémarrage automatique.

Tout devrait maintenant fonctionner : l'affichage sur l'écran TFT et l'appui sur les boutons poussoirs de la console qui devraient maintenant être considérés comme des touches de clavier :D


4/ Explications complémentaires :Go to top


Quelques explications complémentaires :

2) La ligne hdmi_cvt=320 240 60 1 0 0 0 permet de modifier la définition de l'écran. À adapter en fonction de l'écran, si besoin.
La ligne dtparam=spi=on permet d'activer l'affichage par les GPIO.
La ligne dtoverlay=pitft28-resistive:rotate=270 permet de choisir un overlay en fonction de l'écran utilisé. La liste des overlays possibles est dans RECALBOX/overlay. Pour la PiGRRL 0 il faudrait mettre pitft22 à la place de pitft28-resistive et peut-être également modifier l'orientation de l'écran.

3) Le démarrage peut être long et durer 5 min. Il permet, entre autres, la création des partitions OVERLAY et SHARE sur la carte SD, à côté de la partition RECALBOX. La partition SHARE sera utilisée pour les dernières étapes.

4) À cette étape, il est tentant de modifier le paramètre controllers.gpio.enabled pour le mettre à 1 et modifier la bonne ligne parmi celles qui suivent pour configurer l'appui sur les boutons poussoirs directement mais ce n'est pas si simple. En effet, certaines broches GPIO utilisées pour les boutons poussoirs de la PiGRRL 2 sont également utilisées par certains écrans. Pour la PiGRRL 2, l'écran proposé est compatible et n'empiète pas sur les GPIO utilisés pour les boutons poussoirs. Il est possible d'activer l'affichage sur un écran branché sur les GPIO et d'utiliser mk_arcade_joystick_rpi pour utiliser des boutons poussoirs eux aussi branchés sur les GPIO, mais il faut préciser précautionneusement les pins GPIO utilisés pour les boutons poussoirs.
Et surtout, il faut penser à supprimer la ligne qui se termine par map=1,2 !!!

La solution alternative pour les boutons poussoirs est le script retrogame créé par Adafruit. Le script recalbox-retrogame déjà présent dans /usr/bin ne semble pas fonctionner sur la PiGRRL 2, hélas. Mais si quelqu'un a des infos pour l'utiliser, alors je suis preneur !! :D

6) Le script retrogame doit être placé dans un dossier dans lequel il peut être rendu exécutable et surtout il doit être exécuté à chaque démarrage de la console, automatiquement. Il doit (ou peut) être placé dans /usr/bin. Le problème est que ce dernier dossier n'est pas un dossier d'une partition de la carte SD directement accessible depuis l'ordi. Il est dans une archive squashfs qui est montée dans / au démarrage de la console. Cette archive est visible sur la carte SD, dans RECALBOX/boot mais n'est pas modifiable pour y ajouter retrogame.
De même, une fois placé dans le bon dossier, ce script doit être exécuté automatiquement au démarrage de la console. Tous les scripts présents dans /etc/init.d sont exécutés au démarrage, il suffit donc de modifier un des scripts présents dans ce dossier, ou d'en ajouter un, pour demander à lancer automatiquement retrogame.
La bonne nouvelle est que dans ce dossier /etc/init.d il y a un script nommé S99custom qui exécute automatiquement le fichier SHARE/system/custom.sh si un tel fichier existe.
C'est pourquoi nous allons créer un fichier custom.sh dans SHARE/system qui va contenir de quoi déplacer retrogame dans /usr/bin et qui va créer un fichier S32retrogame dans /etc/init.d qui contiendra une unique ligne visant à lancer retrogame à chaque démarrage.

Petit rappel du contenu de custom.sh :
Code: Tout sélectionner
mount / -o rw,remount
cp /recalbox/share/system/retrogame /usr/bin/
chmod a+x /usr/bin/retrogame
echo "/usr/bin/retrogame &" > /etc/init.d/S32retrogame
chmod a+x /etc/init.d/S32retrogame
mv /recalbox/share/system/custom.sh /recalbox/share/system/custom_old.sh
reboot


  1. La première ligne de custom.sh sert à remonter la partition système en lecture+écriture pour pouvoir effectuer les différentes modifications (et créations de fichiers) souhaitées.
  2. La deuxième ligne permet de copier retrogame dans /usr/bin.
  3. La troisième ligne rend ce fichier exécutable.
  4. La quatrième ligne permet de créer un fichier S32retrogame dans /etc/init.d et d'y ajouter la ligne qui lancera retrogame à chaque démarrage.
  5. La cinquième ligne rend ce fichier exécutable.
  6. La sixième ligne renomme le fichier custom.sh en custom_old.sh afin qu'il ne soit pas exécuté à chaque démarrage. Une fois qu'il a été exécuté une fois, tout est à sa place et il n'y a plus rien à faire.
  7. La septième et dernière ligne demande un redémarrage de la console. C'est ce qui permet de lancer (enfin !) retrogame et c'est ce qui contraint à renommer custom.sh pour qu'il ne soit pas exécuté à chaque démarrage et pour éviter que ce redémarrage forcé ne se produise à chaque démarrage de la console. Il était effectivement possible de ne pas demander de redémarrage et de lancer retrogame directement, mais le système est monté en lecture+écriture et un redémarrage permet de le remonter en lecture seule et d'éviter quelques accidents d'écriture qui pourraient corrompre le système d'exploitation et nécessiter une réinstallation.

Remarques :
  • Les commandes contenues dans le fichier custom.sh peuvent être exécutés en se connectant au Raspberry Pi en SSH ou encore directement depuis le Raspberry Pi en y reliant un clavier USB et en tapant les commandes. L'utilisateur est root et le mot de passe est recalboxroot et le paramétrage du système en fr effectué à l'étape 4 est alors apprécié ! :)
    Par ailleurs, si le Raspberry Pi est connecté à Internet, il est alors possible de récupérer les fichiers retrogame et retrogame.cfg directement avec la commande wget suivi du lien direct vers chaque fichier (deuxième lien que j'ai donné à chaque fois).
  • Lorsque Recalbox détecte qu'un clavier est connecté (ce qui est simulé par retrogame une fois ce tuto mené à son terme), il ne peut prendre en compte que 4 touches de direction et 6 boutons d'action. Sont donc exclus les boutons X et Y, ce qui est bien dommage parce qu'un de ces deux boutons sert à marquer des jeux comme "favoris", ce qui n'est donc pas possible avec retrogame.
  • À l'origine, il était prévu d'utiliser le driver xboxdrv pour convertir l'appui sur des touches de clavier en appui sur des boutons de manette de Xbox, (et on pouvait configurer suffisamment de boutons pour avoir L1 et R1 mais également L2 et R2 !) mais ce driver a été remplacé par Xpad qui ne permet pas (encore) de faire ce genre de conversion. :( Il fallait alors créer un fichier custom.sh dans RECALBOX/system et y ajouter la ligne suivante :
    • pour le PiGRRL0 : xboxdrv --evdev /dev/input/event0 --evdev-keymap KEY_UP=du,KEY_DOWN=dd,KEY_LEFT=dl,KEY_RIGHT=dr,KEY_ENTER=start,KEY_RIGHTSHIFT=back,KEY_X=a,KEY_W=b,KEY_S=x,KEY_Q=y,KEY_A=lb,KEY_Z=rb,KEY_ESC=lt,KEY_H=rt --trigger-as-button &
    • pour le PiGRRL2 : xboxdrv --evdev /dev/input/event0 --evdev-keymap KEY_UP=du,KEY_DOWN=dd,KEY_LEFT=dl,KEY_RIGHT=dr,KEY_ENTER=start,KEY_RIGHTSHIFT=back,KEY_G=guide,KEY_Z=a,KEY_X=b,KEY_A=x,KEY_S=y,KEY_Q=lb,KEY_W=rb,KEY_H=lt,KEY_I=rt --trigger-as-button &
    Le recours à xboxdrv permettait d'avoir des boutons reconnus comme une manette de Xbox360, ce qui est bien mieux reconnu qu'un clavier dans certains émulateurs, et permettait de garder un bouton poussoir comme étant la touche Échap, sans la convertir en un bouton de manette.

7) Le fichier 10-retrogame.rules placé dans SHARE/system/udev/rules.d/ est un fichier de règles qui explique au système qu'il faut interpréter les appuis sur les boutons poussoirs comme des touches de clavier et envoyer l'information à Recalbox.


A tester : appliquer le même tuto sur Recalbox 8 ou 9 et éventuellement réutiliser le fichier recalbox.conf de la Recalbox 7.2.2 et pareil pour recalbox-user-config.txt.
A tester : utiliser le script recalbox-retrogame (déjà présent dans Recalbox) à la place de retrogame (ça semble ne pas fonctionner !)
Avatar de l’utilisateur
AfyuVIP++
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 90.9%
 
Messages: 355
Images: 18
Inscription: 30 Oct 2019, 19:17
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: plutôt, oui :)

Retourner vers Maths, physique, informatique et autre...

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 73 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1422 utilisateurs:
>1404 invités
>13 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)