Talaan ng mga Nilalaman:

Retro Idiot Box: 10 Hakbang
Retro Idiot Box: 10 Hakbang

Video: Retro Idiot Box: 10 Hakbang

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

Natagpuan ko ang isang lumang Magnavox portable television mula 1984 na nakaupo sa isang istante sa aking lokal na tindahan ng pag-iimpok. Naisip ko sa sarili ko, "oh NEAT!" Sa karagdagang pagsisiyasat napansin ko ang isang $ 15 na presyo tag dito, kaya't napagpasyahan kong dalhin ito sa bahay at gumawa ng isang bagay na spiffy mula rito. Naaalala ko ang panonood ng mga runsay bilang isang bata ng lahat ng magagaling na klasiko na may maluwalhating itim at puti, at nais kong gawing muli ito.

Ang problema ay wala nang mga istasyon ng analog doon, at ito ay ganap na walang kakayahang gumawa ng anumang pag-decode ng ATSC, o anumang digital decoding. Napansin ko ang pagkakaroon ng isang koneksyon sa AV sa gilid, at mayroong ilang mga raspberry pi na nakahiga, kaya't nagpasya akong magsimula sa isang pakikipagsapalaran upang malaman kung paano ako makakapag-stream ng mga channel dito. Nais kong gawin itong matalas din. Hindi ko ito tatakbo sa 9 na mga baterya ng D-cell, upang maitago ko ang rpi sa kompartimento ng baterya kasama ang maraming iba pang mga kagamitan.

Hakbang 1: Kumuha ng isang Magandang Listahan ng IPTV

Kumuha ng isang Magandang Listahan ng IPTV
Kumuha ng isang Magandang Listahan ng IPTV

Ang Daily IPTV List ay may kamangha-manghang pagpipilian ng mga libreng istasyon ng iptv na inayos ayon sa bansa. Piliin ang bansa na pinili, at i-download ang m3u file.

Para sa software na nasa ito, ang m3u ay isang kinakailangang format. Maaari kang magbasa nang higit pa tungkol sa mga detalye ng format dito.

Hakbang 2: Paunang Eksperimento sa Code

Ang code ng sawa na isusulat namin ay parse ang m3u file sa isang listahan ng mga istasyon.

#! / usr / bin / python3

i-import ang subprocess mula sa sys import argv class Station: def _init _ (self): self.channel = 0 self.name = "self.address =" "channel_list = na may bukas ('./ us-m3uplaylist-2020-08- 17-1.m3u ',' r ') bilang m3u: i = 0 para sa linya sa m3u: kung linya.startswith (' # EXTINF '): this = Station () this.name = line.split (', ') [1] linya = susunod (m3u) this.address = line.strip () this.channel = i channel_list.append (ito) i = i + 1 proseso = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

Tanggalin natin ito.

#! / usr / bin / python3

Sinasabi nito sa bash na gagamit kami ng python3 upang bigyang kahulugan ang file na ito.

i-import ang subprocessfrom sys import argv

Kakailanganin namin ang module ng subprocess upang ilunsad ang aming halimbawa ng vlc, at kakailanganin namin ang argv upang piliin kung aling channel ang ilulunsad namin ang vlc.

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

Tinutukoy nito ang isang klase na tinatawag na Station. Ang bawat channel ay magkakaroon ng isang numero ng channel, ang pangalan ng channel na kinuha mula sa m3u file, at isang address kung saan mula sa streaming ang channel na iyon.

channel_list =

Ito ay isang listahan na iimbak ang lahat ng mga parsed na channel mula sa m3u file.

na may bukas ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') bilang m3u: i = 0 para sa linya sa m3u: kung linya.startswith ('# EXTINF'): ito = Station () this.name = line.split (',') [1] line = susunod (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1

Binubuksan ng loop na ito ang playlist ng m3u, at nilalamok ang data. ang mga linya ng file na m3u na interesado kami ay nagsisimula sa #EXTINF, Ipinapahiwatig nito ang isang bagong entry sa file ng playlist. Ang susunod na halaga ng interes ay ang pangalan, na nasa parehong linya tulad ng #EXTINF, ngunit may isang kuwit sa pagitan nila. Ang sumusunod na linya ng partikular na m3u na ito ay ang address ng stream. Mayroong isang iterator na "i" na ginagamit upang mabilang kung aling channel ang alin. Umikot ang loop na ito sa buong file na m3u at pinunan ang mga channel_list ng mga istasyon.

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

pinapayagan ng library ng subprocess ang python na tumawag sa mga proseso (programa) at ibabalik ang isang PID (Process ID). Pinapayagan nito ang python na pamahalaan ang paglulunsad at pagsasara ng mga programang "tama" nang hindi pinupunan ang file ng kasaysayan, o pinapayagan ang mas maraming di-makatwirang code na patakbuhin sa mga generic na "system" na tawag. Ang bawat elemento ng array na ginamit bilang isang argument sa Popen ay tulad ng na-type sa linya ng utos.

vlc --loop --intf dummy --fullscreen address

Ang utos sa itaas ay kung ano ang ninanais na patakbuhin, na may pagpipilian na --loop na inaayos ang ilang mga isyu sa pag-pause ng stream habang ang mga susunod na chunks ay naglo-load (kakaibang mga isyu ng m3u8), --intf dummy nagsisimula vlc nang walang interface, isang screen lamang, --fullscreen inilulunsad ang video sa fullscreen mode (WALANG PARAAN!), at ang address ay ang address ng stream. Tulad ng nakikita mo sa code, nagbibigay kami ng address mula sa numero ng channel ng listahan, na ibinibigay sa runtime sa pamamagitan ng pahayag ng argv. I-save ang file na ito bilang tv_channels.py, baguhin ang lokasyon ng playlist sa python file upang ituro ang iyong playlist, at maaari mong patakbuhin ang code tulad ng sumusunod:

sawa tv_channels.py

Hakbang 3: Magdagdag ng GPIO

Magdagdag ng GPIO
Magdagdag ng GPIO
Magdagdag ng GPIO
Magdagdag ng GPIO

Ipinapakita ng eskematiko ang dalawang mga pin ng GPIO na ginagamit para sa mga pindutan, at ang bawat isa ay may isang pull up risistor upang mapanatili ang pin na GPIO na hinila mataas pagkatapos ng pindutan ng pagpindot. Ang code na dati nang natukoy ay maaaring pino upang gawing mas seamless ang operasyon sa pamamagitan ng pagdaragdag ng kakayahang GPIO. Pinapayagan kaming baguhin ang channel gamit ang mga pindutan, sa halip na isang keyboard at argv na pahayag, tulad ng isang para sa realsies tv.

Ang unang bagay na tandaan ay mayroon akong tinukoy na telebisyon bilang isang klase. Upang maging isang telebisyon, kailangan nating nasa isang kasalukuyang channel, magkaroon ng isang listahan ng mga posibleng channel, at may kakayahang baguhin ang mga channel. Sa halimbawang ito, ang tanging paraan lamang ng pagbabago ng mga channel ay ang ilipat ang listahan ng channel, at ilipat ang listahan ng channel. Kapag napagpasyahan ang channel, magsisimula kaming VLC sa channel na nais nating makita.

#! / usr / bin / python3

mula sa oras na pag-import ng pagtulog i-subprocess mula sa sys import argv mula sa gpiozero import Button class Station: def _init _ (self): self.channel = 0 self.name = "" self.address = "self.process =" "class Television: def _init _ (self, filename): self.current_channel = 0 self.channel_list = self. build_channel_list (filename) self.start_channel () def build_channel_list (self, filename): with open (filename, 'r') as m3u: i = 0 para sa linya sa m3u: kung linya.startswith ('# EXTINF'): ito = Station () this.name = line.split (',') [1] linya = susunod (m3u) this.address = linya. strip () this.channel = i self.channel_list.append (this) i = i + 1 def channel_up (self): self.current_channel = self.current_channel + 1 kung self.current_channel> len (self.channel_list): sarili. current_channel = len (self.channel_list) self.start_channel () def channel_down (self): self.current_channel = self.current_channel - 1 kung self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): subukan: sarili.proseso. patayin () maliban sa: ipasa ang print ('panimulang channel% 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 = Button (23) habang Totoo: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Ang pag-ulit ng code na ito ay may ilang mga pagpapabuti. Gumamit ito ngayon ng isang module na tinatawag na gpiozero na kinakailangan ng raspberry pi upang madaling ma-access ang pagpapaandar ng mga GPIO pin

sudo apt-get install python3-gpiozero

o

sudo pip install gpiozero

Tulad ng nakikita sa aking code, pinili ko ang GPIO 18 at GPIO 23 para sa channel UP at channel Down na ayon sa pagkakabanggit. Ang gpiozero library ay may magandang klase para sa mga pag-andar ng mga pindutan para sa pag -_pressed, is_pressed, when_held, atbp Ginagawa nitong medyo madali. Pinili ko ang when_pressed, na tumutukoy sa isang function ng callback upang tumakbo kapag nakita ang signal na ito.

Ang huling pangunahing pagbabago ay ang pagsasama ng pagpipiliang '-q' sa VLC subprocess na tawag. Nagpapatakbo lamang ito ng vlc nang walang lahat ng output sa terminal upang mapanatili itong walang kalat upang makita namin ang mga pahayag ng impormasyon na nai-print sa code.

Hakbang 4: Isama ang Hardware upang Magmukhang Matalas

Isama ang Hardware upang Magmukhang Matalas
Isama ang Hardware upang Magmukhang Matalas
Isama ang Hardware upang Magmukhang Matalas
Isama ang Hardware upang Magmukhang Matalas
Isama ang Hardware upang Magmukhang Matalas
Isama ang Hardware upang Magmukhang Matalas

Hindi ko naisip kung paano ko nais na magawa ito, at ito ay magiging isang natatanging solusyon para sa bawat ginagamit na modelo ng tv. Kailangan kong magisip ng mabuti tungkol dito at mag-imbestiga sa telebisyon upang makahanap ng isang mahusay na mapagkukunan ng kuryente para sa pi sa sandaling nai-cram ko ang computer sa loob ng napakalaking kompartimento ng baterya. Isinasaalang-alang ko rin ang paggamit ng mga pindutan ng orasan para sa pagpili ng channel, dahil ang mga ito ay maganda nang inilagay sa telebisyon, at ang orasan ay hindi gagana pa rin. Magpo-post ako nang higit pa kapag nakakita ako ng isang mahusay na solusyon, ngunit dito mag-iiba ang Aking proyekto mula sa iba. Tangkilikin ang real-tv-tulad ng pagsasama ng IPTV!

Hakbang 5: Pi Power

Pi Power
Pi Power

Para sa modelong TV na nahanap ko, nangangailangan ito ng 12V power supply. Nag-usisa ako sa paligid ng board, ngunit wala akong nakitang halatang mga power regulator para sa 5V, kaya ang pinaka-halata na lugar upang makakuha ng isang matatag na supply ng kuryente ay nasa circuit board kung saan papasok ang konektor ng bariles para sa 12V. Mayroong isang halatang problema sa ito. hindi namin nais na magprito ng pi, kaya kakailanganin namin ng isang power regulator. Pinili ko ang MP2315 Step-Down Power Converter. Mura ang dumi, at simpleng gamitin. Hihinang namin ang input ng 12VDC mula sa konektor ng bariles sa PCB sa mga IN + at GND na pin ng converter, at ang VO + upang i-pin 2 sa Raspberry Pi, pati na rin isang GND.

