引言
本文设计了一种基于嵌入式Linux的远程图像采集传输系统,该系统无需大面积现场布线,灵活性好,功耗低。
1 系统方案论证
远程无线图像采集传输系统由主节点、分节点和上位机服务器组成。如图1所示,分节点主要包括S3C2440处理器、ZC301P芯片摄像头和nRF24L01无线收发模块;主节点主要包括S5PV210处理器、ZC301P芯片摄像头和nRF24L01无线收发模块;主节点通过因特网或以太网与上位机服务器进行通信。系统设计结构图如图1所示。
图1 系统设计结构图
1.1 主控模块
本方案中主节点控制器采用S5PV210 处理器。S5PV210 是一个32位低功耗、高性能微处理器。S5PV210拥有一个外部存储器接口,能够承受沉重的内存带宽要求的高端通信服务。分节点控制器选用ARM9核的S3C2440处理器、S3C2440具有两个USB主设备接口、一个8通道多路复用ADC、一个16位看门狗定时器、一个1通道多主I2C总线、3通道UART和24个外部中断接口、130多个多功能输入/输出接口和4通道的DMA控制器,为工业自动化方面的应用奠定了基础。
1.2 视频图像采集模块
视频图像采集模块选用基于中星微电子公司ZC301P芯片的USB摄像头。ZC301P摄像头芯片具备强大的功能,在市场上有很大的用户群体,性价比高,包含了图像信号处理(ISP)、数据压缩、JPEG译码等主要图像处理功能。
ZC301P芯片摄像头采用CMOS感光元件,元件像素130万,硬件JPEG压缩方式,图像清晰,画面稳定,色彩真实鲜艳;完全兼容USB2.0 HS与USB1.1协议,最大分辨率800×600DPI。主控模块与摄像头的连接如图2所示。
图2 主控模块与摄像头的连接
1.3 无线收发模块
nRF24L01无线收发模块包括:频率发生器、增强型SchockBurst模式控制器、功率放大器、晶体振荡器、调制器、解调器。通过SPI接口可以对输出功率、频道选择和协议进行设置。当发射功率为-6 dBm时,发射模式下电流消耗为11.3 mA,接收模式下为12.3 mA,所以其电流消耗极低,掉电模式和待机模式下电流消耗更低[4]。
nRF24L01与ARM处理器之间通过标准的SPI接口进行通信,标准的SPI主要包括主机发送从机接收(MOSI)、主机接收从机发送(MISO)、时钟信号(SCK)、片选信号(CSN)共4个信号。然后将nRF24L01的芯片可屏蔽中断引脚(IRQ)、使能信号(CE)分别连接到ARM处理器上的外部中断接口。ARM处理器与无线收发模块的连接电路如图3所示。
图3 主控制器与无线模块接线图
在一个电子系统中,电源的稳定直接影响到系统的安全、可靠、正常运行。本系统中nRF24L01芯片的VCC引脚电压范围为1.9~3.6 V,不能在这个区间之外,超过3.6 V将会烧毁模块,本系统选择3.3 V电压。
2 软件设计
Linux平台下软件开发主要分为应用程序开发和驱动程序开发两部分。Linux应用程序的设计使用C语言进行开发,通过调用底层的驱动程序来实现对硬件设备的读写操作。系统的主节点和分节点的应用程序流程如图4所示。
图4 主节点分节点应用程序流程图
2.1 图像采集部分
2.1.1 ZC301P在Linux下的驱动
Linux内核从Linux2.6.32以后开始支持ZC301P芯片的驱动,所以首先需要配置内核使其支持ZC301P的驱动和USB驱动。首先进入内核根目录打开配置工具:
#cd /home/linux2.6.37
#make menuconfig
进入配置页面后:
Device Drivers -﹥
<*>Multimedia support-﹥
<*>Video For Linux
<*>Video capture adapters-﹥
<*>Enable advanced debug functionality
<*>Enable old-style fixed minor ranges for video devices
<*>V4L USB devices-﹥
<*>USBVideo Class(UVC)
<*>UVC input events device support
<*>GSPCA based webcams-﹥<*>ZC3XX USB Camera Driver
然后配置USB选项:
Device Drivers-﹥
Multimedia support-﹥
<*>Support for Host-side USB
<*>USB announce debug messages
然后退出保存并编译内核:
#make zImage
编译完内核之后,内核目录/arch/arm/boot/下zImage即为编译好的内核,通过下载工具将zImage下载至开发板。重启开发板后内核就自动加载了ZC301P驱动和USB驱动。因为配置USB时设定了有新设备插入后会自动显示调试消息,所以当插入ZC301P摄像头后,PC端串口终端SecureCRT显示如下信息:
new full speed USB device using s3c2410ohci and address 2
usb 11:New USB device found, idVendor=0ac8, idProduct=301b
……
usb 1-1: configuration #1 chosen 1 choice
……
zc3xx: Find Sensor HV7131R(c).
gspca:probe ok
gspca: video0 created
从以上打印信息中可以看出系统已经识别出摄像头ZC301P、sensor HV7131R(c),并且为摄像头创建了设备文件video0。
2.1.2 Mjpgstreamer的移植
Mjpgstreamer是一个免费的开源项目,用来做轻量级的视频服务器。这款工具采用Linux C语言进行开发,代码简洁,组件功能明确,可以移植到不同的计算机平台,遵循GPLv2条款,任何组织和个人可以在此条款内修改或发布这个源码。它使用的是Linux内核提供的v4l2的接口,是一个可以从单一输入组件获取图像并传输到多个输出组件的命令行应用程序。在基于IP协议的网络中,从网络摄像机中获取并传输JPEG格式的图像到浏览器,例如Firefox/Cambozola/Videolanclient,甚至是一个运行了TCPMP播放器的Windows移动设备[7]。
2.2 无线模块驱动程序
Linux设备驱动程序可以分为字符设备驱动、块设备驱动和网络设备驱动,nRF24l01设备驱动程序按照字符设备驱动的模式进行编写。字符设备驱动程序主要包括模块加载函数、卸载函数以及相关设备操作函数。在模块加载函数中主要完成初始化工作,主要包括字符设备的注册及file_operations结构体绑定等。file_operations结构体如下:
static const struct file_operations nrf24l01_fops={
.owner=THIS_MODULE,
.read=nrf24l01_read,
.write=nrf24l01_write,
.open=nrf24l01_open,
.release=nrf24l01_release,
}
驱动程序中nrf24l01_read通过调用copy_to_user把硬件接收到的数据从内核空间传到用户空间。用户空间的应用程序通过read(fd,&RxBuf,sizeof(RxBuf))即可调用驱动程序中的read方法来得到接收到的数据。同理,nrf24l01_write通过调用copy_from_user把用户空间的数据传递到内核空间,然后再驱动中通过硬件将数据发送出去。用户空间的应用程序通过write(fd,&RxBuf,sizeof(RxBuf))即可调用驱动程序中的write方法来发送数据。驱动程序的读方法和写方法略——编者注。
分节点应用程序主要是采集图像数据,对图像数据进行打包处理,添加数据头,然后将数据发送出去。数据头的作用主要是用于标明图像数据是从哪个分节点发送出的。主节点应用程序设计主要对接收到的数据重新进行组合,判断数据从哪个分节点发送来的,重新添加新的数据头,通过网络发送给上位机服务器。
2.3 主节点与上位机通信
Linux环境下通过使用套接字进行网络通信。每个套接字都拥有一个套接字描述符,应用程序可以像操作一个文件一样操作一个套接字。[8]这也正好印证了Linux下一切设备皆文件的思想,网络设备当然也不例外。主节点Linux网络客户端程序与上位机Windows服务器程序设计流程如图5所示。
图5 主节点客户端与上位机服务器通信
2.4 服务器上位机部分
服务器上位机监控软件基于Microsoft Visual C++6.0开发环境开发。VC++6.0是微软公司推出的开发Win32环境程序的面向对象的可视化集成编程系统,其功能之强大和程序开发的稳定性远远超过其他Windows程序开发工具。上位机软件基于MFC编写,采用Socket套接字编程实现以太网口的数据收发,主节点和上位机之间采用TCP协议进行通信。
3 调试和测试
3.1 系统调试
硬件故障的排查主要通过万用表来检查电路的通断以及各个引脚是否达到指定的电压。软件调试的难点和重点在于两个nRF24L01之间的通信,nRF24L01发送方和接收方的通信调试如果同时进行,一定要等到接收方正确收到数据并且回送应答信号之后,发送方才能触发中断。如果出现发送方未触发中断,则很难判断问题出在发送方还是接收方。所以采用的调试方法是先调试发送方,配置一些参数来取消自动应答和自动重发,让发送方成功发送数据后就会触发发送中断。
如果STATUS寄存器的值为0x40,则表明已经接收到数据并触发了接收中断。这样通信基本成功了,但是最后还是要再打开重发和自动应答功能,这样才能保证数据传输的稳定性。
3.2 系统功能测试
连接好硬件设备后,配置编译内核,将编译好的内核通过USB下载到开发板上,然后重启。再将编译好的应用程序通过串口终端下载到开发板上。
图6 建立服务器界面
软件测试时首先在PC机上启动上位机服务器端监控软件,如图6所示。在建立服务器窗口中设置好服务器IP地址和端口号,开始监听并等待客户端主节点的连接。然后启动主节点程序连接上位机服务器,最后启动分节点采集传输程序。系统运行后,采集到的视频图像会不断在上位机软件监控窗口中更新显示,效果如图7所示。
图7 上位机主节点和分节点图像界面
结语
本文介绍了一种基于nRF24L01和ARM组成的无线图像采集传输系统,并详细分析了系统的整体架构和软硬件设计方案,通过编写上位机软件对整个系统进行测试。
实验证实该系统结构简单、灵活性好,能方便快捷地安装到应用场所中;工作稳定、成本低廉,可以有效地实现图像采集及短距离无线传输,有较高的实用价值。