工作原理
该代码根据此处描述的 PAL 和 NTSC 标准使用内部 DAC 生成模拟信号。
每个图像由两个半帧(偶数和奇数图像行)组成。空白电平为 ~0.3V(值取决于 PAL/NTSC)。同步是使用一些 0.0V 的脉冲完成的。
下图提供了概览。紫色脉冲实现垂直同步,红色脉冲实现水平同步:
该图像概述了图像行的信号(总共 64µs):
为了生成信号,使用了内部 8 位 DAC,它可以使用 I2S 以非常快的速率生成 0 到 3.3V 之间的电压电平。
由于复合信号定义在 0 到 1V 之间,因此只有 0 到 77 的 DAC 值才有用。这导致图像有 54 个灰度值。
颜色目前没有实现,因为它基于超过 4MHz 的频率。我们可以生成一个仅由两个值组成的 6.66Mhz 的简单信号,但是我们会错过目标频率并且相移会导致随机颜色。然而,这可能会在未来的项目中进行探索。
部分
这里使用的部分是一块 LOLIN32 板。但是任何 ESP32 板都可以使用。
-
从哪里得到它们
这些链接是我能找到的最便宜的链接,也支持我们的工作(附属机构)。我还在那里订购了我的模块
LOLIN32 Board (~$6.90)
但亚马逊和 eBay 上也有便宜的模块:
Amazon.com .ca .de .fr
Ebay .de .fr
示波器在这个项目中非常方便。我真的很喜欢它,请查看:
Amazon.com .de .ca .fr
设置
设置非常简单。引脚 25必须连接到黄色 cinch 连接器的内部并接地到外部。像这样:
代码
代码用 C++ 编写并在 Arduino IDE 中运行。需要 Arduino ESP32 集成来编译代码(请按照此处的说明进行操作:https : //github.com/espressif/arduino-esp32)。
所有代码都可以在这里找到。README 描述了存储库内容:https :
//github.com/bitluni/ESP32CompositeVideo
如果您发现错误或有一些改进,只需在 github 上发送拉取请求……我实际上在那里阅读了我的消息 ????
图像到标题转换器
Image 类使您能够在屏幕上呈现灰度图像,而 Graphics 和 Font 类允许打印文本。
但是,图像值不应超过当前支持的最大灰度值 54。这必须在选择图像之前在转换器中设置。较高的值可用作透明度指标。字体是从 32 开始的 ASCII 字符的图像。检查存储库中字体的 png。字体可以使用最大值 255 进行转换。目前 0 用作背景,任何啤酒用作前景像素。
转换后的图像可以放在项目文件夹中,只需包含在项目中即可。像这样:
#include "luni.h" Image <CompositeGraphics> Monday0 (Monday :: xres, Monday :: yres, Monday :: pixel); ... { 图形开始(0);//清除黑屏 luni0.draw(图形, 200, 10); graphics.end ();
从 github 存储库查看CompositeVideoSimple项目。
3D 引擎
遗憾的是,esp32 上没有多少可用内存。大多数用于图像的前后缓冲区。因此,在合理的分辨率下,Z-Buffer 没有更多空间。
作为一种变通方法,该引擎在深度排序的树中收集三角形并在最后呈现。树的缓冲区占用的空间更少,但计算能力更强。
必须使用创建图形对象(当前)的第三个参数来设置此缓冲区的大小:
CompositeGraphics 图形(XRES、YRES、1337);
该参数描述了将要绘制的三角形的最大数量。由于背面剔除实现了大约的网格。可以绘制两倍的三角形计数。网格本身需要额外的空间用于转换顶点。我总共可以在 CGA (320×200) 分辨率下绘制大约 2k 个三角形的模型,这已经填满了几乎完整的 200kb 可用空间。
STL 到头转换器
这个新版本的 stl 转换器将导出的数据包装在以源文件命名的命名空间中。
转换后的网格可以放置在项目文件夹中,如下所示:
#include "venus.h" Mesh<CompositeGraphics> model(venus::vertexCount, venus::vertices, 0, 0, venus::triangleCount, venus::triangles, venus::triangleNormals); ... { 图形开始(54);//清除屏幕白色 model.transform(transfomationMatrix, rotationMatrix); //变换顶点并旋转法线 模型.drawTriangles(图形,40);// 将 tirangles 入队并对它们进行排序 graphics.flush (); //绘制排序后的三角形 graphics.end ();
文档
类似项目
如果您知道任何类似的项目,请给我留言
我的 AM Radio 发射器。还使用 DAC 和 I2S
My Oscilloscope 作为显示项目。这使用 DAC。但 I2S 用作相机输入。
CNLohr 关于 ESP8266 上 NTSC 信号的视频