ESP8266 Interfaz de televisión de transmisión analógica
Enganche una antena hasta GPIO3/RX, sintonice su televisor analógico al canal 3. ¡Encienda el ESP!
Esto utiliza el bus I2S de la misma manera que lo hace el proyecto ESP8266WS2812I2S. La diferencia es que aumenta la salida de salida a 80 MHz. Configuramos los buffers DMA y dejamos que la CPU los llene mientras pasan a través de una línea a la vez. La interrupción de DMA llena los amortiguadores una palabra a la vez. ¡El autobús I2S cambia esos amortiguadores a 80 MHz!
Puede decir "pero Nyquist dice que no puede transmitir o recibir frecuencias a más de 1/2 la frecuencia de muestreo (40 MHz en este caso). Hasta cierto punto. Algunas personas pensaron que puede ser connotaciones, pero lo que sucede En realidad, sucede algo extraño. No es perfecto.
Almacenamos un patrón un poco en la matriz "Premodulate_Table". Esto contiene bitsreams para diversas señales, como el nivel de "sincronización" o el nivel de "colbust", o cualquiera de los colores visuales. La longitud de esta tabla de 1408 bits por color se eligió para que cuando se envió un bit a la vez a 80 MHz, funcione a un multiplicador uniforme de la frecuencia de croma NTCS de 315.0/88.0 MHz, o 3.5795454555 MHz. Puede calcular esto tomando 1408/80MHz = 17.6US * 3.579545 MHz = 63 ciclos, exactamente. Convenientemente, también funciona a un multiplicador uniforme de 61.25 MHz, el centro Luma del Channel 3. 17.6us * 61.25 MHz = 1078 ciclos, exactamente! Cuando modula frecuencias arbitrarias, a veces los ciclos salen muy desiguales.
Para generar Luma (la porción en blanco y negro) modulamos 61.25 MHz. Si generamos una señal fuerte, se ve como un muy "oscuro", y una señal débil es muy "brillante". Esto significa que cuando queremos enviar un pulso de sincronización, lo modulamos tan fuerte como podamos ... Cuando queremos modular el blanco, apuntamos apenas una señal. Una cosa que notarás es Dot Viert. Esto se debe a que la señal que estamos enviando es tan terrible. La señal de croma está muy sucia y tiene un patrón de intensidad repetitiva. Mientras que el croma se alinea hasta el paten de repetición de 1408 en todo el bit, el número total de píxeles en la pantalla no lo hace. Esto provoca que los patrones creados en la pantalla.
Para generar color, necesitamos modular en una señal de croma, 3.579MHz sobre la banda base. El croma se sincroniza con una currícula al comienzo de cada línea. Esto también establece el nivel para el croma. Luego, durante la línea, podemos elegir un "color" que tenga un alto coeficiente en el nivel de croma, o uno bajo. Esto determina cuán vívido es el color. Podemos cambiar la fase para cambiar el tono del color.
Este es básicamente un DAC DILIGING de 1 bits, que funciona a una frecuencia debajo del Nyquist, tratando de codificar Luma y color al mismo tiempo. No se sorprenda de que la calidad sea terrible.
Las tablas para manejar la máquina de estado de buffer de línea están (generadas/almacenadas?) En MayCBtables.h/C, y tablas similares para crear la codificación de señal en alambre están en synthtables.c.
Funciones para configurar las transferencias DMA, rellenar los buffers cuando se vacían y cambiar qué tipo de línea debe enviarse en función de los contenidos de FrameBuffer está en video_broadcast.c. Estas funciones manejan toda la modulación. Esto establece el DMA y una interrupción que se llama cuando el DMA termina un bloque (igual a una línea). Al finalizar, utiliza CBTable para decidir a qué función llamar para completar la línea. La interrupción llena la siguiente línea para DMA que sigue adelante.
FrameBuffer se actualiza por varias pantallas de demostración ubicadas en user_main.c.
custom_commands.c Contiene los comandos personalizados utilizados para los aspectos específicos de NTSC. Usando la interfaz WebSockets común, hay dos comandos agregados. Estos incluyen "CO" y "CV" que establecen el modo de operación (CO) y permiten a los usuarios cambiar la tabla de modulación desde una interfaz web (CV).
Las siguientes pantallas de demostración están disponibles. Normalmente marcan uno tras otro (excepto los de 10), a menos que el usuario lo desactive en el navegador web.
La interfaz web está tomando prestada la interfaz web de ESP8266WS2812I2S. Encienda el ESP, conéctese a él, luego, apunte su navegador web a http://192.168.4.1. Tiene un nuevo botón "NTSC". Esto le brinda la opción de permitir que la demostración continúe de pantalla a pantalla, o se congele en una pantalla específica. Puede especificar la pantalla. Además, para las pruebas de RF, puede atascar un color. Cada vez que la mermelada de color se establece en algo 0 o superior, apaga toda la lógica de dibujo de la línea y simplemente genera ese color continuamente. Esto evitará que los televisores lo vean, sin embargo, puede verlo en otros equipos de RF.
¡También tiene un sistema interactivo de WebWorker JavaScript que le permite escribir código para hacer un nuevo color! Puede crear un nuevo bitstream que se transmitirá cuando se golpee un color específico. Puede editar el código y es efectivo a medida que escribe. Reinicia automáticamente el WebWorker cada vez que lo cambia.
Solo debe emitir -1 o +1, ya que es todo lo que ESP puede emitir. Luego ejecutará un DFT con una ventana aleatoria sobre un área de frecuencia que elija. Aumente la ventana DFT y aumentará su Q (o precisión). Disminución, disminuye su q. Esto es para ayudar a ver cómo los receptores como la televisión realmente entienden la señal y ayudar a ilustrar cuán loco es realmente esto.
Puede probarlo en su propio navegador usando este enlace: http://cnlohr.
Para todos los 3D y texto, estoy usando una nueva versión modificada de mi biblioteca "RawDraw" (http://github.com/cnlohr/rawdraw) Para 3D estoy usando números de punto fijo, con 256 como valor unitario y los 8 bits inferiores son el componente fraccional.
Para permitir las transmisiones de PAL, se modificaron los tiempos en el video_broadcast-library (anteriormente NTSC_BROAD). Dado que solo quería usar esto con un televisor negro y blanco, y el color PAL es bastante complicado de hacer digitalmente, no modificé el broadcast_tables (synthtables.c). Entonces, la biblioteca transmite una señal B/W con información de color NTSC (como NTSC50).
Para habilitar la transmisión de PAL, debe habilitar OPTS += -DPAL en user.cfg.
Aquí está el video original de YouTube en este proyecto:
Aquí está el nuevo video (con color):