Innehållsförteckning:

Retro Idiot Box: 10 steg
Retro Idiot Box: 10 steg

Video: Retro Idiot Box: 10 steg

Video: Retro Idiot Box: 10 steg
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Juli
Anonim
Retro Idiot Box
Retro Idiot Box

Jag hittade en gammal Magnavox bärbar tv från 1984 som satt på en hylla i min lokala butik. Jag tänkte för mig själv, "åh NEAT!" Vid ytterligare inspektion märkte jag en prislapp på $ 15 på den, så jag bestämde mig för att ta hem den och göra något spyt av den. Jag minns att jag såg repriser som barn av alla de stora klassikerna i härliga svartvita, och ville göra detta till verklighet igen.

Problemet är att det inte finns några analoga stationer längre, och detta är helt oförmöget att göra någon ATSC -avkodning eller digital avkodning. Jag märkte närvaron av en AV -anslutning på sidan, och hade några hallonpi som låg runt, så jag bestämde mig för att ge mig ut på ett äventyr för att ta reda på hur jag kunde strömma kanaler till detta. Jag vill också få det att se skarpt ut. Jag kommer inte att köra den på de 9 D-cellbatterierna, så jag kan dölja rpi i batterifacket med en mängd andra godsaker.

Steg 1: Skaffa en bra IPTV -lista

Skaffa en bra IPTV -lista
Skaffa en bra IPTV -lista

Daily IPTV List har ett fantastiskt urval av gratis iptv -stationer organiserade efter land. Välj det land du väljer och ladda ner m3u -filen.

För programvaran som finns i detta är m3u ett nödvändigt format. Du kan läsa mer om detaljerna i formatet här.

Steg 2: Preliminärt kodförsök

Pythonkoden som vi ska skriva tolkar m3u -filen i en lista med stationer.

#!/usr/bin/python3

importera delprocess från sys import argv class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = with open ('./ us-m3uplaylist-2020-08- 17-1.m3u ',' r ') som m3u: i = 0 för rad i m3u: if line.startswith ('#EXTINF '): this = Station () this.name = line.split (', ') [1] rad = nästa (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

Låt oss bryta ner det här.

#!/usr/bin/python3

Detta säger bash att vi kommer att använda python3 för att tolka den här filen.

importera delprocess från sys importera argv

Vi kommer att behöva delprocessmodulen för att starta vår vlc -instans, och vi kommer att behöva argv för att välja vilken kanal vi ska starta vlc till.

klass Station: def _init _ (self): self.channel = 0 self.name = '' self.address = ''

Detta definierar en klass som heter Station. Varje kanal kommer att ha ett kanalnummer, kanalens namn från m3u -filen och en adress varifrån kanalen strömmar.

channel_list =

Detta är en lista som lagrar alla kanaler som analyserats från m3u -filen.

med öppen ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') som m3u: i = 0 för rad i m3u: if line.startswith ('#EXTINF'): this = Station () this.name = line.split (',') [1] line = next (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1

Denna loop öppnar m3u -spellistan och tar in data. m3u -filraderna som vi är intresserade av börjar med #EXTINF, Detta indikerar en ny post i spellistfilen. Nästa värde av intresse är namnet, som ligger på samma rad som #EXTINF, men med ett kommatecken mellan dem. Följande rad i denna speciella m3u är adressen till strömmen. Det finns en iterator "i" som används för att räkna vilken kanal som är vilken. Denna loop itererar genom hela m3u -filen och fyller channel_list med stationer.

process = delprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

delprocessbiblioteket tillåter python att anropa processer (program) och returnerar ett PID (Process ID). Detta gör att python kan hantera start och stängning av program "korrekt" utan att fylla i historikfilen, eller tillåta att mer godtycklig kod körs med generiska "system" -anrop. Varje element i matrisen som används som ett argument till Popen är som det skrivs på kommandoraden.

vlc --loop --intf dummy -fullscreen -adresser

Kommandot ovan är det som önskas köras, med --loop -alternativet fixar några problem med strömpaus medan nästa bitar laddas (konstiga m3u8 -problem), --intf dummy startar vlc utan gränssnittet, bara en skärm, --fullscreen startar videon i helskärmsläge (INTE VÄG!), och adressen är strömmen. Som du kan se i koden tillhandahåller vi adressen från listans kanalnummer, som tillhandahålls vid körning via argv -satsen. Spara den här filen som tv_channels.py, ändra spellistans plats i pythonfilen för att peka på din spellista, och du kan köra koden enligt följande:

python tv_channels.py

Steg 3: Lägg till GPIO

Lägg till GPIO
Lägg till GPIO
Lägg till GPIO
Lägg till GPIO

Schemat visar de två GPIO -stiften som används för knapparna, och var och en har ett uppdragningsmotstånd för att hålla GPIO -stiftet högt efter knapptryckningen. Koden som tidigare definierats kan förädlas för att göra operationen lite mer sömlös genom att lägga till GPIO -kapacitet. Detta gör att vi kan ändra kanal med knappar, snarare än ett tangentbord och argv -uttalanden, precis som för realsies -tv.

Det första att notera är att jag har tv: n definierad som en klass. För att vara en tv måste vi vara på en aktuell kanal, ha en lista över möjliga kanaler och ha möjlighet att ändra kanaler. I det här exemplet är den enda metoden för att byta kanal att flytta upp kanallistan och flytta ner kanallistan. När kanalen väl är avgjord måste vi starta VLC på den kanal vi vill se.

#!/usr/bin/python3

från tid importera sömn import subprocess från sys import argv från gpiozero import Button class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = '' self.process = '' class Television: def _init _ (self, filnamn): self.current_channel = 0 self.channel_list = self.build_channel_list (filnamn) self.start_channel () def build_channel_list (self, filnamn): med öppet (filnamn, 'r') som m3u: i = 0 för rad i m3u: if line.startswith ('#EXTINF'): this = Station () this.name = line.split (',') [1] line = next (m3u) this.address = line. strip () this.channel = i self.channel_list.append (this) i = i + 1 def channel_up (self): self.current_channel = self.current_channel + 1 if self.current_channel> len (self.channel_list): self. current_channel = len (self.channel_list) self.start_channel () def channel_down (self): self.current_channel = self.current_channel - 1 if self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): försök: self.process. kill () utom: passera print ('startkanal % d' % self.current_channel) self.process = subprocess. Popen (['vlc', '-q', '--loop', '--intf', ' dummy ',' --fullscreen ', self.channel_list [self.current_channel].address]) this = Television ('./ us-m3uplaylist-2020-08-17-1.m3u ') channel_UP = Button (18) channel_DN = Knapp (23) medan True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Denna iteration av kod har en hel del förbättringar. det använde nu en modul som heter gpiozero som krävs av hallon pi för att enkelt komma åt funktionaliteten hos GPIO -stiften

sudo apt-get install python3-gpiozero

eller

sudo pip installera gpiozero

Som framgår av min kod har jag valt GPIO 18 och GPIO 23 för kanal UP respektive kanal NED. Gpiozero -biblioteket har en trevlig klass för knappfunktioner för när_pressat, is_pressat, when_held, etc. Detta gör det ganska enkelt. Jag valde när_pressad, som refererar till en återuppringningsfunktion som ska köras när denna signal detekteras.

Den sista stora förändringen är införandet av alternativet '-q' i VLC -delprocessanropet. Detta kör helt enkelt vlc utan all utmatning till terminalen för att hålla den fri från rörelse så att vi kan se de informativa utskriftsuttalandena i koden.

Steg 4: Integrera hårdvaran för att se skarp ut

Integrera hårdvaran för att se skarp ut
Integrera hårdvaran för att se skarp ut
Integrera hårdvaran för att se skarp ut
Integrera hårdvaran för att se skarp ut
Integrera hårdvaran för att se skarp ut
Integrera hårdvaran för att se skarp ut

Jag har inte kommit på hur jag vill uppnå detta, och det kommer att vara en unik lösning för varje modell -tv som används. Jag måste tänka efter om detta och undersöka tv: n för att hitta en bra strömkälla för pi när jag tappar datorn inuti det massiva batterifacket. Jag har också övervägt att använda klockknapparna för kanalvalet, eftersom de redan är vackert placerade på TV: n, och klockan fungerar inte ändå. Jag kommer att lägga upp mer när jag hittar en bra lösning, men det är här Mitt projekt kommer att avvika mycket från alla andras. Njut av den riktiga tv-liknande IPTV-integrationen!

Steg 5: Pi Power

Pi Power
Pi Power

För den modell -tv jag hittade kräver den en 12V strömförsörjning. Jag sonderade runt kortet, men såg inga uppenbara effektregulatorer för 5V, så det mest uppenbara stället att få en stadig strömförsörjning är på kretskortet där fatkontakten för 12V kommer in. Det finns ett uppenbart problem med detta. vi vill inte steka pi, så vi kommer att behöva en effektregulator. Jag har valt MP2315 Step-Down Power Converter. Det är smutsigt billigt och enkelt att använda. Vi kommer att löda 12VDC -ingången från fatkontakten på kretskortet till IN+ och GND -stiften på omvandlaren och VO+ till stift 2 på Raspberry Pi, samt en GND.

INNAN detta görs, se till att slå på omvandlaren och se till att rätt 5V kommer ut ur utgången. Jag valde det enklaste alternativet med den trådbundna justerbara spänningen. Trimmern kommer att justera spänningen, så jag såg spänningsutmatningen med en multimeter när jag justerade trimmern med en skruvmejsel.

Steg 6: Integrera kraft

Integrerande kraft
Integrerande kraft
Integrerande kraft
Integrerande kraft
Integrerande kraft
Integrerande kraft

Efter att ha grävt runt tv: n bestämdes det att det bästa stället att ta ut ström var från minuset på fatkontakten och TV: ns PÅ/AV -omkopplare, vilket innebär att vi kan slå på och av strömmen med tv: n, snarare att ständigt strömförsörjning av pi genom att dra direkt från fatkontakten.

Ledningarna löddes in och matades längs sidan av kretskortet bredvid höljet tills de nådde baksidan av enheten, där de matades genom ett hål som fanns på baksidan av batterifacket. När de väl matats igenom kan vi förbereda ändarna på kablage och lödda ner dem till effektregulatorn. Jag ställde in den för 5V för att driva pi och lödda huvudstiften till den så att vi kan köra kvinnliga till kvinnliga hoppare från effektregulatorn direkt till Pi: s GPIO -rubriksats. Detta rekommenderas normalt inte, eftersom pi generellt får ström via UBS, som har en regulator inline för att konditionera 5V, men eftersom effekten redan regleras bör det vara bra.

Det finns lite brus på ljudlinjerna från att göra detta, eftersom det finns en jordslinga i systemet. Jag försökte många power- och markpunkter över hela linjen i hopp om ett enkelt svar, men hittade inga. Jag löd också en microUSB -kabel till den omkopplade lägesregulatorn för att se om det skulle lösa problemet att tvinga ström genom Pi: s interna regulatorer. Det gjorde det inte. Lösningen kommer att finnas i några transformatorer för ljudjordisolering. Dessa beställdes snarare än byggda, eftersom de är billiga och snyggt förpackade. Du kan hämta dem från de flesta autoljudbutiker eller avdelningar. Det här är vad jag valde.

Steg 7: Långtidsknappslösning

Långsiktig knapplösning
Långsiktig knapplösning
Långsiktig knapplösning
Långsiktig knapplösning

Utan tvekan kommer knapparna inte att ligga kvar på en brödbräda, så det måste finnas en mer permanent lösning. Jag tog en gammal protoboard och kastade kretsen tillsammans med några rubrikstift för att göra det enkelt att komma åt signalerna. Det är här alla kommer att ha olika åsikter om hur man sätter på eller monterar knapparna. Jag väljer att överstyra dem och bara fästa dem på chassit så att handtaget som svänger över skärmen för att bära inte stör. Känn dig fri att mönstra upp designen genom att lägga till ett 3D -tryckt fodral som slätar upp montering, använd muttrar och bultar, fina lim, integrera originalknappar, vad som helst. Så länge det fungerar finns det inga felaktiga svar.

Dessa kommer att monteras på utsidan av fodralet, och Raspberry Pi kommer att stoppas in i det mycket rymliga batterifacket, så det kommer att behöva borras ett litet hål för att tillåta kablar att tränga ut batterifacket.

Steg 8: Final Fit Check

Slutlig passningskontroll
Slutlig passningskontroll

All utrustning måste passformskontrolleras en sista gång för att se exakt var alla hål måste göras till chassit, och vilken storlek på hål osv måste göras. Dessutom bör det övervägas var komponenterna ska placeras för optimal enkel anslutning och åtkomst. Lång historia kort, se till att allt passar där du tror att det gör innan du irreparabelt skadar ditt projekt och måste få ut spjället.

Steg 9: Slutlig integration

Slutlig integration
Slutlig integration
Slutlig integration
Slutlig integration
Slutlig integration
Slutlig integration

Nu är all hårdvara där den behöver vara, och allt passar lika tätt som en bugg i en matta. Låt oss klippa saker! Jag identifierade en plats på batterifacket där jag kunde dra ut AV -kablarna med en liten fördjupning i plasten. Jag slog ner den med en bänkslip. Det gjorde ganska kort arbete. Jag använde en dremel för att slipa ner mer plast för att det skulle passa ganska bra för kablarna.

Den sista komponenten är kanalväljaren. Jag borrade ett litet hål i batterifacket och drog ut huvudkablarna ur det en i taget. Knapparna var anslutna, och jag fäst protoboardet på plastchassit med två halvor av förklistrad kardborre. Jag förstår att det fanns cirka 1200 bättre sätt att göra detta, men det här fungerade och jag hade allt jag behövde till hands.

Steg 10: Njut av din Vintage IPTV

Njut av din Vintage IPTV
Njut av din Vintage IPTV
Njut av din Vintage IPTV
Njut av din Vintage IPTV
Njut av din Vintage IPTV
Njut av din Vintage IPTV

Det sammanfattar det ungefär. Hitta program och ha kul att titta på. Sitt dock inte för nära. Du kommer att ruttna i din hjärna!

Det finns mycket utrymme att förbättra det här projektet, så ta det åt vilket håll du vill, men det var kul att komma så långt. När det gäller mig kör jag det här från en cronjob vid omstart, så stdout fångar inte meddelandena från python -skriptet. Jag skulle vilja fixa detta så jag vet vilken kanal jag är på. Ett annat bra tillägg är en trådlös tangentbordsdongel på Pi. Detta skulle låta dig byta wifi -nätverk om du lämnar ditt hus med tv: n. Oavsett. det var ett roligt projekt, och jag kan inte vänta med att komma igång med nästa.

Rekommenderad: