Retro rádióból retro gamer PC!

Akik ismernek tudják, hogy előszeretettel szeretek bolhapiacon retro gépek után kutatni, amik sajnos ma már elég ritkák ott is. Viszont egyik alkalommal megláttam egy doboz mélyen egy mini PC-nek álcázott rádiót. Oké, nem egy rendes számítógép, de milyen cuki már! :)

Ahogy megláttam, tudtam, hogy ebből valami klasszat is lehetne alkotni, így természetesen elhoztam!

A design egész kidolgozott és még egy kis egér is van hozzá, aminek gombjaival az adókat lehet keresni. 
Mérete 10x12x12 cm, szóval egész pici!

Két ceruzaelemmel működik és a bekapcsolást, illetve hangerőszabályzást egy közös tekerőgomb látja el a gép elején. A bekapcsolt állapotról még egy zöld LED is informál minket. 

Maga a szerkezet valamiféle reklámtermék lehetett anno, legalábbis erről tesz bizonyosságot a monitorjába tehető papírlap, amin tetszőleges grafika lehet. Ezen valami német cég hirdetése lehetet.

Hogy mi legyen belőle, arra az első gondolatom egy óra volt, ami jól mutatna akár a polcon is. Csak egy kijelző és egy arduino kellene hozzá. 

Persze aztán tovább gondoltam a dolgot, csak hogy ne legyen olyan egyszerű a feladat. :) 
Hiszen ha már teszünk bele kijelzőt, akkor többet is tudhatna ennél!
Van itthon elfekvőben pár nem használt Raspberry Pi, és mivel mindig is szerettem volna egy RetroPie alapú gépet építeni, (csak nem találtam neki értelmes beépíthetőségi alkalmatosságot) most adta magát a lehetőség.

Nosza, csináljuk egy mini retro gamer PC-t! :)

A dobozt szétbontva sok mindent nem találunk benne. Egy apró panel lent, egy kis hangszóró fent, hátul az elemtartó és a kihúzható antenna foglal helyet.

Mondhatni, hogy egész sok hely van benne az építkezéshez! Ez így is van, de egy átlagos mérető Raspberry pont nem fér el benne sehogy. Nem gond, van itt egy Raspberry Zero is, még az első szériából. Ez már többféle módon is elfér benne. A RetroPie szépen elfut ezen is, csak ami gond lehet az a Bluetooth, a WiFi és az USB A csatlakozók hiánya. De ezeken lehet segíteni...

 

Minő szerencse, hogy mindenféle panelt megszoktam tartani, a "majd jó lesz valamire" filozófia jegyében, így találtam is egy nagyon pici USB HUB-ot, amin van 4 USB port, plusz egy a hoszt fele. Ráadásul külső tápot is elfogad, így tökéletes lehet kiszolgálni az Pi-t és a perifériákat. 

Lássuk miből is áll a setup:

  • Raspberry Pi Zero - Mindentől mentes, első generációs
  • LCD kijelző - Sokféle létezik, nekem ez volt itthon
  • Aktív USB HUB - Ez a 4 portos már bőven kiszolgálja az igényeket
  • USB csatlakozók / kábelek - Lehetőleg pici csatlakozós, rövid kábelek 
  • Aljzatok: Táp, Jack, RCA - Tép bemenet, video és hang kimenet
  • Külső táp - Én egy 5V 3A tápot használok hozzá, teljes mértékben elég
  • WiFi és Bluetooth adapterek. Esztétikusabb ha minél kisebbek :) 

 

A képen van még egy kis kapcsoló is, mert az eredeti ötlet az volt, hogy majd azzal lehet bekapcsolni, de aztán támadt egy jobb ötletem, így ez nem került bele. Lásd később.

A DC aljzat egyértelmű, azon át kapja majd az 5V-ot.

Eredetileg nem terveztem bele hangszórót és a jack aljzaton keresztül ment volna ki a hang, de aztán mindkettő helyet kapott benne. Erről szintén lesz szó később. 

Eredetileg HDMI kimenet is lett volna, de ez nem valósult (még) meg, viszont az RCA csatin át kompozit kimenet van, így arra alkalmas kijelzőkre ráköthető.

Első körben a kijelzőt szerettem volna a helyére illeszteni, de ez nem volt olyan egyszerű!
Ugyan a kijelző képmérete nagyon jól kitölti a műanyag keretet, csak ép nem lehet középre helyezni, mert a panel jobb oldalán lévő gombsor miatt nem fér középre. Szerencsére ezeknek a gomboknak semmi köze a kijelzőhöz, csak amolyan extraként vannak rajta, így nemes egyszerűséggel levágtam azt a fél centis rész a panelről (természetesen eltettem, mert még az is jó lehet egyszer valamire :) ).

Így már szépen befér a keretbe. Persze a keret belülről be van falazva, hogy tartsa a papír lapot, így ezt is szépen ki kellet vágni.

A teszt konfig, még ormótlan nagy USB kábelekkel:

 

Na de hogy lesz ezen a kijelzőn kép?
Szerencsére nem túl bonyolult a dolog, van hozzá driver és ahhoz egyszerű telepítő is. Akit jobban érdekel, annak minden infó itt fellelhető róla

Második körben jöhetett az USB HUB és a Pi beszerelése!

Nos ezen a ponton van 20 féle elrendezést kipróbáltam és valahogy egyik sem adta ki jól.
Vagy az USB portoknak nem volt elég hely, vagy a HDMI-nek, vagy a GPIO-nak, vagy az LCD csatlakozója esett rossz helyre. Szóval egyszerűen nem lehetett úgy berakni a két panelt, hogy minden csatlakozó és az azokba dugott kábel jó helyen legyen, ne keresztezzen valamit.

Végül aztán úgy döntöttem, hogy a Pi az LCD-re lesz ráapplikálva úgy, hogy a portok elérhetőek legyenek. 
Hivatalosan úgy van kialakítva az LCD panelje, hogy a Pi-t össze lehessen vele dugni, ne kelljen semmilyen kábel. Viszont ebben az esetben ép pont fél centivel lógna annyira jobbra, hogy már nem férne be a gépházba :)
Ezért aztán rövid kábelekkel lettek átvezetve a szükséges jelek.

Üröm az örömben, hogy a HDMI kivezetésnek így már nem jut elég hely. Vagyis igen, de kell majd hozzá egy L alakú csatlakozó és valami nem túl bumfordi csatlakozós kábel. De ez majd akkor kerül bele, ha sikerül ilyet szereznem, nem sürgős! :) 

Oké, Pi-nek megvan a megfelelő hely, de hova kerüljön az USB HUB. Ennek a hátsó három portját szerettem volna könnyen elérhetővé tenni, és nyilván úgy, hogy ez se legyen útba semminek. Pár perc forgatás után aztán meglett ennek is a helye. A rádió antennájának helyére fog kerül. Annak tartóját levágva, pont kaptam egy akkora lyukat, hogy kifér rajta a három csatlakozó és szépen megbújik a panel a ház bal oldalán.

 

Most hogy a lényeges dolgok helyet kaptak. Jöhettek az apróságok!

Kellene hangot csinálni! Viszont a Pi Zero annyira zéró, hogy semmiféle hangkimenet nincs rajta. Ezt azonban  könnyen lehet orvosolni, mert két GPIO pin felhasználható hangkimenetre. Ezt két PWM kimenet lehet, amik alapesetben nem erre vannak kitalálva, de egy kis beállítással felhasználhatóak erre. Az alábbi sort kell csak elhelyezni a /boot/config.txt fájlba:

dtoverlay=audremap,pins_12_13

Tehát a sztereó hangot a 12-es és a 13-as pinen fogjuk megkapni. Ehhez még a hangkimenetet a raspi-config segítségével Headphones-ra kell állítani. 
A trükk hátránya, hogy borzasztó halk, maximum csak fejhallgatóval hallható élvezhetően.

Gondoltam egy LM386-os erősítő IC-vel építek egy apró erősítőt bele. Végül aztán mégsem, mert egy jobb megoldás jutott eszembe! 
Van itt hiszen nekünk egy rádió panelünk, amin nyilván van erősítő is. Igazából két IC van a panelen, egy FM tunner és egy erősítő. Az FM tuner IC-t egy az egyben leszedtem a panelről, nem kell az már ide. Az IC adatlapjáról kideríthető melyik lábán van a hangkimenete. Ezután a nyák megjelelő pontjára csak rá kellet kötni a Pi GPIO lábát. Biztonság kedvvért és hogy ne legyen zajos a jel, egy 220 Ohm-os ellenállást közbe iktattam.

Tádám, lőn erős hang, ami ráadásul szabályozható is a kis tekerőgombbal. 
Mivel ez a gomb egyben a rádió bekapcsolója is volt, adta magát a lehetőség, hogy ez maradjon így a mostani rendszerhez is. Így hát a külön bekapcsoló gomb helyett ez lett felhasználva.

Most, hogy került be erősítő, így a hangszórót is vissza szerettem volna tenni. Csak mivel már jól meglett pakolva a cucc elektronikával, az eredeti hangszóró nem fért be. Viszont akadt itthon egy kisebb, laposabb hangszóró, ami még kényelmesen elfért a jobb oldalon. 
Ettől függetlenül a jack csatlakozó is bekerült, hogy bármilyen más hangrendszerre rá lehessen kötni. Illetve abban az esetben ez meg is szakítja a belső hangot.

Ugye a rádióhoz volt az a kis pofás egér is és ezt sem szerettem volna funkció nélkül visszaakasztani.
Mivel rendes leállításhoz, vagy újraindításhoz nincs a Raspberry-n semmilyen gomb, így gondoltam az egér gombokat lehetne felhasználni erre a két funkcióra. 
Magában az egérben semmi különös nincs, csak két mikrókapcsoló, amik pont jók arra, hogy a Pi GPIO portján két tűskét rövidre zárjunk velük. A 20 és 21-es pin lett erre felhasználva, amiket a gombok GND-re zárnak, biztonság kedvéért egy 330Ohm-os ellenállással.
Habár szoftveresen ezt nagyon egyszerűen le is lehetett volna kezelni, én mégis kicsit bonyolítottam ezen is. Ugyanis szerettem volna elkerülni azt, hogy egy pillanatnyi véletlen lenyomásra leálljon, vagy újra induljon a rendszer. 
Ehhez készült az alábbi kis python script, ami figyeli a gombokat és csak akkor futtatja a leállítás / újraindítás rutinokat, ha a gombot legalább 2 másodpercig nyomva tartjuk. 

/user/local/bin/mouse_btns.py

#!/usr/bin/env python3

from gpiozero import Button
from subprocess import check_call
from signal import pause

def shutdown():
        check_call(['sudo', 'poweroff'])

def restart():
        check_call(['sudo', 'reboot'])


shutdown_btn = Button(20, hold_time=2)
shutdown_btn.when_held = shutdown

restart_btn = Button(21, hold_time=2)
restart_btn.when_held = restart

pause()

Hogy ez mindig elinduljon a háttérben, illetve manuálisan is lehessen kezelni, kell hozzá még egy init.d szolgáltatás is:

/etc/init.d/listen_for_mouse.sh

#!/bin/sh

### BEGIN INIT INFO
# Provides:             listen_for_mouse.py
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
### END INIT INFO


case "$1" in
  start)
    echo "Starting listen_for_mouse.py"
    /usr/local/bin/mouse_btns.py &
    ;;
  stop)
    echo "Stopping listen_for_mouse.py"
    pkill -f /usr/local/bin/mouse_btns.py
    ;;
  *)
    echo "Usage: /etc/init.d/listen_for_mouse.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

 

Így már működnek is a gombok és a véletlen megnyomás miatt sem kell félni.

 

Jöhet az összeépítés!

Hiába a rövidke kábelek, nem volt egyszerű a kábeleket bezsúfolni, de azért sikerült mindent behajtogatni szépen. Igaz az USB kábelekről a törésgátlókat le kellett vágnom, hogy a csatlakozóhoz közelebb meglehessen hajlítani őket. Ám ez nem baj, ezek már úgysem lesznek többet mozgatva. 

Bekerült az eredeti power LED is, a hátsó csatlakozók és összecsavarozva túlajdonképpen késsz is a hardware!

Ugyan a boot nem túl gyors, de miután elindult az Emulationstation, már nincs gond a sebességgel. A játékok pedig csont nélkül futnak. 

Az Xbox One kontroller vezetékkel jól működik, de bluetooth-on át folyamatosan fel-le csatlakozott végtelen ciklusban. Mint kiderült, nem egészen van jól megoldva ennek a kontrollernek a támogatottsága, viszont az xpadneo driverrel már tökéletesen működött. 
Persze akár billentyűzetet is lehet rádugni, de mégis csak kontrollerrel a legkényelmesebb vele játszani. 

Mivel ezek a játékok eleve kisfelbontásra voltak tervezve, így nem is zavaró a kis képernyő. Teljesen jól látható rajta minden! Habár a konzolt ezen nem fogjuk látni, csak ha kilépünk az Emulationstation-ből, azért növeltem kicsit a konzol font méretén is.

sudo dpkg-reconfigure console-setup

paranccsal lehet ennek beállítási lehetőségét elérni. Így már egész jól olvasható lett a konzol a kis kijelzőn. 
Persze ha konzol kell, akkor inkább be SSH-zok. 

 

 

És most kanyarodjunk kicsit vissza. Mi is volt az eredeti ötlet? Hogy óra lesz belőle!
Nos erről nem mondtam le és továbbra is szerettem volna, ha ezt a célt is beteljesítené. 
Sajnos a Emulationstation nem tud időt megjeleníteni, pedig akár lehetne a kezdőképernyőjén is.
Ugyan van neki képernyőkímélő módja, de sajnos ott sem lehet időt mutattatni. 
Sokat morfondíroztam, hogy lehetne mégis a képernyőkímélőjét erre is felhasználni. Aztán egyszer csak beugrott!
Mivel az egyik képernyőkímélő mód az, hogy képeket jelenít meg, hát legyen az aktuális idő magukon a képeken! :)

Gondoltam ha már retro, jelenítsen meg régi gépek és azok gyártóinak logóját: Sinclair, Commodore, Atari, ...
Ezek alján pedig az időt.

De hogy kerül az idő a képekre?
Egyszerű: Fusson le egy kis bash script minden percben, ami a képekre ráírja az időt.
A nyers képek a /opt/piesaver/images/ alatt foglalnak helyet. A módosítottak pedig a /mnt/piesaver_imgs/ alatt lesznek.
De mit keresnek a /mnt alatt? Itt a piesaver_imgs tulajdonképpen egy 10Mb-os RAM FS, mivel nem lenne jó az SD kártyának hosszútávon, ha minden percben kb. 10 képet írnánk rá. Így viszont mindig csak a memóriába kerülnek, nem az SD kártyára. 

Már csak a képgeneráló kód kell, ami mindössze ennyi: 

#!/bin/bash

TIME=$( date '+%H:%M' )

IMAGES="/opt/piesaver/images/*"
DEST="/mnt/piesaver_imgs/"
IDX=0

for i in $IMAGES
do
    convert -font Helvetica-Bold -fill white -pointsize 30 -draw "text 110,220 '$TIME'" $i $DEST$IDX.jpg
    ((IDX=IDX+1))
done

Itt a convert parancs ami a feliratozást végzi, ami az ImageMagick csomag része. 
A scriptet pedig a cron futtatja minden percben. 
Értelem szerűen az Emulationstation-ben be kellet állítani, hogy a képeket a /mnt/piesaver_imgs/ alatt keresse és azután már azokat váltogatja.

És tökéletesen működik most már ez is, eredeti cél beteljesítve! :)

A designon még finomítok majd, illetve teszek be több logót is, de az már csak grafikai meló...

Ami még hátra van még, az némi finomhangolás és játékok telepítése. Ha pedig minden összeállt, akkor az egész SD kártya lementése egy image fájlba, hogy gond esetén csak vissza kelljen állítani. Mert mint köztudott a Raspberry-t SD kártyával használni, hát nem egy életbiztosítás! 

Illetve ahogy írtam, majd fog kapni egy HDMI kivezetést is ha találok arra alkalmas megoldást. 

És Íme a végeredmény.

Ahogy az utolsó képen is látszik, az egész szerkezet áramfelvétele 0.44 amper. Kicsit sok, de ez a WiFi és a Bluetooth adaptereknek köszönhető, mert azok nélkül csak 0.20 lenne. De így sem vészes azért. 
melegedni melegszik, de szerencsére a felső szellőzőrács nem csak dísz, tényleg átjár rajta a levegő. 

Mehet is fel a polcra disznek, órának, alkalmi játékgépnek, de netes rádiónak is jó ha már rádió volt előző életében:)

 

Végül pedig egy indokolatlan cicás kép, mert azt mindenki szereti! :)

Hozzászólások

Szerkesztve: 2022. 09. 10., szo – 20:50

Jó cucc. Az órával kapcsolatban, gondolom az Emulationstation képernyővédő funkciója X másodpercenként jelenít meg új képet, vagyis akár X másodpercet késhet az óra, ez nem zavar? Vagy van erre valami trükköd, hogy a rendszer X másodperccel siessen?

Szerk: Mivel a crontabban nem tudod megadni melyik másodpercben fusson ezért én a date parancsban tekerném előre az órát:

date -d '+1 min' '+%H:%M'

10 másodpercenként váltja a képeket az Emulationstation.
Tehát lehet olyan, hogy a mutatott képen 20:00(:59) van és ez 10 másodpercig látható ugye, de ez idő alatt már 20:01 van igazából. Viszont váltáskor már a következő képen 20:01 lesz, így igazából percente max. egyszer lehet pontatlan a kijelzés, az is max. 10 másodpercig.
De nem is az a cél, hogy ez másodperce pontos legyen állandóan, úgyhogy ennyi bőven belefér! :)

I don't need to "get a life". I'm a gamer, I have lots of lives!

Ügyes! Így már a macskacicónak is van saját gépe :-P

Végig azon izgultam ez tényleg bele fog-e férni... Szép!

[insert line here]
B.C. 3500 - DIY Vehicle / A.D. 30 - DIY Religion / A.D. 1991 - DIY OS

Atya gatya... őszinte elismerésem! :-)

Szerkesztve: 2022. 09. 11., v – 15:40

GJ!

esetleg irhatsz egy mini game-t, ami mutatja az idot(+kepeket), es "ora modban" ezt a jatekot futtatja a Emulationstation

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!