Kazalo:

Retro Idiot Box: 10 korakov
Retro Idiot Box: 10 korakov

Video: Retro Idiot Box: 10 korakov

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

Našel sem stari prenosni televizor Magnavox iz leta 1984, ki je sedel na polici v moji lokalni trgovini. Mislil sem si: "oh NEAT!" Ob nadaljnjem pregledu sem na njem opazil ceno 15 dolarjev, zato sem se odločil, da ga vzamem domov in iz njega naredim nekaj pikantnega. Spomnim se, da sem kot otrok gledal ponovitve vseh velikih klasik v veličastni črno -beli barvi in želel to znova uresničiti.

Težava je v tem, da zunaj ni več analognih postaj, kar je popolnoma nesposobno za dekodiranje ATSC ali digitalno dekodiranje. Opazil sem prisotnost AV povezave na strani in imel nekaj malinovih pi naokoli, zato sem se odločil, da se odpravim na avanturo, da bi ugotovil, kako lahko pretočim kanale do tega. Tudi jaz bi rad, da bi bil videti oster. Ne bom ga uporabljal na 9 baterijah D-celic, zato lahko rpi skrijem v predalček za baterije s kopico drugih dobrot.

1. korak: Pridobite dober seznam IPTV

Pridobite dober seznam IPTV
Pridobite dober seznam IPTV

Dnevni seznam IPTV ima fantastičen izbor brezplačnih iptv postaj, organiziranih po državah. Izberite želeno državo in prenesite datoteko m3u.

Za programsko opremo, ki je v tem, je m3u potrebna oblika. Več o posebnostih formata si lahko preberete tukaj.

2. korak: Predhodni poskus s kodo

Koda python, ki jo bomo zapisali, razčleni datoteko m3u na seznam postaj.

#!/usr/bin/python3

uvoz podprocesa iz sys uvoz argv razred Postaja: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = z odprto ('./ us-m3uplaylist-2020-08- 17-1.m3u ',' r ') kot m3u: i = 0 za vrstico v m3u: če line.startswith ('#EXTINF '): this = Station () this.name = line.split (', ') [1] vrstica = naslednji (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 process = podproces. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. naslov])

Razčlenimo to.

#!/usr/bin/python3

To pove bashu, da bomo za razlago te datoteke uporabljali python3.

uvozni podproces iz sys uvoz argv

Za zagon našega primerka vlc bomo potrebovali podprocesni modul, za izbiro kanala, v katerega bomo zagnali vlc, pa bomo potrebovali argv.

class Station: def _init _ (self): self.channel = 0 self.name = "self.address ="

To definira razred, imenovan Station. Vsak kanal bo imel številko kanala, ime kanala, vzeto iz datoteke m3u, in naslov, od koder ta kanal pretaka.

channel_list =

To je seznam, ki bo shranil vse kanale, razčlenjene iz datoteke m3u.

z odprto ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') kot m3u: i = 0 za vrstico v 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

Ta zanka odpre seznam predvajanja m3u in požre podatke. vrstice datoteke m3u, ki nas zanimajo, se začnejo z #EXTINF, kar označuje nov vnos v datoteko s seznamom predvajanja. Naslednja zanimiva vrednost je ime, ki je v isti vrstici kot #EXTINF, vendar z vejico med njima. Naslednja vrstica tega m3u je naslov toka. V uporabi je iterator "i" za štetje, kateri kanal je kateri. Ta zanka potuje skozi celotno datoteko m3u in zapolni channel_list s postajami.

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

knjižnica podprocesov omogoča pythonu klic procesov (programov) in vrne PID (ID procesa). To omogoča, da lahko python "pravilno" upravlja zagon in zapiranje programov, ne da bi napolnil datoteko zgodovine, ali pa dovoljuje izvajanje bolj poljubne kode z generičnimi "sistemskimi" klici. Vsak element matrike, uporabljen kot argument za Popen, je vnesen v ukazno vrstico.

vlc --loop --intf lutke -celozaslonski naslovi

Zgornji ukaz je tisto, kar je zaželeno zagnati, z možnostjo --loop, ki odpravlja nekatere težave s premorom toka, medtem ko se naslednji kosi nalagajo (čudne težave z m3u8), --intf dummy zažene vlc brez vmesnika, samo zaslon, --fullscreen zažene video v celozaslonskem načinu (NO WAY!), naslov pa je naslov toka. Kot lahko vidite v kodi, podajamo naslov s številke kanala na seznamu, ki je med izvajanjem na voljo prek stavka argv. Shranite to datoteko kot tv_channels.py, spremenite lokacijo seznama predvajanja v datoteki python tako, da kaže na vaš seznam predvajanja, in kodo lahko zaženete na naslednji način:

python tv_channels.py

3. korak: Dodajte GPIO

Dodajte GPIO
Dodajte GPIO
Dodajte GPIO
Dodajte GPIO

Na shemi sta prikazana dva zatiča GPIO, ki se uporabljata za gumbe, vsak pa ima vlečni upor, ki drži, da je pin GPIO po pritisku gumba potegnjen visoko. Predhodno definirano kodo lahko izboljšate, da naredite operacijo nekoliko bolj brezhibno, tako da dodate zmogljivost GPIO. To nam omogoča, da spremenimo kanal z gumbi in ne s tipkovnico in stavki argv, tako kot televizija for realsies.

Najprej je treba omeniti, da imam televizijo opredeljeno kot razred. Če želimo biti televizija, moramo biti na trenutnem kanalu, imeti seznam možnih kanalov in imeti možnost spreminjanja kanalov. V tem primeru bo edini način spreminjanja kanalov premikanje po seznamu kanalov navzgor in po seznamu kanalov navzdol. Ko se kanal odloči, bomo morali zagnati VLC na kanalu, ki ga želimo videti.

#!/usr/bin/python3

od časa uvoz podproces uvoza spanja iz sistema sys uvoz argv iz gpiozero import Tip gumba Razdalja: def _init _ (self): self.channel = 0 self.name = '' self.address = '' self.process = '' class Television: def _init _ (self, ime datoteke): self.current_channel = 0 self.channel_list = self.build_channel_list (ime datoteke) self.start_channel () def build_channel_list (self, ime datoteke): z odprto (ime datoteke, 'r') kot m3u: i = 0 za vrstico v 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, če self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): try: self.process. kill () razen: pass print ('začetni kanal % d' % self.current_channel) self.process = podproces. Popen (['vlc', '-q', '--loop', '--intf', ' lutka ',' --fullscreen ', self.channel_list [self.current_channel].address]) this = Televizija ('./ us-m3uplaylist-2020-08-17-1.m3u ') channel_UP = Gumb (18) channel_DN = Gumb (23), medtem ko je True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Ta ponovitev kode ima kar nekaj izboljšav. zdaj je uporabil modul, imenovan gpiozero, ki ga malina pi potrebuje za enostaven dostop do funkcionalnosti zatičev GPIO

sudo apt-get install python3-gpiozero

ali

sudo pip namestite gpiozero

Kot je razvidno iz moje kode, sem izbral GPIO 18 in GPIO 23 za kanal UP in kanal DOWN. Knjižnica gpiozero ima lep razred za funkcije gumbov za when_pressed, is_pressed, when_held itd. Zaradi tega je precej enostavno. Odločil sem se za when_pressed, ki se nanaša na funkcijo povratnega klica, ki naj se zažene, ko ta signal zazna.

Zadnja velika sprememba je vključitev možnosti '-q' v klic podprocesa VLC. To preprosto zažene vlc brez vseh izhodov na terminal, da ne bo nereda, tako da lahko v kodi vidimo informativne izjave o tiskanju.

4. korak: Vključite strojno opremo, da bo videti ostro

Vključite strojno opremo, da bo videti ostro
Vključite strojno opremo, da bo videti ostro
Vključite strojno opremo, da bo videti ostro
Vključite strojno opremo, da bo videti ostro
Vključite strojno opremo, da bo videti ostro
Vključite strojno opremo, da bo videti ostro

Nisem ugotovil, kako želim to doseči, in to bo edinstvena rešitev za vsak model televizorja v uporabi. Moram dobro premisliti o tem in poizkusiti po televiziji, da najdem dober vir napajanja za pi, ko računalnik natrpam v masivni predal za baterije. Razmišljal sem tudi o uporabi gumbov za uro za izbiro kanala, saj so že lepo nameščeni na televiziji, ura pa vseeno ne deluje. Ko bom našel dobro rešitev, bom objavil več, vendar se bo tu moj projekt močno razlikoval od vseh ostalih. Uživajte v resnični TV-integraciji IPTV!

5. korak: Pi Power

Pi Power
Pi Power

Za model televizorja, ki sem ga našel, potrebuje 12V napajanje. Brskal sem po plošči, vendar nisem videl očitnih regulatorjev moči za 5V, zato je najbolj očitno mesto za stabilen napajalnik na tiskanem vezju, kamor prihaja cevni priključek za 12 V. To je očitna težava.. ne želimo ocvrti pi, zato bomo potrebovali regulator moči. Odločil sem se za zniževalni pretvornik MP2315. Je poceni in enostaven za uporabo. 12VDC vhod iz cevnega priključka na tiskanem vezju bomo spajkali na nožice IN+ in GND pretvornika, VO+ pa na pin 2 na Raspberry Pi, pa tudi GND.

PREDen to storite, ne pozabite vklopiti pretvornika in zagotoviti, da iz izhoda prihaja ustreznih 5V. Izbral sem najpreprostejšo možnost z ožičeno nastavljivo napetostjo. Trimer bo prilagodil napetost, zato sem z multimetrom opazoval izhodno napetost, ko sem z izvijačem nastavljal trimer.

6. korak: Vključitev moči

Integriranje moči
Integriranje moči
Integriranje moči
Integriranje moči
Integriranje moči
Integriranje moči

Po kopanju po televiziji je bilo odločeno, da je najboljše mesto za napajanje iz negativa priključka cevi in televizijskega stikala za vklop/izklop, kar pomeni, da lahko s televizorjem vklopimo in izklopimo tokove, nenehno napajanje pi tako, da povlečete neposredno iz priključka cevi.

Žice so bile spajkane in napajane ob strani tiskanih vezij poleg ohišja, dokler niso prišle do zadnjega dela enote, kjer so jih napajali skozi luknjo, ki je bila v zadnjem delu predala za baterije. Ko so napajani, lahko pripravimo konce kablov in jih spajkamo do regulatorja moči. Uglasil sem ga za 5V za napajanje pi in mu spajkal zatiče glave, tako da lahko vodimo skakalce ženski do ženski od regulatorja moči neposredno do pijevega kompleta glav GPIO. To običajno ni priporočljivo, saj pi na splošno dobiva napajanje prek UBS, ki ima vgrajen regulator za pogon 5V, vendar bi moralo biti napajanje že regulirano.

Pri tem se na zvočnih linijah pojavi nekaj hrupa, ker je v sistemu ozemljitvena zanka. Poskusil sem veliko točk moči in tal po vsej plošči v upanju na enostaven odgovor, vendar jih nisem našel. Priključil sem tudi kabel microUSB na regulator preklopljenega načina, da vidim, ali bi vsilitev moči prek notranjih regulatorjev pi rešila težavo. Ni. Rešitev bo v nekaterih zvočnih ozemljitvenih transformatorjih. Ti so bili naročeni in ne izdelani, ker so poceni in lepo zapakirani. Lahko jih prevzamete v večini trgovin ali oddelkov za avdio avdio. To sem izbral.

7. korak: Rešitev dolgoročnih gumbov

Rešitev z dolgoročnimi gumbi
Rešitev z dolgoročnimi gumbi
Rešitev z dolgoročnimi gumbi
Rešitev z dolgoročnimi gumbi

Nedvomno gumbi ne bodo ostali na krovu, zato mora obstajati trajnejša rešitev. Vzel sem nekaj stare plošče in vrgel vezje skupaj z nekaj zatiči glave, da sem olajšal dostop do signalov. Tu bodo imeli različni mnenja o tem, kako pritrditi ali namestiti gumbe. Odločam se za njihovo protoboard in jih preprosto pritrdim na ohišje, tako da ročaj, ki se premika po zaslonu, ne moti. Oblikovanje lahko popestrite tako, da dodate 3D tiskano ohišje, ki olajša montažo, uporabite matice in vijake, modna lepila, integrirajte izvirne gumbe, karkoli. Dokler deluje, ni napačnih odgovorov.

Ti bodo nameščeni na zunanji strani ohišja, Raspberry Pi pa bo vstavljen v zelo prostoren predal za baterije, zato bo treba narediti majhno luknjo, ki bo omogočila izstop kablov iz prostora za baterije.

8. korak: Končna kontrola prileganja

Končna kontrola prileganja
Končna kontrola prileganja

Vso opremo je treba še zadnjič preveriti, da natančno vidite, kje je treba narediti vse luknje na ohišju in kakšne velikosti je treba narediti itd. Poleg tega je treba razmisliti, kam postaviti komponente za optimalno enostavnost povezovanja in dostopa. Če na kratko povem, se prepričajte, da vse ustreza vašemu mnenju, preden nepopravljivo poškodujete svoj projekt in ga morate odstraniti.

9. korak: Končna integracija

Končna integracija
Končna integracija
Končna integracija
Končna integracija
Končna integracija
Končna integracija

Zdaj je vsa strojna oprema tam, kjer mora biti, in vse se prilega tako tesno kot hrošč v preprogi. Rezimo stvari! V predalu za baterije sem identificiral mesto, kjer bi lahko AV kable napeljal z majhno vdolbino v plastiki. Zmlel sem ga s klopno brusilko. To je naredilo precej kratko. Uporabil sem dremel za mletje več plastike, da je bil zelo primeren za kable.

Zadnja komponenta je izbirnik kanalov. V predalu za baterije sem izvrtal majhno luknjo in enega za drugim napeljal kable glave. Gumbi so bili povezani in protoboard sem pritrdil na plastično ohišje z dvema polovicama predhodno lepljenega ježka. Razumem, da je bilo za to približno 1200 boljših načinov, vendar je to delovalo in imel sem pri roki vse, kar sem potreboval.

10. korak: Uživajte v svoji vintage IPTV

Uživajte v svoji vintage IPTV
Uživajte v svoji vintage IPTV
Uživajte v svoji vintage IPTV
Uživajte v svoji vintage IPTV
Uživajte v svoji vintage IPTV
Uživajte v svoji vintage IPTV

Tole povzame. Poiščite oddaje in uživajte ob ogledu. Vendar ne sedite preblizu. Pokvarili boste možgane!

Obstaja veliko prostora za izboljšanje tega projekta, zato ga usmerite v katero koli smer, vendar je bilo zabavno priti tako daleč. Kar se mene tiče, to zaženem iz cronjoba pri ponovnem zagonu, zato stdout ne zajema sporočil iz skripta python. To bi rad popravil, da vem, na katerem kanalu sem. Še en dober dodatek je brezžični ključ za tipkovnico na Pi. To vam bo omogočilo, da spremenite omrežje WiFi, če zapustite hišo s televizijo. Ne glede na to. To je bil zabaven projekt in komaj čakam, da začnem z naslednjim.

Priporočena: