Step1: 软硬件清单

1. Digilent Arty Z7-20

2. FLIR Lepton 红外摄像头

3. 分线板

4. 软件:Vivado 2016.4


项目选择 Digilent Arty Z7 是因为其板载的 HDMI 输出接口可以方便地将 Lepton 红外摄像头所采集的图像高清输出到显示器端,同时 Arty 系列开发板所特有的 Ardunio 接口,可以方便地连接Lepton 红外摄像头。

Step2: FLIR Lepton 红外摄像头说明

Lepton红外摄像头是一款80x60像素(Lepton 2)或160x120(Lepton 3)长波红外摄像模块。作为一款基于微测辐射热计的热传感器,不像一般的基于HgCdTe的传感器,它不需要低温冷却。相反,当红外辐射击中它时,微测辐射热计就会按照每个像素变化的电阻工作。这个电阻变化定义了场景中的温度。


通常,与冷却成像仪相比,基于微测辐射热计的热成像仪的分辨率大大降低,但其易用性使得开发者能够相对而言更简便地实现热成像系统。

Step3: 红外摄像头的连接与控制

想要在 Arty Z7 开发板上启动 Lepton 红外摄像头,我们需要用到一个分线板,以便于简化电源连接,分离出摄像头的控制与视频接口,并让我们能够将摄像头模块直连在Arty Z7的 Arudino 扩展板接口上。


这一摄像头通过二线接口进行控制,与I2C非常相似。这种相似性使我们能够通过EMIO使用Zynq I2C控制器来向摄像机发出命令。然后摄像头通过 Video over SPI(VoSPI)提供14位视频输出。这一视频接口所使用的是SCLK,CS 与 MISO 信号。理论上,摄像头模块应该是一个从模块。然而,由于我们需要在 VoSPI 传输中为每个像素接收16位数据,因此我们无法使用 Zynq SoC PS端的 SPI 外设,因为后者仅支持8位数据传输。


实际过程中,我们改为使用 Zynq SoC 可编程逻辑端(PL)实例化的 AXI QSPI IP 模块,将之正确配置为使用标准 SPI(这一简单示例向我们展示了 Zynq SoC 非常适合以 I/O 为中心的嵌入式设计。用户可以通过可配置的 IP 模块或一些HDL代码来满足所遇到的任何I/O需求)。通过实现上述功能,我们可以控制分线板上的摄像头模块,并将视频接收到PS存储空间中。

Step4: 创建读取图像并通过HDMI输出的流水线

为了显示接收到的图像,我们需要能够创建一个视频流水线,从PS端的DDR SDRAM读取图像并通过HDMI输出。


最简单的方式是基于Digilent GitHub所提供的Arty Z7-20 HDMI参考设计,并对其进行一些更新优化来实现上述流水线。参考设计的工程源文件可点击左侧“下载代码”获得。


主要的更新部分包括:

1. 添加一个配置为16位标准SPI的AXI QSPI

2. 启用PS端的I2C路由,信号通过EMIO

3. 将I2C和SPI I/O映射到Arty Z7开发板的Arduino扩展板接口


在此基础上,然后我们可以更新Zynq处理器内核上运行的软件来控制摄像头模块,接收VoSPI,并配置HDMI输出通道。


在这一案例中,我已经将摄像头模块插入了分线板,以便Arduino扩展板接口和分线板上的SDA和SCL引脚对齐。这意味着我们可以使用Arduino扩展板接口的IO10至IO13引脚来提供VoSPI。这里不使用IO11,即SPI接口的MOSI,因为该信号在这个项目中并未得到使用。但是,如果我们使用这种方法,Arty Z7上的Arduino扩展板接口无法提供A引脚所需的5V电压,所以我们还必须为分线板和摄像头模块提供额外的电源信号。故而我们将它改为连接到Zynq I/O引脚。实际操作中,我用另一侧Arduino扩展板接口的5V引脚上的电线为Lepton分线板的5V电源输入供电。


随着硬件的启动和运行以及Vivado设计的重建,我们可以打开SDK并根据需要更新软件以显示图像。具体操作将在下一步中分享。

Step5: 软件设计概述

随着硬件的启动和运行以及Vivado设计的重建,下一步是更新软件,以便我们可以接收和显示图像。为此,我们依然可以使用前述的Digilent Arty Z7-20 HDMI输出示例工程,以便正确配置开发板的VDMA输出。我们只需要删除测试图形生成函数并编写我们自己的FLIR控制和输出函数作为替换。


该功能必须执行以下操作:

1. 使用XIICPS配置I2C和SPI外设。为了确保我们可以与Lepton摄像头进行通信,我们需要将I2C地址设置为0x2A,并将SPI配置为CPOL=1,CPHA=1和主操作。

2. 一旦我们可以通过I2C接口进行通信以确定摄像头模块已准备就绪,我们就能够读取状态寄存器了。如果摄像头配置正确并准备就绪,它将以0x06响应。

3. 读出图像并将其存储在存储器中。要做到这一点,我们需要执行几个SPI读取。

4. 将存储的图像移动到由VDMA访问的存储器位置以显示图像。


要从Lepton摄像头模块成功读出图像,我们需要同步VoSPI输出以找到图像中第一行的起始位置。摄像机将每行输出为160字节块(Lepton 2)或两个160字节块(Lepton 3),每个节块都有一个2字节的ID和一个2字节的CRC。我们可以使用这个ID来捕捉图像,识别有效的帧,并将它们存储在图像存储器中。


执行上述操作3和4可以增加屏幕上显示图像的大小。项目中,我们所使用的Lepton 2相机的分辨率只有80水平像素×60垂直像素。这个图像在显示器上显示时会非常小,所以我们可以通过输出每个像素和线条八次,轻松地将图像放大到640x480像素。这种放大方式将产生更大的图像,虽然可能看起来有点块,但在屏幕上更容易识别。


然而,由于我们还没有配置Lepton摄像头模块来优化其输出,单靠缩放并不能提供最佳的图像质量。为了从摄像头模块获得最佳质量的图像,我们需要使用I2C命令接口来启用影响输出图像的对比度和质量的AGC(自动增益控制),以及平场校正以去除像素到像素的变化。


要写入或读回摄像头模块的设置,我们需要创建一个如下所示的数据结构,并将该结构写入摄像头模块。如果我们正在读取设置,则可以执行I2C读取以读取参数。每个16位访问需要两个8位命令:

●  写入地址0x00 0x04的命令字。

●  生成由模块ID,命令ID,类型和保护位形成的命令字数据。它将告知摄像头模块我们想要解决的摄像头元素,以及我们是否希望读取,写入或执行命令。

●  将要读取或写入数据长度寄存器的字数写入地址0x00 0x06。

●  将数据字的数量写入地址0x00 0x08至0x00 0x26。


这一顺序将允许我们配置摄像头模块以便我们获得其最佳性能。当执行更新后的程序时,如上图所示,我会看到自己在显示器屏幕前端拍摄屏幕的身影,且图像按比例放大了8倍。

评论