Tabla de contenido:

Caja de idiota retro: 10 pasos
Caja de idiota retro: 10 pasos

Video: Caja de idiota retro: 10 pasos

Video: Caja de idiota retro: 10 pasos
Video: “ABANDONO la MODIFICACIÓN y DEJO PASO a los JÓVENES” dice BLACK ALIEN 2024, Mes de julio
Anonim
Caja de idiota retro
Caja de idiota retro

Encontré un viejo televisor portátil Magnavox de 1984 en un estante de mi tienda de segunda mano local. Pensé para mí mismo, "¡Oh, ESTUPENDO!" Tras una inspección más profunda, noté una etiqueta de precio de $ 15, así que decidí llevármela a casa y hacer algo elegante con ella. Recuerdo haber visto reposiciones cuando era niño de todos los grandes clásicos en glorioso blanco y negro, y quería volver a hacer esto realidad.

El problema es que ya no hay estaciones analógicas, y esto es completamente incapaz de realizar una decodificación ATSC o una decodificación digital. Noté la presencia de una conexión AV en el lateral, y tenía algunos raspberry pi por ahí, así que decidí embarcarme en una aventura para descubrir cómo podría transmitir canales a esto. También quiero que se vea nítido. No lo usaré con las 9 baterías de celda D, por lo que puedo ocultar el rpi en el compartimiento de la batería con una gran cantidad de otras cosas.

Paso 1: obtenga una buena lista de IPTV

Obtenga una buena lista de IPTV
Obtenga una buena lista de IPTV

Daily IPTV List tiene una fantástica selección de estaciones de iptv gratuitas organizadas por país. Seleccione el país de su elección y descargue el archivo m3u.

Para el software que se encuentra en este, m3u es un formato obligatorio. Puede leer más sobre los detalles del formato aquí.

Paso 2: Experimento de código preliminar

El código Python que vamos a escribir analiza el archivo m3u en una lista de estaciones.

#! / usr / bin / python3

importar subproceso desde sys importar argv class Estación: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = with open ('./ us-m3uplaylist-2020-08- 17-1.m3u ',' r ') como m3u: i = 0 para la línea en m3u: if line.startswith (' # EXTINF '): this = Station () this.name = line.split (', ') [1] línea = siguiente (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 proceso = subproceso. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

Analicemos esto.

#! / usr / bin / python3

Esto le dice a bash que usaremos python3 para interpretar este archivo.

importar subproceso desde sys importar argv

Necesitaremos el módulo de subproceso para lanzar nuestra instancia de vlc, y necesitaremos argv para elegir en qué canal lanzaremos vlc.

class Estación: def _init _ (self): self.channel = 0 self.name = '' self.address = ''

Esto define una clase llamada Station. Cada canal tendrá un número de canal, el nombre del canal tomado del archivo m3u y una dirección de donde se transmite ese canal.

channel_list =

Esta es una lista que almacenará todos los canales analizados del archivo m3u.

con open ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') como m3u: i = 0 para la línea en 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 bucle abre la lista de reproducción m3u e ingiere los datos. las líneas del archivo m3u que nos interesan comienzan con #EXTINF, esto indica una nueva entrada al archivo de la lista de reproducción. El siguiente valor de interés es el nombre, que está en la misma línea que #EXTINF, pero con una coma entre ellos. La siguiente línea de este m3u en particular es la dirección del flujo. Hay un iterador "i" en uso para contar qué canal es cuál. Este bucle recorre todo el archivo m3u y llena el channel_list con estaciones.

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

la biblioteca de subprocesos permite que Python llame a procesos (programas) y devuelve un PID (ID de proceso). Esto permite que Python pueda administrar el inicio y cierre de programas "correctamente" sin llenar el archivo histórico, o permitir que se ejecute un código más arbitrario con llamadas genéricas al "sistema". Cada elemento de la matriz que se utiliza como argumento para Popen se escribe en la línea de comandos.

vlc --loop --intf dummy - direcciones de pantalla completa

El comando anterior es lo que se desea ejecutar, con la opción --loop solucionando algunos problemas con la pausa de la transmisión mientras se cargan los siguientes fragmentos (problemas extraños de m3u8), --intf dummy inicia vlc sin la interfaz, solo una pantalla, --fullscreen lanza el video en modo de pantalla completa (¡DE NINGUNA MANERA!), y la dirección es la dirección de la transmisión. Como puede ver en el código, proporcionamos la dirección del número de canal de la lista, que se proporciona en tiempo de ejecución a través de la declaración argv. Guarde este archivo como tv_channels.py, cambie la ubicación de la lista de reproducción en el archivo de Python para que apunte a su lista de reproducción, y puede ejecutar el código de la siguiente manera:

python tv_channels.py

Paso 3: agregue GPIO

Agregar GPIO
Agregar GPIO
Agregar GPIO
Agregar GPIO

El esquema muestra los dos pines GPIO en uso para los botones, y cada uno tiene una resistencia de extracción para mantener el pin GPIO en alto después de presionar el botón. El código definido previamente se puede refinar para que la operación sea un poco más fluida agregando capacidad GPIO. Esto nos permite cambiar el canal con botones, en lugar de un teclado y declaraciones argv, al igual que en realsies tv.

Lo primero que hay que destacar es que tengo la televisión definida como una clase. Para ser un televisor, necesitamos estar en un canal actual, tener una lista de canales posibles y tener la capacidad de cambiar los canales. En este ejemplo, el único método para cambiar de canal será subir en la lista de canales y bajar en la lista de canales. Una vez decidido el canal, tendremos que iniciar VLC en el canal que queremos ver.

#! / usr / bin / python3

desde el tiempo import sleep import subprocess from sys import argv from gpiozero import Button class Estación: 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 (nombre de archivo) self.start_channel () def build_channel_list (self, nombre de archivo): con open (nombre de archivo, 'r') como m3u: i = 0 para la línea en 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): intente: autoproceso. kill () excepto: pass print ('iniciando el 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ón (18) channel_DN = Botón (23) mientras es verdadero: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Esta iteración de código tiene bastantes mejoras. ahora utilizó un módulo llamado gpiozero que es requerido por la raspberry pi para acceder fácilmente a la funcionalidad de los pines GPIO

sudo apt-get install python3-gpiozero

o

sudo pip instalar gpiozero

Como se ve en mi código, elegí GPIO 18 y GPIO 23 para el canal ARRIBA y el canal ABAJO respectivamente. La biblioteca gpiozero tiene una buena clase para funciones de botones para when_pressed, is_pressed, when_held, etc. Esto lo hace bastante fácil. Elegí when_pressed, que se refiere a una función de devolución de llamada que se ejecutará cuando se detecte esta señal.

El último cambio importante es la inclusión de la opción '-q' en la llamada al subproceso VLC. Esto simplemente ejecuta vlc sin toda la salida al terminal para mantenerlo libre de desorden para que podamos ver las declaraciones de impresión informativas en el código.

Paso 4: integre el hardware para lucir nítido

Integre el hardware para lucir nítido
Integre el hardware para lucir nítido
Integre el hardware para lucir nítido
Integre el hardware para lucir nítido
Integre el hardware para lucir nítido
Integre el hardware para lucir nítido

No he descubierto cómo quiero lograr esto, y será una solución única para cada modelo de televisor en uso. Necesito pensar mucho en esto y sondear el televisor para encontrar una buena fuente de energía para el pi una vez que coloque la computadora dentro del enorme compartimiento de la batería. También consideré usar los botones del reloj para la selección de canales, ya que ya están colocados en el televisor y el reloj no funciona de todos modos. Publicaré más cuando encuentre una buena solución, pero aquí es donde Mi proyecto diferirá enormemente del de todos los demás. ¡Disfruta de la integración de IPTV similar a una televisión real!

Paso 5: Pi Power

Pi Power
Pi Power

Para el modelo de TV que encontré, requiere una fuente de alimentación de 12V. Probé alrededor de la placa, pero no vi ningún regulador de potencia obvio para 5V, por lo que el lugar más obvio para obtener una fuente de alimentación constante es en la placa de circuito donde entra el conector de barril para 12V. Hay un problema obvio con esto. no queremos freír el pi, por lo que necesitaremos un regulador de potencia. He elegido el convertidor de potencia reductor MP2315. Es muy barato y fácil de usar. Soldaremos la entrada de 12VDC del conector de barril en el PCB a los pines IN + y GND del convertidor, y el VO + al pin 2 en la Raspberry Pi, así como a GND.

ANTES de hacer esto, asegúrese de encender el convertidor y asegúrese de que los 5V adecuados estén saliendo de la salida. Elegí la opción más simple con el voltaje ajustable cableado. El recortador ajustará el voltaje, así que miré la salida de voltaje con un multímetro mientras ajustaba el recortador con un destornillador.

Paso 6: Integrar el poder

Poder integrador
Poder integrador
Poder integrador
Poder integrador
Poder integrador
Poder integrador

Después de hurgar en el televisor, se decidió que el mejor lugar para tomar la energía era el negativo del conector de barril y el interruptor de ENCENDIDO / APAGADO del televisor, lo que significa que podemos encender y apagar las transmisiones con el televisor, en lugar de eso. alimentando constantemente el pi tirando directamente del conector de barril.

Los cables se soldaron y se alimentaron a lo largo del costado de los PCB junto a la carcasa hasta que llegaron a la parte posterior de la unidad, donde se introdujeron a través de un orificio que se encontraba en la parte posterior del compartimento de la batería. Una vez que se pasaron, podemos preparar los extremos del cableado y soldarlos al regulador de potencia. Lo sintonicé para 5V para alimentar el pi y los pines del encabezado soldados a él para que podamos ejecutar puentes hembra a hembra desde el regulador de potencia directamente al conjunto de encabezado GPIO del pi. Esto normalmente no se recomienda, ya que el pi generalmente recibe energía a través del UBS, que tiene un regulador en línea para acondicionar los 5V, pero como la energía ya está siendo regulada, debería estar bien.

Hay algo de ruido en las líneas de audio al hacer esto, porque hay un bucle de tierra en el sistema. Probé muchos puntos de energía y tierra en todo el tablero con la esperanza de una respuesta fácil, pero no encontré ninguno. También soldé un cable microUSB al regulador de modo conmutado para ver si forzar la alimentación a través de los reguladores internos del pi solucionaría el problema. No fue así. La solución estará en algunos transformadores de aislamiento de tierra de audio. Estos fueron pedidos en lugar de construidos, porque son baratos y están bien empaquetados. Puede recogerlos en la mayoría de las tiendas o departamentos de audio para automóviles. Esto es lo que elegí.

Paso 7: Solución de botones a largo plazo

Solución de botón a largo plazo
Solución de botón a largo plazo
Solución de botón a largo plazo
Solución de botón a largo plazo

Sin duda, los botones no permanecerán en una placa de prueba, por lo que debe haber una solución más permanente. Agarré un protoboard viejo y coloqué el circuito junto con algunos pines de encabezado para facilitar el acceso a las señales. Aquí es donde todos tendrán una opinión diferente sobre cómo colocar o montar los botones. Elijo hacer un prototipo de ellos y simplemente adjuntarlos al chasis de manera que el asa que se balancea sobre la pantalla para transportar no interfiera. Siéntase libre de mejorar el diseño agregando una carcasa impresa en 3D que suaviza el montaje, use tuercas y pernos, adhesivos elegantes, integre botones originales, lo que sea. Mientras funcione, no hay respuestas incorrectas.

Estos se montarán en el exterior de la carcasa y la Raspberry Pi se colocará dentro del espacioso compartimento de la batería, por lo que será necesario perforar un pequeño orificio para permitir que los cables salgan del compartimento de la batería.

Paso 8: Verificación de ajuste final

Comprobación de ajuste final
Comprobación de ajuste final

Todo el equipo debe revisarse en forma una última vez para ver exactamente dónde se deben hacer todos los orificios en el chasis, y qué tamaño de orificios, etc. Además, se debe considerar dónde colocar los componentes para una óptima facilidad de conectividad y acceso. En pocas palabras, asegúrese de que todo encaje donde cree que lo hace antes de dañar irreparablemente su proyecto y tener que sacar la masilla.

Paso 9: Integración final

Integración final
Integración final
Integración final
Integración final
Integración final
Integración final

Ahora todo el hardware está donde debe estar, y todo encaja tan ceñido como un insecto en una alfombra. ¡Cortamos cosas! Identifiqué un lugar en el compartimiento de la batería donde podría enrutar los cables AV usando una pequeña hendidura en el plástico. Lo molí con una amoladora de banco. Hizo un trabajo bastante corto. Usé una dremel para moler más plástico para que se ajustara bastante bien a los cables.

El último componente es el selector de canales. Perforé un pequeño orificio en el compartimiento de la batería y enrute los cables del cabezal de uno en uno. Los botones estaban conectados y adjunté el protoboard al chasis de plástico con dos mitades de velcro preadhesivo. Entiendo que había alrededor de 1200 formas mejores de hacer esto, pero funcionó y tenía todo lo que necesitaba a mano.

Paso 10: disfruta de tu IPTV vintage

Disfrute de su IPTV vintage
Disfrute de su IPTV vintage
Disfrute de su IPTV vintage
Disfrute de su IPTV vintage
Disfrute de su IPTV vintage
Disfrute de su IPTV vintage

Eso lo resume todo. Encuentra programas y diviértete viéndolos. Sin embargo, no te sientes demasiado cerca. ¡Podrás pudrir tu cerebro!

Hay mucho espacio para mejorar este proyecto, así que llévelo en la dirección que desee, pero fue divertido llegar tan lejos. En cuanto a mí, ejecuto esto desde un cronjob al reiniciar, por lo que stdout no captura los mensajes del script de Python. Me gustaría arreglar esto para saber en qué canal estoy. Otra buena adición es un dongle de teclado inalámbrico en el Pi. Esto le permitiría cambiar la red wifi si sale de su casa con la televisión. A pesar de todo. fue un proyecto divertido y no veo la hora de empezar con el siguiente.

Recomendado: