Raspberry Pi retro-kontsola

Joan den urteko urtebetetzerako, Raspberry Pi-aren pack bat oparitu zidaten, RetroPie instalatua zekarren SD txartela, 5 hatzbeteko pantaila eta SNESekoen forma duten mando pare batekin.

Bateria bat erosi eta kontsola portatila egiteko aukera bikaina.

Portatila egitea ongi dago, baino eta etxeko telebistan aritzeko? Baaaaai, LCDaren HDMIa kendu eta telebistarakoa entxufatu, egina! Baino, arazotxo bat dago: telebistan LCDko bereizmenarekin ikustea ez da egokiena.

Fitxategiak prestatzen

RPiaren irteerako bereizmena zein izanen den /boot/config.txt izeneko fitxategi batean adierazten da, fitxategi horretan, audio irteera (HDMI edo Jack) eta bertze hainbat gauza ere adierazten dira. Hasieratzean kargatzen da RPiaren memorian eta hau martxan dagoenean aldatuta ere, ez du eraginik izanen. Fitxategia berriz kargatzeko RPia berrabiarazi behar da.

Bertzetik, RetroPiek ez ninduen guztiz konbentzitu eta gehiago gustatu zitzaidan recalbox erabiltzen dut, sinpleagoa iduritzen zait (jokoetan aritu bakarrik egin nahi dut) eta gainera guztiz euskaratua dago. Sistema eragile honentzat ere konfigurazio desberdinak kargatzea komeni da izanen dugun irteeraren arabera.

Hasteko, irteera bakoitzeko konfigurazio fitxategi bat sortu nuen defektuzkoaren kopiak eginez. Hauen gainean aldaketak egiten joanen gara:
config.txt -> config.tv.txt / config.lcd.txt
recalbox.conf -> recalbox.tv.conf / recalbox.lcd.conf

Konbinazioak probatzen

Probak egiten aritu nintzenean, LCD konfigurazioa kargatua izan eta telebistan bistaratzean bereizmen kaxkarra ikusten da, config.txt fitxategian adierazi dioguna, azken finean. Eta LCDarentzat irudia 800x480 bereizmenarekin bidaltzeko erraten badiogu RPiri, imajinatu 4K telebista batean nola ikusiko den:

TV konfigurazioa kargatua dagoenean eta pantaila ttikia konektatua dagoenean, berriz, ez da irudirik bistaratzen, pantaila beltza gelditzen da. Horregatik derrigorrezkoa da LCD konfigurazioa kargatzea. Honela ikusten da pantaila ttikian LCD konfigurazioa kargatua duenean.

Prozesua automatizatzen

Goiko modu horretan, fitxategiak eskuz aldatzen aritzen nintzen denak ongi funtzionatzen zuela egiaztatzeko. Baina ez da batere erabilgarria fitxategi horiek eskuz aldatzea irteera aldatu nahi den bakoitzean: RPik sarean egon behar du, IPa zein den egiaztatu, SSH edo FTP bidez konektatu, fitxategiak lekualdatu eta berrizendatu.

Hori moduren batean automatizatu behar nuen. Script bat, Pythonen. Lehenengo eta behin, /recalbox/share/system/custom.sh fitxategiari erreparatu behar diogu: bertan adierazten dira RPi hasieratzean, itzaltzean edota berrabiaraztean exekutatu nahi ditugun komandoak. Gure kasuan Python script bat (lcd_or_tv.py) sortuko dugu gure prozesua automatizatzeko. custom.sh fitxategian erran beharko diogu recalboxi gure script hori exekutatzeko:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh
# custom.sh
# /recalbox/share/system/custom.sh
recallog "Custom.sh called"
case "$1" in
start)
recallog "Start detected."
# GURE SCRIPTa EXEKUTATZEKO AGINDUA HEMEN GEHITU
/usr/bin/python /recalbox/share/system/lcd_or_tv.py 2>&1 | recallog &
# AKABO AGINDUA
;;
stop)
recallog "Stop detected."
;;
restart|reload)
recallog "Restart|Reload detected"
;;
*)
recallog "Other state detected..."
esac

recalboxek custom.sh honi hasieratu dela erratean, start argumentuarekin fitxategi honi deitzen zaionean alegia, lcd_or_tv.py (gure script-a) exekutatuko du. 2>&1 parametroaren bidez, Pythonen errore mezuak irteera estandarrera bideratuko ditugu. Eta | recallog & parametroarekin berriz, irteera estandarrera doan guztia recalboxen logean idazteko agintzen dugu. Modu honetan, gure pyhthon scriptean idatzitako print aginduak edota gertatzen ahal diren erroreak, recalboxek eskeintzen duen log-era bideratuko ditugu. Gero ikusiko dugu zergatik den hau interesgarria. Log hori /recalbox/share/system/logs/recalbox.log fitxategian dago.

Automatizazioaren lehenengo proba, RPi abiaraztean konfigurazio berria kargatu eta berrabiaraztea zen. Nola jakin zein konfigurazio kargatu behar den berrabiaratze bakoitzean? Lehendik RPian zein irteerako konfigurazioa kargatua zegoen jakin behar nuen, aldatu behar zen unean, konfigurazioa bertze irteerarako prestatu nuen fitxategitik hartzeko. Fitxategi batean gordeko nuen, current_output deitu nion eta tv edo lcd idazten nuen une horretan kargatzen nuen konfigurazioren arabera.

Konfigurazio aldaketa hori baldintzatzea izan zen hurrengo pausua. Hasiera batean, botoi bat jarri nion RPiari eta 3 segundu edo gehiagoz sakatua egotean, konfigurazioak aldatu eta berrabiarazi egiten zen.

Soluzio ona, funtzionala, baino hala ere, nahiago nuen automatikoagoa zen zerbait. Adibidez, HDMI bidez konektatutako gailuaren arabera konfigurazioa kargatzea.

Pantailaren informazioa lortzen

Zer eskeintzen digu RPik HDMIn konektatutako gailuaren informazioa lortzeko? tvservice izeneko komando bat. RPin SSH bidez konektatu eta komando hau (parametro batzuekin) exekutatzean, HDMIaren bertze aldean dagoen pantailari galdera bidaltzen zaio. Pantailak ematen duen erantzunean onartzen dituen bereizmen, maiztasun, formatu… desberdinak itzuliko dizkigu. Itxura honetako irteerak emanen du, onartzen duen bereizmen bakoitzeko lerro bat:

1
2
3
4
5
6
...............
mode 4: 1280x720 @ 60Hz 16:9, clock:74MHz progressive
...............
mode 82: 1920x1080 @ 60Hz 16:9, clock:148MHz progressive
...............
mode 87: 800x480 @ 59Hz 15:9, clock:29MHz progressive

Hasieran, lortuko nituen bereizemenetan oinarrituta zein pantailatara konektatuta nengoen jakitea erraza izanen zela pentsatu nuen. Baino uste baino zailagoa egin zitzaidan eta ebazpen sinple eta zikin batera jo nuen, ez bainuen borroka horretan denbora (gehiago) galdu nahi.

Hemen zikinkeria: probatu nituen TV guzti-guztietan tvservice komandoa exekutatzean, lerro gehiago itzultzen zizkidan LCD pantailan exekutatzean baino. Hau da, LCDak baino bereizmen gehiago onartzen zituztela probatu nituen TV guztiek. Badakit LCDa konektatuta dagoenean tvservicek zenbat lerro itzuliko dizkidan. Beraz, tvservicek kopuru hori baino lerro gehiago itzultzen baditu, telebista batera konektatua dagoela suposatuko dut, eta guttiago badira, LCDa dela. Itsusia eta dudako fidagarritasunarekin, baino oraingoz funtzionatzen dit.

current_output fitxategian dagoen informazioarekin, RPi zein irteeratarako konfiguratua dagoen dakit eta tvservice aginduarekin bertze irteera motara konektatua nagoela ondorioztatzen badut, irteera berrira egokitutako konfigurazio fitxategiekin kargatu, current_output aldatu eta RPi berrabiaraziko dut.

Horrela, RPi berrabiaraztean, konfigurazio egokiak kargatuko ditu eta TV konfigurazioarekin hasieratuko da eta horrela ikusiko da.

Konparatze aldera, lehengo irudia berriz paratuko dut: telebistan LCD konfigurazioarekin.

Bonus

Recalboxek web bidezko kudeatzaile bat eskeintzen du. Bertatik ROMak kargatu daitezke, log-ak ikusi, RPiaren tenperaturak, prozesagailuen karga… Web nabigatzaile bidez kudeatu daitezke. Honegatik da interesgarria gure script-eko irteera guztiak recalboxen log-era bideratzea. Espero ez dugun portaeraren bat baldin badago, modu eroso batean egiaztatzeko.
Informazioa metatzeko intentzioarekin eta espero ez ditudan portaerak gertatzean ahalik informazio gehiena eskuragarri izateko, tvservice komandoaren irteera ere aparteko fitxategi batera bideratu nuen, log haundi horren erdian ez galtzeko. Fitxategi hori eta current_output egiaztatzeko, komando bidez edo FTP bidez joatea da ohikoena, baino ez erosoena. Recalboxek eskeintzen duen web managerraren bidez ere egin daiteke eta hagitz erosoa da aukera hori. Web manager honi bere konfigurazio fitxategien bidez erranen diogu zein fitxategiren edukiak ikusi nahi ditugun. /usr/recalbox-manager2/config/default.js fitxategiko recalbox.logsPaths eremuan gehitu beharko ditugu ikusi nahi ditugun fitxategien path-ak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
recalbox: {
ip: '127.0.0.1',
udpPort: 1337,
logsPaths: [
'/var/log/messages',
'/recalbox/share/system/.emulationstation/es_log.txt',
'/recalbox/share/system/logs/recalbox.log',


'/recalbox/share/system/current_output.txt',
'/recalbox/share/system/tvservice_output.txt',
'/recalbox/share/system/recalbox.conf',
],
...

Script-a eta konfigurazio fitxategiak repositorio honetan daude.