Sommario:

Scatola dell'idiota retrò: 10 passaggi
Scatola dell'idiota retrò: 10 passaggi

Video: Scatola dell'idiota retrò: 10 passaggi

Video: Scatola dell'idiota retrò: 10 passaggi
Video: 10 TRUCCHI DA ELETTRICISTA 2024, Luglio
Anonim
Scatola dell'idiota retrò
Scatola dell'idiota retrò

Ho trovato un vecchio televisore portatile Magnavox del 1984 seduto su uno scaffale nel mio negozio dell'usato locale. Ho pensato tra me e me, "oh NEAT!" Dopo un'ulteriore ispezione ho notato un cartellino del prezzo di $ 15, quindi ho deciso di portarlo a casa e farne qualcosa di elegante. Ricordo di aver guardato le repliche da bambino di tutti i grandi classici in glorioso bianco e nero, e volevo renderlo di nuovo realtà.

Il problema è che non ci sono più stazioni analogiche là fuori, e questo è del tutto incapace di eseguire qualsiasi decodifica ATSC o qualsiasi decodifica digitale. Ho notato la presenza di una connessione AV sul lato e avevo alcuni Raspberry Pi in giro, quindi ho deciso di imbarcarmi in un'avventura per capire come poter trasmettere i canali a questo. Voglio farlo sembrare nitido anch'io. Non lo eseguirò con le batterie a 9 celle D, quindi posso nascondere l'rpi nel vano batterie con una miriade di altre chicche.

Passaggio 1: ottenere un buon elenco IPTV

Ottieni una buona lista IPTV
Ottieni una buona lista IPTV

L'elenco IPTV giornaliero ha una fantastica selezione di stazioni iptv gratuite organizzate per paese. Seleziona il paese di tua scelta e scarica il file m3u.

Per il software che è in questo, m3u è un formato richiesto. Puoi leggere di più sulle specifiche del formato qui.

Passaggio 2: esperimento preliminare sul codice

Il codice Python che andremo a scrivere analizza il file m3u in un elenco di stazioni.

#!/usr/bin/python3

import subprocess from 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') as m3u: i = 0 for line in 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 process = subprocess. Popen(['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list[int(argv[1])].address])

Rompiamo questo.

#!/usr/bin/python3

Questo dice a bash che useremo python3 per interpretare questo file.

import subprocessfrom sys import argv

Avremo bisogno del modulo subprocess per avviare la nostra istanza vlc e avremo bisogno di argv per scegliere in quale canale lanceremo vlc.

class Station: def _init_(self): self.channel = 0 self.name = '' self.address = ''

Questo definisce una classe chiamata Station. Ogni canale avrà un numero di canale, il nome del canale preso dal file m3u e un indirizzo da cui quel canale sta trasmettendo.

lista_canali =

Questo è un elenco che memorizzerà tutti i canali analizzati dal file m3u.

with open('./us-m3uplaylist-2020-08-17-1.m3u', 'r') as m3u: i = 0 for line in 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

Questo ciclo apre la playlist m3u e acquisisce i dati. le righe del file m3u che ci interessano iniziano con #EXTINF, questo indica una nuova voce nel file della playlist. Il prossimo valore di interesse è il nome, che si trova sulla stessa riga di #EXTINF, ma con una virgola tra di loro. La riga seguente di questo particolare m3u è l'indirizzo del flusso. C'è un iteratore "i" in uso per contare quale canale è quale. Questo ciclo scorre l'intero file m3u e riempie la channel_list con le stazioni.

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

la libreria dei sottoprocessi consente a Python di chiamare processi (programmi) e restituisce un PID (ID processo). Ciò consente a Python di essere in grado di gestire l'avvio e la chiusura di programmi "correttamente" senza riempire il file di cronologia, o consentire l'esecuzione di codice più arbitrario con chiamate di "sistema" generiche. Ogni elemento dell'array utilizzato come argomento per Popen è come digitato nella riga di comando.

vlc --loop --intf dummy --indirizzi a schermo intero

Il comando sopra è ciò che si desidera eseguire, con l'opzione --loop che risolve alcuni problemi con la pausa del flusso durante il caricamento dei blocchi successivi (strani problemi con m3u8), --intf dummy avvia vlc senza l'interfaccia, solo uno schermo, --fullscreen lancia il video in modalità a schermo intero (NO WAY!), e l'indirizzo è l'indirizzo del flusso. Come puoi vedere nel codice, stiamo fornendo l'indirizzo dal numero di canale dell'elenco, che viene fornito in fase di esecuzione tramite l'istruzione argv. Salva questo file come tv_channels.py, cambia la posizione della playlist nel file python in modo che punti alla tua playlist e puoi eseguire il codice come segue:

python tv_channels.py

Passaggio 3: aggiungi GPIO

Aggiungi GPIO
Aggiungi GPIO
Aggiungi GPIO
Aggiungi GPIO

Lo schema mostra i due pin GPIO in uso per i pulsanti e ognuno ha un resistore di pull-up per mantenere il pin GPIO tirato in alto dopo la pressione del pulsante. Il codice precedentemente definito può essere perfezionato per rendere l'operazione un po' più fluida aggiungendo la funzionalità GPIO. Questo ci permette di cambiare il canale con i pulsanti, piuttosto che con una tastiera e istruzioni argv, proprio come una TV for realsies.

La prima cosa da notare è che ho definito la televisione come una classe. Per essere una televisione, dobbiamo essere su un canale corrente, avere un elenco di possibili canali e avere la possibilità di cambiare canale. In questo esempio, l'unico metodo per cambiare i canali sarà quello di spostare l'elenco dei canali in alto e in basso. Una volta deciso il canale, dovremo avviare VLC sul canale che vogliamo vedere.

#!/usr/bin/python3

from time import sleep import subprocess from sys import argv from 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 per la riga in 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. corrente_canale = len(self.channel_list) self.start_channel() def canale_down(self): self.current_channel = self.current_channel - 1 if self.current_channel < 0: self.start_channel = 0 self.start_channel() def start_channel(self): prova: self.process. kill() tranne: pass print('canale iniziale %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) while True: channel_UP.quando_premuto = this.channel_up DN_canale.quando_premuto = this.channel_down

Questa iterazione del codice presenta alcuni miglioramenti. ora utilizzava un modulo chiamato gpiozero richiesto dal raspberry pi per accedere facilmente alla funzionalità dei pin GPIO

sudo apt-get install python3-gpiozero

o

sudo pip install gpiozero

Come visto nel mio codice, ho scelto GPIO 18 e GPIO 23 rispettivamente per il canale SU e il canale GI. La libreria gpiozero ha una bella classe per le funzioni dei pulsanti per quando_premuto, is_premuto, quando_tenuto, ecc. Questo lo rende abbastanza semplice. Ho scelto quando_premuto, che si riferisce a una funzione di callback da eseguire quando viene rilevato questo segnale.

L'ultimo cambiamento importante è l'inclusione dell'opzione ' -q ' nella chiamata del sottoprocesso VLC. Questo esegue semplicemente vlc senza tutto l'output sul terminale per mantenerlo libero da confusione in modo che possiamo vedere le istruzioni di stampa informative nel codice.

Passaggio 4: integra l'hardware per apparire nitido

Integra l'hardware per apparire nitido
Integra l'hardware per apparire nitido
Integra l'hardware per apparire nitido
Integra l'hardware per apparire nitido
Integra l'hardware per apparire nitido
Integra l'hardware per apparire nitido

Non ho capito come voglio realizzare questo, e sarà una soluzione unica per ogni modello di tv in uso. Devo pensarci bene e sondare il televisore per trovare una buona fonte di alimentazione per il pi una volta che ho stipato il computer all'interno dell'enorme vano batteria. Ho anche preso in considerazione l'utilizzo dei pulsanti dell'orologio per la selezione dei canali, poiché sono già ben posizionati sul televisore e l'orologio non funziona comunque. Pubblicherò di più quando troverò una buona soluzione, ma è qui che il mio progetto divergerà notevolmente da quello di tutti gli altri. Goditi l'integrazione IPTV simile alla vera TV!

Passaggio 5: potenza Pi

Potenza Pi
Potenza Pi

Per il modello di TV che ho trovato, richiede un'alimentazione a 12V. Ho sondato la scheda, ma non ho visto nessun evidente regolatore di potenza per 5V, quindi il posto più ovvio per ottenere un'alimentazione stabile è sulla scheda del circuito dove entra il connettore cilindrico per il 12V. C'è un problema ovvio con questo. non vogliamo friggere il pi, quindi avremo bisogno di un regolatore di potenza. Ho scelto il convertitore di potenza step-down MP2315. È molto economico e semplice da usare. Salderemo l'ingresso 12VDC dal connettore cilindrico sul PCB ai pin IN+ e GND del convertitore e il VO+ al pin 2 del Raspberry Pi, oltre a un GND.

PRIMA di eseguire questa operazione, assicurarsi di accendere il convertitore e assicurarsi che dall'uscita escano i 5 V corretti. Ho scelto l'opzione più semplice con la tensione regolabile cablata. Il trimmer regolerà la tensione, quindi ho osservato l'uscita di tensione con un multimetro mentre regolavo il trimmer con un cacciavite.

Passaggio 6: integrazione della potenza

Integrazione del potere
Integrazione del potere
Integrazione del potere
Integrazione del potere
Integrazione del potere
Integrazione del potere

Dopo aver scavato intorno alla televisione, è stato deciso che il posto migliore per prendere l'alimentazione era dal negativo del connettore cilindrico e dall'interruttore ON/OFF della televisione, il che significa che possiamo accendere e spegnere i flussi con la televisione, piuttosto che alimentando costantemente il pi tirando direttamente dal connettore a canna.

I fili sono stati saldati e fatti passare lungo il lato del PCB vicino al case fino a raggiungere il retro dell'unità, dove sono stati fatti passare attraverso un foro che si trovava nella parte posteriore del vano batteria. Una volta che sono stati inseriti, possiamo preparare le estremità del cablaggio e saldarle al regolatore di potenza. L'ho sintonizzato su 5 V per alimentare il pi e i pin dell'intestazione saldati in modo da poter eseguire i ponticelli da femmina a femmina dal regolatore di potenza direttamente al set di intestazioni GPIO del pi. Questo normalmente non è consigliato, poiché il pi generalmente riceve energia attraverso l'UBS, che ha un regolatore in linea per condizionare i 5V, ma poiché l'alimentazione è già in fase di regolazione dovrebbe andare bene.

C'è un po' di rumore sulle linee audio a causa di ciò, perché c'è un loop di massa nel sistema. Ho provato molti punti di potenza e massa su tutto il tabellone sperando in una risposta facile, ma non ne ho trovati. Ho anche saldato un cavo microUSB al regolatore in modalità commutata per vedere se forzare l'alimentazione attraverso i regolatori interni del pi avrebbe risolto il problema. Non è stato così. La soluzione sarà in alcuni trasformatori di isolamento della messa a terra audio. Questi sono stati ordinati piuttosto che costruiti, perché sono economici e ben confezionati. Puoi ritirarli dalla maggior parte dei negozi o reparti di audio per auto. Questo è quello che ho scelto.

Passaggio 7: soluzione del pulsante a lungo termine

Soluzione pulsante a lungo termine
Soluzione pulsante a lungo termine
Soluzione pulsante a lungo termine
Soluzione pulsante a lungo termine

Senza dubbio, i pulsanti non rimarranno su una breadboard, quindi deve esserci una soluzione più permanente. Ho preso una vecchia scheda prototipi e ho unito il circuito con alcuni pin di intestazione per facilitare l'accesso ai segnali. È qui che tutti avranno una divergenza di opinioni su come attaccare o montare i pulsanti. Scelgo di metterli su protoboard e semplicemente collegarli al telaio in modo tale che la maniglia che oscilla sullo schermo per trasportarli non interferisca. Sentiti libero di esaltare il design aggiungendo una custodia stampata in 3D che facilita il montaggio, usa dadi e bulloni, adesivi fantasiosi, integra pulsanti originali, qualunque cosa. Finché funziona, non ci sono risposte sbagliate.

Questi saranno montati all'esterno del case e il Raspberry Pi sarà nascosto all'interno del vano batteria molto spazioso, quindi sarà necessario praticare un piccolo foro per consentire ai cavi di fuoriuscire dal vano batteria.

Passaggio 8: controllo finale dell'adattamento

Controllo finale della vestibilità
Controllo finale della vestibilità

Tutta l'attrezzatura deve essere controllata un'ultima volta per vedere esattamente dove devono essere praticati tutti i fori sul telaio e quali sono le dimensioni dei fori, ecc. Inoltre, dovrebbe essere considerato dove posizionare i componenti per una facilità ottimale di connettività e accesso. Per farla breve, assicurati che tutto si adatti dove pensi prima di danneggiare irreparabilmente il tuo progetto e dover eliminare lo spackle.

Passaggio 9: integrazione finale

Integrazione finale
Integrazione finale
Integrazione finale
Integrazione finale
Integrazione finale
Integrazione finale

Ora tutto l'hardware è dove deve essere e tutto si adatta perfettamente come un insetto in un tappeto. Tagliamo le cose! Ho identificato un punto sul vano batteria dove potevo far passare i cavi AV usando una piccola rientranza nella plastica. L'ho macinato con una smerigliatrice da banco. Ha fatto un lavoro piuttosto breve. Ho usato un dremel per macinare più plastica per adattarla abbastanza bene ai cavi.

L'ultimo componente è il selettore di canale. Ho praticato un piccolo foro nel vano batteria e ne ho instradato i cavi uno alla volta. I pulsanti sono stati collegati e ho attaccato la scheda prototipi allo chassis di plastica con due metà di velcro pre-adesivo. Ho capito che c'erano circa 1200 modi migliori per farlo, ma ha funzionato e avevo tutto ciò di cui avevo bisogno a portata di mano.

Passaggio 10: goditi la tua IPTV vintage

Goditi la tua IPTV vintage
Goditi la tua IPTV vintage
Goditi la tua IPTV vintage
Goditi la tua IPTV vintage
Goditi la tua IPTV vintage
Goditi la tua IPTV vintage

Questo riassume tutto. Trova spettacoli e divertiti a guardare. Non sederti troppo vicino, però. Ti marciresti il cervello!

C'è molto spazio per migliorare questo progetto, quindi portalo nella direzione che vuoi, ma è stato divertente arrivare fino a qui. Per quanto mi riguarda, lo eseguo da un cronjob al riavvio, quindi lo stdout non acquisisce i messaggi dallo script python. Vorrei risolvere questo problema in modo da sapere su quale canale sono. Un'altra buona aggiunta è un dongle per tastiera wireless sul Pi. Questo ti permetterebbe di cambiare la rete wifi se esci di casa con la tv. Indipendentemente. è stato un progetto divertente e non vedo l'ora di iniziare il prossimo.

Consigliato: