جدول المحتويات:

صندوق الأبله الرجعية: 10 خطوات
صندوق الأبله الرجعية: 10 خطوات

فيديو: صندوق الأبله الرجعية: 10 خطوات

فيديو: صندوق الأبله الرجعية: 10 خطوات
فيديو: العريس اول مشافها شالها واخده ومشي وهو شايله علي ايده 2024, شهر نوفمبر
Anonim
ريترو الأبله بوكس
ريترو الأبله بوكس

لقد وجدت تلفزيون Magnavox محمولًا قديمًا من عام 1984 جالسًا على رف في متجر التوفير المحلي الخاص بي. قلت لنفسي ، "أوه NEAT!" عند إجراء مزيد من الفحص ، لاحظت سعرًا قدره 15 دولارًا عليه ، لذلك قررت أن آخذه إلى المنزل وأصنع منه شيئًا أنيقًا. أتذكر مشاهدة عروض إعادة التدوير كطفل من جميع الكلاسيكيات العظيمة باللونين الأبيض والأسود المجيد ، وأردت أن أجعل هذا حقيقة مرة أخرى.

تكمن المشكلة في عدم وجود محطات تمثيلية هناك بعد الآن ، وهذا غير قادر تمامًا على القيام بأي فك تشفير ATSC أو أي فك تشفير رقمي. لقد لاحظت وجود اتصال AV على الجانب ، وكان لدي عدد قليل من raspberry Pi ، لذلك قررت الشروع في مغامرة لمعرفة كيف يمكنني بث القنوات إلى هذا. أريد أن أجعلها تبدو حادة أيضًا. لن أقوم بتشغيله على بطاريات 9 D-cell ، لذا يمكنني إخفاء rpi في حجرة البطارية مع مجموعة من الأشياء الجيدة الأخرى.

الخطوة 1: احصل على قائمة IPTV جيدة

احصل على قائمة IPTV جيدة
احصل على قائمة IPTV جيدة

تحتوي قائمة IPTV اليومية على مجموعة رائعة من محطات البث التلفزيوني عبر الإنترنت المجانية التي تنظمها الدولة. حدد الدولة التي تختارها ، وقم بتنزيل ملف m3u.

بالنسبة للبرنامج الموجود في هذا ، يعد m3u تنسيقًا ضروريًا. يمكنك قراءة المزيد حول تفاصيل التنسيق هنا.

الخطوة 2: تجربة التعليمات البرمجية الأولية

كود بيثون الذي سنكتبه يوزع ملف m3u في قائمة المحطات.

#! / usr / bin / python3

استيراد عملية فرعية من فئة استيراد النظام sys: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = مع open ('./ us-m3uplaylist-2020-08- 17-1.m3u '،' r ') كـ m3u: i = 0 للخط في 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])

دعونا نكسر هذا.

#! / usr / bin / python3

هذا يخبر باش أننا سنستخدم python3 لتفسير هذا الملف.

استيراد العملية الفرعية من استيراد sys argv

سنحتاج إلى وحدة العملية الفرعية لبدء تشغيل مثيل vlc الخاص بنا ، وسنحتاج إلى argv لاختيار القناة التي سنطلق vlc فيها.

فئة المحطة: def _init _ (self): self.channel = 0 self.name = '' self.address = ''

هذا يحدد فئة تسمى المحطة. سيكون لكل قناة رقم قناة ، واسم القناة كما هو مأخوذ من ملف m3u ، وعنوان المكان الذي يتم التدفق منه.

channel_list =

هذه قائمة ستخزن جميع القنوات المحللة من ملف m3u.

مع open ('./ us-m3uplaylist-2020-08-17-1.m3u'، 'r') كـ m3u: i = 0 للخط في 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

تفتح هذه الحلقة قائمة التشغيل m3u وتستوعب البيانات. تبدأ أسطر ملف m3u التي نهتم بها بـ #EXTINF ، وهذا يشير إلى إدخال جديد إلى ملف قائمة التشغيل. القيمة التالية للفائدة هي الاسم الموجود على نفس السطر مثل #EXTINF ، ولكن مع فاصلة بينهما. السطر التالي من هذا m3u المحدد هو عنوان الدفق. هناك مكرر "i" مستخدم لحساب أي قناة هي. تتكرر هذه الحلقة خلال ملف m3u بأكمله وتملأ channel_list بالمحطات.

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

تسمح مكتبة العمليات الفرعية لبيثون باستدعاء العمليات (البرامج) وإرجاع PID (معرف العملية). يمكّن هذا Python من أن يكون قادرًا على إدارة بدء تشغيل البرامج وإغلاقها "بشكل صحيح" دون ملء ملف المحفوظات ، أو السماح بتشغيل المزيد من التعليمات البرمجية العشوائية باستخدام مكالمات "النظام" العامة. يتم استخدام كل عنصر من عناصر المصفوفة كوسيطة لـ Popen كما هو مكتوب في سطر الأوامر.

vlc - حلقة --intf دمية - عناوين ملء الشاشة

الأمر أعلاه هو ما هو مطلوب لتشغيله ، مع خيار الحلقات لإصلاح بعض المشكلات مع إيقاف البث مؤقتًا أثناء تحميل الأجزاء التالية (مشكلات m3u8 غريبة) ، --intf dummy يبدأ تشغيل vlc بدون الواجهة ، مجرد شاشة ، - شاشة كاملة يقوم بتشغيل الفيديو في وضع ملء الشاشة (NO WAY!) ، والعنوان هو عنوان الدفق. كما ترى في الكود ، نحن نقدم العنوان من رقم قناة القائمة ، والذي يتم توفيره في وقت التشغيل عبر تعليمة argv. احفظ هذا الملف باسم tv_channels.py ، وقم بتغيير موقع قائمة التشغيل في ملف python للإشارة إلى قائمة التشغيل الخاصة بك ، ويمكنك تشغيل الكود كما يلي:

بيثون tv_channels.py

الخطوة 3: أضف GPIO

أضف GPIO
أضف GPIO
أضف GPIO
أضف GPIO

يُظهر التخطيط دبابيس GPIO المستخدمة للأزرار ، ولكل منهما مقاومة سحب لأعلى لإبقاء دبوس GPIO مرتفعًا بعد الضغط على الزر. يمكن تحسين الكود الذي تم تحديده مسبقًا لجعل العملية أكثر سلاسة عن طريق إضافة إمكانية GPIO. هذا يسمح لنا بتغيير القناة باستخدام الأزرار ، بدلاً من عبارات لوحة المفاتيح و argv ، تمامًا مثل تلفزيون realsies.

أول شيء يجب ملاحظته هو أنني لديّ التليفزيون مُعرَّف على أنه فصل دراسي. لكي نكون تلفزيونًا ، يجب أن نكون على قناة حالية ، ولدينا قائمة بالقنوات الممكنة ، ولدينا القدرة على تغيير القنوات. في هذا المثال ، ستكون الطريقة الوحيدة لتغيير القنوات هي تحريك قائمة القنوات لأعلى ، والتحرك لأسفل في قائمة القنوات. بمجرد تحديد القناة ، سيتعين علينا بدء تشغيل VLC على القناة التي نريد رؤيتها.

#! / usr / bin / python3

من وقت استيراد عملية استيراد السكون الفرعية من sys import argv من فئة gpiozero import Button class المحطة: 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): مع فتح (اسم الملف ، 'r') كـ m3u: i = 0 للخط في 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): جرب: self.process. kill () باستثناء: تمرير الطباعة ('قناة البداية٪ 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 = زر (23) بينما صحيح: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

يحتوي هذا التكرار على بعض التحسينات. تستخدم الآن وحدة تسمى gpiozero مطلوبة من قبل raspberry pi للوصول بسهولة إلى وظائف دبابيس GPIO

sudo apt-get install python3-gpiozero

أو

sudo pip تثبيت gpiozero

كما هو موضح في الكود الخاص بي ، اخترت GPIO 18 و GPIO 23 للقناة UP والقناة DOWN على التوالي. تحتوي مكتبة gpiozero على فئة جيدة لوظائف الأزرار عند الضغط ، والضغط ، وعندما يتم الاحتفاظ بها ، وما إلى ذلك. وهذا يجعل الأمر سهلاً للغاية. اخترت when_pressed ، والتي تشير إلى وظيفة رد الاتصال للتشغيل عند اكتشاف هذه الإشارة.

التغيير الرئيسي الأخير هو تضمين الخيار "-q" في استدعاء العملية الفرعية لـ VLC. يعمل هذا ببساطة على تشغيل vlc بدون كل المخرجات إلى المحطة لإبقائها خالية من الفوضى حتى نتمكن من رؤية بيانات الطباعة المعلوماتية في الكود.

الخطوة 4: دمج الأجهزة لتبدو حادة

دمج الأجهزة لتبدو حادة
دمج الأجهزة لتبدو حادة
دمج الأجهزة لتبدو حادة
دمج الأجهزة لتبدو حادة
دمج الأجهزة لتبدو حادة
دمج الأجهزة لتبدو حادة

لم أكتشف كيف أريد تحقيق ذلك ، وسيكون حلاً فريدًا لكل طراز تلفزيون قيد الاستخدام. أحتاج إلى التفكير مليًا في هذا الأمر والبحث في التلفزيون للعثور على مصدر طاقة جيد لـ pi بمجرد حشر الكمبيوتر داخل حجرة البطارية الضخمة. لقد فكرت أيضًا في استخدام أزرار الساعة لاختيار القناة ، حيث تم وضعها بالفعل بشكل جميل على التلفزيون ، والساعة لا تعمل على أي حال. سأقوم بنشر المزيد عندما أجد حلاً جيدًا ، ولكن هذا هو المكان الذي سيختلف فيه مشروعي بشكل كبير عن مشروع أي شخص آخر. استمتع بتكامل IPTV الشبيه بالتلفزيون الحقيقي!

الخطوة 5: باي باور

باي باور
باي باور

بالنسبة للتلفزيون النموذجي الذي وجدته ، فإنه يتطلب مصدر طاقة بجهد 12 فولت. لقد بحثت في اللوح ، لكنني لم أر أي منظمات طاقة واضحة لـ 5 فولت ، لذا فإن المكان الأكثر وضوحًا للحصول على مصدر طاقة ثابت هو على لوحة الدائرة حيث يأتي موصل البرميل لـ 12V. هناك مشكلة واضحة في هذا. لا نريد قلي البي ، لذلك سنحتاج إلى منظم طاقة. لقد اخترت MP2315 Step-Down محول الطاقة. إنها رخيصة الثمن وسهلة الاستخدام. سنلحم مدخلات 12VDC من موصل البرميل الموجود على PCB إلى دبابيس IN + و GND للمحول ، و VO + للدبوس 2 على Raspberry Pi ، بالإضافة إلى GND.

قبل القيام بذلك ، تأكد من تشغيل المحول وتأكد من خروج 5V المناسب من الخرج. اخترت الخيار الأبسط مع الجهد القابل للتعديل السلكي. ستقوم أداة التشذيب بضبط الجهد ، لذلك شاهدت خرج الجهد بمقياس متعدد أثناء ضبط أداة التشذيب باستخدام مفك البراغي.

الخطوة السادسة: دمج القوة

تكامل القوة
تكامل القوة
تكامل القوة
تكامل القوة
تكامل القوة
تكامل القوة

بعد البحث حول التلفزيون ، تقرر أن أفضل مكان للاستيلاء على الطاقة هو السالب لموصل البرميل ومفتاح تشغيل / إيقاف التلفزيون ، مما يعني أنه يمكننا تشغيل وإيقاف التدفقات باستخدام التلفزيون ، بدلاً من ذلك باستمرار تشغيل pi عن طريق السحب مباشرة من موصل البرميل.

تم لحام الأسلاك وتغذيتها على طول جانب ثنائي الفينيل متعدد الكلور بجوار العلبة حتى وصلت إلى الجزء الخلفي من الوحدة ، حيث تم تغذيتها من خلال ثقب كان في الجزء الخلفي من حجرة البطارية. بمجرد تغذيتها ، يمكننا إعداد أطراف الكابلات ولحامها في منظم الطاقة. لقد قمت بضبطه على 5 فولت لتشغيل pi ودبابيس الرأس الملحومة حتى نتمكن من تشغيل لاعبي الإناث إلى الإناث من منظم الطاقة مباشرة إلى مجموعة رأس GPIO الخاصة بـ Pi. لا يُنصح بهذا عادةً ، حيث يحصل pi عمومًا على الطاقة من خلال UBS ، الذي يحتوي على منظم مضمن لتكييف 5V ، ولكن نظرًا لأن الطاقة يتم تنظيمها بالفعل ، فيجب أن تكون جيدة.

هناك بعض الضوضاء على خطوط الصوت من القيام بذلك ، لأن هناك حلقة أرضية في النظام. لقد جربت العديد من نقاط القوة والأرض في جميع أنحاء اللوحة على أمل الحصول على إجابة سهلة ، لكن لم أجد أيًا منها. لقد قمت أيضًا بلحام كبل microUSB بمنظم الوضع المحول لمعرفة ما إذا كان إجبار الطاقة من خلال المنظمين الداخليين في Pi سيؤدي إلى حل المشكلة. لم تفعل. سيكون الحل في بعض محولات عزل الصوت الأرضي. تم طلبها بدلاً من بنائها ، لأنها رخيصة ومعبأة بشكل جيد. يمكنك الحصول عليها من معظم متاجر أو أقسام صوت السيارات. هذا ما اخترته.

الخطوة 7: حل زر طويل المدى

حل زر طويل المدى
حل زر طويل المدى
حل زر طويل المدى
حل زر طويل المدى

مما لا شك فيه أن الأزرار لن تبقى على اللوح ، لذلك يجب أن يكون هناك حل دائم. أمسكت ببعض الألواح القديمة ورميت الدائرة مع بعض دبابيس الرأس لتسهيل الوصول إلى الإشارات. هذا هو المكان الذي سيختلف فيه الرأي حول كيفية إرفاق الأزرار أو تركيبها. أنا أختار أن أضعهم على لوح الحماية وأرفقهم بالهيكل المعدني بحيث لا يتداخل المقبض الذي يتأرجح فوق الشاشة لحمله. لا تتردد في تحسين التصميم عن طريق إضافة حافظة مطبوعة ثلاثية الأبعاد تسهل التثبيت ، واستخدام الصواميل والمسامير ، والمواد اللاصقة الفاخرة ، ودمج الأزرار الأصلية ، أيًا كان. طالما أنه يعمل ، فلا توجد إجابات خاطئة.

سيتم تثبيتها على الجزء الخارجي من العلبة ، وسيتم وضع Raspberry Pi داخل حجرة البطارية الفسيحة للغاية ، لذلك ستحتاج إلى ثقب صغير محفور للسماح للكابلات بالخروج من حجرة البطارية.

الخطوة 8: فحص الملاءمة النهائي

فحص الملاءمة النهائي
فحص الملاءمة النهائي

يجب أن تكون جميع المعدات مناسبة لفحصها مرة أخيرة لمعرفة المكان الذي يجب إجراء جميع الثقوب فيه بالضبط في الهيكل ، وحجم الثقوب ، وما إلى ذلك التي يجب القيام بها. بالإضافة إلى ذلك ، ينبغي النظر في مكان وضع المكونات من أجل السهولة المثلى للاتصال والوصول. قصة قصيرة طويلة ، تأكد من أن كل شيء يناسب المكان الذي تعتقد أنه يحدث فيه قبل أن تتلف مشروعك بشكل لا يمكن إصلاحه وتضطر إلى التخلص منه.

الخطوة 9: الدمج النهائي

التكامل النهائي
التكامل النهائي
التكامل النهائي
التكامل النهائي
التكامل النهائي
التكامل النهائي

الآن جميع الأجهزة في المكان الذي يجب أن تكون فيه ، وكلها مناسبة تمامًا مثل حشرة في السجادة. دعونا نقطع الأشياء! لقد حددت مكانًا في حجرة البطارية حيث يمكنني توجيه كبلات AV للخارج باستخدام مسافة بادئة صغيرة في البلاستيك. لقد قمت بتثبيته باستخدام طاحونة مقاعد البدلاء. جعلت منه عملاً قصيرًا جدًا. لقد استخدمت جهاز dremel لطحن المزيد من البلاستيك لجعله مناسبًا جدًا للكابلات.

المكون الأخير هو محدد القناة. لقد قمت بحفر ثقب صغير في حجرة البطارية وقمت بتوجيه كابلات الرأس منها واحدة تلو الأخرى. تم توصيل الأزرار ، وقمت بتوصيل لوح الحماية بالهيكل البلاستيكي بنصفين من الفيلكرو اللاصق مسبقًا. أدركت أنه كان هناك حوالي 1200 طريقة أفضل للقيام بذلك ، لكن هذا نجح ، وكان لدي كل ما أحتاجه في متناول اليد.

الخطوة 10: استمتع بـ Vintage IPTV

استمتع بـ Vintage IPTV
استمتع بـ Vintage IPTV
استمتع بـ Vintage IPTV
استمتع بـ Vintage IPTV
استمتع بـ Vintage IPTV
استمتع بـ Vintage IPTV

هذا يلخص الامر. ابحث عن العروض واستمتع بالمشاهدة. لا تجلس قريبًا جدًا ، رغم ذلك. سوف تتعفن عقلك!

هناك متسع كبير لتحسين هذا المشروع ، لذا خذها في أي اتجاه تريده ، ولكن كان من الممتع الوصول إلى هذا الحد. بالنسبة لي ، أقوم بتشغيل هذا من cronjob عند إعادة التشغيل ، لذا فإن stdout لا يلتقط الرسائل من نص Python النصي. أرغب في إصلاح هذا حتى أعرف القناة التي أستخدمها. إضافة جيدة أخرى هي دونجل لوحة مفاتيح لاسلكية على Pi. سيتيح لك ذلك تغيير شبكة wifi إذا غادرت منزلك بالتلفزيون. بغض النظر. لقد كان مشروعًا ممتعًا ، ولا أطيق الانتظار لبدء المشروع التالي.

موصى به: