ESP32 复合视频

工作原理

该代码根据此处描述的 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 信号的视频

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注