Himbeer-Pi-NES-Patrone


Hallo! Dies ist eine Retro-Spielekonsole, die auf dem Raspberry Pi basiert. In einer Kassette von der NES-Spielekonsole. Ein integrierter Bildschirm kann für das Spiel verwendet werden. Bei der Ausgabe von Videos über HDMI werden das Bild des Cover des Spiels sowie die Kerntemperatur angezeigt (siehe Foto). Ich schlage ein wenig Nastalgit vor und lese über die Montage und Konfiguration eines solchen Geräts. Achtung, dann viel Verkehr und Fotos.

Nostalgie


In unserer Kindheit haben wir, die wir jetzt zwischen 25 und 35 Jahre alt sind, gerne Konsolen gespielt. Dann gab es kein neues Wort für die Konsole, also werde ich sie so nennen. Meine Bekanntschaft mit Konsolen begann mit Dandy (NES-Klon). Super Mario Bros, Contra, Ducktales und Battletoads sind nur einige der Hits der Zeit. Dann würde der ganze Hof mit meinem Freund Sega (Sega Mega Drive) spielen, in Hits wie Sonic, Ultimate Mortal Combat 3, Contra Hard Corps und mehr . Und als Play Station herauskam, muss ich sagen, dass es uns nicht sofort erreichte, sorgte die Resident Evil-Serie für eine wirklich beängstigende Freude.


Dieses Bild hat mir geholfen, eine Träne Nostalgie wegzuwischen. Ich muss sagen, ich bin nicht der erste, der einen Raspberry Pi in der NES-Kassette entwickelt. Ja, das ist nicht mein Gerät. Und diese Patrone ist fast ideal für diese Zwecke, sie ist klein und schön. Und drinnen ist viel Platz. Überzeugen Sie sich selbst.


Im Inneren des Raspberry Pi Zero befinden sich ein USB-Hub und ein Paar Verlängerungskabel. Alle Sticks werden auf Schmelzkleber gesetzt.

Montage


Ich wollte etwas Gleiches oder Ähnliches sammeln. Die gleiche Patrone von NES wurde ausgewählt. Andere Optionen sind entweder sehr klein oder sehen nicht sehr gut aus. Der Raspberry Pi 3B war das feurige Herz des Retro-Autos. Bei Ali wurden auch USB-Anschlüsse mit praktischen Lötstiften gekauft. Das ist alles


Oh ja, Sie werden dieses Projekt wiederholen, nehmen Sie keine Trefferpatronen. Es gibt so wenige von ihnen. Nehmen Sie etwas häufigeres oder weniger bekanntes. Es gibt auch die Möglichkeit, eine Patrone mit Ali zu nehmen, aber das Original wärmt die Seele. Meine 1986er Veröffentlichung.

Sie benötigen außerdem einen speziellen Schraubenzieher, wenn die Patrone auf drei Schrauben geschraubt ist. Es gibt auch frühe Patronenoptionen mit fünf Schrauben, die mit einem normalen flachen Schraubendreher herausgeschraubt werden. Ich habe nur einen.

Alle störenden Teile werden mit einem Büromesser und einem Sägeblatt von der Patrone abgeschnitten und abgesägt.


Die hervorstehenden Verbinder wurden mit dem Raspberry Pi verlötet. Experten sagen, dass Sie auf eine Lötstation verzichten können, wenn Sie zuerst die Steckverbinder vorsichtig mit Drahtschneidern zerlegen und dann jeweils ein Bein löten. Alles zu heißer Schmelze geklebt. Zwischen den USB-Anschlüssen und der Himbeere lag ein Isolator aus nicht verbrauchbarem Kunststoff. Vergessen Sie nicht, den GND Raspberry Pi und das Gehäuse des USB-Anschlusses anzuschließen (siehe Abbildung oben nicht). Andernfalls funktionieren einige Joysticks nicht.


Der letzte Retropie wurde auf der Himbeere installiert. Zuerst gab es Recalbox , aber ich habe es abgelehnt, weil es die Vibration von Joysticks auf Playstation 1 nicht unterstützt. Aber ich muss sagen, Recalbox ist etwas praktischer in Bezug auf das, was sofort funktioniert, und Sie müssen nichts konfigurieren. In Retropie können Sie eine Reihe von Einstellungen endlos anpassen. Das hat mir gefallen.
Folgendes ist passiert. Alle Joysticks mit xinput sind angeschlossen.



Bildschirm


Appetit kommt mit Essen. Wie wäre es mit dem Einbetten des Bildschirms in die Patrone? Zum Spielen oder Anzeigen des Titelbilds des Spiels. Ein solcher Bildschirm wurde bestellt. Dies ist ein 800 * 480 3,5-Zoll-Parallel-DPI-Bildschirm, der fast alle GPIO Raspberry Pi verwendet. Es funktioniert für mich im 120-Hz-Modus (aber das Rendern ist immer noch bei 60 Hz), die Antwort ist sofort. Das einzig Negative ist die 6-Bit-Matrix. Nur 262.144 Farben. Obwohl dies im Allgemeinen nicht besonders auffällt, urteilen Sie selbst.

Screenshot aus dem Spiel Comix Zone (anklickbar)

Alle Beine vom Bildschirm und vom Raspberry Pi waren verlötet. Der Bildschirm wurde mit zwei Kabeln aus einem zerrissenen alten IDE-Kabel verlötet. Unter dem Bildschirm sind 5-mm-Hypotheken installiert, die die Bodenwand der Patrone nicht berühren. Ein Isolierband wird um den Umfang des Displays geklebt, so dass keine seitlichen Blitze auftreten. Alles ist auf Heißkleber geklebt. Auf die obere Abdeckung habe ich ein Fenster geschnitten und ein 2 mm dickes Glas geklebt.


Um Bilder auf diesem Bildschirm anzuzeigen, müssen Sie die Konfiguration /boot/config.txt korrigieren . Ich empfehle WinSCP für Windows-Besitzer, das beim Herstellen einer Verbindung zum Raspberry Pi über SSH die Darstellung von Dateien wie in Total Commander ermöglicht. Sehr bequem. Vor allem, wenn Sie es im Shell- Modus sudo su - ausführen, der Zugriff auf alle Dateien ermöglicht.

Wenn der DPI-Bildschirm eingeschaltet ist, funktioniert die HDMI-Videoausgabe leider nicht. Daher habe ich zwei Konfigurationsdateien im Ordner / boot / erstellt , eine config_hdmi.txt und die zweite config_dpi.txt . Die Konfiguration config_hdmi.txt hat die Auflösung auf 1080p60Hz eingestellt und Overscan entfernt. config_dpi.txt enthält die DPI-Einstellungen des Bildschirms.

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 wird unser Autoskript sein, das im Netzwerk verfügbar ist
\\ 192.168.x.xxx \ configs \ all \ autostart.sh oder im Ordner auf dem Gerät /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 


Das Skript switchscreen.sh wurde ebenfalls geschrieben, das in / home / pi / RetroPie / retropiemenu / abgelegt werden muss . Dieses Skript wechselt manuell die Konfiguration und ist über das Hauptmenü der Retropie-Einstellungen zugänglich. Nach dem Start müssen Sie das HDMI-Kabel herausziehen, da sonst nach dem Neustart alles automatisch zurückgeschaltet wird. Vergessen Sie nicht, das Skript zu registrieren

 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 zeigt Codespuren an, die die DPI des Bildschirms deaktivieren, wenn HDMI aktiviert ist. Ich habe dieses Skript im Internet kopiert, sodass es auf unserem Bildschirm nicht funktioniert. Wir könnten mit Transistoren verwechselt werden, um die Stromversorgung des Bildschirms auszuschalten, aber warum, wenn wir das Titelbild des aktuell laufenden Spiels anzeigen müssen. Sie müssen nur herausfinden, was DPI ist.

Parallele Anzeigeschnittstelle (DPI)


DPI ist, wie gesagt, eine parallele Schnittstelle für Bildschirme. Informationen auf dieser Schnittstelle einmal , zweimal und falsch berechnet . Nun, jetzt wird es hier sein, auf Russisch.

Alle Versuche, DPI mit Konsolenbefehlen während des HDMI-Betriebs zu aktivieren, sind fehlgeschlagen. Vielleicht hat er etwas falsch gemacht. Plan B wurde für die Implementierung angenommen: Zeigen Sie das Bild auf einem kleinen Bildschirm an und ziehen Sie die GPIO-Beine programmgesteuert.

DPI ist dadurch gekennzeichnet, dass pro Taktzyklus des Taktsignals ein Pixel an die Anzeige übertragen wird. Da wir eine 6-Bit-Matrix haben, sind dies 18 Pins für drei Farben, und es gibt auch Anzeigefreigabe (zeigt ein gültiges Datum an), h_sync (setzt die horizontale Leitungsadresse in der Anzeigesteuerung auf Null), v_sync (setzt die vertikale Leitungsadresse in der Anzeigesteuerung auf Null ) Datenfang tritt an der fallenden Flanke des Taktsignals auf. Dies ist bekannt, wenn wir die Zeile "dpi_output_format = 0x6f015" aus unserer config_dpi.txt gemäß dieser Terminologie entschlüsseln.

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 




Die Reihenfolge der Bits ist in der obigen Abbildung dargestellt. Für jede Linie, die mit VSYNC beginnt, gibt es einen vollständigen Messzyklus der HSYNC-Linie. Dies ist ein Frame. Hintere und vordere Veranda sind die sogenannten Einschnitte des Displays, die sich im Speicher des Controllers befinden, aber nicht auf dem Bildschirm angezeigt werden.

Dekodieren Sie nun die Zeile "hdmi_timings = 480 0 16 16 24 800 0 4 2 2 0 0 0 120 0 46080000 6" aus unserer config_dpi.txt. Hier ist nichts kompliziert, schreiben Sie einfach die Parameter der Reihe nach.


Welche GPIO-Beine für die Farbwiedergabe verwendet werden, zeigt dieses Bild. Wir haben Modus 5. Achtung, das sind keine Beine in Ordnung, nämlich die GPIO-Notation! Andere Signale Takt - GPIO 0, DE - GPIO 1, VSYNC - GPIO 2, HSYNC - GPIO 3.


Eine Python wurde schnell installiert, die erforderliche GPIO-Bibliothek und ein Hallo-Skript wurden geschrieben, das zumindest den Bildschirm blau färbte. Und ich hatte auch eine kognitive Dissonanz, als Notepad ++ unter Windows nicht die Einrückung zeigte, in der sie sich in Nano befanden, während beim Umbrechen von Zeilen der Tabulator anstelle von Leerzeichen verwendet wurde. Übrigens sündigt VSCode auf die gleiche Weise, wie man es repariert, ich habe es nicht gefunden.

Python-Skript
 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() 




Zu langsam, Python. Es war eine Überraschung für mich, dass die bereits gerenderten Pixel verschwinden. Obwohl das, was ich erwartet hatte, offensichtlich ist.

Es wurde beschlossen, alles in C neu zu schreiben. Es funktioniert schneller, mit einigen Bildern pro Sekunde. Der Bildschirm kräuselt sich wie bei alten CRT-Monitoren oder Radargeräten. Was du brauchst. Retro! Der Code wird auf GitHub veröffentlicht .


Auf GPIO wird direkt über die SoM-Register BCM2837 zugegriffen. Ich habe hier Codebeispiele genommen.

Alles begann mit einem sehr kleinen Programm, aber jetzt werden auch die Prozessor- und Speicherlasten in Form kleiner Bildlaufleisten angezeigt. Die Prozessortemperatur wird in einer solchen Schriftart gezeichnet.


Um den Code auszuführen, müssen Sie den Inhalt des Repositorys in den Ordner / home / pi / lcd_screen / kopieren (Wer weiß, wie man den Pfad relativ zur Binärdatei und nicht zum Arbeitsordner in C unter nix schreibt? Daher bisher nur in diesen Ordner) und die folgenden Befehle ausführen.

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

Oder laden Sie die Binärdatei sofort aus den Releases herunter. Um zu beginnen, müssen Sie Folgendes eingeben. SUDO ist erforderlich, um auf das GPIO zuzugreifen.

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

Wenn "path / file.bmp" der Pfad zur Bilddatei ist, funktioniert dies nur im BMP-Format. "Usec_per_frame" ist die Verzögerung zwischen Frames in Mikrosekunden, um den Prozessor nicht umsonst zu laden.

Wir automatisieren den Start unseres LCD-Programms so, dass es das gewünschte Cover anzeigt, wenn das Spiel läuft. Natürlich verwendet Retropie einen eingebauten Schaber, um Abdeckungen zu laden.
Installieren Sie den Image Converter. Alle vom Programm unterstützten Formate werden in bmp konvertiert. Zur gleichen Zeit und Größe ändern, so dass die Bilder Vollbild waren.

 sudo apt-get install imagemagick 

Erstellen Sie im Verzeichnis / opt / retropie / configs / all / zwei Dateien: runcommand-onstart.sh und runcommand-onend.sh . Retropie führt diese Skripte automatisch aus, wenn ein Spiel geladen / beendet wird. Denken Sie daran, jeder Datei chmod + x zuzuweisen.

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 


Im Startskript wird zuerst das Vorhandensein einer DPI-Verbindung überprüft, dann wird ein Bild mit den Formaten JPEG oder PNG durchsucht, es wird in den gewünschten Winkel gedreht, seine Größe wird geändert und in das BMP-Format konvertiert. Dann startet mein Programm mit den erforderlichen Parametern.

Kühlung


Der Raspberry Pi 3B ist leistungsstärker als der Zero und benötigt eine gute Kühlung. Besonders in solch einem geschlossenen Fall. Mit einem kleinen Kühlkörper auf dem Foto erreichte die Kerntemperatur nach einer halben Stunde Spielzeit auf einem Emulator 80 Grad und der Trab begann.


Ein 40 * 30 * 10 mm Radialventilator wurde bestellt, aber bis er ankam, habe ich nur versucht, eine kleine Platte mit einer Größe von 80 * 30 mm aus 3 mm Aluminium zu schneiden. Zu diesem Zeitpunkt hatte ich alle GPIO-Pins entfernt, sodass sie die Installation der Platte nicht mehr beeinträchtigten. Außerdem habe ich ein Stück von 20 * 10 mm für den Kontakt mit dem Chip ausgeschnitten und aus den Tellern ein Sandwich gemacht. Dies hat alle meine Erwartungen übertroffen, mit maximal 65 Grad im Kern.


So sieht es innen aus.



Am Ende was


Wie wird das gespielt? Großartig! Mit Schreien, schlagenden Gamepads, gegenseitigen Vorwürfen. Genau wie einmal.

Es wurden keine Verzögerungen oder Verzögerungen festgestellt.

Der Bildschirm ist natürlich klein, nur dreieinhalb Zoll. Fünf-Zoll-Smartphones haben uns verwöhnt, aber Sie können spielen. Der Text ist lesbar, auch klein. Ich bevorzuge HDMI.

Sie können zu einem Freund kommen, spielen, Portabilität erlaubt. Zugehöriges Zubehör: Kabel, Kabel, Joysticks und Ladegeräte benötigen mehr Platz als die Konsole selbst.

Ton


Leider lässt der Standardklang des Raspberry Pi zu wünschen übrig. PWM-Modulation mit passiver Filterung wird als Soundsystem verwendet. Daher wurde auf dem PCM2704 ein USB-DAC gekauft. Hauptsächlich wegen seiner Größe.

Bei der Wiedergabe auf einem kleinen LCD-Bildschirm ist die Tonausgabe wirklich nicht ausreichend. Daher habe ich mir beim NS8002 auch einen 3-W-Mikroverstärker gekauft und einen Lautsprecher von einem 8-Ohm-Tablet aufgenommen.

USB DAC und NS8002



All dies passt unter den LCD-Bildschirm. Wird kommen, werde ich setzen.

Datei-Retropie


Montage abgeschlossen. Im Folgenden sind einige der weniger interessanten Retropie-Einstellungen für das Lesen von Unterhaltungsprogrammen aufgeführt.

Shader
Die meisten Konsolen, die den Raspberry Pi emulieren können, bieten eine Auflösung von 320 x 240 Pixel. Nach heutigen Maßstäben ist dies sehr klein. Alle Spiele erhalten auf modernen Bildschirmen eine ausgeprägte Pixelung.


Die Entwickler von Retroarch, das Teil von Retropie ist, haben sich um dieses Problem gekümmert und die Unterstützung für Shader hinzugefügt. Zum Beispiel gefällt mir die vorinstallierte xbr-lv1-noblend.glslp sehr gut . Er zieht buchstäblich die Details aus dem Bild. Siehe unten.

Screenshot aus dem Spiel Castlevania: Symphony of the Night, ich rate Ihnen, es zu spielen

Um den Shader zu installieren, gehen Sie zum Menü Retropie -> Konfigurationseditor . Wählen Sie Grundlegende Libretro-Emulator-Optionen konfigurieren und dann Standardoptionen für alle Libretro-Emulatoren konfigurieren aus . Setzen Sie dann Video Shader Enable auf "true" und Video Shader File auf den gewünschten Shader. Stellen Sie Video Smoth ebenfalls auf "false", da nur das Bild verschmiert wird. Sie können sogar einen Scanline-Shader auswählen, der die Arbeit von CRT-Fernsehern ausgibt. Aber das ist nicht jedermanns Sache.


Das Rendern von Shadern ist eine ziemlich teure Operation. Bei einer Auflösung von mindestens 720p treten beim RPi 3B ziemlich auffällige Staus auf. Wählen Sie daher im selben Menü die Renderauflösung „800x600“. Machen Sie sich keine Sorgen, wenn Sie zuvor Änderungen an der Datei /boot/config.txt vorgenommen haben , wie in diesem Artikel etwas höher, beträgt die Bildschirmauflösung des HDMI-Kabels 1080p, aber der Emulator rendert das Bild mit 800 x 600 und streckt es auf den Vollbildmodus. Und er macht es nicht schlecht. Zumindest mit einem Shader ist es besser als ohne, und ein Rendering in 1080p ist nutzlos, da die Videodaten des Spiels immer noch für eine Auflösung von 320x240 gezeichnet werden.

Joystick-Einstellungen
Wenn Sie ein xinput-Gamepad (Micro $ oft Standard) haben, reicht dies aus. Sie wird beim ersten Start von Retropie oder über die Startschaltfläche - Eingabe konfigurieren konfiguriert. Aber es gibt Kopfschmerzen. Schlaue Leute aus Übersee tauschten die Knöpfe gegen A und B, X und Y, um nicht auf Patentklagen hereinzufallen.


Wenn Sie ein Gamepad von Xbox oder ähnlichem haben, müssen Sie es wie bei NES mit den invertierten Tasten konfigurieren. Gehen Sie dann zu Retropie -> Retropie Setup , wählen Sie Konfiguration / Tools , dann Emulationsstation und setzen Sie "Swapped" in Swap A / B Buttons in ES . Konfigurieren Sie dann den Joystick neu.

Außerdem gefällt mir nicht, wie Retropie-Entwickler den Button-Fonds verwaltet haben. Wo ist die Kombination von Schaltflächen, um einen Screenshot zu machen? Warum brauche ich eine Reset-Taste, wenn ich sie jedes Mal drücke? Wo befinden sich die Tasten zum Zurückspulen und zur Zeitbeschleunigung?

Um dies zu beheben, müssen Sie die Datei mit dem Namen Ihres Joysticks in / opt / retropie / configs / all / retroarch-joypads / bearbeiten . Es ist auch im Netzwerk \\ 192.168.x.xxx \ configs \ all \ retroarch-joypads \ verfügbar . Nach jedem Update von Retropie durch den Updater fliegt die Nummerierung der Bindung, so dass ich nicht die gesamte Konfiguration hochladen werde. Ich werde schreiben, dass ich nur diese Schaltflächen geändert habe. Sie werden ausgeführt, wenn sie gleichzeitig mit dem Hotkey gedrückt werden, normalerweise einem Knopf mit einem Logo in der Mitte des Joysticks.

Tastenkonfiguration
 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" 


Hier wird die Screenshot-Schaltfläche zugewiesen anstatt zurückgesetzt. Schnelles Vor- und Zurückspulen (Zurückspulen) wird über die Kreuztasten konfiguriert: Vorwärts und Rückwärts. Die Kreuztasten nach oben und unten ändern den Speicherplatz.

Der Rücklauf muss in der Konfiguration /opt/retropie/configs/all/retroarch.cfg aktiviert sein . Aktivieren Sie den Rücklauf auf dem psx-Emulator einfach nicht, alles wird langsam langsamer. Der Rücklauf ist in der psx-Konfiguration standardmäßig deaktiviert.

Ich möchte auch über Bluetooth hinzufügen. Ich selbst mag keine drahtlosen Joysticks und spiele immer mit Kabel. Alte Schule noch. Für Liebhaber von drahtlosen Joysticks müssen Sie einen Bluetooth-Dongle kaufen und in einen USB-Anschluss einstecken. Es wird besser und es wird keine Probleme geben. Ich selbst habe nicht nachgesehen, aber sachkundige Leute schreiben.

Xboxdrv


Das ist aber noch nicht alles. Im Retropie-Setup im Paketmanager können Sie verschiedene Ports einfügen, z. B. Openttd, Doom oder sogar den DOS Dosbox-Emulator. Sie können den Joystick in ihnen jedoch nicht steuern. Nur eine Tastatur und eine Maus. Um dies zu beheben, müssen Sie den xboxdrv-Treiber im Paketmanager installieren, der Tastenanschläge emulieren kann. Legen Sie es einfach von der Quelle ab, es ist kein Autorun erforderlich, es passt nicht auf alle Joysticks.

Wir werden das Startskript für unser Gamepad schreiben. Fügen Sie die folgenden Zeilen am Ende der Datei in /opt/retropie/configs/all/runcommand-onstart.sh hinzu .

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 


Hier ist $ 1 unser Zielsystem, auf dem xboxdrv startet. Sie können analog hinzufügen. Die Zeilen --evdev-absmap --evdev-keymap sind für die Bindung von Achsen und Schaltflächen an Ihren Joystick verantwortlich. Das obige Skript ist für den Xbox One S-Controller angegeben. Um herauszufinden, welche Achse und Schaltfläche der Nummer oder dem Namen Ihres Joysticks entsprechen, müssen Sie den Befehl evtest in die Konsole eingeben . Gleichzeitig können Sie sehen, welches Ereignis unserem Joystick entspricht. Ich habe dieses / dev / input / event0, das sich im Parameter --evdev befindet.

Die Optionen --ui-axismap emulieren die Mausachse und die Tastaturtasten --ui-buttonmap. In diesem Beispiel ist der Auslöser die Maustaste, der linke Stick ist die Maus, der rechte Stick sind die Cursortasten. Starten, auswählen - eingeben bzw. esc. Den übrigen Tasten sind Tastaturziffern zugeordnet. Leider war es nicht möglich, das Kreuz unter den Tastaturtasten zu verwenden. Aus irgendeinem Grund funktioniert der Xbox One S-Joystick nicht.

Strategien wie das Theme Hospital, OpenTTD usw. werden mit einer solchen Konfiguration gespielt. Bei Schützen wird etwas schlechter gespielt, aber Sie können ähnliche Startskripte für Schützen in derselben Datei erstellen, indem Sie dort den Parameter $ 1 ändern.

Um den normalen Betrieb des Joysticks in der Emulationsstation sicherzustellen, müssen Sie xboxdrv nach dem Beenden des Spiels abschließen. Fügen Sie dazu am Ende der Datei /opt/retropie/configs/all/runcommand-onend.sh Folgendes hinzu .

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



Wenn beim Aktualisieren von Retropie ein Fehler aufgetreten ist
Einmal habe ich das Retropie-Update gestartet und beim Auspacken des Kernels fiel das eingebaute WLAN aus. Das Gerät wurde gestartet, reagierte jedoch nicht auf Tasten, einschließlich der angeschlossenen Tastatur. Es gibt kein SSH, da es kein Wi-Fi gibt, es nicht auf die Tastatur reagiert und Sie die SD-Karte nicht erhalten können ...

Mir ist aufgefallen, dass die Tastatur beim Booten funktioniert. Ich habe viele Male Strg + C gedrückt und, oh, die Konsole! Aber wie kann man Wi-Fi jetzt wiederherstellen? Die wlan0-Schnittstelle fehlte überhaupt im Wort. Das Ausführen des Updaters hat nicht geholfen, da Dateien aus dem Internet abgerufen werden.

Als erstes kommentierte /opt/retropie/configs/all/autostart.sh den Start der Emulationsstation und startete neu. , . , wlan . . .

 sudo dpkg --configure -a 


Damit Retropie nicht wie eine Linux-Station aussieht
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 



 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, . .


, , .

Was kann man noch tun?


Sie können sich endlos verbessern. Ich gebe Ihnen ein paar Links, die gemacht werden können. Schreiben Sie weitere interessante Dinge, die Sie hinzufügen können. Vielen Dank für Ihre Aufmerksamkeit.


Er ist es wert.

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


All Articles