ESP8266 Analog Broadcast -Fernsehoberfläche
Haken Sie eine Antenne an gpio3/rx, stimmen Sie Ihren analogen Fernseher auf Kanal.
Dies verwendet den I2S -Bus genauso wie das ESP8266WS2812I2S -Projekt. Der Unterschied ist, dass es den Ausgangsbaud auf 80 MHz krankiert. Wir richten DMA -Puffer ein und lassen die CPU sie füllen, während sie jeweils eine Linie durchlaufen. Der DMA -Interrupt füllt das Puffer jeweils ein Wort aus. Der I2S -Bus verschiebt diese Puffer bei 80 MHz!
Sie können sagen: "Aber Nyquist sagt, Sie können keine Frequenzen mit mehr als 1/2 der Stichprobenrate (40 MHz) übertragen oder erhalten. In einem Grad, der wahr ist. Einige Leute dachten In Wirklichkeit passiert etwas Fremder. Das ist nicht perfekt.
Wir speichern ein Bitmuster im Array "Premoduled_table". Dies enthält Bitstreams für verschiedene Signale, wie z. Die Länge dieser Tabelle von 1408 Bit pro Farbe wurde ausgewählt, sodass bei einem Bit gleichzeitig bei 80 MHz ein Multiplikator der NTCS -Chroma -Frequenz von 315.0/88,0 MHz oder 3,5795454555 MHz erfolgt. Sie können dies berechnen, indem Sie 1408/80MHz = 17,6US * 3,579545 MHz = 63 Zyklen genommen haben. Praktischerweise entspricht es auch einen noch 61,25 MHz, der Luma Center von Channel 3. 17,6us * 61,25 MHz = 1078 Zyklen genau! Wenn Sie willkürliche Frequenzen modulieren, kommen die Zyklen manchmal sehr ungleichmäßig heraus.
Um Luma (schwarz -weißer Teil) zu erzeugen, modulieren wir 61,25 MHz. Wenn wir ein starkes Signal erzeugen, wird es als sehr "dunkel" angesehen, und ein schwaches Signal ist sehr "hell". Das heißt, wenn wir einen Synchronisationsimpuls senden möchten, modulieren wir ihn so laut wie möglich ... Wenn wir Weiß modulieren wollen, geben wir kaum ein Signal aus. Eine Sache, die Sie bemerken werden, ist ein Punktguss. Dies liegt daran, dass das Signal, das wir senden, so schrecklich ist. Das Chroma -Signal ist sehr schmutzig und hat ein wiederholtes Intensitätsmuster. Während die Chroma bis zu den 1408 bitweiten Wiederholungspatten übereinstimmt, ist die Gesamtzahl der Pixel auf dem Bildschirm nicht. Dies führt dazu, dass die erstellten Muster den Bildschirm herunterrollen.
Um Farbe zu erzeugen, müssen wir in einem Chroma -Signal 3,579MHz über dem Basisband modulieren. Der Chroma wird zu Beginn jeder Zeile von einem Farbburst synchronisiert. Dies setzt auch den Niveau für die Chroma. Während der Linie können wir entweder eine "Farbe" wählen, die auf Chroma -Ebene einen hohen Koeffizienten aufweist. Dies bestimmt, wie lebendig die Farbe ist. Wir können die Phase ändern, um den Farbton der Farbe zu ändern.
Dies ist im Grunde genommen ein 1-Bit-Dithering-DAC, der zu einer Frequenz unterhalb des Nyquists arbeitet und versucht, gleichzeitig Luma und Farbe zu kodieren. Seien Sie nicht überrascht, dass die Qualität schrecklich ist.
Tabellen zum Umgang mit der Leitungs-Buffer-Statusmaschine werden (erzeugt/gespeichert?) In MaycBTables.h/c und ähnliche Tabellen zum Erstellen der Codierung des On-Wire-Signals sind in Synthtables.c.
Funktionen zum Einrichten der DMA -Transfers, zum Auffüllen der Puffer, wenn sie leer werden, und ändern Sie, welche Art von Zeile auf dem FrameBuffer -Inhalt gesendet werden soll. Diese Funktionen verarbeiten die gesamte Modulation. Dies richtet die DMA und einen Interrupt ein, der aufgerufen wird, wenn die DMA einen Block beendet (gleich einer Zeile). Nach Abschluss der Fertigstellung wird CBTable verwendet, um zu entscheiden, welche Funktion aufgerufen werden soll, um die Linie auszufüllen. Der Interrupt füllt die nächste Zeile für DMA aus, die weiterhin geht.
Der FrameBuffer wird durch verschiedene Demo -Bildschirme in user_main.c aktualisiert.
Custom_Commands.c enthalten die benutzerdefinierten Befehle, die für die NTSC-spezifischen Aspekte verwendet werden. Mit der Common WebSockets -Schnittstelle gibt es zwei zusätzliche Befehle. Dazu gehören "CO" und "CV", die den Betriebsmodus (CO) festlegen und den Benutzern die Modulationstabelle von einer Web -Schnittstelle (CV) ändern können.
Die folgenden Demo -Bildschirme sind verfügbar. Normalerweise kreuzen sie nacheinander eine durch (außer nach 10), es sei denn, der Benutzer deaktiviert dies im Webbrowser.
Die Webschnittstelle liehen die Weboberfläche von ESP8266WS2812I2S aus. Schalten Sie das ESP ein, stellen Sie eine Verbindung dazu her, und weisen Sie Ihren Webbrowser mit http://192.168.4.1 an. Es hat eine neue Schaltfläche "NTSC". Auf diese Weise können Sie die Demo ermöglichen, von Bildschirm zu Bildschirm fortzufahren oder in einem bestimmten Bildschirm einzufrieren. Sie können den Bildschirm angeben. Zusätzlich können Sie für HF -Tests eine Farbe verfolgen. Immer wenn die Farbmarmelade auf etwas 0 oder höher eingestellt ist, schaltet sie alle Zeilenzeichnungslogik aus und gibt einfach kontinuierlich aus. Dies verhindert, dass Fernseher es sehen. Sie können es jedoch auf anderen HF -Geräten sehen.
Es verfügt auch über ein interaktives JavaScript -Webworker -System, mit dem Sie Code schreiben können, um eine neue Farbe zu erstellen! Sie können einen neuen Bitstream erstellen, der übertragen wird, wenn eine bestimmte Farbe getroffen wird. Sie können den Code bearbeiten und es ist effektiv, wenn Sie eingeben. Es startet den Webworker automatisch jedes Mal, wenn Sie ihn ändern.
Sie sollten nur -1 oder +1 ausgeben, da dies alles ist, was der ESP ausgeben kann. Anschließend wird ein DFT mit einem randomisierten Fenster über einen von Ihnen gewählten Frequenzbereich ausgeführt. Erhöhen Sie das DFT -Fenster, und es erhöht Ihr Q (oder Ihre Präzision). Abnahme, es verringert Ihr Q. Dies soll dazu beitragen, zu sehen, wie Empfänger wie der Fernseher das Signal wirklich verstehen und veranschaulichen, wie verrückt das wirklich ist.
Sie können es in Ihrem eigenen Browser mit diesem Link ausprobieren: http://cnlohr.github.io/channel3/web/page/index.html klicken Sie auf NTSC und gehen Sie in die Stadt.
Für alle 3D und Text verwende ich eine neue modifizierte Version meiner "Rawdraw" -Bibliothek (http://github.com/cnlohr/rawdraw) für 3D und die unteren 8 Bit sind die Bruchkomponente.
Um PAL-Sendungen zu ermöglichen, wurden die Timings in der Video_Broadcast-Library (ehemals NTSC_Broadcast) geändert. Da ich dies nur mit einem schwarzen einen weißen Fernseher verwenden wollte und die Farbe der Kumpel tatsächlich ziemlich kompliziert ist, um digital zu tun, habe ich die Broadcast_tables (synthtables.c) nicht geändert. Die Bibliothek sendet also einen KAL-konforme B/W-Signal mit NTSC-Farbinformationen (Art wie NTSC50).
Um PAL Broadcasting zu aktivieren, müssen Sie OPTS += -DPAL
in user.cfg aktivieren.
Hier ist das ursprüngliche YouTube -Video zu diesem Projekt:
Hier ist das neue Video (mit Farbe):