BAGO nagawa ito, siguraduhing paandarin ang converter at tiyakin na ang tamang 5V ay lalabas sa output. Pinili ko ang pinakasimpleng pagpipilian gamit ang hardwired adjustable boltahe. Aayos ng trimmer ang boltahe, kaya't pinapanood ko ang output ng boltahe na may isang multimeter habang inaayos ko ang trimmer gamit ang isang distornilyador.

Hakbang 6: Pagsasama-sama ng Lakas

Pagsasama-sama ng Lakas
Pagsasama-sama ng Lakas
Pagsasama-sama ng Lakas
Pagsasama-sama ng Lakas
Pagsasama-sama ng Lakas
Pagsasama-sama ng Lakas

Matapos ang paghuhukay sa telebisyon, napagpasyahan na ang pinakamagandang lugar upang kumuha ng kuryente ay mula sa negatibo ng konektor ng bariles at switch na ON / OFF sa telebisyon, na nangangahulugang maaari nating i-on at i-off ang mga stream gamit ang telebisyon, sa halip na Patuloy na pinapagana ang pi sa pamamagitan ng paghila nang direkta mula sa konektor ng bariles.

Ang mga wire ay na-solder at pinakain sa gilid ng PCB sa tabi ng kaso hanggang sa maabot nila ang likuran ng unit, kung saan pinakain sila sa pamamagitan ng isang butas na nasa likurang bahagi ng baterya. Kapag napakain na sila, maaari na nating ihanda ang mga dulo ng paglalagay ng kable at solder ang mga ito pababa sa power regulator. Inayos ko ito para sa 5V upang mapagana ang pi at soldered na mga pin ng header dito upang maaari naming patakbuhin ang mga babae sa mga babaeng jumper mula sa power regulator nang direkta sa hanay ng header ng GPIO ng pi. Karaniwan itong hindi pinapayuhan, dahil ang pi sa pangkalahatan ay nakakakuha ng lakas sa pamamagitan ng UBS, na mayroong isang regulator na inline na kundisyon ang 5V, ngunit dahil ang kapangyarihan ay naayos na dapat itong maging maayos.

Mayroong ilang ingay sa mga linya ng audio mula sa paggawa nito, dahil mayroong isang ground loop sa system. Sinubukan ko ang maraming kapangyarihan at ground point sa buong board na umaasa para sa isang madaling sagot, ngunit wala akong nahanap. Naghinang din ako ng isang microUSB cable sa nakabukas na mode regulator upang makita kung ang sapilitang lakas sa pamamagitan ng panloob na mga regulator ng pi ay magbubukud-bukod ng isyu. Hindi naman. Ang solusyon ay magiging sa ilang mga audio ground isolation transformer. Ang mga ito ay iniutos sa halip na itayo, sapagkat ang mga ito ay mura at maayos na nakabalot. Maaari mong kunin ang mga ito mula sa karamihan sa mga awtomatikong tindahan ng audio o departamento. Ito ang napili ko.

Hakbang 7: Solusyon sa Long Term Button

Solusyon sa Long Term Button
Solusyon sa Long Term Button
Solusyon sa Long Term Button
Solusyon sa Long Term Button

Walang alinlangan, ang mga pindutan ay hindi mananatili sa isang breadboard, kaya kailangang mayroong isang mas permanenteng solusyon. Kumuha ako ng ilang lumang protoboard at itinapon ang circuit kasama ang ilang mga header pin upang madali itong ma-access ang mga signal. Dito magkakaroon ang bawat isa ng pagkakaiba-iba ng opinyon sa kung paano ilakip o i-mount ang mga pindutan. Pinipili kong protoboard ang mga ito at ilakip lamang ang mga ito sa chassis tulad ng hawakan na ang swings sa ibabaw ng screen upang dalhin ay hindi makagambala. Huwag mag-atubili na simulan ang disenyo sa pamamagitan ng pagdaragdag ng isang naka-print na kaso ng 3d na kininis ang pag-mount, gumamit ng mga mani at bolts, magarbong mga adhesive, isama ang orihinal na mga pindutan, anuman. Hangga't gumagana ito, walang anumang maling sagot.

Ang mga ito ay mai-mount sa labas ng kaso, at ang Raspberry Pi ay maitabi sa loob ng maluwang na kompartimento ng baterya, kaya kailangang magkaroon ng isang maliit na butas na drill upang pahintulutan ang mga kable na ilabas ang kompartimento ng baterya.

Hakbang 8: Final Fit Check

Final Fit Check
Final Fit Check

Ang lahat ng kagamitan ay kailangang magkasya na suriin sa huling pagkakataon upang makita nang eksakto kung saan ang lahat ng mga butas ay kailangang gawin sa tsasis, at kung anong laki ng mga butas, atbp ang kailangang gawin. Bilang karagdagan dapat itong isaalang-alang kung saan ilalagay ang mga bahagi para sa pinakamainam na kadalian ng pagkakakonekta at pag-access. Mahabang kwento, siguraduhin na umaangkop ang lahat kung saan sa palagay mo ay bago ito hindi mo maiwasang masira ang iyong proyekto at kailangang mailabas ang spackle.

Hakbang 9: Pangwakas na Pagsasama

Pangwakas na Pagsasama
Pangwakas na Pagsasama
Pangwakas na Pagsasama
Pangwakas na Pagsasama
Pangwakas na Pagsasama
Pangwakas na Pagsasama

Ngayon ang lahat ng mga hardware ay kung saan ito kinakailangan, at ang lahat ay umaangkop tulad ng isang snug bilang isang bug sa isang basahan. Gupitin natin ang mga bagay! Nakilala ko ang isang lugar sa kompartimento ng baterya kung saan maaari kong mailabas ang mga AV cable gamit ang isang maliit na pagkakabit sa plastik. Ibinagsak ko ito ng isang gilingan ng bench. Ginawa itong medyo maikling gawain nito. Gumamit ako ng isang dremel upang gilingin ang mas maraming plastik upang gawin itong isang mahusay na akma para sa mga kable.

Ang huling sangkap ay ang tagapili ng channel. Nag-drill ako ng isang maliit na butas sa kompartimento ng baterya at diniretso ang mga header cable dito nang paisa-isa. Ang mga pindutan ay nakakonekta, at ikinabit ko ang protoboard sa plastic chassis na may dalawang halves ng pre-adhesive'ed velcro. Napag-alaman kong mayroong humigit-kumulang na 1200 mas mahusay na mga paraan upang magawa ito, ngunit ito ay gumana, at nasa kamay ko ang lahat ng kailangan ko.

Hakbang 10: Masiyahan sa Iyong Vintage IPTV

Masiyahan sa iyong Vintage IPTV
Masiyahan sa iyong Vintage IPTV
Masiyahan sa iyong Vintage IPTV
Masiyahan sa iyong Vintage IPTV
Masiyahan sa iyong Vintage IPTV
Masiyahan sa iyong Vintage IPTV

Iyon ay tungkol sa pagbuo nito. Maghanap ng mga palabas at magsaya sa panonood. Huwag umupo ng masyadong malapit, bagaman. Mabulok mo utak mo!

Mayroong maraming silid upang mapagbuti ang proyektong ito, kaya dalhin ito sa kung anong direksyong nais mo, ngunit masaya itong malayo. Tulad ng sa akin, pinatakbo ko ito mula sa isang cronjob sa pag-reboot, kaya't hindi nakuha ng stdout ang mga mensahe mula sa script ng sawa. Nais kong ayusin ito upang malaman ko kung anong channel ako nasa. Ang isa pang mahusay na karagdagan ay isang wireless keyboard dongle sa Pi. Hahayaan ka nitong palitan ang wifi network kung umalis ka sa iyong bahay gamit ang tv. Hindi alintana. ito ay isang nakakatuwang proyekto, at hindi ako makapaghintay na magsimula sa susunod.

Inirerekumendang: