Оглавление:

Коробка для ретро-идиотов: 10 шагов
Коробка для ретро-идиотов: 10 шагов

Видео: Коробка для ретро-идиотов: 10 шагов

Видео: Коробка для ретро-идиотов: 10 шагов
Видео: Женщина за 50. Половая жизнь в зрелом возрасте 2024, Июль
Anonim
Коробка ретро-идиота
Коробка ретро-идиота

Я нашел старый портативный телевизор Magnavox 1984 года выпуска, стоящий на полке в моем местном благотворительном магазине. Я подумал про себя: "О, ПРЕКРАСНО!" При дальнейшем осмотре я заметил на нем ценник в 15 долларов, поэтому решил забрать его домой и сделать из него что-нибудь шикарное. Я помню, как в детстве смотрел повторы всех великих классиков в великолепном черно-белом цвете, и хотел снова воплотить это в жизнь.

Проблема в том, что аналоговых станций больше нет, и они совершенно неспособны выполнять какое-либо декодирование ATSC или какое-либо цифровое декодирование. Я заметил наличие AV-соединения сбоку, и у меня было несколько малиновых пи, поэтому я решил отправиться в приключение, чтобы выяснить, как я могу транслировать на него каналы. Я тоже хочу, чтобы он выглядел резким. Я не буду запускать его на 9 батареях D-cell, поэтому я могу спрятать rpi в батарейном отсеке с множеством других вкусностей.

Шаг 1. Получите хороший список IPTV

Получите хороший список IPTV
Получите хороший список 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
Добавить 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

Наслаждайтесь своим винтажным IPTV
Наслаждайтесь своим винтажным IPTV
Наслаждайтесь своим винтажным IPTV
Наслаждайтесь своим винтажным IPTV
Наслаждайтесь своим винтажным IPTV
Наслаждайтесь своим винтажным IPTV

Это подводит итог. Находите шоу и получайте удовольствие от просмотра. Однако не садитесь слишком близко. Ты сгнишь себе мозг!

Есть много возможностей для улучшения этого проекта, так что двигайте его в любом направлении, в каком захотите, но было весело зайти так далеко. Что касается меня, я запускаю это из cronjob при перезагрузке, поэтому stdout не захватывает сообщения из скрипта python. Я хочу исправить это, чтобы знать, на каком я канале. Еще одно хорошее дополнение - адаптер беспроводной клавиатуры на Pi. Это позволит вам изменить сеть Wi-Fi, если вы выйдете из дома с телевизором. Несмотря на. это был забавный проект, и я не могу дождаться, чтобы приступить к следующему.

Рекомендуемые: