Début 2013 j’étais tombé sur cet article de Korben qui proposait plus de 50 idées de projets avec un RaspberryPi et cela m’avait motivé à en acheter un.


Bon, mais déjà qu’est-ce qu’un RaspberryPi ?

En résumé c’est un ordinateur de la taille d’une carte de crédit qui embarque un processeur ARM.
Malgré sa taille il possède tous les entrées/sorties dont on a besoin (USB, HDMI, RJ45, Audio Jack, Vidéo composite).

Son grand avantage étant son prix inférieur à 50$.

Plusieurs mois plus tard, alors que mon RaspberryPi prenait la poussière dans un tiroir et que la RetroN5 était repoussée de sortie pour la Xème fois, j’ai repensé à la liste de projets et plus particulièrement à celui-ci :

Un RaspberryPi avec Emulateur SNES

Bien sûr, rien ne remplace la console d’origine. Mais de mon point de vue jouer sur une TV et avec les manettes de la console d’origine est ce qui peux reproduire au mieux l’expérience d’antan.

Les bases du mini projet sont posés :

  • Look de console
  • Utilisation de la sortie HDMI
  • Emulateurs des console de l’époque guerre Sega-Nintendo
  • Support des manettes officielles (MD, SMS, NES & SNES)

Les premiers essais

Avant de réellement se lancer dans le projet nous avons fait quelques essai.

Notre premier test était d’arriver à faire fonctionner une manette megadrive (le port standard db9 est facile à se procurer)

Sur le RaspberryPi nous avons installé le « RetroPie Projet » qui est en fait un pack de différents émulateur axés retro-gaming / front-ends / drivers.
Sur le site officiel ils proposent même des images toutes faites à copier direct sur la carte SD du RaspberryPi.

Pour copier facilement les images sur la carte SD, il existe le soft Win32 Disk Imager.

Malgré le fait que tout soit sensé être installé et marcher, rien ne fonctionnait du premier coup.
Heureusement à chaque étape du projet j’ai pu compter sur l’aide de FDestroyer comme ça on pouvait frustrer à deux !

Commande du matériel

J’ai presque tout commandé sur ebay. Pour les petites pièces (câbles, boutons, connecteurs) c’est super, ça ne coûte jamais plus de 2-3$ et les frais de ports sont gratuits. Seule condition, ça vient de Chine et donc il faut être prêt à attendre environ 1 mois pour être livré.

Le boitier de la future console

J’ai décidé d’utiliser un vieux boitier de NES. Par chance j’ai pu me procurer une NES défectueuse sur « ricardo.ch » à bon prix (15CHF). (Le prix des NES est vraiment hallucinant maintenant !)

Première étape : donner un look différent d’une NES classique.

La pauvre à été éventrée puis vidée et quelques découpes ont été effectués afin d’intégrer les nouveaux types de sorties.

Et hop un coup de peinture blanche.

Finalement, le boitier est refermé et les boutons placés.

Boutons en façade

Les boutons qui ont été ajouté sur le boitier, vont servir à naviguer dans les menu (sélection de l’émulateur, de la rom, lancer/quitter le jeu)

Pour les connecter au RaspberryPi, j’ai commandé (ebay) un mini-clavier configurable qui se connecte en USB.

Le boitier est fourni avec un soft pour Windows qui permet d’attribuer une touche (ou macro) à chaque bouton.

Installation des ports console supplémentaires

Ports MS/SMS : Se sont les mêmes pour les deux consoles, il s’agit de ports standard db9. (Utilisé à l’époque par Atari, Commodore, Amiga, etc..)
Ports NES : Nous allons tout simplement utiliser ceux déjà présent sur la console
Ports SNES : Comme pour la NES c’est un standard Nintendo. J’ai pu m’en procurer sur le site Québécois http://www.raphnet-tech.com/ (Le site présente entre-autres pas mal de projets sympa liés aux consoles)

Voici ce que ça donne une fois placés.

Et vu de l’intérieur.

Petite interstice pour la configuration de RetroPie

Commandes et astuces en vrac :


Reset de la config manette sous Emulationstation

cd ~/.emulationstation/sudo rm es_input.cfg


Pour tout ce qui touche à la config de emulationstation

cd ~/.emulationstation/
sudo nano es_systems.cfg


Pour faire un shutdown

sudo halt


Pour accéder à la config générale de la distribution linux Raspi (Pour changer le nom de la machine ou le type de clavier)

sudo raspi-config


Pour accéder à la config liée a RetroPie

cd RetroPie-Setup
sudo ./retropie_setup.sh

 
Accéder à l’éditeur de texte

sudo nano myconfig.cfg


Loader un driver (manette megadrive par ex)

sudo modeprobe --first-time db9_gpio_rpi map=4


Unload un driver

sudo modprobe db9_gpio_rpi -r


Nom d’utilisateur et password par défaut

user : pi
password : raspberry

Quelques utilitaires biens utiles

PuTTY :http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Permet d’accéder à la console du RaspberryPi via SSH

WinSCP :http://winscp.net
Permet d’accéder au RaspberryPi via SFTP. Cela permet entre autre de nettement facilier la navigation, l’édition et le transfert de fichiers, vue que tout ca fait dans un explorateur de fichier type Norton Commander.

Branchement des manettes sur le RaspberryPi

Il y a deux drivers différent pour gérer les types de manettes qui nous intéressent.

db9_gpio_rpi : https://github.com/petrockblog/RetroPie-Setup/wiki/db9_gpio_rpi
Support pour les manettes MD, SMS, Atari, Amiga, Commodore

gamecon_gpio_rpi : https://github.com/petrockblog/RetroPie-Setup/wiki/gamecon_gpio_rpi
Support pour les manettes SNES, NES, N64, PSX/PS2, GC


Les connecteurs manettes sont physiquement reliés aux ports GPIO du RaspberryPi.

Pour gérer plusieurs types de manettes plusieurs GPIO étaient utilisés à double.

Pour s’y retrouver avec les branchements, j’ai pu demander de l’aide à mon père qui est électronicien.
Il nous a fournis un petit système quadruplant ces connecteurs GPIO

Toutes les infos de branchement se trouvent sur les pages des drivers donnés plus haut.
Et avec les schémas ci-dessous c’est possible de se débrouiller.

ATTENTION : Malgré le schéma sur le site web du driver gamecon_gpio_rpi, les ports GPIO2 & 3 ne sont pas utilisables car il s’agit de ports I2C. (en tout cas sur la r2 du Pi)

ATTENTION : Pour la SNES, les manettes européennes ne fonctionnent pas ! Car le RaspberryPi ne leur fournit que 3.3V au lieu des 5V qu’elles demandent. Pour cela j’utilise mon ancien ASCII Pad sortit à l’époque sous licence Nintendo ainsi qu’une manette SNES US (Les manettes super famicom marchent aussi). Toutefois il est possible d’acheter un module sur le site de petRockblog qui permet de faire circuler du 5V sans risques. (mais à vérifier !!)

Pour le mappage des touches il suffit d’éditer le fichier retroarch.cfg relatif à la console choisie.

Par exemple dans « /home/pi/RetroPie/config/nes » mon fichier retroarch.cfg contient :

input_player1_a_btn = 1
input_player1_b_btn = 3
input_player1_start_btn = 7
input_player1_select_btn = 6
input_player1_left_axis = -0
input_player1_right_axis = +0
input_player1_up_axis = -1
input_player1_down_axis = +1
input_player2_a_btn = 1
input_player2_b_btn = 3
input_player2_start_btn = 7
input_player2_select_btn = 6
input_player2_left_axis = -0
input_player2_right_axis = +0
input_player2_up_axis = -1
input_player2_down_axis = +1

Pour vérifier si les touches sont bien mappé il existe des roms pour tester les inputs.

Utiliser un adaptateur USB

Avec RetroPie il est tout a fait possible d’utiliser directement un adaptateur USB au lieu de passer par les GPIO.
Cependant à première vue il me semble que passer directement par les GPIO supprime les retard inhérent aux adaptateurs USB.

Mettre un splashscreen personnalisé.

Le splashscreen c’est tout simplement l’écran de boot.
Le plus simple est de remplacer le .png du splashscreen actif. Par défaut dans « RetroPie-Setup/supplementary/splashscreens »

Voici celui que j’ai réalisé :

Pour les addicts des vieilles TV

Si l’aspect super net du jeu sur HDMI vous rebute, sachez qu’il existe un pack qui permet de simuler des scan-lines comme sur les vieux écrans.
Le pack se trouve ici, mais je ne l’ai pas encore testé.

http://blog.petrockblock.com/forums/topic/video-filters-scanlinesntsc/

Utiliser les bouton Power et Reset de la NES

Le problème avec le RaspberryPi c’est que le seul moyen de l’éteindre c’est de lancer un shutdown « sudo halt » (comme sur n’importe quel PC) puis de tirer la prise d’alimentation.
Si on tire directement la prise sans faire de shutdown on risque de corrompre la carte SD !

Heureusement le site http://mausberry-circuits.myshopify.com/ vend des circuit permettant de palier à ce problème.

Théoriquement c’est pas compliqué. On relie nos boutons POWER et RESET au circuit et le circuit lui-même doit être branché sur deux GPIO (1x IN et 1x OUT).
Sur le RaspberryPi on doit également installer un petit script.

Donc en gros quand on presse sur le bouton POWER, le circuit envoi un signal au RaspberryPi qui lance la commande de shutdown, et quand le shutdown se fait c’est le RaspberryPi qui envoi un signal au circuit et celui-ci coupe le courant.


Le problème dans notre cas c’est qu’il n’y avait plus qu’un seul GPIO de libre, tous les autres étant utilisés par les manettes…

Heureusement la revision2 du RaspberryPi possède deux ports GPIO supplémentaires (GPIO 30 & 31). Je les ai indiqués sur l’image ci-dessous

Utiliser la led POWER de la console

Il faut simplement relier la LED de la NES sur le 3.3V ou 5V du RaspberryPi.

ATTENTION : Il faut placer une résistance avant la LED sinon elle grille !

Gestion des drivers manettes selon le jeu lancé.

Pour cela j’ai modifié le fichier « /home/pi/.emulationstation/es_systems.cfg »

Voici ce que j’ai fait pour les lignes de config SNES par exemple

DESCNAME=Super Nintendo
NAME=snes
PATH=/home/pi/RetroPie/roms/snes
EXTENSION=.smc .sfc .fig .swc .SMC .SFC .FIG .SWC
COMMAND=sudo modprobe gamecon_gpio_rpi -r && sudo modprobe db9_gpio_rpi -r && sudo modprobe --first-time gamecon_gpio_rpi map=0,0,1,1 && /home/pi/RetroPie/supplementary/runcommand/runcommand.sh 2 "/home/pi/RetroPie/emulators/RetroArch/installdir/bin/retroarch -L /home/pi/RetroPie/emulatorcores/pocketsnes-libretro/libretro.so --config /home/pi/RetroPie/configs/all/retroarch.cfg --appendconfig /home/pi/RetroPie/configs/snes/retroarch.cfg %ROM%"
# alternatively: COMMAND=/home/pi/RetroPie/emulators/snes9x-rpi/snes9x %ROM%
# alternatively: COMMAND=/home/pi/RetroPie/emulators/pisnes/snes9x %ROM%
PLATFORMID=6

J’ai ajouté des autres commande à la ligne de lancement du jeu afin d’unlader les drivers actifs et de loader le bon driver

« && » permet d’inclure plusieurs commandes à exécuter sur une même ligne

Ajout de dissipateurs thermiques sur le RaspberryPi

Cela permet entre autre de l’overclocker et avoir de meilleures performances dans certains jeux.

Scrapping des informations des jeux

Avec EmulationStation (le front-end de RetroPie), il est possible d’ajouter un résumé ainsi qu’une pochette pour chaque jeu.

RetroPie est livré avec un script Python (ES-Scraper) qui permet de scraper les résumé et les pochettes. Mais quand il y a des choses à modifier ça devient tout de suite ennuyant pour éditer le XML manuellement…

Pour palier à ce problème, j’ai fait un petit logiciel en C#

Il permet de scraper manuellement et facilement les résumé et les pochettes.
Si une pochette ne convient pas on peux en choisir une depuis son disque ou via une recherche Google Image. Les images sont chargés et redimensionnés automatiquement.
J’ai prévu deux tailles de covers pour les version européennes et japonaises.

Chaque console est configurable dans le fichier .config de l’application.
Voici par exemple la config de la SNES :

<add key="snes_name" value="SNES"/>
<add key="snes_pc_path" value="P:\RetroPie\Roms\snes"/>
<add key="snes_pi_path" value="/home/pi/RetroPie/roms/snes/"/>
<add key="snes_cover_width" value="825"/>
<add key="snes_cover_height" value="580"/>
<add key="snes_cover_width_alternate" value="580"/>
<add key="snes_cover_height_alternate" value="825"/>
<add key="snes_rom_extension" value="smc,sfc,fig,swc"/>
<add key="snes_gamesdb_machine_name" value="Super Nintendo (SNES)"/>

Télécharger la V1 de ES-Manager EDIT: Il y a maintenant une V2 ! Voir l’article.

ATTENTION : Uniquement compatible avec la V1 de EmulationStation (Retropie 1)

Des thèmes tout neufs pour EmulationStation

J’ai intégré de nouveaux thèmes que j’ai trouvé sur les forum de petrockblock : http://blog.petrockblock.com/forums/topic/my-skin/
Ces derniers que je trouve très réussis, ont été réalisés par « nosifone »

Je les ai quelque peu modifiés pour inclure les pochettes + résumé et les adapter à une résolution 1080p.

Voici un aperçu :

La console est à ce stade finie et utilisable !

Quelques images de la console finie.

L’intérieur avec une bonne quantité de fils.

L’arrière avec le port d’alimentation, HDMI, RJ45 (Copie de roms par partage réseau), sur le côté des sorties analogique audio et vidéo (toutefois ils y a un gros retard sur la sortie vidéo analogique)

L’expansion Port au dessous de la NES (qui d’ailleurs n’a jamais été utilisé) à ici été recyclé en tant que « Port de service » pour y brancher un clavier ou autre grâce a l’USB disponible. On à également accès à la carte SD pour la sortir et faire des backups.

Après les images, place à la vidéo !

F Destroyer m’a aidé à réaliser une courte vidéo pour montrer le fonctionnement de l’appareil.