Spisu treści:
- Krok 1: Uzyskaj dobrą listę IPTV
- Krok 2: Wstępny eksperyment z kodem
- Krok 3: Dodaj GPIO
- Krok 4: Zintegruj sprzęt, aby wyglądać ostro
- Krok 5: Moc Pi
- Krok 6: Integracja mocy
- Krok 7: Długoterminowe rozwiązanie przycisku
- Krok 8: Końcowa kontrola dopasowania
- Krok 9: Końcowa integracja
- Krok 10: Ciesz się swoim Vintage IPTV
Wideo: Retro Idiot Box: 10 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:27
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
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
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
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
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
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
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
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
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
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:
Retro Arcade - (pełny rozmiar zasilany przez Raspberry Pi): 8 kroków
Retro Arcade - (Full Size Powered by Raspberry Pi): Najpierw chciałem podziękować za zapoznanie się z instrukcją budowania tego systemu Retro Arcade. Biorę starszą skrzynkę arcade i umieszczam ją w wolnostojącej szafce z 24-calowym monitorem panoramicznym. Pomiary w tym przewodniku są trudne do podania
Retro lampka nocna „Rayotron” (część 1): 16 kroków
Retro lampka nocna „Rayotron” (część 1): WprowadzenieW grudniu 1956 r. Atomic Laboratories reklamowało Rayotron jako „Pierwszy tani generator elektrostatyczny i akcelerator cząstek” dla nauczycieli przedmiotów ścisłych i hobbystów [1]. Rayotron był superwymiarowym, naładowanym gumowym paskiem
Samodzielny emulator Retro CP/M: 8 kroków
Retro CP/M Stand Alone Emulator: Ten projekt wykorzystuje moduł VGA32 ESP v1.4 do uruchomienia kombinacji RunCPM i FabGL, aby zapewnić samodzielny komputer z systemem równoważnym do CP/M 2.2. Popularny w latach 80. jako system operacyjny dla małych komputerów. Możesz wrócić w
2-osobowy Stand-Up Retro Arcade firmy Micro Center: 20 kroków
2-Player Stand-Up Retro Arcade firmy Micro Center: Twoje lokalne Micro Center zawiera teraz wszystko, czego potrzebujesz do stworzenia własnej szafki Retro Arcade opartej na Raspberry Pi. Zestawy są w pełni konfigurowalne, zawierają obudowę, Raspberry Pi, przyciski, joysticki, akcesoria audio i wideo i wiele innych. Ono
Barbie Box: zakamuflowana obudowa/Boom Box do odtwarzacza MP3: 4 kroki (ze zdjęciami)
Barbie Box: Zakamuflowany futerał/Boom Box do odtwarzacza mp3: jest to wyściełany futerał ochronny do odtwarzacza mp3, który również przekształca gniazdo słuchawkowe na ćwierć cala, może działać jako boom box po naciśnięciu przełącznika i maskuje twój odtwarzacz mp3 jako magnetofon z początku lat dziewięćdziesiątych lub podobny niski poziom kradzieży i