俞强1,刘卿卿1,2,董龙3
(1.南京信息工程大学 信息与控制学院,江苏 南京 210044;2. 南京信息工程大学 大气环境与装备技术
协同创新中心,江苏 南京210044;3. 南京信息工程大学 数学与统计学院,江苏 南京 210044)
摘要:对太阳图像数据进行同步采集与分析,可以为辐射测量以及各种需要进行复杂图像算法处理的嵌入式系统提供重要参考。设计了一种能够对太阳图像进行同步数据采集的系统,该系统主要包括图像传感器模块、数据传输与存储模块、上位机软件设计等。利用传感器实现了对太阳图像的采集,通过ARM串口控制数据的读写,并利用MATLAB设计了上位机软件,完成了对采集数据的计算与管理。
关键词:ARM;太阳图像;数据采集;MATLAB
中图分类号:TP391文献标识码:ADOI: 10.19358/j.issn.1674-7720.2017.03.021
引用格式:俞强,刘卿卿,董龙.基于ARM和MATLAB GUI的太阳图像数据采集系统设计[J].微型机与应用,2017,36(3):71-74.
0引言
太阳辐射是自然界中各物理过程的重要能量来源,也是地球表面与大气交换热量的一种形式,可以作为反映气候变化的重要信号。而太阳跟踪装置是散射辐射测量中的一个基本部件,其精确度直接影响散射辐射测量的精度与准确性。
光电式太阳跟踪方法因其结构简单,易于实现,同时具有较高的跟踪精度而被广泛地应用于太阳辐射测量以及太阳能应用等领域。但传统的光电式跟踪方法虽然瞬时跟踪精度较高,但多数采用直接基于嵌入式平台的跟踪方法[13],受限于单片机等主控芯片的计算速度与开发难度,往往不能实时精确地定位太阳质心,易出现累积误差,影响太阳跟踪的稳定性与连续性。因此,本文提出一种基于ARM和MATLAB GUI的太阳图像数据采集系统,以基于ARM Cortex M3的STM32F103为硬件核心,利用CMOS传感器对太阳图像数据进行采集,并且提供可视化的上位机操作界面,对采集到的数据进行存储、分析、计算。本系统不仅可以对太阳图像数据进行实时采集和显示,而且便于扩展和后续对太阳质心图像提取算法的研究,为进一步消除太阳跟踪系统累积误差以及准确测定太阳辐射提供基础。同时,该系统可以为其他需要实现较复杂图像处理的嵌入式系统提供有利的技术参考。
1总体设计
图像数据采集系统总体结构如图1所示。系统由两部分组成:一部分是通过PC与STM32串口实现图像数据的实时通信,另一部分是利用MATLAB GUI完成图像存储及图像处理[4]。
系统下位机负责图像数据的采集,并通过串行接口实时地将图像数据传送回上位机准备进行下一步处理。其中,图像传感器选用OV7725,以实现图像的采集与存储等功能。摄像头模块外接FIFO芯片,存储采集的图像,并在控制信号到来时,由STM32读取FIFO中存储的图像数据。STM32通过CP2102电平转换芯片与PC的USB接图1系统总体结构图2摄像头接口电路口相连,利用芯片将TTL电平与RS232电平转换,完成数据传输功能。
系统的上位机部分负责图像数据的存储与处理。通过调用MATLAB设备控制箱中的serial类,完成对串口的设置,接着根据自定义的传输协议在摄像头与PC串口之间进行实时通信。上位机的串口参数、图像像素等设置均可通过采集系统的GUI界面,根据下位机配置进行修改。对返回的图像数据,可利用MATLAB的图像处理工具箱与直接面向矩阵操作的编程特点,方便地进行分析与处理,获取所需信息。
2硬件设计
2.1摄像头接口电路
鉴于CMOS传感器兼容CMOS技术,内部集成了A/D转换等芯片,简化了外围模块的设计,提高了采集的抗噪声能力,故本系统采用美国Omni Vision公司的CMOS数字图像传感器OV7725。其接口电路原理图如图2所示。OV7725是一个能够提供单片VGA摄像头和影像处理器的所有功能的图像传感器,实际有效像素为640×480,支持整帧输出、子采样、取窗口等模式,支持8/10位图像分辨率,支持包括RAW RGB、RGB(RGB 4:2:2、RGB565/555/444)以及YCbCr(4:2:2)等多种数据格式。其体积小,工作电压低,可以对图像进行伽马曲线、白平衡、饱和度、色度等处理。
在OV7725后端搭载了FIFO来降低对单片机的性能依赖(当前模块对处理器的硬件要求仅仅为一个中断,几个GPIO管脚即可),节省片内资源,方便后续对于单片机功能的扩展。WEN与HREF作为与非门的输入端,而与非门的输出端口连接到FIFO的WE端口。当WEN管脚和HREF管脚都为高电平时,FIFO的WE端口的电平值才为低电平。因此,如果允许图像数据传入FIFO时,可以把WEN拉高,当摄像头的HREF为低电平时,WE的电平值为高电平,因此,即使PCLK仍在运转,也不会传送数据进入FIFO,从而防止采集到无效数据[5]。
2.2串行接口电路
接口电路采用CP2102芯片设计而成。CP2102集成度高,内置USB2.0全速功能控制器、USB收发器、晶体振荡器、EEPROM及异步串行数据总线(UART)。与其他电平转接电路的工作原理类似,CP2102通过驱动程序将PC的USB口虚拟成COM口以达到扩展的目的。电路原理如图3所示。
3软件设计
3.1STM32数据传输流程
将摄像头的场中断信号送入单片机,当单片机捕捉到场中断信号时,拉高WEN管脚电平,之后整幅图像的数据就会存入FIFO。当单片机再次捕捉到场中断时,表明一幅图像已经送入FIFO,此时关闭场中断,拉低WEN电平,防止摄像头数据再次写入FIFO。当上位机发送握手信号之后,开始读取FIFO数据到内存缓冲区,根据采集到的图像做应用处理,并通过串口发送至上位机,发送完成后,再次开启场中断,当再次捕捉到场中断时,再次拉高WEN管脚电平,继续让摄像头数据存入FIFO,完成后单片机等待上位机握手信号,如此循环。
3.2串行通信实现
MATLAB软件的设备控制箱(Instrument Control Toolbox,ICT)提供了对RS232串口通信的正式支持。首先调用设备控制工具箱中的serial类函数,创建用户自定义的串口设备对象。再通过自定义的文件句柄,以文件操作的方式,达到对PC串行口读写操作的目的。
在进行通信之前,需对控制器进行配置,包括设置通信模式(全双工、半双工等)和串行口的通信参数(波特率、数据位、停止位等),使通信设备拥有相同的通信模式和串行通信参数。从通信的建立到结束通信主要包括如下5个基本步骤[6]:
(1)为应用程序创建串口对象。
(2)连接打开串口。
(3)设置或者修改串口通信参数。在能够有效地进行串口通信前,必须设置正确的串口通信参数。
(4)从串口读写数据。在前面三个步骤正常完成后,既可以从串口读数据也可以向串口写数据,也就是接受或者发送数据。实现读串口功能的函数有多个,根据到达串口数据的类型选择合适的读函数。
(5)关闭串口以及释放串口对象在工作空间中占用的存储空间。
基本步骤中参数的设置需要在回调函数中提前初始化,对于不同的STM32程序,需要找到回调函数相应位置进行修改,较为不便,本文中通过对用户的选择值进行读取,从而初始化串口参数,同时添加了中断函数以及数据转换函数。数据传输流程如图4所示。
首先对用户设置的参数进行读取,设置并初始化串口,接着打开串口,发送握手信号0xff。当单片机接收到相应的握手信号后,开始图像传输。当MATLAB接收到终止符 ‘\\n’ 时,表明已成功接收一帧图像,从而触发中断。由于MATLAB接收到的数据是ASCII码字符形式,所以需要将从缓冲区读取到的数据进行格式转换:根据用户设定的像素数M×N,将数据转换成M×N的整形图像矩阵。最后以JPEG图像格式存储于工作区空间中。具体代码如下:
a_temp = [0,0,0,0,0];%定义一个像素值临时存储矩阵
b_count_flag = 1;
c_count_flag = 0;
data = zeros(M,N);%定义图像存储矩阵,M,N为像素数
n = s.BytesAvailable;%读取缓存区中当前图像大小
out = fread(s,n,char);%读取图像
out = char(out);
for a = 1:n
if out(a) ~= 13%判断是否是一帧图像终止符
if out(a) ~= 10%判断是否是单个像素终止符
a_temp(b_count_flag) = int16(out(a) - 48);
b_count_flag = b_count_flag + 1;
end
if out(a) == 10
c_count_flag = c_count_flag + 1;
b_count_flag = b_count_flag - 1;
i = b_count_flag;
while b_count_flag~=0
data(c_count_flag) = a_temp(b_count_flag) * (10^(i - b_count_flag)) + data(c_count_flag);
b_count_flag = b_count_flag - 1;
end
b_count_flag = 1;
end
end
end
%将rgb565格式转化成适合计算机处理的形式
imgR = uint8((255/31)*bitshift(bitand(data,63488),-11));
imgG = uint8((255/63)*bitshift(bitand(data,2016),-5));
imgB = uint8((255/31)*bitand(data,31));
imgRGB = cat(3,imgR,imgG,imgB);
imwrite(imgRGB,Sun.jpg);%存储当前帧
3.3GUI界面布局
利用MATLAB GUIDE开发工具,添加完成必要的控制框,包括静态文本框、弹出式菜单、可编辑文本框、按钮、坐标轴。
完成后的界面如图5所示。界面设计了一般串行通信参数设置按钮,可对波特率、数据位、停止位等数值进行设置,这里根据STM32程序中的对应设置,选择相应的参数。Pixel为像素数的大小,由图像传感器寄存器中的相应设置来选择接收像素数。方形静态文本框显示当前执行状态。坐标轴(axes1)显示当前接收到的图像。右边打开串口(open serial)完成串口参数的读取设置,并发送握手信号。发送控制信号(send control signal)通过串口发送控制信号给伺服电机,完成精确的太阳定位跟踪。关闭(close)按钮释放串口对象在MATLAB工作区中占用的存储空间,并退出应用。
4实验
设置波特率为115 200,数据位8 bit,停止位1 bit,无奇偶校验位,像素数为240×240。图片以45 s为周期进行刷新,满足预期。太阳图像显示结果如图6所示。
5结论
针对目前太阳辐射测量中的跟踪系统累积误差较大、速度较慢等问题,提出了一种基于MATLAB与ARM的太阳图像采集系统。该系统可以直观、快速地显示当前系统的运行状态与太阳的实时变化,使控制过程可视化。同时,上位机采用MATLAB编程实现,可以利用软件本身的图像处理方法与工具箱,为下一步太阳质心提取算法的开发提供良好的平台,可大大节省开发时间。GUI程序发布后,移植方便,无需安装MATLAB软件,可在任意一台PC上以静态或动态的图像处理结果,驱动电机等执行器,实现高精度的太阳跟踪自动控制。
参考文献
[1] 陈丽娟, 周鑫. 基于ARM嵌入式图像处理平台的太阳跟踪系统[J]. 现代电子技术, 2012, 35(4): 71-74.
[2] 刘丽微. 基于视觉的太阳光线自动跟踪装置[D]. 沈阳:沈阳工业大学, 2008.
[3] 任松林. 主动式太阳跟踪及驱动系统研究与设计[D]. 重庆:重庆大学, 2008.
[4] 薛飞, 杨友良, 孟凡伟, 等. 基于Matlab GUI串口通信的实时温度监控系统设计[J]. 计算机应用, 2014, 34(1): 292-296.
[5] 刘火良,杨森. STM32库开发实战指南[M]. 北京:机械工业出版社,2013.
[6] 王战军, 沈明. 基于MATLAB GUI的串口通信编程实现[J]. 现代电子技术, 2010, 39(9): 38-40.