Spisu treści:

Retro Idiot Box: 10 kroków
Retro Idiot Box: 10 kroków

Wideo: Retro Idiot Box: 10 kroków

Wideo: Retro Idiot Box: 10 kroków
Wideo: babcia z torebką torebką wypada z piątego piętra z okna #ziemnioki i kartofle 2024, Listopad
Anonim
Retro Idiota Pudełko
Retro Idiota Pudełko

Znalazłem stary przenośny telewizor Magnavox z 1984 roku na półce w moim lokalnym sklepie z używanymi rzeczami. Pomyślałem sobie: "och NEAT!" Po dalszej inspekcji zauważyłem na nim metkę z ceną 15 USD, więc postanowiłem zabrać go do domu i zrobić z niego coś fajnego. Pamiętam, jak jako dziecko oglądałem powtórki wszystkich wspaniałych klasyków we wspaniałej czerni i bieli i chciałem, aby to znów stało się rzeczywistością.

Problem polega na tym, że nie ma już stacji analogowych, a to jest całkowicie niezdolne do dekodowania ATSC ani żadnego dekodowania cyfrowego. Zauważyłem obecność połączenia AV z boku i miałem kilka malinowych pi, więc postanowiłem rozpocząć przygodę, aby dowiedzieć się, jak mogę przesyłać strumieniowo kanały do tego. Chcę, żeby to też wyglądało ostro. Nie będę go używał na 9 bateriach D-cell, więc mogę schować rpi w komorze baterii z mnóstwem innych gadżetów.

Krok 1: Uzyskaj dobrą listę IPTV

Uzyskaj dobrą listę IPTV
Uzyskaj dobrą listę IPTV

Codzienna lista IPTV zawiera fantastyczny wybór bezpłatnych stacji IPTV zorganizowanych według krajów. Wybierz kraj i pobierz plik m3u.

W przypadku oprogramowania, które się w nim znajduje, wymaganym formatem jest m3u. Więcej o szczegółach tego formatu przeczytasz tutaj.

Krok 2: Wstępny eksperyment z kodem

Kod Pythona, który zamierzamy napisać, analizuje plik m3u do listy stacji.

#!/usr/bin/python3

import podprocesu z 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 dla linii w 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”, „atrapa”, „--fullscreen”, lista_kanałów[int(argv[1])].adres])

Rozłóżmy to.

#!/usr/bin/python3

To mówi bashowi, że będziemy używać python3 do interpretacji tego pliku.

import podprocesu z sys import argv

Będziemy potrzebować modułu podprocesów, aby uruchomić naszą instancję vlc i będziemy potrzebować argv, aby wybrać kanał, na którym uruchomimy vlc.

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

Definiuje to klasę o nazwie Station. Każdy kanał będzie miał numer kanału, nazwę kanału pobraną z pliku m3u oraz adres, z którego ten kanał jest przesyłany strumieniowo.

lista_kanałów =

Jest to lista, która będzie przechowywać wszystkie kanały przeanalizowane z pliku m3u.

with open('./us-m3uplaylist-2020-08-17-1.m3u', 'r') as m3u: i = 0 dla linii w m3u: if line.startswith('#EXTINF'): this = Station () this.name = line.split(', ')[1] line = next(m3u) this.address = line.strip() this.channel = i lista_kanalow.append(this) i = i + 1

Ta pętla otwiera listę odtwarzania m3u i pobiera dane. interesujące nas wiersze pliku m3u zaczynają się od #EXTINF, Oznacza to nowy wpis w pliku listy odtwarzania. Kolejną interesującą wartością jest nazwa, która znajduje się w tym samym wierszu co #EXTINF, ale pomiędzy nimi jest przecinek. Kolejny wiersz tego konkretnego m3u to adres strumienia. Używany jest iterator „i” do zliczania, który kanał jest który. Ta pętla iteruje przez cały plik m3u i wypełnia listę kanałów stacjami.

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

biblioteka podprocesów pozwala pythonowi na wywoływanie procesów (programów) i zwraca PID (Process ID). Dzięki temu python może „prawidłowo” zarządzać uruchamianiem i zamykaniem programów bez zapełniania pliku historii lub zezwalania na uruchamianie bardziej dowolnego kodu za pomocą ogólnych wywołań „systemowych”. Każdy element tablicy używany jako argument Popen jest taki, jak wpisano w wierszu poleceń.

vlc --loop --intf dummy --adresy pełnoekranowe

Powyższe polecenie jest pożądane do uruchomienia, z opcją --loop naprawiającą niektóre problemy z wstrzymywaniem strumienia podczas ładowania kolejnych porcji (dziwne problemy z m3u8), --intf dummy uruchamia vlc bez interfejsu, tylko ekran, --fullscreen uruchamia wideo w trybie pełnoekranowym (NIE MA MOWY!), a adres jest adresem strumienia. Jak widać w kodzie, podajemy adres z numeru kanału listy, który jest podawany w czasie wykonywania za pomocą instrukcji argv. Zapisz ten plik jako tv_channels.py, zmień lokalizację listy odtwarzania w pliku Pythona, aby wskazywała na Twoją listę odtwarzania, a możesz uruchomić kod w następujący sposób:

python tv_channels.py

Krok 3: Dodaj GPIO

Dodaj GPIO
Dodaj GPIO
Dodaj GPIO
Dodaj GPIO

Schemat pokazuje dwa piny GPIO używane dla przycisków, a każdy z nich ma rezystor podciągający, który utrzymuje wysoki pin GPIO po naciśnięciu przycisku. Zdefiniowany wcześniej kod można udoskonalić, aby uczynić operację bardziej płynną, dodając funkcję GPIO. Pozwala nam to zmienić kanał za pomocą przycisków, a nie za pomocą klawiatury i instrukcji argv, tak jak w przypadku telewizji realsies.

Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że telewizor został zdefiniowany jako klasa. Aby być telewizorem, musimy być na bieżącym kanale, mieć listę możliwych kanałów i mieć możliwość zmiany kanałów. W tym przykładzie jedyną metodą zmiany kanałów będzie przejście w górę listy kanałów i przejście w dół listy kanałów. Po wybraniu kanału będziemy musieli uruchomić VLC na kanale, który chcemy zobaczyć.

#!/usr/bin/python3

from time import sleep import podproces z sys import argv z gpiozero import Button class Stacja: def _init_(self): self.channel = 0 self.name = '' self.address = '' self.process = '' class Telewizja: def _init_(self, nazwa_pliku): self.bieżący_kanał = 0 self.lista_kanałów = self.build_lista_kanałów(nazwa_pliku) self.start_kanał() def build_lista_kanałów(self, nazwa_pliku): with open(nazwa_pliku, 'r') as m3u: i = 0 dla linii w 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): spróbuj: self.process. kill() z wyjątkiem: pass print('początkowy kanał %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 = Przycisk(23) while True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Ta iteracja kodu ma sporo ulepszeń. teraz wykorzystuje moduł o nazwie gpiozero, który jest wymagany przez raspberry pi, aby łatwo uzyskać dostęp do funkcji pinów GPIO

sudo apt-get zainstaluj python3-gpiozero

lub

sudo pip zainstaluj gpiozero

Jak widać w moim kodzie, wybrałem GPIO 18 i GPIO 23 odpowiednio dla kanału UP i kanału DOWN. Biblioteka gpiozero ma fajną klasę dla funkcji przycisków dla when_pressed, is_pressed, when_held, itd. To sprawia, że jest to całkiem proste. Wybrałem when_pressed, który odnosi się do funkcji zwrotnej, która zostanie uruchomiona po wykryciu tego sygnału.

Ostatnią poważną zmianą jest włączenie opcji ' -q ' w wywołaniu podprocesu VLC. To po prostu uruchamia vlc bez wszystkich danych wyjściowych do terminala, aby utrzymać go bez bałaganu, abyśmy mogli zobaczyć informacyjne instrukcje print w kodzie.

Krok 4: Zintegruj sprzęt, aby wyglądać ostro

Zintegruj sprzęt, aby wyglądać ostro
Zintegruj sprzęt, aby wyglądać ostro
Zintegruj sprzęt, aby wyglądać ostro
Zintegruj sprzęt, aby wyglądać ostro
Zintegruj sprzęt, aby wyglądać ostro
Zintegruj sprzęt, aby wyglądać ostro

Nie wymyśliłem, jak chcę to osiągnąć, a będzie to unikalne rozwiązanie dla każdego używanego modelu telewizora. Muszę się nad tym mocno zastanowić i poszukać wokół telewizora, aby znaleźć dobre źródło zasilania dla pi, gdy wepchnę komputer do masywnej komory baterii. Rozważałem również użycie przycisków zegara do wyboru kanału, ponieważ są już pięknie umieszczone na telewizorze, a zegar i tak nie działa. Opublikuję więcej, gdy znajdę dobre rozwiązanie, ale tutaj Mój projekt będzie się znacznie różnił od wszystkich innych. Ciesz się integracją IPTV podobną do prawdziwej telewizji!

Krok 5: Moc Pi

Moc Pi
Moc Pi

Dla modelu telewizora, który znalazłem, wymaga zasilania 12V. Sondażowałem wokół płytki, ale nie widziałem żadnych oczywistych regulatorów mocy dla 5 V, więc najbardziej oczywistym miejscem, w którym można uzyskać stabilne zasilanie, jest płytka drukowana, gdzie wchodzi złącze beczki dla 12 V. Jest z tym oczywisty problem. nie chcemy smażyć pi, więc będziemy potrzebować regulatora mocy. Wybrałem konwerter Step-Down Power MP2315. Jest tani jak barszcz i prosty w użyciu. Przylutujemy wejście 12VDC ze złącza baryłkowego na płytce drukowanej do pinów IN+ i GND konwertera, a VO+ do pinu 2 na Raspberry Pi oraz GND.

ZANIM to zrobisz, upewnij się, że włączyłeś konwerter i upewnij się, że z wyjścia wychodzi właściwe napięcie 5V. Wybrałem najprostszą opcję z przewodową regulacją napięcia. Trymer dostosuje napięcie, więc obserwowałem napięcie wyjściowe za pomocą multimetru, jak regulowałem trymer śrubokrętem.

Krok 6: Integracja mocy

Integracja mocy
Integracja mocy
Integracja mocy
Integracja mocy
Integracja mocy
Integracja mocy

Po przekopaniu się wokół telewizora uznano, że najlepszym miejscem do wyciągnięcia prądu jest z minusa złącza beczki i włącznika telewizora, co oznacza, że możemy włączać i wyłączać strumienie z telewizorem, a nie ciągłe zasilanie pi poprzez pociągnięcie bezpośrednio z łącznika lufy.

Przewody zostały wlutowane i poprowadzone wzdłuż płytki drukowanej obok obudowy, aż dotarły do tyłu urządzenia, gdzie zostały wprowadzone przez otwór znajdujący się z tyłu komory baterii. Po ich przepuszczeniu możemy przygotować końce okablowania i przylutować je do regulatora mocy. Dostroiłem go na 5 V, aby zasilić pi i przylutowałem do niego piny nagłówka, abyśmy mogli poprowadzić zworki żeńskie do żeńskich z regulatora mocy bezpośrednio do zestawu nagłówkowego GPIO pi. Zwykle nie jest to zalecane, ponieważ pi na ogół pobiera moc przez UBS, który ma wbudowany regulator do kondycjonowania 5 V, ale ponieważ moc jest już regulowana, powinno być w porządku.

Z tego powodu jest trochę szumu na liniach audio, ponieważ w systemie jest pętla masy. Próbowałem wielu punktów zasilania i uziemienia na całej tablicy, mając nadzieję na łatwą odpowiedź, ale nie znalazłem żadnego. Przylutowałem również kabel microUSB do regulatora trybu przełączanego, aby sprawdzić, czy wymuszenie zasilania przez wewnętrzne regulatory pi rozwiąże problem. Tak się nie stało. Rozwiązaniem będą niektóre transformatory izolujące uziemienie audio. Te były raczej zamawiane niż budowane, bo są tanie i ładnie zapakowane. Możesz je odebrać w większości sklepów lub działów samochodowych. To właśnie wybrałem.

Krok 7: Długoterminowe rozwiązanie przycisku

Długoterminowe rozwiązanie przycisku
Długoterminowe rozwiązanie przycisku
Długoterminowe rozwiązanie przycisku
Długoterminowe rozwiązanie przycisku

Niewątpliwie przyciski nie pozostaną na płytce stykowej, więc potrzebne jest bardziej trwałe rozwiązanie. Chwyciłem starą płytkę prototypową i wyrzuciłem obwód razem z kilkoma pinami nagłówka, aby ułatwić dostęp do sygnałów. Tutaj każdy będzie miał różne zdanie co do sposobu mocowania lub montażu przycisków. Wybieram ich prototypowanie i po prostu mocuję je do obudowy w taki sposób, aby uchwyt, który przesuwa się nad ekranem do przenoszenia, nie przeszkadzał. Nie krępuj się dopracować projekt, dodając drukowaną w 3D obudowę, która ułatwia montaż, używaj nakrętek i śrub, fantazyjnych klejów, integruj oryginalne przyciski, cokolwiek. Dopóki to działa, nie ma złych odpowiedzi.

Zostaną one zamontowane na zewnątrz obudowy, a Raspberry Pi zostanie schowane w bardzo pojemnej komorze baterii, więc trzeba będzie wywiercić mały otwór, aby kable mogły wyjść z komory baterii.

Krok 8: Końcowa kontrola dopasowania

Końcowa kontrola dopasowania
Końcowa kontrola dopasowania

Cały sprzęt musi być dopasowany i sprawdzony po raz ostatni, aby zobaczyć dokładnie, gdzie należy wykonać wszystkie otwory w podwoziu i jakiego rozmiaru należy wykonać otwory. Dodatkowo należy rozważyć, gdzie umieścić komponenty, aby zapewnić optymalną łatwość podłączenia i dostępu. Krótko mówiąc, upewnij się, że wszystko pasuje tam, gdzie myślisz, że pasuje, zanim nieodwracalnie uszkodzisz swój projekt i będziesz musiał usunąć plamę.

Krok 9: Końcowa integracja

Integracja końcowa
Integracja końcowa
Integracja końcowa
Integracja końcowa
Integracja końcowa
Integracja końcowa

Teraz cały sprzęt jest tam, gdzie powinien, a wszystko jest tak wygodne, jak robak w dywanie. Wytnijmy rzeczy! Zidentyfikowałem miejsce w komorze baterii, w którym mógłbym wyprowadzić kable AV za pomocą małego wgłębienia w plastiku. Zmielę go szlifierką stołową. To było dość krótkie. Użyłem dremela do zmielenia większej ilości plastiku, aby dobrze pasował do kabli.

Ostatnim elementem jest selektor kanałów. Wywierciłem mały otwór w komorze baterii i wyprowadziłem z niej pojedynczo kable nagłówkowe. Przyciski zostały połączone, a płytkę prototypową przymocowałem do plastikowej obudowy za pomocą dwóch połówek naklejanych wcześniej rzepów. Rozumiem, że było około 1200 lepszych sposobów na zrobienie tego, ale to zadziałało i miałem pod ręką wszystko, czego potrzebowałem.

Krok 10: Ciesz się swoim Vintage IPTV

Ciesz się swoim Vintage IPTV
Ciesz się swoim Vintage IPTV
Ciesz się swoim Vintage IPTV
Ciesz się swoim Vintage IPTV
Ciesz się swoim Vintage IPTV
Ciesz się swoim Vintage IPTV

To wszystko podsumowuje. Znajdź programy i baw się dobrze oglądając. Nie siedź jednak zbyt blisko. Zgnijesz swój mózg!

Jest dużo miejsca na ulepszenie tego projektu, więc weź go w dowolnym kierunku, ale fajnie było dotrzeć tak daleko. Jeśli chodzi o mnie, uruchamiam to z cronjob przy ponownym uruchomieniu, więc standardowe wyjście nie przechwytuje wiadomości ze skryptu Pythona. Chciałbym to naprawić, żebym wiedział, na jakim kanale jestem. Kolejnym dobrym dodatkiem jest klucz sprzętowy klawiatury bezprzewodowej na Pi. Umożliwiłoby to zmianę sieci Wi-Fi, jeśli wyjdziesz z domu z telewizorem. Bez względu. to był fajny projekt i nie mogę się doczekać rozpoczęcia następnego.

Zalecana: