İçindekiler:
- Adım 1: İyi Bir IPTV Listesi Alın
- 2. Adım: Ön Kod Deneyi
- 3. Adım: GPIO'yu ekleyin
- 4. Adım: Keskin Görünmek için Donanımı Entegre Edin
- Adım 5: Pi Gücü
- Adım 6: Gücü Entegre Etme
- 7. Adım: Uzun Vadeli Düğme Çözümü
- Adım 8: Son Uyum Kontrolü
- 9. Adım: Son Entegrasyon
- Adım 10: Vintage IPTV'nizin Keyfini Çıkarın
Video: Retro Aptal Kutusu: 10 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
1984'ten kalma eski bir Magnavox taşınabilir televizyonu yerel ikinci el mağazamın rafında buldum. Kendi kendime düşündüm, "oh NEAT!" Daha fazla inceleme üzerine, üzerinde 15 dolarlık bir fiyat etiketi fark ettim, bu yüzden onu eve götürmeye ve ondan bir şeyler çıkarmaya karar verdim. Bir çocuk olarak muhteşem siyah beyaz tüm harika klasiklerin tekrarlarını izlediğimi hatırlıyorum ve bunu tekrar gerçeğe dönüştürmek istedim.
Sorun şu ki, artık orada analog istasyon yok ve bu herhangi bir ATSC kod çözme veya herhangi bir dijital kod çözme yapamıyor. Yan tarafta bir AV bağlantısının varlığını fark ettim ve etrafta birkaç ahududu pi'si vardı, bu yüzden kanalları buna nasıl aktarabileceğimi bulmak için bir maceraya atılmaya karar verdim. Ben de keskin görünmesini istiyorum. 9 D hücreli pille çalıştırmayacağım, böylece rpi'yi pil bölmesinde bir dizi başka güzellikle saklayabilirim.
Adım 1: İyi Bir IPTV Listesi Alın
Günlük IPTV Listesi, ülkeye göre düzenlenen harika bir ücretsiz iptv istasyonu seçkisine sahiptir. Seçtiğiniz ülkeyi seçin ve m3u dosyasını indirin.
Bunun içindeki yazılım için m3u gerekli bir formattır. Formatın özellikleri hakkında daha fazla bilgiyi buradan edinebilirsiniz.
2. Adım: Ön Kod Deneyi
Yazacağımız python kodu, m3u dosyasını bir istasyon listesine ayrıştırır.
#!/usr/bin/python3
sys'den alt işlemi içe aktar argv sınıfı İstasyon: def _init_(self): self.channel = 0 self.name = '' self.address = '' channel_list = with open('./us-m3uplaylist-2020-08- 17-1.m3u', 'r') m3u olarak: m3u'daki satır için i = 0: if line.startswith('#EXTINF'): this = Station() this.name = line.split(', ') [1] satır = sonraki(m3u) this.address = line.strip() this.channel = i channel_list.append(this) i = i + 1 süreç = alt süreç. Popen(['vlc', '--loop', '--intf', 'kukla', '--tam ekran', kanal_listesi[int(argv[1])].adres])
Bunu parçalayalım.
#!/usr/bin/python3
Bu, bash'a bu dosyayı yorumlamak için python3 kullanacağımızı söyler.
sys import argv'den alt işlemi içe aktar
Vlc örneğimizi başlatmak için alt işlem modülüne ihtiyacımız olacak ve vlc'yi hangi kanala başlatacağımızı seçmek için argv'ye ihtiyacımız olacak.
class İstasyon: def _init_(self): self.channel = 0 self.name = '' self.address = ''
Bu, Station adlı bir sınıfı tanımlar. Her kanalın bir kanal numarası, m3u dosyasından alındığı şekliyle kanalın adı ve o kanalın akışının yapıldığı adresin adresi olacaktır.
kanal_listesi =
Bu, m3u dosyasından ayrıştırılan tüm kanalları saklayacak bir listedir.
open('./us-m3uplaylist-2020-08-17-1.m3u', 'r') ile m3u olarak: m3u'daki satır için i = 0: if line.startswith('#EXTINF'): bu = İstasyon () this.name = line.split(', ')[1] satır = sonraki(m3u) this.address = satır.şerit() this.channel = i channel_list.append(bu) i = i + 1
Bu döngü m3u çalma listesini açar ve verileri alır. ilgilendiğimiz m3u dosya satırları #EXTINF ile başlar, Bu, çalma listesi dosyasına yeni bir giriş olduğunu gösterir. Bir sonraki ilgi değeri, #EXTINF ile aynı satırda ancak aralarında virgül bulunan addır. Bu belirli m3u'nun aşağıdaki satırı, akışın adresidir. Hangi kanalın hangisi olduğunu saymak için kullanılan bir "i" yineleyici var. Bu döngü tüm m3u dosyasını yineler ve channel_list'i istasyonlarla doldurur.
süreç = alt süreç. Popen(['vlc', '--loop', '--intf', 'kukla', '--tam ekran', kanal_listesi[int(argv[1])].adres])
alt süreç kitaplığı, python'un süreçleri (programları) çağırmasına izin verir ve bir PID (İşlem Kimliği) döndürür. Bu, python'un geçmiş dosyasını doldurmadan veya genel "sistem" çağrılarıyla daha fazla rastgele kodun çalıştırılmasına izin vermeden programların başlatılmasını ve kapatılmasını "doğru" şekilde yönetebilmesini sağlar. Popen'e argüman olarak kullanılan dizinin her bir öğesi, komut satırında yazıldığı gibidir.
vlc --loop --intf kukla --tam ekran adresleri
Yukarıdaki komut çalıştırılmak istenen şeydir, --loop seçeneği sonraki parçalar yüklenirken akışın duraklatılmasıyla ilgili bazı sorunları düzeltir (garip m3u8 sorunları), --intf dummy arabirim olmadan vlc'yi başlatır, yalnızca bir ekran, --fullscreen videoyu tam ekran modunda başlatır (NO WAY!) ve adres akışın adresidir. Kodda görebileceğiniz gibi, argv deyimi aracılığıyla çalışma zamanında sağlanan listenin kanal numarasından adresi sağlıyoruz. Bu dosyayı tv_channels.py olarak kaydedin, python dosyasındaki oynatma listesi konumunu oynatma listenize işaret edecek şekilde değiştirin ve kodu aşağıdaki gibi çalıştırabilirsiniz:
python tv_channels.py
3. Adım: GPIO'yu ekleyin
Şematik, düğmeler için kullanılan iki GPIO pimini gösterir ve her birinin, düğmeye basıldıktan sonra GPIO pimini yüksekte tutmak için bir çekme direnci vardır. Daha önce tanımlanan kod, GPIO özelliği eklenerek işlemi biraz daha sorunsuz hale getirmek için iyileştirilebilir. Bu, tıpkı bir for realsies tv gibi bir klavye ve argv ifadeleri yerine butonlarla kanalı değiştirmemizi sağlar.
Unutulmaması gereken ilk şey, televizyonu bir sınıf olarak tanımladığımdır. Televizyon olabilmek için güncel bir kanalda olmamız, olası kanalların bir listesinin olması ve kanal değiştirme yeteneğine sahip olmamız gerekir. Bu örnekte, kanalları değiştirmenin tek yöntemi kanal listesinde yukarı ve kanal listesinde aşağı gitmek olacaktır. Kanala karar verildikten sonra görmek istediğimiz kanalda VLC'ye başlamamız gerekecek.
#!/usr/bin/python3
zamandan içe uyku alt işlemini sys'den içe aktar gpiozero'dan argv'yi içe aktar Düğme sınıfı İstasyon: def _init_(kendi): self.channel = 0 self.name = '' self.address = '' self.process = '' class Televizyon: def _init_(self, filename): self.current_channel = 0 self.channel_list = self.build_channel_list(dosyaadı) self.start_channel() def build_channel_list(self, dosyaadı): m3u olarak open(filename, 'r') ile: i = 0 m3u'daki satır için: if line.startswith('#EXTINF'): this = Station() this.name = line.split(', ')[1] satır = sonraki(m3u) this.address = satır. 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): deneyin: self.process. kill() hariç: pass print('kanal %d'yi başlatma' % self.current_channel) self.process = subprocess. Popen(['vlc', '-q', '--loop', '--intf', ' kukla', '--tam ekran', self.channel_list[self.current_channel].address]) this = Television('./us-m3uplaylist-2020-08-17-1.m3u') channel_UP = Button(18) channel_DN = Button(23) iken True: channel_UP. When_pressed = this.channel_up channel_DN. When_pressed = this.channel_down
Bu kod yinelemesinde epeyce iyileştirmeler var. artık GPIO pinlerinin işlevlerine kolayca erişmek için ahududu pi tarafından gerekli olan gpiozero adlı bir modül kullanıyordu.
sudo apt-get install python3-gpiozero
veya
sudo pip kurulum gpiozero
Kodumda görüldüğü gibi, sırasıyla YUKARI ve AŞAĞI kanalı için GPIO 18 ve GPIO 23'ü seçtim. gpiozero kitaplığı, When_pressed, is_pressed, When_held, vb. için düğme işlevleri için güzel bir sınıfa sahiptir. Bu, bunu oldukça kolaylaştırır. Bu sinyal algılandığında çalışacak bir geri arama işlevine atıfta bulunan When_pressed'i seçtim.
Son büyük değişiklik, VLC alt süreç çağrısına ' -q ' seçeneğinin dahil edilmesidir. Bu, koddaki bilgi yazdırma ifadelerini görebilmemiz için karmaşıklığı önlemek için terminale tüm çıktılar olmadan vlc'yi çalıştırır.
4. Adım: Keskin Görünmek için Donanımı Entegre Edin
Bunu nasıl başarmak istediğimi çözemedim ve kullanılan her model tv için benzersiz bir çözüm olacak. Bilgisayarı büyük pil bölmesine yerleştirdiğimde, bunun hakkında çok düşünmem ve pi için iyi bir güç kaynağı bulmak için televizyonun etrafını araştırmam gerekiyor. Ayrıca, zaten televizyona güzelce yerleştirilmiş oldukları ve saat zaten çalışmadığı için kanal seçimi için saat düğmelerini kullanmayı düşündüm. İyi bir çözüm bulduğumda daha fazlasını göndereceğim, ancak burası benim projemin herkesinkinden büyük ölçüde ayrılacağı yer. Gerçek tv benzeri IPTV entegrasyonunun tadını çıkarın!
Adım 5: Pi Gücü
Bulduğum model TV için 12V güç kaynağı gerekiyor. Kartın etrafını araştırdım, ancak 5V için bariz bir güç regülatörü görmedim, bu yüzden sabit bir güç kaynağı elde etmek için en bariz yer 12V için kovan konektörünün geldiği devre kartıdır. Bununla ilgili bariz bir sorun var.. pi'yi kızartmak istemiyoruz, bu yüzden bir güç regülatörüne ihtiyacımız olacak. MP2315 Step-Down Güç Dönüştürücüsünü seçtim. Kir ucuzdur ve kullanımı kolaydır. PCB üzerindeki kovan konektöründen gelen 12VDC girişini dönüştürücünün IN+ ve GND pinlerine ve VO+'yı Raspberry Pi'deki pin 2'ye ve ayrıca bir GND'ye lehimleyeceğiz.
Bu yapılmadan ÖNCE, dönüştürücüye güç verdiğinizden ve çıkıştan uygun 5V'nin geldiğinden emin olun. Kablolu ayarlanabilir voltaj ile en basit seçeneği seçtim. Düzeltici voltajı ayarlayacaktır, bu yüzden bir tornavida ile düzelticiyi ayarlarken bir multimetre ile voltaj çıkışını izledim.
Adım 6: Gücü Entegre Etme
Televizyonun etrafını kazdıktan sonra, gücü almak için en iyi yerin namlu konektörünün negatifinden ve televizyon ON/OFF anahtarından olduğuna karar verildi, bu da yayınları televizyondan açıp kapatabileceğimiz anlamına geliyor. doğrudan namlu konektöründen çekerek pi'ye sürekli güç sağlar.
Kablolar, pil bölmesinin arkasındaki bir delikten beslendikleri ünitenin arkasına ulaşana kadar PCB'lerin yan tarafına lehimlendi ve beslendi. Beslendikten sonra kabloların uçlarını hazırlayabilir ve güç regülatörüne lehimleyebiliriz. Pi'ye güç sağlamak için 5V'a ayarladım ve lehimli başlık pinlerini güç regülatöründen doğrudan pi'nin GPIO başlık setine dişi-dişi jumperları çalıştırabilmemiz için ona bağladım. Bu normalde tavsiye edilmez, çünkü pi genellikle 5V'yi koşullandırmak için bir regülatöre sahip olan UBS üzerinden güç alır, ancak güç zaten düzenlendiğinden, iyi olması gerekir.
Bunu yaparken ses hatlarında biraz gürültü var, çünkü sistemde bir topraklama döngüsü var. Kolay bir cevap umuduyla panonun her yerinde birçok güç ve temel nokta denedim ama hiçbirini bulamadım. Ayrıca, pi'nin dahili düzenleyicilerinden gücü zorlamanın sorunu çözüp çözmeyeceğini görmek için anahtarlamalı mod düzenleyicisine bir microUSB kablosu lehimledim. Olmadı. Çözüm, bazı ses zemin izolasyon transformatörlerinde olacak. Bunlar ucuz ve güzel paketlenmiş oldukları için inşa edilmek yerine sipariş edildi. Bunları çoğu oto ses mağazasından veya bölümünden alabilirsiniz. Ben bunu seçtim.
7. Adım: Uzun Vadeli Düğme Çözümü
Şüphesiz butonlar devre tahtası üzerinde kalmayacak, dolayısıyla daha kalıcı bir çözüm bulunması gerekiyor. Bazı eski protokol kartlarını aldım ve sinyallere erişimi kolaylaştırmak için devreyi bazı başlık pinleriyle birlikte fırlattım. Bu, herkesin düğmelerin nasıl takılacağı veya monte edileceği konusunda fikir ayrılığına sahip olacağı yerdir. Onları protoboard yapmayı seçiyorum ve onları taşımak için ekranın üzerinde sallanan kol engel olmayacak şekilde kasaya takmayı seçiyorum. Montajı kolaylaştıran, somun ve cıvataları, süslü yapıştırıcıları kullanan, orijinal düğmeleri entegre eden, ne olursa olsun, 3 boyutlu baskılı bir kasa ekleyerek tasarımı kiliseye taşımaktan çekinmeyin. Çalıştığı sürece, yanlış cevap yoktur.
Bunlar kasanın dışına monte edilecek ve Raspberry Pi çok geniş pil bölmesinin içine sıkışacak, bu nedenle kabloların pil bölmesinden çıkmasına izin vermek için küçük bir delik açılması gerekecek.
Adım 8: Son Uyum Kontrolü
Şasideki tüm deliklerin tam olarak nerede yapılması gerektiğini ve hangi boyutta delikler, vb. yapılması gerektiğini görmek için tüm ekipmanın son bir kez kontrol edilmesi gerekir. Ek olarak, optimum bağlantı ve erişim kolaylığı için bileşenlerin nereye yerleştirileceği düşünülmelidir. Uzun lafın kısası, projenize onarılamaz bir şekilde zarar vermeden önce her şeyin düşündüğünüz yere uyduğundan emin olun.
9. Adım: Son Entegrasyon
Artık tüm donanım olması gereken yerde ve hepsi bir halıdaki böcek kadar rahat uyuyor. Hadi keselim! Pil bölmesinde, plastikte küçük bir girinti kullanarak AV kablolarını yönlendirebileceğim bir yer belirledim. Ben öğütücü ile öğütüyorum. Oldukça kısa bir çalışma yaptı. Kablolara oldukça iyi oturması için daha fazla plastiği öğütmek için bir dremel kullandım.
Son bileşen kanal seçicidir. Pil bölmesinde küçük bir delik açtım ve başlık kablolarını birer birer yönlendirdim. Düğmeler bağlandı ve ön kartı iki yarı önceden yapıştırılmış cırt cırtla plastik kasaya bağladım. Bunu yapmanın yaklaşık 1200 daha iyi yolu olduğunu anlıyorum ama bu işe yaradı ve ihtiyacım olan her şey elimdeydi.
Adım 10: Vintage IPTV'nizin Keyfini Çıkarın
Bu konuda özetliyor. Gösterileri bulun ve eğlenerek izleyin. Yine de çok yakın oturmayın. Beynini çürüteceksin!
Bu projeyi geliştirmek için çok fazla alan var, bu yüzden istediğiniz yöne gidin, ancak bu noktaya gelmek eğlenceliydi. Bana gelince, bunu yeniden başlatma sırasında bir cronjob'dan çalıştırıyorum, bu yüzden stdout python betiğinden gelen mesajları yakalamıyor. Hangi kanalda olduğumu bilmek için bunu düzeltmek istiyorum. Bir başka iyi ek, Pi'deki bir kablosuz klavye dongle'ı. Bu, evinizden televizyonla ayrılırsanız wifi ağını değiştirmenize izin verir. Ne olursa olsun. eğlenceli bir projeydi ve bir sonrakine başlamak için sabırsızlanıyorum.
Önerilen:
Aptal Fan Akıllı Yapıldı: 7 Adım
Dumb Fan Made Smart: Tipik bir ayaklı vantilatörü akıllı yapmak istedim, çünkü odanın diğer tarafındayken ve koltukta ya da yataktayken manuel olarak açıp kapatmaktan sıkıldım. Ayrıca uyurken zaman ayırabilmek istedim. Bazı hayranlar
Aptal Bir Çim Taşıyıcı Robotu Daha Akıllı Yapmak: 4 Adım
Aptal Çim Biçme Robotunu Daha Akıllı Yapmak: Yani güzel ama aptal bir çim biçme makinesi robotum var (Resim www.harald-nyborg.dk'den). gerçekten köşelere girmek için. Çizimlerimde gösterilmeyen çok sayıda
Mamutun Ayakları Üşüyor (Aptal Çözümler): 4 Adım
Mamutun Ayakları Üşüyor (aptal Çözümler): Bu projede mamutun ayakları tam anlamıyla üşüyor! Wiz'den bazı beyaz botlar ekledim çünkü muhtemelen ayaklarını kızarmış, temiz ve şık tutacaklar
Bomba Yumruğu (Aptal Ver.: 13 Adım
Bomb Fist (Stupid Ver.: Bu muhteşem tasarımdan değişiklik: https://www.instructables.com/id/Angry-Iron-Fist/… Kızgın olduğunuzda ve kendinizi bir süper kahraman olarak hayal etmek istediğinizde, şunları yapabilirsiniz: bu eldiveni giyin. Yumruğunuzu salladığınızda, eldivenin bir "Sha Sha" sesi çıkar. Ve
Çevir onu! - Dünyanın En Aptal Oyunu?: 7 Adım (Resimlerle)
Çevir onu! - the World's Dumbest Game?: Origins: Bu, 2018-2019 yıllarında birkaç yıl içinde geliştirdiğim bir oyundur. Başlangıçta "Aptal Çevirme" olarak adlandırılıyordu; ve kodlama öğretmek için de kullanılabilecek basit ve eğlenceli interaktif oyunlar yaratmaya olan ilgimden doğdu. Bu ab