NES30Pro & RetroPie
J'ai enfin reçu mes NES30 Pro commandées sur Willgoo il y a trois semaines (ça vient d'Honk Kong).
Au premier essai je les ai connecté en USB pour voir ce que ça donnait; EmulationStation les reconnaît immédiatement et la configuration se fait aisément.
Seulement si j'ai choisi cette manettes c'est notamment pour leur connectique bluetooth. Allons bon, est-ce que ça sera compliqué à configurer? NinjaJoey nous explique comment connecter en bluetooth sa manette NES30 à son RetroPie sur le forum de 8bitdo.
Le protocole à suivre est plus ou moins le même avec les NES30 Pro et RetroPie 3.0 sur Raspberry 2, je l'adapterai selon nos besoins. Nous verrons ainsi les bonne choses à faire et les impasses à éviter.
==Envie d'un peu de lecture? RetroPie
Appairage
Les paquets requis
Assurez-vous tout d'abord d'avoir tous les paquets requis, notamment Bluez et Blueman.
Installez les paquets nécessaire
sudo apt-get install bluetooth bluez-utils blueman
sudo apt-get install bluez python-gobject
PiAssist
Le tutoriel ci-dessous vous explique pas-à-pas comment configurer une manette en bluetooth, ce que je vous recommande de suivre dans un premier temps afin d'avoir une meilleure vision de la chose. Par la suite, PiAssist devrait devenir votre meilleur ami et simplifiant la manœuvre.
Si vous êtes flemmard vous pouvez toujours recourir dès maintenant au Script PiAssist conçu par Death259. Ce script exécute pour vous les commandes, vous n'avez qu'à lancez le script et naviguez dans le menu proposé.
Rendez-vous dans le répertoire /etc/init.d/
cd /etc/init.d
Téléchargez PiAssist depuis GitHub
sudo wget https://raw.githubusercontent.com/Death259/PiAssist/master/PiAssist.sh
Rendez exécutable le script
sudo chmod +x PiAssist.sh
Et exécutez-le
sudo ./PiAssist.sh
Ligne de commandes
Je vais vous proposer deux méthodes pour appairer en ligne de commandes, l'une avec bluez (comme le fait PiAssist ci-dessus), l'autre avec hidd. Pourquoi deux méthodes me direz-vous? Tout simplement parce que la première méthode semble fonctionner dans la plupart des cas mais malheureusement pour moi, ça n'a pas fonctionner. J'ai du alors trouver une alternative au travers de hidd
1ère méthode : bluez
Éditez le fichier de config de bluez
sudo nano /usr/bin/bluez-simple-agent
Dans celui-ci recherchez l’occurrence KeyboardDisplay
et remplacez-la par DisplayYesNo
(veillez à respecter la casse)
Quittez en sauvegardant votre edit avec ctrl+x et relancez votre raspberry avec sudo reboot
.
Une fois que c'est relancé, vérifiez que votre dongle bluetooth soit reconnu en tapant lsusb
puis déterminez son ID et son adresse MAC en tapant:
hcitool dev
La console devrait vous retourner
Devices:
hci0 XX:XX:XX:XX:XX:XX
C'est tout bon? Parfait, poursuivons.
saisissez-vous de votre manette NES30 Pro et allumez-la en pressant le bouton power ⌽ + B pendant 3 secondes. Votre manette devrait à présent arborer un joli bleu clignotant rapidement.
Patientez environ 10 secondes et scannez les appareils bluetooth à proximité
hcitool scan
La console devrait vous retourner la ligne suivante
Scanning ...
XX:XX:XX:XX:XX:XX 8Bitdo NES30 Pro
Maintenant que vous avez l'adresse MAC de votre manette, appairez-la à votre RetroPie
sudo bluez-simple-agent hci0 xx:xx:xx:xx:xx:xx
Si on vous demande un code PIN, tapez 0000
.
Ajouter la manette à la liste des périphériques de confiance
sudo bluez-test-device trusted xx:xx:xx:xx:xx:xx yes
Confirmez la connexion persistante entre votre NES30 Pro et votre RetroPie. Après un reboot, les deux devraient alors restés connectés
sudo bluez-test-input connect xx:xx:xx:xx:xx:xx
Voilà! Le plus gros est fait, tout est connecté. 😛
La LED devrait maintenant arborée un joli bleu persistant.
Désappairage
Si vous avez foiré votre appairage et que vous souhaitez vous y reprendre, supprimez la configuration de votre périphérique avec la commande
sudo bluez-test-device remove xx:xx:xx:xx:xx:xx
Et recommencez.
Erreurs possibles
Il est possible que vous rencontriez des erreurs au cours de l'appairage, ce fut mon cas.
Au moment où je tente de connecter la manette avec la commande
sudo bluez-test-input connect xx:xx:xx:xx:xx:xx
La console me retourne cette erreur
Traceback (most recent call last):
File "/usr/bin/bluez-test-input", line 40, in <module>
input.Connect()
File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 70, in __call__
return self._proxy_method(*args, **keywords)
File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 145, in __call__
**keywords)
File "/usr/lib/python2.7/dist-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownMethod: Method "Connect" with signature "" on interface "org.bluez.Input" doesn't exist
Ennuyeux.
Alors il semblerait que cette erreur pointe le bout de son nez lorsque le plugin input de Bluetooth n'est pas activé, ce qui n'est pas mon cas après vérification du fichier sudo nano /etc/bluetooth/main.conf
Il suffirait de désappairer la manette puis de la ré-apparier pour que cette erreur disparaisse. Ce ne fut pas mon cas.
Je désinstalle et réinstalle les paquets Bluez, Blueman, etc.. Rien ne change. Je refais toute la procédure à l'envers, toujours rien. Encore la même erreur.
Je ne me démonte pas et je pose la question directement sur le forum 8bitdo ainsi que sur le Github de Retropie. Rien de convaincant...
Bon, après moult tentatives diverses et variées, toujours pareil. 😡
Tentons autre chose.
2ème méthode : hidd
Ah! Après avoir perdu pas mal de temps avec la première méthode qui est pourtant indiquée comme étant celle à favoriser, je me rabats sur l'utilisation de hidd.
saisissez-vous de votre manette NES30 Pro et allumez-la en pressant le bouton POWER
+ B
+ R1
pendant 3 secondes. Votre manette devrait à présent arborer un joli bleu clignotant rapidement.
Patientez environ 10 secondes et scannez les appareils bluetooth à proximité
hcitool scan
La console vous retourne une adresse MAC
pi@retropie ~ $ hcitool scan
Scanning ...
xx:xx:xx:xx:xx:xx 8Bitdo NES30 Pro Joystick
Appairez-la
sudo hidd --connect xx:xx:xx:xx:xx:xx
Si la console vous retourne, c'est que ça n'a pas fonctionné, sinon c'est tout bon!
Appairage automatique au démarrage
J'y suis enfin arrivé.
Maintenant il va falloir rendre tous ça plus automatique.
hidd
Commençons par nous rendre dans /home/pi
cd /home/pi
Et téléchargez-y les scripts btDaemon.sh et btService
sudo wget https://raw.githubusercontent.com/frthery/ES_RetroPie/master/bluetooth/btDaemon.sh https://raw.githubusercontent.com/frthery/ES_RetroPie/master/bluetooth/btService
Rendez-les exécutables puis changez leur chmod
sudo chmod +x btService btDaemon.sh; sudo chmod 755 btService btDaemon.sh
Déplacez btService dans /etc/init.d
sudo mv btService /etc/init.d/btService
Éditez maintenant btDaemon.sh en y indiquant la/les adresse(s) MAC de votre/vos manette(s)
# CONFIGURE YOUR BLUETOOTH DEVICES
BT1='xx:xx:xx:xx:xx:xx'
BT2='xx:xx:xx:xx:xx:xx'
Voilà. Il ne vous reste plus qu'à démarrer le service
sudo /etc/init.d/btService start
Pour l'arrêter
sudo /etc/init.d/btService stop
et vérifiez son état
sudo /etc/init.d/btService status
Va falloir que le script se lance à chaque reboot.
sudo update-rc.d /etc/init.d/btService defaults
Vous savez tout. Seulement pour éviter que le script ne tourne en permanence il va falloir faire en sorte que le script ne fonctionne qu'au démarrage. Éditez runcommand.sh
sudo nano /opt/retropie/supplementary/runcommand/runcommand.sh
Recherchez la ligne function set_governor()
et collez juste au dessus
sudo /etc/init.d/btService stop
Puis recherchez la ligne exit 0
et collez juste au dessus
sudo /etc/init.d/btService start
Sauvegardez et relancez votre RPi.
Pour être certain que vos manettes s'appairent correctement, allumez-les avant de démarrer votre RPi.
bluez
L'opération est la même pour ceux qui utilisent bluez pour connecter leurs manettes, à la différence prêt qu'il vous faut un script btDaemon.sh adapté que vous trouverez ci-dessous
#!/bin/bash
#REMPLACER BT1 ET BT2 PAR VOS ADRESSES MAC
#hcitool scan
#Joystick 1
BT1='20:73:AB:01:98:76'
#Joystick 2 supprimer le caractère # pour activer BT2
#BT2='20:73:AB:01:16:3E'
BT1_STATUS='unknown'
BT2_STATUS='unknown'
#initialize
VERBOSE=0
NO_LOG=0
COUNT_LINES_LOGGER=0
MAX_LINES_LOGGER=100
DELAI=10
LOGGER_FILE=/var/log/btDaemonLogger.log
[ "$1" = '-v' ] && VERBOSE=1
#END initialize
#functions
logger() {
#no logger
[ $NO_LOG -eq 1 ] && return
[[ $2 -eq 1 ]] && COUNT_LINES_LOGGER=0
COUNT_LINES_LOGGER=$(($COUNT_LINES_LOGGER + 1))
now=$(date +"%m-%d-%y %r")
if [ $VERBOSE -eq 1 ]; then
echo "[$now]" $1
fi
if [[ $2 -eq 1 ]]; then
#RESET Logger File
echo "[$now]" $1 > $LOGGER_FILE
else
echo "[$now]" $1 >> $LOGGER_FILE
fi
}
auto_connect() {
local index=$1
local bt=$2
[ ! -s /tmp/btcheck ] && [ $(ls /dev/input/js0 2> /dev/null) ] && logger "USB device js0 is already connected" && return
if [ ! -z "$bt" ]; then
if grep -q $bt /tmp/btcheck; then
logger "[OK] bluetooth device $index [$bt] is already connected"
else
logger "[KO] bluetooth device $index [$bt] not connected"
connect $index $bt
fi
else
logger "no configuration found for bluetooth device $index (check mac address)"
fi
}
connect() {
local index=$1
local bt=$2
local btStatus='notconnected'
local tryPing=1
local tryCon=1
local maxRetry=1
#priority to gamepad 1
#[ $index -eq 0 ] && maxRetry=10
logger "try connecting bluetooth device $index [$bt] maxRetry=$maxRetry..."
#10 attempts for connecting device
while [ $tryPing -le $maxRetry ]; do
l2ping $bt -c 3 > /dev/null 2>&1
RESPING=$?
if [ $RESPING = 0 ]; then
logger "[OK][$RESPING] ping bluetooth device $index [$bt]"
tryCon=1
while [ $tryCon -le $maxRetry ]; do
bluez-test-input connect $bt &> /dev/null
RESCON=$?
if [ $RESCON = 0 ]; then
#logger "[OK][$RESCON] bluetooth device $index [$bt] connected"
btStatus='connected'
#xd_init $index $bt
else
logger "[KO][$RESCON][$tryCon] bluetooth device $index [$bt] connected"
btStatus='notconnected'
fi
[ $btStatus = 'connected' ] && break
tryCon=$(($tryCon + 1))
done
else
logger "[KO][$RESPING][$tryPing] ping bluetooth device $index [$bt]"
btStatus='noping'
fi
[ $btStatus = 'connected' ] && break
tryPing=$(($tryPing + 1))
done
[ $index -eq 0 ] && BT1_STATUS=$btStatus && logger "bluetooth device $index [$bt] [$BT1_STATUS]"
[ $index -eq 1 ] && BT2_STATUS=$btStatus && logger "bluetooth device $index [$bt] [$BT2_STATUS]"
}
#END functions
#MAIN
logger "[START] bluetooth devices monitoring..." 1
while [ 1 ]; do
#COUNT_LINES_LOGGER=$(wc -l $LOGGER_FILE | cut -f1 -d" ")
if [ $COUNT_LINES_LOGGER -gt $MAX_LINES_LOGGER ]; then
#RESET Logger
logger "--- bluetooth devices check connections [delai=$DELAI] ---" 1
else
logger "--- bluetooth devices check connections [delai=$DELAI] ---"
fi
#check bluetooth devices status
hcitool con|grep -v "^Connections:" > /tmp/btcheck
auto_connect 0 $BT1
auto_connect 1 $BT2
logger "------------------------------------------------------"
sleep $DELAI
done
logger "[STOP] bluetooth devices monitoring."
#END MAIN
exit 0
Mapping des touches
Si vous avez déjà testé votre manette sur RetroPie, vous vous êtes rendu compte qu'au démarrage d'EmulationStation il vous est demandé de mapper vos touches grâce avec InputStation, interface graphique née de la collaboration entre les équipes de RetroPie et EmulationStation, qui dans la plupart des cas et pour la majorité des émulateurs fonctionnera correctement.
Mais vous pouvez aussi directement utiliser RetroArch, le frontend de libretro. C'est grâce à lui que vous pourrez configurer vos émulateurs (la plupart). Vous voulez mettre les mains dans le cambouis? À votre guise, suivez les conseils ci-dessous.
Mode clavier
Pour utiliser votre manette en Mode2 (Bluetooth Keyboard), allumez-la avec la combinaison Power+B
La LED va clignoter 2 fois par seconde
Ouvrez ensuite le fichier /opt/retropie/configs/all/retroarch.cfg
et recherchez la ligne
input_player1_a
Et complétez les input comme il suit
input_player1_a = g
input_player1_b = j
input_player1_y = i
input_player1_x = h
input_player1_start = o
input_player1_select = n
input_player1_l = k
input_player1_r = comma
input_player1_left = e
input_player1_right = f
input_player1_up = c
input_player1_down = d
input_player1_l2 = l
input_player1_r2 = space
input_player1_l3 = a
input_player1_r3 = y
Mode Joystick
Pour utiliser votre manette en Mode1 (Joystick), allumez-la tout simplement avec la touche Power
. Ainsi vous pourrez jouer avec le joystick.
La LED va clignoter 1 fois par seconde
Maintenant rendez-vous à la fin du fichier et collez-y les lignes suivantes
# Player 1
input_player1_a_btn = "11"
input_player1_b_btn = "12"
input_player1_y_btn = "15"
input_player1_x_btn = "14"
input_player1_start_btn = "22"
input_player1_select_btn = "21"
input_player1_l_btn = "17"
input_player1_r_btn = "18"
input_player1_left_btn = "2"
input_player1_right_btn = "3"
input_player1_up_btn = "0"
input_player1_down_btn = "5"
# Player 2
input_player2_a_btn = "11"
input_player2_b_btn = "12"
input_player2_y_btn = "15"
input_player2_x_btn = "14"
input_player2_start_btn = "22"
input_player2_select_btn = "21"
input_player2_l_btn = "17"
input_player2_r_btn = "18"
input_player2_left_btn = "2"
input_player2_right_btn = "3"
input_player2_up_btn = "0"
input_player2_down_btn = "5"
#Hotkeys
input_enable_hotkey_btn = "21"
input_exit_emulator_btn = "22"
input_menu_toggle_btn = "14"
input_screenshot_btn = "15"
input_load_state_btn = "17"
input_save_state_btn = "18"
input_reset_btn = "12"
input_state_slot_increase_btn = "h0right"
input_state_slot_decrease_btn = "h0left"
screenshot_directory = /home/pi/RetroPie/screenshots/
Les dernières lignes (Hotkeys) sont des combinaisons de touches à utiliser avec la hotkey SELECT. Par exemple si vous voulez prendre un screenshot faites SELECT + Y.
- Quitter l'émulateur -
SELECT
+START
- Ouvrir le menu RetroArch -
SELECT
+X
- Faire un screenshot -
SELECT
+Y
- Charger une partie -
SELECT
+L1
- Sauvegarder une partie -
SELECT
+R1
- Reset la partie -
SELECT
+B
Utilisez le D-Pad et le Joystick
Il existe un conflit entre le D-Pad et le Joystick en mode1 (Joystick). Pour régler le problème, éditez retroarch.cfg
Trouvez les lignes
input_player1_left = e
input_player1_right = f
input_player1_up = c
input_player1_down = d
Et remplacez-les par
input_player1_left = nul
input_player1_right = nul
input_player1_up = nul
input_player1_down = nul
Certains émulateurs n'utilise pas RetroArch, comme MAME par exemple. Il vous faudra éditer directement leur .cfg
. En dessous de la ligne de commentaire # Player 2
le mappage vous permettra entre autre de configurer plus tard une seconde manette.
Relançons maintenant le setup de RetroArch. Rendez-vous dans le répertoire RetroPie-Setup
cd RetroPie-Setup
Et lancez le script
sudo ./retropie_setup.sh
Rendez-vous dans l'option 2 - Setup / Configuration puis sur le second tableau sélectionnez l'option 317 - Configure Retroarch Controller et laissez le script s'exécuter.
Retroarch va alors générer les fichiers de configuration pour plusieurs gamepads, comme la NES30Pro. Il existe par ailleurs trois fichiers de configuration pour celle-ci qui seront utilisés selon le mode de votre manette. Ces différents modes s'activent lors du démarrage de la méthode grâce à différentes combinaisons de touches.
Mode | nom | Combo | fichier |
---|---|---|---|
Mode1 | Joystick | ⌽ | 8Bitdo-NES30-Pro-GamePad-Bluetooth-Mode(POWER).cfg |
Mode2 | Bluetooth Keyboard | ⌽ + B | 8BitdoNES30Pro8BitdoNES30Pro.cfg |
Mode2 | Bluetooth Keyboard(2P) | ⌽ + B + R1 | 8Bitdo-NES30-Pro-GamePad-Bluetooth-Mode(POWER+R1).cfg |
Mode5 | USB Joystick | ⌽ et branchez l'USB | 8Bitdo-NES30-Pro-GamePad-USB.cfg |
Éditez chacun de ces fichiers selon vos besoins et configurations voulues en omettant pas d'éditer aussi /opt/retropie/config/all/retroarch.cfg
Vu que je suis en mode2 le fichier de mapping se nomme 8BitdoNES30Pro8BitdoNES30Pro.cfg
et il ressemble à ça:
input_device = "8Bitdo NES30 Pro"
input_driver = "udev"
input_vendor_id = 14368
input_product_id = 9
input_b_btn = "12"
input_y_btn = "15"
input_select_btn = "21"
input_start_btn = "22"
input_up_btn = "h0up"
input_down_btn = "h0down"
input_left_btn = "h0left"
input_right_btn = "h0right"
input_a_btn = "11"
input_x_btn = "14"
input_l_btn = "17"
input_r_btn = "18"
input_l2_btn = "19"
input_r2_btn = "20"
input_l3_btn = "24"
input_r3_btn = "25"
input_l_x_plus_axis = "+0"
input_l_x_minus_axis = "-0"
input_l_y_plus_axis = "+1"
input_l_y_minus_axis = "-1"
input_r_x_plus_axis = "+2"
input_r_x_minus_axis = "-2"
input_r_y_plus_axis = "+3"
input_r_y_minus_axis = "-3"
input_b_btn_label = "B"
input_y_btn_label = "Y"
input_select_btn_label = "Select"
input_start_btn_label = "Start"
input_up_btn_label = "D-Pad Up"
input_down_btn_label = "D-Pad Down"
input_left_btn_label = "D-Pad Left"
input_right_btn_label = "D-Pad Right"
input_a_btn_label = "A"
input_x_btn_label = "X"
input_l_btn_label = "L1"
input_r_btn_label = "R1"
input_l2_btn_label = "L2"
input_r2_btn_label = "R2"
input_l3_btn_label = "Left Thumb"
input_r3_btn_label = "Right Thumb"
input_l_x_plus_axis_label = "Left Analog Right"
input_l_x_minus_axis_label = "Left Analog Left"
input_l_y_plus_axis_label = "Left Analog Down"
input_l_y_minus_axis_label = "Left Analog Up"
input_r_x_plus_axis_label = "Right Analog Right"
input_r_x_minus_axis_label = "Right Analog Left"
input_r_y_plus_axis_label = "Right Analog Down"
input_r_y_minus_axis_label = "Right Analog Up"
input_enable_hotkey_btn = "21"
input_exit_emulator_btn = "22"
input_menu_toggle_btn = "14"
input_load_state_btn = "17"
input_save_state_btn = "18"
input_reset_btn = "12"
input_state_slot_increase_btn = "h0right"
input_state_slot_decrease_btn = "h0left"
Astuces
Reset la config de EmulationStation
Vous avez mal configuré votre EmulationStation? Quà cela ne tienne, avec votre clavier depuis EmulationStation tapez la touche F4
Une fois sur la console, supprimez le fichier de config:
sudo rm /home/pi/.emulationstation/es_input.cfg
Et relancez EmulationStation
emulationstation
Update du firmware
Les mises à jour c'est important, faisant en sorte que le firmware de notre toute nouvelle manette le soit.
Tout d'abord il va vous falloir télécharger la version la plus récente du firmware ainsi que l'updater adéquat, sur 8bitdo.com
Dézippez l'archive téléchargée et naviguez à l'intérieur. Vous remarquerez qu'il un fichier nommé Firmware_FC30&NES30_Pro_VX.XX.dat
; il s'agit bien évidemment du firmware.
Si vous êtes sous OSX rendez-vous dans le répertoire MacOS et ouvrez l'app qui s'y trouve, ici 8Bitdo_Update_v1.2
Il ne vous reste plus qu'à relier le câble USB fourni avec votre manette à votre ordinateur, sans pour autant le connecter à la NES30 Pro.
Maintenez les touches power + appairage jusqu'à ce que la LED clignote jaune.
Reliez votre manette au câble USB et jetez un œil à l'app lancée en amont. Celle-ci va s'éveiller et vous indiquez la version actuelle du firmware de votre manette. Cliquez sur le bouton USB Update
Une nouvelle fenêtre s'ouvre et vous demande de sélectionner le fichier Firmware_FC30&NES30_Pro_VX.XX.dat
, faîtes-le et confirmez
L'updater vous indique la version du firmware que vous vous apprêtez à installer et demande de confirmer
Hop! Confirmez et admirez la jolie barre de progression qui s'affiche
C'est fini! Votre NES30 Pro est à jour. 😋
Liens
Quelques lectures et points de repères
- Manuel d'utilisation de la NES30 Pro
- Wiki de PiAssist
- Monter un retropie - open-consoles-news.com
- NES30 Pro - blog.recalbox.com
- script btDaemon