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.

ModenomCombofichier
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