Índice:

Caixa Idiota Retro: 10 Passos
Caixa Idiota Retro: 10 Passos
Anonim
Caixa Idiota Retro
Caixa Idiota Retro

Eu encontrei uma velha televisão portátil Magnavox de 1984 em uma prateleira em minha loja local. Eu pensei comigo mesmo, "oh NEAT!" Após uma inspeção mais aprofundada, notei um preço de US $ 15 nele, então decidi levá-lo para casa e fazer algo elegante com ele. Lembro-me de assistir a reprises, quando criança, de todos os grandes clássicos em gloriosos preto e branco, e queria tornar isso realidade novamente.

O problema é que não existem mais estações analógicas por aí, e isso é totalmente incapaz de fazer qualquer decodificação ATSC, ou qualquer decodificação digital. Percebi a presença de uma conexão AV na lateral e tinha alguns pi's de framboesa por perto, então decidi embarcar em uma aventura para descobrir como poderia transmitir canais para isso. Eu quero fazer com que pareça nítido também. Não vou usá-lo com baterias de 9 células D, então posso esconder a rpi no compartimento da bateria com uma série de outras guloseimas.

Etapa 1: Obtenha uma boa lista de IPTV

Obtenha uma boa lista de IPTV
Obtenha uma boa lista de IPTV

A Lista Diária de IPTV tem uma seleção fantástica de estações de iptv gratuitas organizadas por país. Selecione o país de sua escolha e baixe o arquivo m3u.

Para o software que está neste, m3u é um formato necessário. Você pode ler mais sobre as especificações do formato aqui.

Etapa 2: Experiência Preliminar de Código

O código python que vamos escrever analisa o arquivo m3u em uma lista de estações.

#! / usr / bin / python3

import subprocess from 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 para linha em m3u: if line.startswith (' # EXTINF '): this = Station () this.name = line.split (', ') [1] linha = próximo (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 processo = subprocesso. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. endereço])

Vamos decompô-lo.

#! / usr / bin / python3

Isso diz ao bash que usaremos o python3 para interpretar este arquivo.

import subprocessfrom sys import argv

Precisaremos do módulo de subprocesso para lançar nossa instância vlc e precisaremos de argv para escolher em qual canal lançaremos vlc.

class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = ''

Isso define uma classe chamada Station. Cada canal terá um número de canal, o nome do canal retirado do arquivo m3u e um endereço de onde o canal está transmitindo.

channel_list =

Esta é uma lista que armazenará todos os canais analisados do arquivo m3u.

com open ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') como m3u: i = 0 para linha em 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

Este loop abre a lista de reprodução m3u e ingere os dados. as linhas do arquivo m3u em que estamos interessados começam com #EXTINF, isso indica uma nova entrada no arquivo de lista de reprodução. O próximo valor de interesse é o nome, que está na mesma linha que #EXTINF, mas com uma vírgula entre eles. A linha a seguir deste m3u em particular é o endereço do stream. Há um iterador "i" em uso para contar qual canal é qual. Este loop percorre todo o arquivo m3u e preenche channel_list com estações.

process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. endereço])

a biblioteca de subprocesso permite que o python chame processos (programas) e retorne um PID (ID do processo). Isso permite que o python seja capaz de gerenciar a inicialização e o fechamento de programas "corretamente" sem preencher o arquivo de histórico, ou permitir que um código mais arbitrário seja executado com chamadas de "sistema" genéricas. Cada elemento da matriz usado como argumento para Popen é digitado na linha de comando.

vlc --loop --intf dummy - endereços de tela cheia

O comando acima é o que se deseja executar, com a opção --loop corrigindo alguns problemas com a pausa do stream enquanto os próximos pedaços carregam (problemas estranhos no m3u8), --intf dummy inicia a vlc sem a interface, apenas uma tela, --fullscreen inicia o vídeo em modo de tela cheia (SEM CAMINHO!), e o endereço é o endereço do stream. Como você pode ver no código, estamos fornecendo o endereço do número do canal da lista, que é fornecido em tempo de execução por meio da instrução argv. Salve este arquivo como tv_channels.py, altere o local da lista de reprodução no arquivo python para apontar para sua lista de reprodução e você pode executar o código da seguinte maneira:

python tv_channels.py

Etapa 3: Adicionar GPIO

Adicionar GPIO
Adicionar GPIO
Adicionar GPIO
Adicionar GPIO

O esquema mostra os dois pinos GPIO em uso para os botões, e cada um tem um resistor pull up para manter o pino GPIO puxado para cima após o botão ser pressionado. O código definido anteriormente pode ser refinado para tornar a operação um pouco mais contínua, adicionando o recurso GPIO. Isso nos permite mudar o canal com botões, ao invés de um teclado e instruções argv, assim como uma TV para reais.

A primeira coisa a se notar é que defini a televisão como uma classe. Para ser uma televisão, precisamos estar em um canal atual, ter uma lista de canais possíveis e ter a capacidade de mudar os canais. Neste exemplo, o único método de mudar de canal será mover para cima na lista de canais e para baixo na lista de canais. Assim que o canal for decidido, teremos que iniciar o VLC no canal que queremos ver.

#! / usr / bin / python3

from time import sleep import subprocess from sys import argv from gpiozero import Button class 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): com aberto (nome do arquivo, 'r') como m3u: i = 0 para linha em 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 se 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 se self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): try: self.process. kill () exceto: pass print ('iniciando canal% 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 = Botão (18) channel_DN = Botão (23) enquanto Verdadeiro: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Esta iteração de código tem algumas melhorias. agora utilizava um módulo chamado gpiozero que é exigido pelo raspberry pi para acessar facilmente a funcionalidade dos pinos GPIO

sudo apt-get install python3-gpiozero

ou

sudo pip install gpiozero

Como visto em meu código, escolhi GPIO 18 e GPIO 23 para o canal UP e o canal DOWN, respectivamente. A biblioteca gpiozero tem uma boa classe para funções de botões para when_pressed, is_pressed, when_held, etc. Isso torna muito fácil. Eu escolhi o when_pressed, que se refere a uma função de retorno de chamada a ser executada quando este sinal for detectado.

A última grande mudança é a inclusão da opção '-q' na chamada do subprocesso VLC. Isso simplesmente executa vlc sem toda a saída para o terminal para mantê-lo livre de desordem para que possamos ver as instruções de impressão informativas no código.

Etapa 4: integre o hardware para ter uma aparência nítida

Integre o hardware para ter uma aparência nítida
Integre o hardware para ter uma aparência nítida
Integre o hardware para ter uma aparência nítida
Integre o hardware para ter uma aparência nítida
Integre o hardware para ter uma aparência nítida
Integre o hardware para ter uma aparência nítida

Ainda não descobri como quero fazer isso e será uma solução única para cada modelo de tv em uso. Preciso pensar muito sobre isso e sondar a televisão para encontrar uma boa fonte de energia para o pi assim que enfiar o computador dentro do enorme compartimento da bateria. Também considerei usar os botões do relógio para a seleção de canais, pois eles já estão lindamente colocados na televisão e o relógio não funciona de qualquer maneira. Vou postar mais quando eu encontrar uma boa solução, mas é aqui que Meu projeto será muito diferente do de todos os outros. Desfrute da integração de IPTV semelhante à de uma tv real!

Etapa 5: Pi Power

Pi Power
Pi Power

Para o modelo de TV que encontrei, ele requer uma fonte de alimentação de 12V. Eu investiguei a placa, mas não vi nenhum regulador de energia óbvio para 5V, então o lugar mais óbvio para obter uma fonte de alimentação estável é na placa de circuito onde o conector cilíndrico para 12V entra. Há um problema óbvio com isso. não queremos fritar o pi, então precisaremos de um regulador de potência. Eu escolhi o conversor de potência com step-down MP2315. É muito barato e simples de usar. Soldaremos a entrada de 12 VCC do conector cilíndrico no PCB aos pinos IN + e GND do conversor, e o VO + ao pino 2 do Raspberry Pi, além de um GND.

ANTES de fazer isso, certifique-se de ligar o conversor e garantir que os 5 V adequados estejam saindo da saída. Eu escolhi a opção mais simples com a tensão ajustável com fio. O aparador ajustará a voltagem, então observei a saída de voltagem com um multímetro enquanto ajustava o aparador com uma chave de fenda.

Etapa 6: Integração de energia

Poder Integrador
Poder Integrador
Poder Integrador
Poder Integrador
Poder Integrador
Poder Integrador

Depois de vasculhar a televisão, foi decidido que o melhor lugar para obter energia era no negativo do conector cilíndrico e no botão liga / desliga da televisão, o que significa que podemos ligar e desligar os streams com a televisão, ao invés de constantemente alimentando o pi puxando diretamente do conector de barril.

Os fios eram soldados e alimentados ao longo da lateral das placas de circuito impresso ao lado da caixa até chegarem à parte traseira da unidade, onde eram alimentados por um orifício que ficava na parte de trás do compartimento da bateria. Depois de alimentados, podemos preparar as extremidades do cabeamento e soldá-los no regulador de energia. Eu o ajustei para 5 V para alimentar o pi e soldou os pinos do cabeçote a ele para que possamos executar jumpers feminino para feminino do regulador de potência diretamente para o conjunto de cabeçote GPIO do pi. Normalmente, isso não é aconselhável, pois o pi geralmente obtém energia através do UBS, que tem um regulador em linha para condicionar os 5V, mas como a energia já está sendo regulada, deve estar bom.

Há algum ruído nas linhas de áudio ao fazer isso, porque há um loop de aterramento no sistema. Tentei muitos pontos de energia e aterramento em todo o tabuleiro, esperando uma resposta fácil, mas não encontrei nenhum. Também soldei um cabo microUSB ao regulador de modo chaveado para ver se forçar a alimentação através dos reguladores internos do pi resolveria o problema. Isso não aconteceu. A solução será em alguns transformadores de isolamento de aterramento de áudio. Eles foram encomendados, em vez de construídos, porque são baratos e bem embalados. Você pode adquiri-los na maioria das lojas ou departamentos de áudio automotivo. Isso é o que eu escolhi.

Etapa 7: Solução de botão de longo prazo

Solução de botão de longo prazo
Solução de botão de longo prazo
Solução de botão de longo prazo
Solução de botão de longo prazo

Sem dúvida, os botões não ficarão em uma placa de ensaio, então é preciso haver uma solução mais permanente. Peguei um protoboard antigo e juntei o circuito com alguns pinos de cabeçalho para facilitar o acesso aos sinais. É aqui que todos terão uma opinião diferente sobre como anexar ou montar os botões. Estou optando por protoboard-los e apenas fixá-los ao chassi de forma que a alça que balança sobre a tela para transportar não interfira. Sinta-se à vontade para aprimorar o design adicionando uma caixa impressa em 3D que suaviza a montagem, use porcas e parafusos, adesivos sofisticados, integre botões originais, o que for. Contanto que funcione, não há respostas erradas.

Eles serão montados na parte externa do gabinete e o Raspberry Pi será colocado dentro do compartimento muito espaçoso da bateria, portanto, será necessário fazer um pequeno orifício para permitir que os cabos saiam do compartimento da bateria.

Etapa 8: verificação de ajuste final

Verificação de ajuste final
Verificação de ajuste final

Todo o equipamento precisa ter o ajuste verificado uma última vez para ver exatamente onde todos os orifícios devem ser feitos no chassi, e quais tamanhos de orifícios, etc, devem ser feitos. Além disso, deve-se considerar onde colocar os componentes para facilitar a conectividade e o acesso. Para encurtar a história, certifique-se de que tudo se encaixa onde você pensa que está antes de danificar irreparavelmente seu projeto e ter que soltar a massa.

Etapa 9: Integração final

Integração Final
Integração Final
Integração Final
Integração Final
Integração Final
Integração Final

Agora todo o hardware está onde precisa estar e tudo se encaixa tão bem quanto um inseto no tapete. Vamos cortar coisas! Identifiquei um local no compartimento da bateria onde poderia rotear os cabos AV usando um pequeno recorte no plástico. Amassei com um moedor de bancada. Fez um trabalho bem rápido. Usei uma dremel para amolar mais plástico e torná-lo um ajuste muito bom para os cabos.

O último componente é o seletor de canal. Eu fiz um pequeno orifício no compartimento da bateria e direcionei os cabos do conector para fora dele, um de cada vez. Os botões foram conectados e fixei o protoboard ao chassi de plástico com duas metades de velcro pré-adesivo. Percebi que havia cerca de 1200 maneiras melhores de fazer isso, mas funcionou e eu tinha tudo de que precisava em mãos.

Etapa 10: aproveite sua IPTV vintage

Desfrute da sua IPTV vintage
Desfrute da sua IPTV vintage
Desfrute da sua IPTV vintage
Desfrute da sua IPTV vintage
Desfrute da sua IPTV vintage
Desfrute da sua IPTV vintage

Isto resume tudo. Encontre programas e divirta-se assistindo. Não se sente muito perto, no entanto. Você vai apodrecer seu cérebro!

Há muito espaço para melhorar este projeto, então leve-o na direção que quiser, mas foi divertido chegar até aqui. Quanto a mim, eu executo isso a partir de um cronjob na reinicialização, para que o stdout não capture as mensagens do script python. Eu gostaria de consertar isso para saber em qual canal estou. Outra boa adição é um dongle de teclado sem fio no Pi. Isso permitiria que você alterasse a rede wi-fi se sair de casa com a TV. Sem considerar. foi um projeto divertido e mal posso esperar para começar o próximo.

Recomendado: