Inhoudsopgave:

Retro Idiot Box - Ajarnpa
Retro Idiot Box - Ajarnpa

Video: Retro Idiot Box - Ajarnpa

Video: Retro Idiot Box - Ajarnpa
Video: The Secret | Ajahn Brahm | 30 Dec 2007 2024, Juli-
Anonim
Retro idiotendoos
Retro idiotendoos

Ik vond een oude draagbare Magnavox-televisie uit 1984 op een plank in mijn plaatselijke kringloopwinkel. Ik dacht bij mezelf, "oh NETTE!" Bij nadere inspectie merkte ik een prijskaartje van $ 15 op, dus besloot ik het mee naar huis te nemen en er iets pittigs van te maken. Ik herinner me dat ik als kind naar herhalingen keek van alle grote klassiekers in glorieus zwart-wit, en ik wilde dit weer waarmaken.

Het probleem is dat er geen analoge stations meer zijn, en dit is totaal niet in staat om ATSC-decodering of digitale decodering uit te voeren. Ik merkte wel de aanwezigheid van een AV-aansluiting aan de zijkant, en had een paar Raspberry pi's liggen, dus besloot ik op avontuur te gaan om erachter te komen hoe ik kanalen hierheen kon streamen. Ik wil het er ook scherp uit laten zien. Ik zal hem niet op de 9 D-cell batterijen laten werken, dus ik kan de rpi in het batterijcompartiment verbergen met tal van andere goodies.

Stap 1: Krijg een goede IPTV-lijst

Krijg een goede IPTV-lijst
Krijg een goede IPTV-lijst

Dagelijkse IPTV-lijst heeft een fantastische selectie gratis iptv-stations, gerangschikt per land. Selecteer het land van keuze en download het m3u-bestand.

Voor de software die hierin zit, is m3u een vereist formaat. U kunt hier meer lezen over de bijzonderheden van het formaat.

Stap 2: Voorlopig code-experiment

De python-code die we gaan schrijven, parseert het m3u-bestand in een lijst met stations.

#!/usr/bin/python3

importeer subproces van sys import argv class Station: def _init_(self): self.channel = 0 self.name = '' self.address = '' channel_list = with open('./us-m3upplaylist-2020-08- 17-1.m3u', 'r') als m3u: i = 0 voor lijn 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', '--volledig scherm', channel_list[int(argv[1])].address])

Laten we dit opsplitsen.

#!/usr/bin/python3

Dit vertelt bash dat we python3 zullen gebruiken om dit bestand te interpreteren.

subproces importeren uit sys import argv

We hebben de subprocesmodule nodig om onze vlc-instantie te starten, en we hebben argv nodig om te kiezen in welk kanaal we vlc willen starten.

klasse Station: def _init_(zelf): zelf.kanaal = 0 zelf.naam = '' zelf.adres = ''

Dit definieert een klasse met de naam Station. Elk kanaal heeft een kanaalnummer, de naam van het kanaal zoals overgenomen uit het m3u-bestand en een adres van waar dat kanaal vandaan komt.

kanaallijst =

Dit is een lijst waarin alle kanalen worden opgeslagen die uit het m3u-bestand zijn geparseerd.

met open('./us-m3upplaylist-2020-08-17-1.m3u', 'r') als m3u: i = 0 voor lijn 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

Deze lus opent de m3u-afspeellijst en neemt de gegevens op. de m3u-bestandsregels waarin we geïnteresseerd zijn, beginnen met #EXTINF, dit geeft een nieuw item aan in het afspeellijstbestand. De volgende interessante waarde is de naam, die op dezelfde regel staat als #EXTINF, maar met een komma ertussen. De volgende regel van deze specifieke m3u is het adres van de stream. Er is een iterator "i" in gebruik om te tellen welk kanaal dat is. Deze lus doorloopt het hele m3u-bestand en vult de channel_list met stations.

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

met de subprocesbibliotheek kan python processen (programma's) aanroepen en een PID (proces-ID) retourneren. Dit stelt python in staat om het starten en sluiten van programma's "correct" te beheren zonder het geschiedenisbestand te vullen, of om meer willekeurige code te laten uitvoeren met generieke "systeem"-aanroepen. Elk element van de array dat als argument voor Popen wordt gebruikt, is zoals getypt in de opdrachtregel.

vlc --loop --intf dummy --fullscreen adressen

Het bovenstaande commando is wat je wilt uitvoeren, met de --loop optie die enkele problemen oplost met het pauzeren van de stream terwijl de volgende chunks worden geladen (rare m3u8 problemen), --intf dummy start vlc zonder de interface, alleen een scherm, --fullscreen start de video op volledig scherm (NO WAY!), en het adres is het adres van de stream. Zoals je in de code kunt zien, geven we het adres van het kanaalnummer van de lijst, dat tijdens runtime wordt verstrekt via de argv-instructie. Sla dit bestand op als tv_channels.py, wijzig de locatie van de afspeellijst in het python-bestand om naar uw afspeellijst te verwijzen en u kunt de code als volgt uitvoeren:

python tv_channels.py

Stap 3: GPIO toevoegen

GPIO toevoegen
GPIO toevoegen
GPIO toevoegen
GPIO toevoegen

Het schema toont de twee GPIO-pinnen die voor de knoppen worden gebruikt, en elk heeft een pull-up-weerstand om de GPIO-pin hoog te houden nadat de knop is ingedrukt. De eerder gedefinieerde code kan worden verfijnd om de werking een beetje meer naadloos te maken door GPIO-mogelijkheden toe te voegen. Dit stelt ons in staat om het kanaal te veranderen met knoppen, in plaats van een toetsenbord en argv-statements, net als een voor realsies tv.

Het eerste wat opvalt is dat ik de televisie als een klasse heb gedefinieerd. Om een televisie te zijn, moeten we op een huidige zender zijn, een lijst met mogelijke zenders hebben en de mogelijkheid hebben om van zender te veranderen. In dit voorbeeld is de enige methode om van zender te veranderen, omhoog gaan in de zenderlijst en omlaag gaan in de zenderlijst. Zodra het kanaal is bepaald, moeten we VLC starten op het kanaal dat we willen zien.

#!/usr/bin/python3

from time import sleep subprocess importeren vanuit sys import argv from gpiozero import Button class Station: def _init_(self): self.channel = 0 self.name = '' self.address = '' self.process = '' class Televisie: def _init_(self, bestandsnaam): self.current_channel = 0 self.channel_list = self.build_channel_list(filename) self.start_channel() def build_channel_list(self, bestandsnaam): met open(bestandsnaam, 'r') als m3u: i = 0 voor lijn 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. 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): probeer: zelf.proces. kill() behalve: pass print('startkanaal %d' % self.current_channel) self.process = subprocess. Popen(['vlc', '-q', '--loop', '--intf', ' dummy', '--fullscreen', self.channel_list[self.current_channel].address]) this = Televisie('./us-m3upplaylist-2020-08-17-1.m3u') channel_UP = Knop (18) channel_DN = Knop (23) terwijl True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Deze iteratie van code heeft nogal wat verbeteringen. het maakte nu gebruik van een module genaamd gpiozero die vereist is door de raspberry pi om gemakkelijk toegang te krijgen tot de functionaliteit van de GPIO-pinnen

sudo apt-get install python3-gpiozero

of

sudo pip install gpiozero

Zoals te zien is in mijn code, heb ik respectievelijk GPIO 18 en GPIO 23 gekozen voor kanaal UP en kanaal DOWN. De gpiozero-bibliotheek heeft een mooie klasse voor knopfuncties voor when_pressed, is_pressed, when_held, etc. Dit maakt het vrij eenvoudig. Ik koos voor de when_pressed, die verwijst naar een callback-functie die moet worden uitgevoerd wanneer dit signaal wordt gedetecteerd.

De laatste grote verandering is de opname van de optie ' -q' in de VLC-subprocesaanroep. Dit voert eenvoudig vlc uit zonder alle uitvoer naar de terminal om het vrij van rommel te houden, zodat we de informatieve afdrukinstructies in de code kunnen zien.

Stap 4: Integreer de hardware om er scherp uit te zien

Integreer de hardware om er scherp uit te zien
Integreer de hardware om er scherp uit te zien
Integreer de hardware om er scherp uit te zien
Integreer de hardware om er scherp uit te zien
Integreer de hardware om er scherp uit te zien
Integreer de hardware om er scherp uit te zien

Ik heb nog niet bedacht hoe ik dit wil bereiken, en het zal een unieke oplossing zijn voor elk model tv dat in gebruik is. Ik moet hier goed over nadenken en rond de televisie speuren om een goede stroombron voor de pi te vinden zodra ik de computer in het enorme batterijcompartiment prop. Ik heb ook overwogen om de klokknoppen te gebruiken voor de kanaalselectie, omdat ze al mooi op de televisie zijn geplaatst en de klok toch niet werkt. Ik zal meer posten als ik een goede oplossing vind, maar dit is waar mijn project sterk zal afwijken van dat van alle anderen. Geniet van de real-tv-achtige IPTV-integratie!

Stap 5: Pi-kracht

Pi-vermogen
Pi-vermogen

Voor het model tv dat ik heb gevonden, is een 12V-voeding nodig. Ik heb rondgekeken op het bord, maar zag geen duidelijke stroomregelaars voor 5V, dus de meest voor de hand liggende plaats om een stabiele stroomvoorziening te krijgen is op de printplaat waar de cilinderconnector voor de 12V binnenkomt. Er is een duidelijk probleem hiermee. we willen de pi niet bakken, dus we hebben een vermogensregelaar nodig. Ik heb gekozen voor de MP2315 Step-Down Power Converter. Het is spotgoedkoop en eenvoudig te gebruiken. We zullen de 12VDC-ingang van de barrel-connector op de PCB solderen naar de IN+ en GND-pinnen van de converter, en de VO+ naar pin 2 op de Raspberry Pi, evenals een GND.

Voordat u dit doet, moet u ervoor zorgen dat u de converter inschakelt en ervoor zorgt dat de juiste 5V uit de uitgang komt. Ik koos voor de eenvoudigste optie met de bedrade instelbare spanning. De trimmer zal de spanning aanpassen, dus ik keek naar de uitgangsspanning met een multimeter terwijl ik de trimmer afstelde met een schroevendraaier.

Stap 6: Kracht integreren

Kracht integreren
Kracht integreren
Kracht integreren
Kracht integreren
Kracht integreren
Kracht integreren

Na wat rond de televisie te hebben gegraven, werd besloten dat de beste plaats om stroom te halen de min van de barrel-connector en de AAN/UIT-schakelaar van de televisie was, wat betekent dat we de streams met de televisie kunnen in- en uitschakelen, in plaats van dat constant de pi van stroom voorzien door rechtstreeks uit de barrel-connector te trekken.

De draden werden erin gesoldeerd en langs de zijkant van de PCB's naast de behuizing gevoerd totdat ze de achterkant van het apparaat bereikten, waar ze door een gat aan de achterkant van het batterijcompartiment werden gevoerd. Nadat ze zijn doorgevoerd, kunnen we de uiteinden van de bekabeling voorbereiden en vastsolderen aan de stroomregelaar. Ik heb het afgestemd op 5V om de pi van stroom te voorzien en de header-pinnen erop gesoldeerd, zodat we vrouwelijke naar vrouwelijke jumpers van de stroomregelaar rechtstreeks naar de GPIO-headerset van de pi kunnen leiden. Dit wordt normaal gesproken niet geadviseerd, omdat de pi over het algemeen stroom krijgt via de UBS, die een regelaar inline heeft om de 5V te conditioneren, maar aangezien de stroom al wordt geregeld, zou het in orde moeten zijn.

Er is wat ruis op de audiolijnen als je dit doet, omdat er een aardlus in het systeem zit. Ik probeerde veel kracht- en aardingspunten over het hele bord in de hoop op een gemakkelijk antwoord, maar vond er geen. Ik heb ook een microUSB-kabel aan de geschakelde modusregelaar gesoldeerd om te zien of het forceren van stroom door de interne regelaars van de pi het probleem zou oplossen. Het deed het niet. De oplossing zal zijn in sommige audio-aardingsisolatietransformatoren. Deze zijn besteld in plaats van gebouwd, omdat ze goedkoop en mooi verpakt zijn. Je kunt ze ophalen bij de meeste auto-audiowinkels of -afdelingen. Dit is wat ik heb gekozen.

Stap 7: Langetermijnknopoplossing

Oplossing voor lange termijn knop
Oplossing voor lange termijn knop
Oplossing voor lange termijn knop
Oplossing voor lange termijn knop

De knoppen blijven ongetwijfeld niet op een breadboard zitten, dus er moet een meer permanente oplossing komen. Ik pakte een oud protoboard en gooide het circuit samen met enkele header-pinnen om het gemakkelijk te maken om toegang te krijgen tot de signalen. Hier zal iedereen van mening verschillen over het bevestigen of monteren van de knoppen. Ik kies ervoor om ze te protoboarden en ze gewoon aan het chassis te bevestigen, zodat het handvat dat over het scherm zwaait om te dragen, niet in de weg zit. Voel je vrij om het ontwerp te verfraaien door een 3D-geprinte behuizing toe te voegen die de montage vereenvoudigt, gebruik moeren en bouten, mooie lijmen, integreer originele knoppen, wat dan ook. Zolang het werkt, zijn er geen foute antwoorden.

Deze worden aan de buitenkant van de behuizing gemonteerd en de Raspberry Pi wordt in het zeer ruime batterijcompartiment gestopt, dus er moet een klein gaatje worden geboord om kabels uit het batterijcompartiment te laten komen.

Stap 8: Laatste controle over pasvorm

Laatste Fit Check
Laatste Fit Check

Alle apparatuur moet nog een laatste keer worden gecontroleerd om precies te zien waar alle gaten in het chassis moeten worden gemaakt, en welke gaten, enz. moeten worden gemaakt. Bovendien moet worden overwogen waar de componenten moeten worden geplaatst voor een optimaal gemak van connectiviteit en toegang. Om een lang verhaal kort te maken, zorg ervoor dat alles past waar je denkt dat het past voordat je je project onherstelbaar beschadigt en de spackle eruit moet halen.

Stap 9: definitieve integratie

Laatste integratie
Laatste integratie
Laatste integratie
Laatste integratie
Laatste integratie
Laatste integratie

Nu is alle hardware waar het moet zijn, en het past allemaal net zo knus als een insect in een vloerkleed. Laten we dingen knippen! Ik identificeerde een plaats op het batterijcompartiment waar ik de AV-kabels naar buiten kon leiden met behulp van een kleine inkeping in het plastic. Ik heb het vermalen met een slijpmachine. Het maakte er vrij korte metten mee. Ik heb een dremel gebruikt om meer plastic weg te slijpen om het een redelijk goede pasvorm voor de kabels te maken.

Het laatste onderdeel is de zenderkiezer. Ik boorde een klein gaatje in het batterijcompartiment en leidde de header-kabels er een voor een uit. De knoppen waren verbonden en ik bevestigde het protoboard aan het plastic chassis met twee helften van voorgekleefd klittenband. Ik begrijp dat er ongeveer 1200 betere manieren waren om dit te doen, maar dit werkte en ik had alles wat ik nodig had bij de hand.

Stap 10: Geniet van je vintage IPTV

Geniet van je vintage IPTV
Geniet van je vintage IPTV
Geniet van je vintage IPTV
Geniet van je vintage IPTV
Geniet van je vintage IPTV
Geniet van je vintage IPTV

Dat vat het ongeveer samen. Zoek shows en veel plezier met kijken. Ga echter niet te dichtbij zitten. Je zult je hersenen rotten!

Er is veel ruimte om dit project te verbeteren, dus neem het in welke richting je wilt, maar het was leuk om zo ver te komen. Wat mij betreft, ik voer dit uit vanaf een cronjob bij het opnieuw opstarten, zodat de stdout de berichten van het python-script niet vastlegt. Ik wil dit graag oplossen, zodat ik weet op welke zender ik zit. Een andere goede toevoeging is een draadloze toetsenborddongle op de Pi. Hiermee kun je het wifi-netwerk wijzigen als je je huis verlaat met de tv. Achteloos. het was een leuk project en ik kan niet wachten om aan het volgende te beginnen.

Aanbevolen: