Cartouche Raspberry Pi NES


Bonjour Il s'agit d'une console de jeu rétro basée sur le Raspberry Pi. Dans une cartouche de la console de jeu NES. Un écran intégré peut être utilisé pour le jeu. Lors de la sortie vidéo via HDMI, il montre l'image de la couverture du jeu, ainsi que la température centrale, voir photo. Je suggère un peu de nastalgit et je lis sur l'assemblage et la configuration d'un tel appareil. Attention, alors beaucoup de trafic et de photos.

La nostalgie


Dans l'enfance, nous, qui avons maintenant entre 25 et 35 ans, aimions jouer aux consoles. Ensuite, il n'y avait pas de nouveau mot pour la console, je vais donc les appeler ainsi. Ma connaissance des consoles a commencé avec Dandy (clone NES). Super Mario Bros, Contra, Ducktales, Battletoads ne sont que quelques - uns des succès de l'époque. Ensuite, toute la cour allait jouer avec mon ami Sega (Sega Mega Drive), dans des tubes tels que Sonic, Ultimate Mortal Combat 3, Contra Hard Corps et plus encore . Et lorsque Play Station est sortie, je dois dire qu'elle ne nous est pas arrivée tout de suite, la série Resident Evil a causé un délice vraiment effrayant.


Cette photo m'a aidé à essuyer une larme de nostalgie. Je dois dire que je ne suis pas le premier à proposer un Raspberry Pi dans la cartouche NES. Oui, ce n'est pas mon appareil. Et cette cartouche est presque idéale à ces fins, elle est petite et belle. Et à l'intérieur, il y a beaucoup d'espace. Jugez par vous-même.


À l'intérieur du Raspberry Pi Zero, un concentrateur USB et une paire de rallonges. Tous les bâtons sont fixés sur de la colle thermofusible.

Assemblage


Je voulais collecter quelque chose de similaire ou similaire. La même cartouche de NES a été sélectionnée. Les autres options sont soit très petites, soit pas très belles. Le Raspberry Pi 3B était le cœur enflammé de la voiture rétro. Des connecteurs USB avec des broches à souder pratiques ont également été achetés sur Ali. C’est tout.


Oh oui, vous allez répéter ce projet, ne prenez pas de cartouches hit. Il y en a si peu. Prenez quelque chose de plus commun ou de moins connu. Il y a aussi une option pour prendre une cartouche avec Ali, mais l'original, ça réchauffe l'âme. Ma sortie en 1986.

Vous aurez également besoin d'un tournevis NES spécial si la cartouche est vissée sur trois vis. Il existe également des premières options de cartouche avec cinq vis; elles sont dévissées avec un tournevis plat ordinaire. J'en ai juste un.

Toutes les pièces gênantes sont coupées et sciées de la cartouche avec un couteau de bureau et une lame de scie à métaux.


Les connecteurs saillants ont été soudés au Raspberry Pi. Les experts disent que vous pouvez vous passer d'une station de soudage, si vous démontez d'abord soigneusement les connecteurs avec un coupe-fil, puis soudez une jambe à la fois. Le tout collé à chaud. Entre les connecteurs USB et la framboise se trouvait un isolant en plastique non consommable. N'oubliez pas de connecter le GND Raspberry Pi et le corps du connecteur USB (non illustré dans l'image ci-dessus). Sinon, certains joysticks ne fonctionneront pas.


La dernière Retropie a été installée sur la framboise . Au début, il y avait Recalbox , mais je l'ai refusé, car il ne prend pas en charge la vibration des joysticks sur Playstation 1. Mais je dois dire que Recalbox est un peu plus pratique en termes de ce qui fonctionne hors de la boîte et vous n'avez pas besoin de configurer quoi que ce soit. Dans Retropie, un tas de paramètres, vous pouvez personnaliser à l'infini. Voilà ce que j'ai aimé.
Voici ce qui s'est passé. Tous les joysticks avec xinput sont connectés.



Écran


L'appétit vient en mangeant. Que diriez-vous d'intégrer l'écran dans la cartouche? Pour jouer ou afficher l'image de couverture du jeu. Un tel écran a été commandé. Il s'agit d'un écran DPI parallèle de 800 * 480 de 3,5 pouces qui utilise presque tous les GPIO Raspberry Pi. Cela fonctionne pour moi en mode 120 Hz (mais le rendu est toujours à 60 Hz), la réponse est instantanée. Le seul point négatif est la matrice 6 bits. Seulement 262.144 couleurs. Bien que, en général, cela ne soit pas particulièrement visible, jugez par vous-même.

Capture d'écran du jeu Comix Zone (Clickable)

Toutes les jambes de l'écran et du Raspberry Pi ont été soudées. L'écran a été soudé par deux câbles d'un vieux câble IDE en lambeaux. Des hypothèques de 5 mm sont installées sous l'écran, il ne touche pas la paroi inférieure de la cartouche. Un ruban isolant est collé autour du périmètre de l'écran afin qu'il n'y ait pas de clignotements latéraux. Tout est collé à de la colle chaude. Sur le capot supérieur, j'ai découpé une fenêtre et collé un verre de 2 mm d'épaisseur.


Pour commencer à afficher des images sur cet écran, vous devez corriger la configuration /boot/config.txt . Je recommande WinSCP pour les propriétaires de Windows qui, lors de la connexion au Raspberry Pi via SSH, donne la présentation des fichiers comme dans Total Commander. Très confortable. Surtout si vous l'exécutez en mode shell sudo su - , qui donne accès à tous les fichiers.

Malheureusement, lorsque l'écran DPI est allumé, la sortie vidéo HDMI ne fonctionne pas. Par conséquent, j'ai créé deux fichiers de configuration dans le dossier / boot / , un config_hdmi.txt et le second config_dpi.txt . La configuration config_hdmi.txt a défini la résolution sur 1080p60Hz et supprimé le surbalayage. config_dpi.txt contient les paramètres DPI de l'écran.

config_dpi.txt
# uncomment if you get no picture on HDMI for a default "safe" mode #hdmi_safe=1 disable_overscan=1 # uncomment to force a specific HDMI mode (this will force VGA) #hdmi_group=1 #hdmi_mode=1 # Sound output. Set to 0 or comment for autodetect, 1 for DVI, 2 to force HDMI. #hdmi_drive=2 # Using /etc/modules is deprecated and no longer supported on 4.4 kernel # So manually enable audio dtparam=audio=on config_hdmi_boost=0 # force hdmi while the tv can take time before sending the signal on the hdmi output hdmi_force_hotplug=1 # uncomment for composite PAL #sdtv_mode=2 # uncomment for lirc-rpi #dtoverlay=lirc-rpi #3.5 HD tft screen 800x480 dtoverlay=dpi24 overscan_left=0 overscan_right=0 overscan_top=0 overscan_bottom=0 #Banggood framebuffer_width=800 framebuffer_height=480 dtparam=spi=off dtparam=i2c_arm=off enable_dpi_lcd=1 display_default_lcd=1 dpi_output_format=0x6f015 dpi_group=2 dpi_mode=87 hdmi_timings=480 0 16 16 24 800 0 4 2 2 0 0 0 120 0 46080000 6 display_rotate=3 # if you plug your tv at the same time as your rpi and that the rpi switches from the hdmi or give a low resolution because tv had no enough time to initialize it boot_delay=3 # uncomment if you don't want the rainbow at startup #disable_splash=1 # default CEC name #cec_osd_name=recalbox dtparam=spi=off # Overclock gpu_mem_256=128 gpu_mem_512=256 gpu_mem_1024=256 overscan_scale=1 gpu_mem=256 start_x=0 enable_uart=0 avoid_safe_mode=1 kernel=zImage 

config_hdmi.txt
 # For more options and information see # http://rpf.io/configtxt # Some settings may impact device functionality. See link above for details # uncomment if you get no picture on HDMI for a default "safe" mode #hdmi_safe=1 # uncomment this if your display has a black border of unused pixels visible # and your display can output without overscan disable_overscan=1 # uncomment the following to adjust overscan. Use positive numbers if console # goes off screen, and negative if there is too much border #overscan_left=16 #overscan_right=16 #overscan_top=16 #overscan_bottom=16 # uncomment to force a console size. By default it will be display's size minus # overscan. #framebuffer_width=1280 #framebuffer_height=720 # uncomment if hdmi display is not detected and composite is being output hdmi_force_hotplug=1 # uncomment to force a specific HDMI mode (this will force VGA) hdmi_group=1 #1080p60fps hdmi_mode=16 # uncomment to force a HDMI mode rather than DVI. This can make audio work in # DMT (computer monitor) modes #hdmi_drive=2 # uncomment to increase signal to HDMI, if you have interference, blanking, or # no display #config_hdmi_boost=4 # uncomment for composite PAL #sdtv_mode=2 #uncomment to overclock the arm. 700 MHz is the default. #arm_freq=800 # Uncomment some or all of these to enable the optional hardware interfaces #dtparam=i2c_arm=on #dtparam=i2s=on dtparam=spi=off # Uncomment this to enable the lirc-rpi module #dtoverlay=lirc-rpi # Additional overlays and parameters are documented /boot/overlays/README # Enable audio (loads snd_bcm2835) dtparam=audio=on gpu_mem_256=128 gpu_mem_512=256 gpu_mem_1024=256 overscan_scale=1 gpu_mem=256 start_x=0 enable_uart=0 


Switch the configs sera notre autoscript qui est disponible sur le réseau
\\ 192.168.x.xxx \ configs \ all \ autostart.sh ou dans le dossier sur l'appareil /opt/retropie/configs/all/autostart.sh

autostart.sh
 # Check to see if display is not connected _NOHDMI=$(tvservice -n ) || true # Check to make sure it's not already in LCD mode _ISLCD=$(tvservice -s | grep "LCD") || true # HDMI is connected - turn off backlight LCD _HDMI=$(tvservice -s | grep "0x12000a") || true if [ -z "$_NOHDMI" ]; then if [ "$_ISLCD" ]; then printf "NO HDMI connected, LCD DPI display config already active\n" #do nothing else printf "NO HDMI connected, Switching to LCD DPI display\n" #change config to Hyperpixel and reboot since no display detected sudo cp /boot/config_dpi.txt /boot/config.txt sudo reboot now fi elif [ "$_NOHDMI" ]; then if [ "$_ISLCD" ]; then printf "HDMI is connected, but LCD DPI config is being used\n" #we need to switch to HDMI display config and reboot sudo cp /boot/config_hdmi.txt /boot/config.txt sudo reboot now elif [ "$_HDMI" ]; then printf "HDMI is connected, HDMI config detected, so turning off LCD BL\n" #we need to shut off the backlight on the Hyperpixel display since we aren't using it #don't panic, a reboot automatically resets this - it isn't a persistent value #also to do this the config.txt file needs to load the backlight module on startup #to control it even if you aren't loading the overlay driver for the display # this comment #echo 1 | sudo tee /sys/class/backlight/rpi_backlight/bl_power else #debugging catchall - shouldn't happen since we expect 0x12000a - but you never know... printf "HDMI is connected, HDMI config detected, your tv might not like 1920x1080 resolution\n" fi else #do nothing - based on previous if statements - you either have HDMI or you don't have it... printf "Debug catchall point - sorry I can't help you out - I haven't run into the error state yet!\n" fi emulationstation #auto 


Le script switchscreen.sh a également été écrit et doit être placé dans / home / pi / RetroPie / retropiemenu / . Ce script change manuellement de configuration et est accessible depuis le menu principal des paramètres de Retropie. Après l'avoir démarré, vous devez retirer le câble HDMI, sinon après le redémarrage, tout reviendra automatiquement. N'oubliez pas d'enregistrer le script

 chmod +x /home/pi/RetroPie/retropiemenu/switchscreen.sh 

switchscreen.sh
 #!/bin/bash # Check to see if display is dpi _DPI=$(grep dpi /boot/config.txt) || true if [ "$_DPI" ]; then printf "Switch to HDMI\n" sudo cp /boot/config_hdmi.txt /boot/config.txt sudo reboot now else printf "Switch to DPI LCD\n" sudo cp /boot/config_dpi.txt /boot/config.txt sudo reboot now fi exit 0 


Autostart.sh affiche des traces de code qui désactivent le DPI de l'écran lorsque HDMI est activé. J'ai copié ce script sur Internet, il ne fonctionne donc pas sur notre écran. Nous pourrions être confondus avec des transistors pour couper l'alimentation de l'écran, mais pourquoi, si nous devons afficher l'image de couverture du jeu en cours d'exécution. Vous avez juste besoin de comprendre ce qu'est le DPI.

Interface d'affichage parallèle (DPI)


DPI, comme cela a été dit, est une interface parallèle pour les écrans. Informations sur cette interface une , deux fois et mal calculées . Eh bien, maintenant ce sera ici, en russe.

Toutes les tentatives d'activation de DPI avec les commandes de la console pendant le fonctionnement HDMI ont échoué. Peut-être qu'il faisait quelque chose de mal. Le plan B a été adopté pour la mise en œuvre: afficher l'image sur un petit écran, en tirant les jambes GPIO par programmation.

DPI est caractérisé par le fait qu'un pixel est transmis à l'affichage par cycle d'horloge du signal d'horloge. Étant donné que nous avons une matrice 6 bits, ce sont 18 broches pour trois couleurs, et il y a aussi la validation de l'affichage (indique une date valide), h_sync (définit l'adresse de la ligne horizontale à zéro dans le contrôleur d'affichage), v_sync (définit l'adresse de la ligne verticale à zéro dans le contrôleur d'affichage ) La capture des données se produit sur le front descendant du signal d'horloge. Ceci est connu si nous déchiffrons la ligne «dpi_output_format = 0x6f015» de notre config_dpi.txt selon cette terminologie.

dpi_output_format
 output_format = (dpi_output_format >> 0) & 0xf; rgb_order = (dpi_output_format >> 4) & 0xf; output_enable_mode = (dpi_output_format >> 8) & 0x1; invert_pixel_clock = (dpi_output_format >> 9) & 0x1; hsync_disable = (dpi_output_format >> 12) & 0x1; vsync_disable = (dpi_output_format >> 13) & 0x1; output_enable_disable = (dpi_output_format >> 14) & 0x1; hsync_polarity = (dpi_output_format >> 16) & 0x1; vsync_polarity = (dpi_output_format >> 17) & 0x1; output_enable_polarity = (dpi_output_format >> 18) & 0x1; hsync_phase = (dpi_output_format >> 20) & 0x1; vsync_phase = (dpi_output_format >> 21) & 0x1; output_enable_phase = (dpi_output_format >> 22) & 0x1; output_format: 1: DPI_OUTPUT_FORMAT_9BIT_666 2: DPI_OUTPUT_FORMAT_16BIT_565_CFG1 3: DPI_OUTPUT_FORMAT_16BIT_565_CFG2 4: DPI_OUTPUT_FORMAT_16BIT_565_CFG3 5: DPI_OUTPUT_FORMAT_18BIT_666_CFG1 6: DPI_OUTPUT_FORMAT_18BIT_666_CFG2 7: DPI_OUTPUT_FORMAT_24BIT_888 rgb_order: 1: DPI_RGB_ORDER_RGB 2: DPI_RGB_ORDER_BGR 3: DPI_RGB_ORDER_GRB 4: DPI_RGB_ORDER_BRG output_enable_mode: 0: DPI_OUTPUT_ENABLE_MODE_DATA_VALID 1: DPI_OUTPUT_ENABLE_MODE_COMBINED_SYNCS invert_pixel_clock: 0: RGB Data changes on rising edge and is stable at falling edge 1: RGB Data changes on falling edge and is stable at rising edge. hsync/vsync/output_enable_polarity: 0: default for HDMI mode 1: inverted hsync/vsync/oe phases: 0: DPI_PHASE_POSEDGE 1: DPI_PHASE_NEGEDGE 




La séquence de bits est illustrée dans la figure ci-dessus. Pour chaque ligne commençant par VSYNC, il existe un cycle complet de mesures de la ligne HSYNC. Ceci est un cadre. Les porches arrière et avant sont les soi-disant retraits de l'affichage, qui sont dans la mémoire du contrôleur, mais ils ne sont pas à l'écran.

Décodez maintenant la ligne «hdmi_timings = 480 0 16 16 24 800 0 4 2 2 0 0 0 120 0 46080000 6» de notre config_dpi.txt. Il n'y a rien de compliqué ici, il suffit d'écrire les paramètres dans l'ordre.


Les jambes GPIO utilisées pour le rendu des couleurs sont illustrées sur cette image. Nous avons le mode 5. Attention, ce ne sont pas des jambes en ordre, à savoir la notation GPIO! Autres signaux Horloge - GPIO 0, DE - GPIO 1, VSYNC - GPIO 2, HSYNC - GPIO 3.


Un python a été rapidement installé, la bibliothèque GPIO nécessaire et un bon script a été écrit, colorant au moins l'écran en bleu. Et j'ai également eu une dissonance cognitive lorsque le Bloc-notes ++ sur Windows n'affichait pas l'indentation où ils se trouvaient en nano, tout en faisant un habillage de tabulation, plutôt que des espaces, lors de l'habillage des lignes. Soit dit en passant, VSCode pèche de la même manière, comment le réparer, je ne l'ai pas trouvé.

Script Python
 from gpiozero import LED from time import sleep sleep_time = 0.0 clock = LED(0) de = LED(1) vsync = LED(2) hsync = LED(3) red2 = LED(16) red3 = LED(17) red4 = LED(18) red5 = LED(19) red6 = LED(20) red7 = LED(21) green2 = LED(10) green3 = LED(11) green4 = LED(12) green5 = LED(13) green6 = LED(14) green7 = LED(15) blue2 = LED(4) blue3 = LED(5) blue4 = LED(6) blue5 = LED(7) blue6 = LED(8) blue7 = LED(9) def v_sync(frame): vsync.on() for n in range(frame): clock.on() #sleep(sleep_time) clock.off() #sleep(sleep_time) #print("vsync") vsync.off() pass def h_sync(frame): hsync.on() for n in range(frame): clock.on() #sleep(sleep_time) clock.off() #sleep(sleep_time) #print("hsync") hsync.off() pass def clc(frame): for n in range(frame): clock.on() #sleep(sleep_time) clock.off() #sleep(sleep_time) pass red2.off() red3.off() red4.off() red5.off() red6.off() red7.off() green2.off() green3.off() green4.off() green5.off() green6.off() green7.off() blue2.on() blue3.on() blue4.on() blue5.on() blue6.on() blue7.on() clock.off() de.off() #de.on() sleep(sleep_time) v_sync(2) clc(2) for row in range(5): v_sync(2) # v_back_porch(2) clc(2) for column in range(800): h_sync(16) # h_back_porch(16) clc(16) # LCD column de.on() clc(480) de.off() # h_front_porch(24) clc(24) # v_front_porch(4) clc(4) de.off() red2.off() red3.off() red4.off() red5.off() red6.off() red7.off() green2.off() green3.off() green4.off() green5.off() green6.off() green7.off() blue2.off() blue3.off() blue4.off() blue5.off() blue6.off() blue7.off() 




Trop lent, Python. Ce fut une surprise pour moi que les pixels déjà rendus disparaissent. Bien que ce que j'attendais est évident.

Il a été décidé de tout réécrire en C. Cela fonctionne plus rapidement, à environ quelques images par seconde. L'écran ondule comme sur les anciens moniteurs CRT ou radars. Ce dont vous avez besoin. Rétro! Le code est publié sur GitHub .


GPIO est accessible directement via les registres SoC BCM2837. J'ai pris des exemples de code ici .

Tout a commencé avec un tout petit programme, mais maintenant le processeur et les charges de mémoire sous forme de petites barres de défilement sont également affichés. La température du processeur est dessinée dans une telle police.


Pour exécuter le code, vous devez copier le contenu du référentiel dans le dossier / home / pi / lcd_screen / (Qui sait comment écrire le chemin relatif au binaire et non le dossier de travail en C sous nix? Par conséquent, jusqu'à présent uniquement dans ce dossier) et exécutez les commandes suivantes.

 gcc ./lcd_screen/lcd.c -o ./lcd_screen/lcd chmod +x ./lcd_screen/lcd 

Ou téléchargez immédiatement le binaire des versions. Pour commencer, vous devez taper ce qui suit. SUDO est requis pour accéder au GPIO.

 sudo ./lcd_screen/lcd path/file.bmp usec_per_frame 

Où "chemin / fichier.bmp" est le chemin vers le fichier image, il ne fonctionne qu'avec le format BMP, "usec_per_frame" est le délai entre les images en microsecondes, afin de ne pas charger le processeur en vain.

Nous automatisons le lancement de notre programme lcd afin qu'il affiche la couverture souhaitée lorsque le jeu est en cours d'exécution. Bien sûr, Retropie utilise un grattoir intégré pour charger les couvertures.
Installez le convertisseur d'image. Il convertira tous les formats en bmp pris en charge par le programme. En même temps, et redimensionnez, de sorte que les images soient en plein écran.

 sudo apt-get install imagemagick 

Dans le répertoire / opt / retropie / configs / all / , créez deux fichiers: runcommand-onstart.sh et runcommand-onend.sh . Retropie exécute automatiquement ces scripts lors du chargement / arrêt d'un jeu. N'oubliez pas d'affecter chmod + x à chaque fichier.

runcommand-onstart.sh
 #!/bin/sh system="$1" emulator="$2" romname="$3" #with path #echo $system # LCD programm here: #find current config: dpi or hdmi _DPI=$(grep dpi /boot/config.txt) || true if ! [ "$_DPI" ]; #if hdmi then sudo killall lcd # remove path filename=$(basename "$romname") # remove extension filename="${filename%.*}" # add image path file_png="/home/pi/.emulationstation/downloaded_images/$system/$filename-image.png" file_jpg="/home/pi/.emulationstation/downloaded_images/$system/$filename-image.jpg" #if system snes and n64 then rotate image 270 degree if [ "$system" = "snes" ] || [ "$system" = "n64" ] then if test -f "$file_png"; #fing file then convert "$file_png" -resize '800x480' -type TrueColor -alpha Remove -rotate 270 /home/pi/lcd_screen/work.bmp elif test -f "$file_jpg"; then convert "$file_jpg" -resize '800x480' -type TrueColor -alpha Remove -rotate 270 /home/pi/lcd_screen/work.bmp else convert "/opt/retropie/configs/$system/launching.png" -resize '480x800' -type TrueColor -alpha Remove -rotate 180 /home/pi/lcd_screen/work.bmp fi else if test -f "$file_png"; then convert "$file_png" -resize '480x800' -type TrueColor -alpha Remove -rotate 180 /home/pi/lcd_screen/work.bmp elif test -f "$file_jpg"; then convert "$file_jpg" -resize '480x800' -type TrueColor -alpha Remove -rotate 180 /home/pi/lcd_screen/work.bmp else convert "/opt/retropie/configs/$system/launching.png" -resize '480x800' -type TrueColor -alpha Remove -rotate 180 /home/pi/lcd_screen/work.bmp fi fi #launch my lcd project sudo /home/pi/lcd_screen/lcd /home/pi/lcd_screen/work.bmp 400000 & fi 

runcommand-onend.sh
 #!/bin/sh _DPI=$(sudo grep dpi /boot/config.txt) || true if ! [ "$_DPI" ]; then sudo killall lcd sudo /home/pi/lcd_screen/lcd /home/pi/lcd_screen/retropie.bmp 50000 & # cp /home/pi/lcd_screen/retropie.bmp /home/pi/lcd_screen/work.bmp fi 


Dans le script de départ, la présence de la connexion DPI est d'abord vérifiée, puis une image au format jpeg ou png est recherchée, elle est tournée à l'angle souhaité, sa taille est modifiée et convertie au format bmp, puis mon programme démarre avec les paramètres nécessaires.

Refroidissement


Le Raspberry Pi 3B est plus puissant que le Zero et a besoin d'un bon refroidissement. Surtout dans un cas aussi fermé. Avec un petit dissipateur thermique visible sur la photo, après une demi-heure de jeu sur n'importe quel émulateur, la température centrale a atteint 80 degrés et le trot a commencé.


Un ventilateur centrifuge de 40 * 30 * 10 mm a été commandé, mais jusqu'à son arrivée, j'ai juste essayé de couper une petite plaque de 80 * 30 mm en aluminium de 3 mm. À ce moment-là, j'avais retiré toutes les broches GPIO, de sorte qu'elles n'interféraient plus avec l'installation de la plaque. De plus, j'ai également découpé un morceau de 20 * 10 mm pour le contact avec la puce et fait un sandwich à partir des plaques. Cela a dépassé toutes mes attentes, avec un maximum de 65 degrés sur le noyau.


Il regarde donc à l'intérieur.



En fin de compte, ce


Comment ça se joue? Super! Avec des cris, des manettes de jeu, des reproches mutuels. Comme une fois.

Aucun retard ou retard n'a été constaté.

L'écran, bien sûr, est petit, seulement trois pouces et demi. Les smartphones de cinq pouces nous ont gâtés, mais vous pouvez jouer. Le texte est lisible, même petit. Je préfère HDMI.

Vous pouvez venir à un ami, jouer, la portabilité le permet. Accessoires associés: câbles, câbles, joysticks, charge prennent plus de place que la console elle-même.

Son


Malheureusement, le son standard du Raspberry Pi laisse beaucoup à désirer. La modulation PWM avec filtrage passif est utilisée comme système audio. Par conséquent, un DAC USB a été acheté sur le PCM2704. Principalement à cause de sa taille.

Il n'y a vraiment pas assez de sortie sonore lors de la lecture sur un petit écran LCD, j'ai donc également acheté un micro amplificateur 3W sur le NS8002 et pris un haut-parleur sur une tablette de 8 ohms.

USB DAC et NS8002



Tout cela tient sous l'écran LCD. Viendra, je mettrai.

Retropie de fichiers


Assemblage terminé. Voici quelques-uns des paramètres Retropie les moins intéressants pour la lecture de divertissement.

Shaders
La plupart des consoles capables d'émuler le Raspberry Pi offrent une résolution de 320x240 pixels. Selon les normes d'aujourd'hui, c'est très petit. Tous les jeux acquièrent une pixellisation prononcée sur les écrans modernes.


Les créateurs de Retroarch, qui fait partie de Retropie, se sont occupés de ce problème et ont ajouté le support des shaders. Par exemple, j'aime vraiment le xbr-lv1-noblend.glslp préinstallé . Il retire littéralement les détails de l'image. Voir ci-dessous.

Capture d'écran du jeu Castlevania: Symphonie de la nuit, je vous conseille d'y jouer

Pour installer le shader, allez dans le menu Retropie -> Editeur de configuration . Sélectionnez Configurer les options de base de l'émulateur libretro , puis sélectionnez Configurer les options par défaut pour tous les émulateurs libretro . Réglez ensuite Video Shader Enable sur "true" et Video Shader File sur le shader souhaité. Réglez également Video Smoth sur «false», car il ne fait qu'endommager l'image. Vous pouvez même choisir quelque chose comme un shader de ligne de balayage qui émet le travail des téléviseurs CRT. Mais ce n'est pas pour tout le monde.


Le rendu des shaders est une opération assez coûteuse. Avec une résolution égale et supérieure à 720p, des bourrages assez visibles apparaissent sur le RPi 3B. Par conséquent, dans le même menu, sélectionnez la résolution de rendu «800x600». Ne vous inquiétez pas, si vous avez apporté des modifications au fichier /boot/config.txt auparavant , comme dans cet article un peu plus élevé, la résolution d'écran sur le câble HDMI sera de 1080p, mais l'émulateur rendra l'image à 800x600 et l'étirera en plein écran. Et il ne le fait pas mal. Au moins avec un shader c'est mieux que sans lui, et un rendu en 1080p est inutile, car les données vidéo du jeu sont toujours dessinées pour une résolution de 320x240.

Paramètres du joystick
Si vous avez une manette de jeu xinput (norme Micro $ oft standard), elle le fera. Il est configuré au premier démarrage de Retropie, ou via le bouton de démarrage - Configurer l'entrée. Mais il y a un mal de tête. Des gars rusés d'outre-mer, afin de ne pas tomber dans les poursuites en matière de brevets, ont échangé les boutons avec A et B, X et Y.


Si vous avez une manette de jeu de xbox ou similaire, vous devez la configurer avec les boutons inversés, comme sur NES. Allez ensuite dans Retropie -> Retropie Setup , sélectionnez Configuration / tools , puis emulationstation , mettez «Swapped» dans Swap A / B Buttons dans ES . Reconfigurez ensuite le joystick.

De plus, je n'aime pas la façon dont les développeurs de Retropie ont géré le fonds de boutons. Où est la combinaison de boutons pour faire une capture d'écran? Pourquoi ai-je besoin d'un bouton de réinitialisation si je le frappe à chaque fois? Où sont les boutons de rembobinage et d'accélération temporelle?

Pour résoudre ce problème, vous devez modifier le fichier avec le nom de votre joystick dans / opt / retropie / configs / all / retroarch-joypads / . Il est également disponible sur le réseau \\ 192.168.x.xxx \ configs \ all \ retroarch-joypads \ . Après chaque mise à jour de Retropie via le programme de mise à jour, la numérotation de la liaison s'envole, donc je ne téléchargerai pas la configuration entière. J'écrirai que je n'ai changé que ces boutons. Ils sont exécutés lorsqu'ils sont enfoncés simultanément avec le raccourci clavier, généralement un bouton avec un logo au milieu du joystick.

Configuration des boutons
 input_screenshot_btn = "0" input_rewind_btn = "h0left" input_hold_fast_forward_btn = "h0right" input_state_slot_increase_btn = "h0up" input_state_slot_decrease_btn = "h0down" 


Ici, le bouton de capture d'écran est attribué au lieu de réinitialiser. Avance rapide et rembobinage (rembobinage) sont configurés sur les boutons croisés: avant et arrière. Les boutons croisés de haut en bas modifient l'emplacement de sauvegarde.

Le rembobinage doit être activé dans la configuration /opt/retropie/configs/all/retroarch.cfg . N'activez tout simplement pas Rewind sur l'émulateur psx, tout commence à ralentir sauvagement. Le rembobinage est désactivé par défaut dans la configuration psx.

Je veux également ajouter des informations sur Bluetooth. Je n'aime pas moi-même les joysticks sans fil et je joue toujours avec le câble. La vieille école encore. Pour les amateurs de joysticks sans fil, vous devez acheter un dongle Bluetooth et l'insérer dans un port USB. Ce sera mieux et il n'y aura pas de problèmes. Je n'ai pas vérifié moi-même, mais des gens bien informés écrivent.

Xboxdrv


Mais ce n'est pas tout. Dans le programme d'installation de Retropie dans le gestionnaire de packages, vous pouvez mettre différents ports, par exemple, Openttd, Doom ou même l'émulateur DOS Dosbox. Mais vous ne pourrez pas contrôler le joystick qui s'y trouve. Seulement un clavier et une souris. Pour résoudre ce problème, vous devez installer le pilote xboxdrv dans le gestionnaire de packages, qui peut émuler les frappes. Il suffit de le mettre à partir de la source, il n'est pas nécessaire de faire un autorun, il ne convient pas à tous les joysticks.

Nous allons écrire le script de lancement de notre manette de jeu. Ajoutez les lignes suivantes à la fin du fichier dans /opt/retropie/configs/all/runcommand-onstart.sh .

runcommand-onstart.sh
 # xboxdrv sudo killall > /dev/null 2>&1 xboxdrv if [ "$1" = "pc" ] || [ "$1" = "openttd" ] || [ "$1" = "doom" ] || [ "$1" = "kodi" ]; then sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv > /dev/shm/runcommand.log 2>&1 \ --evdev /dev/input/event0 \ --silent \ --detach-kernel-driver \ --force-feedback \ --mimic-xpad \ --trigger-as-button \ --evdev-no-grab \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RX=x2,ABS_RY=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap KEY_#304=a,KEY_#305=b,KEY_#307=x,KEY_#308=y,KEY_#312=lt,KEY_#313=rt,KEY_#310=lb,KEY_#311=rb,KEY_#317=tl,KEY_#318=tr,KEY_#314=back,KEY_#315=start,KEY_#316=guide \ --axismap -Y1^deadzone:3000=Y1,-Y2^deadzone:3000=Y2 \ --ui-axismap x2^deadzone:3000=KEY_LEFT:KEY_RIGHT,y2=KEY_UP:KEY_DOWN \ --ui-axismap x1^deadzone:3000=REL_X:06,y1=REL_Y:06 \ --ui-axismap dpad_x^deadzone:0=KEY_LEFT:KEY_RIGHT,dpad_y^deadzone:0=KEY_UP:KEY_DOWN \ --ui-buttonmap rt=BTN_LEFT,lt=BTN_RIGHT,start=KEY_ENTER,back=KEY_ESC,tl=KEY_4,tr=KEY_5,lb=KEY_2,rb=KEY_3,a=KEY_SPACE,b=KEY_M,x=KEY_3,y=KEY_LEFTCTRL,guide=KEY_Y \ & fi 


Ici, $ 1 est notre système cible sur lequel xboxdrv démarre. Vous pouvez ajouter par analogie. Les lignes --evdev-absmap --evdev-keymap sont responsables de la liaison des axes et des boutons à votre joystick. Le script ci-dessus est donné pour la manette Xbox One S. Pour savoir quel axe et quel bouton correspondent au numéro ou au nom de votre joystick, vous devez taper la commande evtest dans la console. En même temps, vous pouvez voir quel événement correspond à notre joystick. J'ai ce / dev / input / event0 qui est dans le paramètre --evdev.

Les options --ui-axismap émulent l'axe de la souris et les boutons du clavier --ui-buttonmap. Dans cet exemple, le déclencheur est le bouton de la souris, le joystick gauche est la souris, le joystick droit est les touches du curseur. Start, select - enter et esc, respectivement. Les chiffres du clavier sont attachés aux boutons restants. Malheureusement, il n'a pas été possible d'utiliser la croix sous les boutons du clavier. Pour une raison quelconque, le joystick Xbox One S refuse de fonctionner.

Des stratégies comme le Theme Hospital, OpenTTD, etc. sont jouées avec une telle configuration. Un peu pire est joué dans les tireurs, mais vous pouvez créer des scripts de lancement similaires pour les tireurs dans le même fichier en modifiant le paramètre $ 1.

Pour assurer le fonctionnement normal du joystick dans emulationstation, vous devez terminer xboxdrv après avoir quitté le jeu. Pour ce faire, ajoutez ce qui suit à la fin du fichier /opt/retropie/configs/all/runcommand-onend.sh .

runcommand-onend.sh
 sudo killall > /dev/null 2>&1 xboxdrv 



En cas de problème lors de la mise à jour de Retropie
Une fois, j'ai lancé la mise à jour Retropie et lors du déballage du noyau, le Wi-Fi intégré est tombé. L'appareil a démarré, mais n'a répondu à aucun bouton, y compris le clavier connecté. Il n'y a pas de SSH, car il n'y a pas de Wi-Fi, il ne répond pas au clavier et vous ne pouvez pas obtenir la carte SD ...

J'ai remarqué que le clavier fonctionne au démarrage. J'ai appuyé plusieurs fois sur ctrl + c et, oh, la console! Mais comment restaurer le Wi-Fi maintenant? L'interface wlan0 était complètement absente du mot. L'exécution du programme de mise à jour n'a pas aidé, car il extrait des fichiers d'Internet.

La première chose dans /opt/retropie/configs/all/autostart.sh a commenté le lancement de l'émulationstation et redémarré.Après le redémarrage, la console se charge, le clavier fonctionne. En outre, Google comment retourner wlan a donné cela. La commande reconfigure tous les packages installés. Ça a aidé.

 sudo dpkg --configure -a 


Pour que Retropie ne ressemble pas à une station Linux
Linux. .

Linux
Linux, /boot/cmdline.txt . .

cmdline.txt
 dwc_otg.lpm_enable=0 console=tty3 root=PARTUUID=f2d3cb4f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait loglevel=3 consoleblank=0 plymouth.enable=0 quiet vt.global_cursor_default=0 plymouth.enable=0 plymouth.ignore-serial-consoles splash 


, , , .
motd.

 nano /etc/motd 

.

 sudo nano /etc/systemd/system/autologin@.service 



 ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM 

Sur

 ExecStart=-/sbin/agetty --skip-login --noclear --noissue --login-options "-f pi" %I $TERM 

.

, — splashscreen. , . \\192.168.x.xxx\splashscreens, Retropie -> SPLASH SCREEN -> Append Splashscreen to list .

, , .


Retropie runcommand, . .


, , .

Que peut-on faire d'autre


Vous pouvez vous améliorer sans cesse. Je vais vous donner quelques liens qui peuvent être créés. Écrivez des choses plus intéressantes que vous pouvez ajouter. Merci de votre attention.


Il en vaut la peine.

Source: https://habr.com/ru/post/fr422005/


All Articles