Cuprins:

Retro Idiot Box: 10 pași
Retro Idiot Box: 10 pași

Video: Retro Idiot Box: 10 pași

Video: Retro Idiot Box: 10 pași
Video: The Best Of Me SUBTITRAT ÎN ROMÂNĂ 2024, Iulie
Anonim
Retro Idiot Box
Retro Idiot Box

Am găsit un televizor portabil Magnavox vechi din 1984, care stătea pe un raft la magazinul meu local de cumpărături. M-am gândit în sinea mea, "oh NEAT!" La o inspecție ulterioară, am observat o etichetă de preț de 15 USD, așa că am decis să o iau acasă și să fac ceva din el. Îmi amintesc că m-am uitat la reluări când eram un copil al tuturor marilor clasici în alb și negru glorios, și am vrut să fac din asta o realitate din nou.

Problema este că nu mai există stații analogice, iar acest lucru este complet incapabil să facă decodare ATSC sau decodare digitală. Am observat prezența unei conexiuni AV pe lateral și am avut câteva zmeuri de zmeură, așa că am decis să mă angajez într-o aventură pentru a afla cum aș putea transmite canale către acest lucru. Și eu vreau să-l fac să pară ascuțit. Nu îl voi rula pe cele 9 baterii cu celule D, așa că pot ascunde rpi-ul în compartimentul bateriei cu o serie de alte bunătăți.

Pasul 1: obțineți o listă IPTV bună

Obțineți o listă IPTV bună
Obțineți o listă IPTV bună

Daily IPTV List are o selecție fantastică de posturi iptv gratuite organizate în funcție de țară. Selectați țara aleasă și descărcați fișierul m3u.

Pentru software-ul care se află în acesta, m3u este un format necesar. Puteți citi mai multe despre specificul formatului aici.

Pasul 2: experiment preliminar de cod

Codul python pe care îl vom scrie analizează fișierul m3u într-o listă de stații.

#! / usr / bin / python3

import subproces din 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 ') ca m3u: i = 0 pentru linia din m3u: dacă 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 process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

Să descompunem asta.

#! / usr / bin / python3

Acest lucru spune bash că vom folosi python3 pentru a interpreta acest fișier.

import subprocess from sys import argv

Vom avea nevoie de modulul de subproces pentru a lansa instanța noastră vlc și vom avea nevoie de argv pentru a alege în ce canal vom lansa vlc.

clasa Stație: def _init _ (self): self.channel = 0 self.name = "self.address ="

Aceasta definește o clasă numită Stație. Fiecare canal va avea un număr de canal, numele canalului preluat din fișierul m3u și o adresă de unde se difuzează canalul respectiv.

channel_list =

Aceasta este o listă care va stoca toate canalele analizate din fișierul m3u.

cu open ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') ca m3u: i = 0 pentru linie în m3u: dacă 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

Această buclă deschide lista de redare m3u și ingerează datele. liniile de fișiere m3u care ne interesează începe cu #EXTINF, Aceasta indică o nouă intrare în fișierul listei de redare. Următoarea valoare a interesului este numele, care se află pe aceeași linie cu #EXTINF, dar cu o virgulă între ele. Următoarea linie a acestui m3u special este adresa fluxului. Există un iterator „i” utilizat pentru a număra ce canal este care. Această buclă parcurge întregul fișier m3u și umple lista de canale cu stații.

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

biblioteca de subprocese permite python să apeleze procese (programe) și returnează un PID (ID proces). Acest lucru permite Python să poată gestiona lansarea și închiderea programelor „corect” fără a completa fișierul istoric sau a permite executarea unui cod mai arbitrar cu apeluri generice „de sistem”. Fiecare element al matricei folosit ca argument pentru Popen este așa cum este tastat în linia de comandă.

vlc --loop --intf dummy --adrese cu ecran complet

Comanda de mai sus este ceea ce se dorește să fie executat, cu opțiunea --loop rezolvând unele probleme cu întreruperea fluxului în timp ce se încarcă bucăți următoare (probleme ciudate m3u8), --intf dummy pornește vlc fără interfață, doar un ecran, - fullscreen lansează videoclipul în modul ecran complet (NO WAY!), iar adresa este adresa fluxului. După cum puteți vedea în cod, furnizăm adresa din numărul canalului listei, care este furnizat în timpul rulării prin declarația argv. Salvați acest fișier ca tv_channels.py, modificați locația listei de redare din fișierul python pentru a indica spre lista dvs. de redare și puteți rula codul după cum urmează:

python tv_channels.py

Pasul 3: Adăugați GPIO

Adăugați GPIO
Adăugați GPIO
Adăugați GPIO
Adăugați GPIO

Schema arată cei doi pini GPIO folosiți pentru butoane și fiecare are un rezistor de tragere pentru a menține pinul GPIO tras în sus după apăsarea butonului. Codul definit anterior poate fi rafinat pentru a face operațiunea puțin mai simplă prin adăugarea capacității GPIO. Acest lucru ne permite să schimbăm canalul cu butoane, mai degrabă decât cu o declarație de tastatură și argv, la fel ca un televizor realsies.

Primul lucru de remarcat este că am televizorul definit ca o clasă. Pentru a fi un televizor, trebuie să fim pe un canal curent, să avem o listă de canale posibile și să avem posibilitatea de a schimba canalele. În acest exemplu, singura metodă de schimbare a canalelor va fi să vă deplasați în sus în lista de canale și să vă deplasați în jos în lista de canale. Odată ce canalul este decis, va trebui să pornim VLC pe canalul pe care vrem să îl vedem.

#! / usr / bin / python3

din timp import somn import subproces din sys import argv din gpiozero import Buton clasă Stație: def _init _ (self): self.channel = 0 self.name = "self.address =" self.process = "class Televiziune: def _init _ (auto, nume de fișier): self.current_channel = 0 self.channel_list = self.build_channel_list (nume fișier) self.start_channel () def build_channel_list (auto, nume fișier): cu deschis (nume fișier, 'r') ca m3u: i = 0 pentru linia din m3u: dacă 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): încearcă: auto.proces. kill () cu excepția: pass print ('canal de pornire% d'% self.current_channel) self.process = subprocess. Popen (['vlc', '-q', '--loop', '--intf', ' manechin ',' --fullscreen ', self.channel_list [self.current_channel].address]) this = Television ('./ us-m3uplaylist-2020-08-17-1.m3u ') channel_UP = Buton (18) channel_DN = Buton (23) în timp ce True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Această iterație de cod are destul de multe îmbunătățiri. acum a folosit un modul numit gpiozero care este cerut de raspberry pi pentru a accesa cu ușurință funcționalitatea pinilor GPIO

sudo apt-get install python3-gpiozero

sau

sudo pip instalează gpiozero

După cum se vede în codul meu, am ales GPIO 18 și GPIO 23 pentru canalele UP și respectiv canalul DOWN. Biblioteca gpiozero are o clasă frumoasă pentru funcțiile butoanelor pentru when_pressed, is_pressed, when_held etc. Acest lucru îl face destul de ușor. Am ales when_pressed, care se referă la o funcție de apel invers pentru a rula atunci când este detectat acest semnal.

Ultima modificare majoră este includerea opțiunii „-q” în apelul de subproces VLC. Aceasta pur și simplu rulează vlc fără toate ieșirile către terminal pentru a-l păstra liber de aglomerație, astfel încât să putem vedea declarațiile de tipărire informaționale din cod.

Pasul 4: Integrarea hardware-ului pentru a arăta clar

Integrați hardware-ul pentru a arăta clar
Integrați hardware-ul pentru a arăta clar
Integrați hardware-ul pentru a arăta clar
Integrați hardware-ul pentru a arăta clar
Integrați hardware-ul pentru a arăta clar
Integrați hardware-ul pentru a arăta clar

Nu mi-am dat seama cum vreau să realizez acest lucru și va fi o soluție unică pentru fiecare model de televizor utilizat. Trebuie să mă gândesc foarte bine la acest lucru și să cercetez televizorul pentru a găsi o sursă de energie bună pentru pi odată ce înghesuiesc computerul în compartimentul masiv al bateriei. De asemenea, am luat în calcul utilizarea butoanelor ceasului pentru selectarea canalului, deoarece acestea sunt deja frumos plasate pe televizor, iar ceasul nu funcționează oricum. Voi posta mai multe când voi găsi o soluție bună, dar aici proiectul meu va fi foarte diferit de cel al tuturor celorlalți. Bucurați-vă de integrarea IPTV de tip real TV!

Pasul 5: Puterea Pi

Pi Power
Pi Power

Pentru modelul de televizor pe care l-am găsit, necesită o sursă de alimentare de 12V. Am cercetat în jurul plăcii, dar nu am văzut regulatoare de putere evidente pentru 5V, așa că cel mai evident loc pentru a obține o sursă de alimentare constantă este pe placa de circuit unde intră conectorul cilindru pentru 12V. Există o problemă evidentă cu acest lucru. nu vrem să prăjim pi, așa că vom avea nevoie de un regulator de putere. Am ales MP2315 Step-Down Power Converter. Este ieftin și simplu de utilizat. Vom lipi intrarea de 12VDC de la conectorul butoi de pe PCB la pinii IN + și GND ai convertorului, iar VO + la pinul 2 de pe Raspberry Pi, precum și un GND.

ÎNAINTE de a face acest lucru, asigurați-vă că porniți convertorul și asigurați-vă că 5V corespunzător iese din ieșire. Am ales cea mai simplă opțiune cu tensiunea reglabilă cablată. Tunderea va regla tensiunea, așa că am urmărit ieșirea de tensiune cu un multimetru în timp ce am ajustat tunderea cu o șurubelniță.

Pasul 6: Integrarea puterii

Integrarea puterii
Integrarea puterii
Integrarea puterii
Integrarea puterii
Integrarea puterii
Integrarea puterii

După ce am săpat în jurul televizorului, s-a decis că cel mai bun loc pentru a scoate curentul este de la negativul conectorului butoiului și de la comutatorul ON / OFF al televizorului, ceea ce înseamnă că putem porni și opri fluxurile cu televizorul, mai degrabă că alimentarea constantă a pi trăgând direct din conectorul butoiului.

Sârmele au fost lipite și alimentate de-a lungul părții PCB-ului de lângă carcasă până când au ajuns în partea din spate a unității, unde au fost alimentate printr-o gaură care se afla în partea din spate a compartimentului bateriei. Odată ce au fost alimentate, putem pregăti capetele cablării și le putem lipi la regulatorul de putere. L-am reglat pentru 5V pentru a alimenta pinul și am lipit pinii de antet, astfel încât să putem rula jumperi de la regulator de putere direct la setul de antet GPIO al pi. În mod normal, acest lucru nu este recomandat, deoarece pi obține în general energie prin UBS, care are un regulator în linie pentru a condiționa 5V, dar din moment ce puterea este deja reglementată, ar trebui să fie bine.

Există ceva zgomot pe liniile audio din acest lucru, deoarece există o buclă de masă în sistem. Am încercat multe puncte de putere și sol pe toată placa sperând un răspuns ușor, dar nu am găsit niciunul. De asemenea, am lipit un cablu microUSB la regulatorul de mod comutat pentru a vedea dacă forțarea alimentării prin intermediul regulatoarelor interne ale pi ar rezolva problema. Nu a făcut-o. Soluția va fi în unele transformatoare audio de izolare la sol. Acestea au fost comandate mai degrabă decât construite, deoarece sunt ieftine și frumos ambalate. Puteți să le ridicați de la majoritatea magazinelor sau departamentelor audio auto. Asta am ales.

Pasul 7: Soluția butonului pe termen lung

Soluție buton pe termen lung
Soluție buton pe termen lung
Soluție buton pe termen lung
Soluție buton pe termen lung

Fără îndoială, butoanele nu vor rămâne pe un panou de calcul, deci trebuie să existe o soluție mai permanentă. Am apucat niște protoboard vechi și am aruncat circuitul împreună cu niște știfturi pentru a facilita accesul la semnale. Aici toată lumea va avea o diferență de opinie cu privire la modul de atașare sau montare a butoanelor. Aleg să le protejez și să le atașez la șasiu astfel încât mânerul care se leagă peste ecran să nu fie interferat. Simțiți-vă liber să pregătiți designul adăugând o carcasă imprimată 3D care netezește montarea, utilizați piulițe și șuruburi, adezivi fantezi, integrați butoane originale, orice. Atâta timp cât funcționează, nu există răspunsuri greșite.

Acestea vor fi montate în exteriorul carcasei, iar Raspberry Pi va fi băgat în interiorul compartimentului foarte spațios al bateriei, astfel încât va trebui să existe o mică gaură forată pentru a permite cablurilor să iasă din compartimentul bateriei.

Pasul 8: Verificarea ajustării finale

Verificarea ajustării finale
Verificarea ajustării finale

Toate echipamentele trebuie să fie potrivite verificate ultima oară pentru a vedea exact unde trebuie găsite toate găurile pe șasiu și ce dimensiuni trebuie făcute, etc. În plus, ar trebui să se ia în considerare locul în care se amplasează componentele pentru o ușurință optimă a conectivității și accesului. Povestea lungă scurtă, asigură-te că totul se potrivește acolo unde crezi că se întâmplă înainte de a-ți deteriora iremediabil proiectul și trebuie să scapi.

Pasul 9: Integrare finală

Integrare finală
Integrare finală
Integrare finală
Integrare finală
Integrare finală
Integrare finală

Acum tot hardware-ul este locul unde trebuie să fie și totul se potrivește la fel de bine ca un bug dintr-un covor. Să tăiem lucrurile! Am identificat un loc pe compartimentul bateriei unde puteam direcționa cablurile AV folosind o mică indentare în plastic. Am împământat-o cu un polizor de bancă. A lucrat destul de scurt. Am folosit un dremel pentru a măcina mai mult plastic pentru a face o potrivire destul de bună pentru cabluri.

Ultima componentă este selectorul de canal. Am forat o mică gaură în compartimentul bateriei și am direcționat cablurile antet din acesta unul câte unul. Butoanele au fost conectate și am atașat placa de protecție la șasiul de plastic cu două jumătăți de velcro pre-adeziv. Am aflat că existau aproximativ 1200 de modalități mai bune de a face acest lucru, dar acest lucru a funcționat și am avut la îndemână tot ce aveam nevoie.

Pasul 10: Bucurați-vă de IPTV-ul dvs. Vintage

Bucurați-vă de IPTV-ul dvs. Vintage
Bucurați-vă de IPTV-ul dvs. Vintage
Bucurați-vă de IPTV-ul dvs. Vintage
Bucurați-vă de IPTV-ul dvs. Vintage
Bucurați-vă de IPTV-ul dvs. Vintage
Bucurați-vă de IPTV-ul dvs. Vintage

Cam asta o rezumă. Găsiți spectacole și distrați-vă urmărind. Nu sta prea aproape, totuși. Îți vei putrezi creierul!

Există mult spațiu pentru a îmbunătăți acest proiect, așa că luați-l în orice direcție doriți, dar a fost distractiv să ajungeți până aici. În ceea ce mă privește, am executat acest lucru de la o cronjob la repornire, astfel încât stdout-ul să nu capteze mesajele din scriptul python. Aș dori să remediez acest lucru, astfel încât să știu pe ce canal sunt. O altă adăugare bună este o tastatură wireless dongle pe Pi. Acest lucru vă va permite să schimbați rețeaua wifi dacă părăsiți casa cu televizorul. Indiferent. a fost un proiect distractiv și abia aștept să încep pe următorul.

Recomandat: