Оглавление:
- Шаг 1. Получите хороший список IPTV
- Шаг 2: предварительный эксперимент с кодом
- Шаг 3: Добавьте GPIO
- Шаг 4. Интегрируйте оборудование, чтобы выглядеть четко
- Шаг 5: Pi Power
- Шаг 6: интеграция мощности
- Шаг 7: долгосрочное решение кнопки
- Шаг 8: окончательная проверка соответствия
- Шаг 9: Окончательная интеграция
- Шаг 10: наслаждайтесь своим винтажным IPTV
Видео: Коробка для ретро-идиотов: 10 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Я нашел старый портативный телевизор Magnavox 1984 года выпуска, стоящий на полке в моем местном благотворительном магазине. Я подумал про себя: "О, ПРЕКРАСНО!" При дальнейшем осмотре я заметил на нем ценник в 15 долларов, поэтому решил забрать его домой и сделать из него что-нибудь шикарное. Я помню, как в детстве смотрел повторы всех великих классиков в великолепном черно-белом цвете, и хотел снова воплотить это в жизнь.
Проблема в том, что аналоговых станций больше нет, и они совершенно неспособны выполнять какое-либо декодирование ATSC или какое-либо цифровое декодирование. Я заметил наличие AV-соединения сбоку, и у меня было несколько малиновых пи, поэтому я решил отправиться в приключение, чтобы выяснить, как я могу транслировать на него каналы. Я тоже хочу, чтобы он выглядел резким. Я не буду запускать его на 9 батареях D-cell, поэтому я могу спрятать rpi в батарейном отсеке с множеством других вкусностей.
Шаг 1. Получите хороший список IPTV
Ежедневный список IPTV имеет фантастический выбор бесплатных станций IPTV, организованных по странам. Выберите желаемую страну и загрузите файл m3u.
Для программного обеспечения, которое находится в этом, необходим формат m3u. Подробнее об особенностях формата читайте здесь.
Шаг 2: предварительный эксперимент с кодом
Код python, который мы собираемся написать, анализирует файл m3u на список станций.
#! / usr / bin / python3
импорт подпроцесса из sys import argv class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = с открытым ('./ 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])]. адрес])
Давайте разберемся с этим.
#! / usr / bin / python3
Это сообщает bash, что мы будем использовать python3 для интерпретации этого файла.
импорт подпроцесса из sys import argv
Нам понадобится модуль подпроцесса для запуска нашего экземпляра vlc, и нам понадобится argv, чтобы выбрать, в каком канале мы будем запускать vlc.
class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = ''
Это определяет класс под названием Station. Каждый канал будет иметь номер канала, имя канала, взятое из файла 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 и заполняет список каналов станциями.
process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. адрес])
библиотека подпроцессов позволяет python вызывать процессы (программы) и возвращает PID (идентификатор процесса). Это позволяет python «правильно» управлять запуском и закрытием программ, не заполняя файл истории, или позволяя запускать более произвольный код с помощью общих «системных» вызовов. Каждый элемент массива, используемый в качестве аргумента для Popen, соответствует набранному в командной строке.
vlc --loop --intf dummy - полноэкранные адреса
Вышеупомянутая команда - это то, что нужно запустить, с параметром --loop, исправляющим некоторые проблемы с приостановкой потока при загрузке следующих фрагментов (странные проблемы с m3u8), --intf dummy запускает vlc без интерфейса, просто экран, --fullscreen запускает видео в полноэкранном режиме (НЕЛЬЗЯ!), а адрес является адресом потока. Как вы можете видеть в коде, мы предоставляем адрес из номера канала списка, который предоставляется во время выполнения с помощью оператора argv. Сохраните этот файл как tv_channels.py, измените расположение списка воспроизведения в файле python, чтобы он указывал на ваш список воспроизведения, и вы можете запустить код следующим образом:
python tv_channels.py
Шаг 3: Добавьте GPIO
На схеме показаны два вывода GPIO, используемые для кнопок, и каждый из них имеет подтягивающий резистор, чтобы удерживать вывод GPIO в высоком положении после нажатия кнопки. Определенный ранее код можно улучшить, чтобы сделать операцию немного более плавной, добавив возможности GPIO. Это позволяет нам изменять канал с помощью кнопок, а не клавиатуры и операторов argv, как в случае с realsies tv.
Первое, что следует отметить, это то, что я определил телевидение как класс. Чтобы быть телевизором, мы должны быть на текущем канале, иметь список возможных каналов и иметь возможность менять каналы. В этом примере единственным методом смены каналов будет перемещение вверх по списку каналов и перемещение вниз по списку каналов. Как только канал будет выбран, нам нужно будет запустить VLC на канале, который мы хотим видеть.
#! / usr / bin / python3
from time import sleep import subprocess from sys import argv from gpiozero import Класс кнопки Station: 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): с open (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, если 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, если self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): try: self.process. kill () за исключением: передать print ('начальный канал% 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) пока True: 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 для каналов ВВЕРХ и ВНИЗ соответственно. В библиотеке gpiozero есть хороший класс для функций кнопок для when_pressed, is_pressed, when_held и т. Д. Это делает его довольно простым. Я выбрал when_pressed, который относится к функции обратного вызова, запускаемой при обнаружении этого сигнала.
Последнее серьезное изменение - включение опции '-q' в вызов подпроцесса VLC. Это просто запускает vlc без вывода всего вывода на терминал, чтобы не было беспорядка, чтобы мы могли видеть информационные операторы печати в коде.
Шаг 4. Интегрируйте оборудование, чтобы выглядеть четко
Я не понял, как я хочу этого добиться, и это будет уникальное решение для каждой используемой модели телевизора. Мне нужно хорошенько подумать об этом и исследовать телевизор, чтобы найти хороший источник питания для пи, как только я запихну компьютер в массивный батарейный отсек. Я также подумал об использовании кнопок часов для выбора канала, так как они уже красиво размещены на телевизоре, а часы все равно не работают. Я опубликую больше, когда найду хорошее решение, но именно здесь Мой проект будет сильно отличаться от всех остальных. Наслаждайтесь интеграцией IPTV, подобной реальному телевидению!
Шаг 5: Pi Power
Для найденной мной модели телевизора требуется блок питания на 12 В. Я осмотрел плату, но не обнаружил очевидных регуляторов мощности для 5 В, поэтому наиболее очевидное место для получения стабильного питания находится на печатной плате, где входит цилиндрический разъем для 12 В. С этим есть очевидная проблема.. мы не хотим жарить пи, поэтому нам понадобится регулятор мощности. Я выбрал понижающий преобразователь мощности MP2315. Это очень дешево и просто в использовании. Мы припаяем вход 12 В постоянного тока от цилиндрического разъема на печатной плате к контактам IN + и GND преобразователя, а VO + - к контакту 2 на Raspberry Pi, а также к GND.
ПЕРЕД этим обязательно включите преобразователь и убедитесь, что на выходе подается правильное напряжение 5 В. Я выбрал самый простой вариант с проводной регулировкой напряжения. Триммер будет регулировать напряжение, поэтому я наблюдал за выходным напряжением с помощью мультиметра, пока регулировал триммер отверткой.
Шаг 6: интеграция мощности
Покопавшись вокруг телевизора, было решено, что лучшее место для сбора энергии - это отрицательная часть цилиндрического разъема и переключатель включения / выключения телевизора, что означает, что мы можем включать и выключать потоки с помощью телевизора, а не то, что постоянное питание пи, потянув его прямо из соединителя цилиндра.
Провода были впаяны и протянуты вдоль стороны печатной платы рядом с корпусом, пока они не достигли задней части устройства, где их пропустили через отверстие в задней части батарейного отсека. Как только они будут пропущены, мы можем подготовить концы кабеля и припаять их к регулятору мощности. Я настроил его на 5 В для питания пи-пи и припаял к нему контакты заголовка, чтобы мы могли подключить перемычки «мама-мама» от регулятора мощности непосредственно к набору заголовков GPIO пи. Обычно это не рекомендуется, так как пи обычно получает питание через UBS, который имеет встроенный регулятор для кондиционирования 5 В, но, поскольку мощность уже регулируется, все должно быть в порядке.
Из-за этого в аудиолиниях возникает некоторый шум, потому что в системе есть контур заземления. Я перепробовал множество точек питания и заземления по всей доске в надежде получить простой ответ, но не нашел ни одной. Я также припаял кабель microUSB к регулятору с переключением режимов, чтобы посмотреть, решит ли проблему принудительная подача питания через внутренние регуляторы пи. Это не так. Решение будет в некоторых изолирующих трансформаторах заземления. Их скорее заказывали, чем строили, потому что они дешевы и красиво упакованы. Вы можете приобрести их в большинстве магазинов или отделов автозвука. Это то, что я выбрал.
Шаг 7: долгосрочное решение кнопки
Несомненно, кнопки не останутся на макетной плате, поэтому необходимо более постоянное решение. Я схватил старую макетную плату и скинул схему вместе с несколькими выводами, чтобы упростить доступ к сигналам. Здесь у всех будут разные мнения о том, как прикрепить или установить кнопки. Я решил сделать их прототипами и просто прикрепил их к шасси так, чтобы ручка, которая поворачивается над экраном для переноски, не мешала. Не стесняйтесь украсить дизайн, добавив 3D-печатный корпус, который упрощает монтаж, используйте гайки и болты, необычные клеи, интегрируйте оригинальные кнопки, что угодно. Пока это работает, нет неправильных ответов.
Они будут установлены снаружи корпуса, а Raspberry Pi будет спрятан внутри очень вместительного батарейного отсека, поэтому потребуется просверлить небольшое отверстие, чтобы кабели могли выходить из батарейного отсека.
Шаг 8: окончательная проверка соответствия
Все оборудование необходимо проверить в последний раз, чтобы увидеть, где именно нужно проделать все отверстия в шасси, а также отверстия какого размера и т. Д. Кроме того, следует продумать, где разместить компоненты для оптимальной простоты подключения и доступа. Короче говоря, убедитесь, что все подходит там, где вы думаете, прежде чем вы непоправимо испортите свой проект и вам придется вытащить шпаклевку.
Шаг 9: Окончательная интеграция
Теперь все оборудование находится там, где оно должно быть, и все оно умещается так же удобно, как жучок в коврике. Давайте порежем! Я нашел место в батарейном отсеке, где я мог бы вывести AV-кабели, используя небольшое углубление в пластике. Я измельчил его с помощью настольного точильного станка. Он довольно быстро с этим справился. Я использовал дремель, чтобы отшлифовать больше пластика, чтобы он хорошо подходил для кабелей.
Последний компонент - это селектор каналов. Я просверлил небольшое отверстие в батарейном отсеке и по одному вытащил из него соединительные кабели. Кнопки были соединены, и я прикрепил макетную плату к пластиковому шасси с помощью двух половин предварительно приклеенной липучки. Я понимаю, что было около 1200 лучших способов сделать это, но это сработало, и у меня было все необходимое под рукой.
Шаг 10: наслаждайтесь своим винтажным IPTV
Это подводит итог. Находите шоу и получайте удовольствие от просмотра. Однако не садитесь слишком близко. Ты сгнишь себе мозг!
Есть много возможностей для улучшения этого проекта, так что двигайте его в любом направлении, в каком захотите, но было весело зайти так далеко. Что касается меня, я запускаю это из cronjob при перезагрузке, поэтому stdout не захватывает сообщения из скрипта python. Я хочу исправить это, чтобы знать, на каком я канале. Еще одно хорошее дополнение - адаптер беспроводной клавиатуры на Pi. Это позволит вам изменить сеть Wi-Fi, если вы выйдете из дома с телевизором. Несмотря на. это был забавный проект, и я не могу дождаться, чтобы приступить к следующему.
Рекомендуемые:
Дешевая коробка для фотографий своими руками: 5 шагов
Дешевая коробка для фотографий своими руками: вам когда-нибудь требовалось что-то, чтобы ваши фотографии выглядели лучше для вашего проекта с инструкциями, или просто нужно правильное освещение для ваших фотографий, хорошо, вы можете использовать коробку для фотографий, которую можно легко сделать дома. Шахта здесь не самая лучшая, но дёшево и е
Arduino: поющая коробка для подарков на день рождения: 14 шагов
Arduino: Поющая коробка для подарков на день рождения: эта поющая коробка для подарков на день рождения создана для упаковки подарков на день рождения с помощью Arduino для обеспечения специальных функций, включая пение и зажигание светодиодной свечи. С возможностью петь песню «С Днем Рождения» и зажигать светодиодный
Коробка для дезинфекции UV-C - Учебное пособие для базовой версии: 11 шагов (с изображениями)
Коробка для дезинфекции UV-C - Учебное пособие по базовой версии: Стивен Фенг, Шахрил Ибрагим и Санни Шарма, 6 апреля 2020 г. Особая благодарность Шерил за ценные отзывы Версию этой инструкции для документации Google см. На странице https://docs.google. ru / document / d / 1My3Jf1Ugp5K4MV … Предупреждение Свет УФ-С
Коробка Dreamday для особенного человека в вашей жизни: 11 шагов (с изображениями)
Коробка Dreamday для особенного человека в вашей жизни: в этой маленькой коробке указано количество дней, в течение которых мы с моим возлюбленным живем вместе. Конечно, для вас свидание может быть любым, оно может указывать на дни с момента вашего брака, с того дня, когда вы встретились с супругом, с того дня, когда вы переехали
ДЕНЬ ВАЛЕНТИНА Птицы любви: коробка для отправки и получения аудиосообщения Telegram: 9 шагов (с изображениями)
ДЕНЬ ВАЛЕНТИНА Love Birds: ящик для отправки и получения аудиосообщения в Telegram: посмотрите видео здесь Что такое любовь (птицы)? О, детка, не делай мне больно, больше не делай мне больно Это автономное устройство, которое принимает голосовые сообщения для твоей любви, семьи или друга. Откройте коробку, нажмите кнопку, пока говорите, отпустите, чтобы отправить