俞強(qiáng)1,劉卿卿1,2,董龍3
?。?.南京信息工程大學(xué) 信息與控制學(xué)院,江蘇 南京 210044;2. 南京信息工程大學(xué) 大氣環(huán)境與裝備技術(shù)
協(xié)同創(chuàng)新中心,江蘇 南京210044;3. 南京信息工程大學(xué) 數(shù)學(xué)與統(tǒng)計(jì)學(xué)院,江蘇 南京 210044)
摘要:對(duì)太陽圖像數(shù)據(jù)進(jìn)行同步采集與分析,可以為輻射測(cè)量以及各種需要進(jìn)行復(fù)雜圖像算法處理的嵌入式系統(tǒng)提供重要參考。設(shè)計(jì)了一種能夠?qū)μ枅D像進(jìn)行同步數(shù)據(jù)采集的系統(tǒng),該系統(tǒng)主要包括圖像傳感器模塊、數(shù)據(jù)傳輸與存儲(chǔ)模塊、上位機(jī)軟件設(shè)計(jì)等。利用傳感器實(shí)現(xiàn)了對(duì)太陽圖像的采集,通過ARM串口控制數(shù)據(jù)的讀寫,并利用MATLAB設(shè)計(jì)了上位機(jī)軟件,完成了對(duì)采集數(shù)據(jù)的計(jì)算與管理。
關(guān)鍵詞:ARM;太陽圖像;數(shù)據(jù)采集;MATLAB
中圖分類號(hào):TP391文獻(xiàn)標(biāo)識(shí)碼:ADOI: 10.19358/j.issn.1674-7720.2017.03.021
引用格式:俞強(qiáng),劉卿卿,董龍.基于ARM和MATLAB GUI的太陽圖像數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2017,36(3):71-74.
0引言
太陽輻射是自然界中各物理過程的重要能量來源,也是地球表面與大氣交換熱量的一種形式,可以作為反映氣候變化的重要信號(hào)。而太陽跟蹤裝置是散射輻射測(cè)量中的一個(gè)基本部件,其精確度直接影響散射輻射測(cè)量的精度與準(zhǔn)確性。
光電式太陽跟蹤方法因其結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn),同時(shí)具有較高的跟蹤精度而被廣泛地應(yīng)用于太陽輻射測(cè)量以及太陽能應(yīng)用等領(lǐng)域。但傳統(tǒng)的光電式跟蹤方法雖然瞬時(shí)跟蹤精度較高,但多數(shù)采用直接基于嵌入式平臺(tái)的跟蹤方法[13],受限于單片機(jī)等主控芯片的計(jì)算速度與開發(fā)難度,往往不能實(shí)時(shí)精確地定位太陽質(zhì)心,易出現(xiàn)累積誤差,影響太陽跟蹤的穩(wěn)定性與連續(xù)性。因此,本文提出一種基于ARM和MATLAB GUI的太陽圖像數(shù)據(jù)采集系統(tǒng),以基于ARM Cortex M3的STM32F103為硬件核心,利用CMOS傳感器對(duì)太陽圖像數(shù)據(jù)進(jìn)行采集,并且提供可視化的上位機(jī)操作界面,對(duì)采集到的數(shù)據(jù)進(jìn)行存儲(chǔ)、分析、計(jì)算。本系統(tǒng)不僅可以對(duì)太陽圖像數(shù)據(jù)進(jìn)行實(shí)時(shí)采集和顯示,而且便于擴(kuò)展和后續(xù)對(duì)太陽質(zhì)心圖像提取算法的研究,為進(jìn)一步消除太陽跟蹤系統(tǒng)累積誤差以及準(zhǔn)確測(cè)定太陽輻射提供基礎(chǔ)。同時(shí),該系統(tǒng)可以為其他需要實(shí)現(xiàn)較復(fù)雜圖像處理的嵌入式系統(tǒng)提供有利的技術(shù)參考。
1總體設(shè)計(jì)
圖像數(shù)據(jù)采集系統(tǒng)總體結(jié)構(gòu)如圖1所示。系統(tǒng)由兩部分組成:一部分是通過PC與STM32串口實(shí)現(xiàn)圖像數(shù)據(jù)的實(shí)時(shí)通信,另一部分是利用MATLAB GUI完成圖像存儲(chǔ)及圖像處理[4]。
系統(tǒng)下位機(jī)負(fù)責(zé)圖像數(shù)據(jù)的采集,并通過串行接口實(shí)時(shí)地將圖像數(shù)據(jù)傳送回上位機(jī)準(zhǔn)備進(jìn)行下一步處理。其中,圖像傳感器選用OV7725,以實(shí)現(xiàn)圖像的采集與存儲(chǔ)等功能。攝像頭模塊外接FIFO芯片,存儲(chǔ)采集的圖像,并在控制信號(hào)到來時(shí),由STM32讀取FIFO中存儲(chǔ)的圖像數(shù)據(jù)。STM32通過CP2102電平轉(zhuǎn)換芯片與PC的USB接圖1系統(tǒng)總體結(jié)構(gòu)圖2攝像頭接口電路口相連,利用芯片將TTL電平與RS232電平轉(zhuǎn)換,完成數(shù)據(jù)傳輸功能。
系統(tǒng)的上位機(jī)部分負(fù)責(zé)圖像數(shù)據(jù)的存儲(chǔ)與處理。通過調(diào)用MATLAB設(shè)備控制箱中的serial類,完成對(duì)串口的設(shè)置,接著根據(jù)自定義的傳輸協(xié)議在攝像頭與PC串口之間進(jìn)行實(shí)時(shí)通信。上位機(jī)的串口參數(shù)、圖像像素等設(shè)置均可通過采集系統(tǒng)的GUI界面,根據(jù)下位機(jī)配置進(jìn)行修改。對(duì)返回的圖像數(shù)據(jù),可利用MATLAB的圖像處理工具箱與直接面向矩陣操作的編程特點(diǎn),方便地進(jìn)行分析與處理,獲取所需信息。
2硬件設(shè)計(jì)
2.1攝像頭接口電路
鑒于CMOS傳感器兼容CMOS技術(shù),內(nèi)部集成了A/D轉(zhuǎn)換等芯片,簡(jiǎn)化了外圍模塊的設(shè)計(jì),提高了采集的抗噪聲能力,故本系統(tǒng)采用美國Omni Vision公司的CMOS數(shù)字圖像傳感器OV7725。其接口電路原理圖如圖2所示。OV7725是一個(gè)能夠提供單片VGA攝像頭和影像處理器的所有功能的圖像傳感器,實(shí)際有效像素為640×480,支持整幀輸出、子采樣、取窗口等模式,支持8/10位圖像分辨率,支持包括RAW RGB、RGB(RGB 4:2:2、RGB565/555/444)以及YCbCr(4:2:2)等多種數(shù)據(jù)格式。其體積小,工作電壓低,可以對(duì)圖像進(jìn)行伽馬曲線、白平衡、飽和度、色度等處理。
在OV7725后端搭載了FIFO來降低對(duì)單片機(jī)的性能依賴(當(dāng)前模塊對(duì)處理器的硬件要求僅僅為一個(gè)中斷,幾個(gè)GPIO管腳即可),節(jié)省片內(nèi)資源,方便后續(xù)對(duì)于單片機(jī)功能的擴(kuò)展。WEN與HREF作為與非門的輸入端,而與非門的輸出端口連接到FIFO的WE端口。當(dāng)WEN管腳和HREF管腳都為高電平時(shí),F(xiàn)IFO的WE端口的電平值才為低電平。因此,如果允許圖像數(shù)據(jù)傳入FIFO時(shí),可以把WEN拉高,當(dāng)攝像頭的HREF為低電平時(shí),WE的電平值為高電平,因此,即使PCLK仍在運(yùn)轉(zhuǎn),也不會(huì)傳送數(shù)據(jù)進(jìn)入FIFO,從而防止采集到無效數(shù)據(jù)[5]。
2.2串行接口電路
接口電路采用CP2102芯片設(shè)計(jì)而成。CP2102集成度高,內(nèi)置USB2.0全速功能控制器、USB收發(fā)器、晶體振蕩器、EEPROM及異步串行數(shù)據(jù)總線(UART)。與其他電平轉(zhuǎn)接電路的工作原理類似,CP2102通過驅(qū)動(dòng)程序?qū)C的USB口虛擬成COM口以達(dá)到擴(kuò)展的目的。電路原理如圖3所示。
3軟件設(shè)計(jì)
3.1STM32數(shù)據(jù)傳輸流程
將攝像頭的場(chǎng)中斷信號(hào)送入單片機(jī),當(dāng)單片機(jī)捕捉到場(chǎng)中斷信號(hào)時(shí),拉高WEN管腳電平,之后整幅圖像的數(shù)據(jù)就會(huì)存入FIFO。當(dāng)單片機(jī)再次捕捉到場(chǎng)中斷時(shí),表明一幅圖像已經(jīng)送入FIFO,此時(shí)關(guān)閉場(chǎng)中斷,拉低WEN電平,防止攝像頭數(shù)據(jù)再次寫入FIFO。當(dāng)上位機(jī)發(fā)送握手信號(hào)之后,開始讀取FIFO數(shù)據(jù)到內(nèi)存緩沖區(qū),根據(jù)采集到的圖像做應(yīng)用處理,并通過串口發(fā)送至上位機(jī),發(fā)送完成后,再次開啟場(chǎng)中斷,當(dāng)再次捕捉到場(chǎng)中斷時(shí),再次拉高WEN管腳電平,繼續(xù)讓攝像頭數(shù)據(jù)存入FIFO,完成后單片機(jī)等待上位機(jī)握手信號(hào),如此循環(huán)。
3.2串行通信實(shí)現(xiàn)
MATLAB軟件的設(shè)備控制箱(Instrument Control Toolbox,ICT)提供了對(duì)RS232串口通信的正式支持。首先調(diào)用設(shè)備控制工具箱中的serial類函數(shù),創(chuàng)建用戶自定義的串口設(shè)備對(duì)象。再通過自定義的文件句柄,以文件操作的方式,達(dá)到對(duì)PC串行口讀寫操作的目的。
在進(jìn)行通信之前,需對(duì)控制器進(jìn)行配置,包括設(shè)置通信模式(全雙工、半雙工等)和串行口的通信參數(shù)(波特率、數(shù)據(jù)位、停止位等),使通信設(shè)備擁有相同的通信模式和串行通信參數(shù)。從通信的建立到結(jié)束通信主要包括如下5個(gè)基本步驟[6]:
?。?)為應(yīng)用程序創(chuàng)建串口對(duì)象。
?。?)連接打開串口。
?。?)設(shè)置或者修改串口通信參數(shù)。在能夠有效地進(jìn)行串口通信前,必須設(shè)置正確的串口通信參數(shù)。
?。?)從串口讀寫數(shù)據(jù)。在前面三個(gè)步驟正常完成后,既可以從串口讀數(shù)據(jù)也可以向串口寫數(shù)據(jù),也就是接受或者發(fā)送數(shù)據(jù)。實(shí)現(xiàn)讀串口功能的函數(shù)有多個(gè),根據(jù)到達(dá)串口數(shù)據(jù)的類型選擇合適的讀函數(shù)。
?。?)關(guān)閉串口以及釋放串口對(duì)象在工作空間中占用的存儲(chǔ)空間。
基本步驟中參數(shù)的設(shè)置需要在回調(diào)函數(shù)中提前初始化,對(duì)于不同的STM32程序,需要找到回調(diào)函數(shù)相應(yīng)位置進(jìn)行修改,較為不便,本文中通過對(duì)用戶的選擇值進(jìn)行讀取,從而初始化串口參數(shù),同時(shí)添加了中斷函數(shù)以及數(shù)據(jù)轉(zhuǎn)換函數(shù)。數(shù)據(jù)傳輸流程如圖4所示。
首先對(duì)用戶設(shè)置的參數(shù)進(jìn)行讀取,設(shè)置并初始化串口,接著打開串口,發(fā)送握手信號(hào)0xff。當(dāng)單片機(jī)接收到相應(yīng)的握手信號(hào)后,開始圖像傳輸。當(dāng)MATLAB接收到終止符 ‘\\n’ 時(shí),表明已成功接收一幀圖像,從而觸發(fā)中斷。由于MATLAB接收到的數(shù)據(jù)是ASCII碼字符形式,所以需要將從緩沖區(qū)讀取到的數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換:根據(jù)用戶設(shè)定的像素?cái)?shù)M×N,將數(shù)據(jù)轉(zhuǎn)換成M×N的整形圖像矩陣。最后以JPEG圖像格式存儲(chǔ)于工作區(qū)空間中。具體代碼如下:
a_temp = [0,0,0,0,0];%定義一個(gè)像素值臨時(shí)存儲(chǔ)矩陣
b_count_flag = 1;
c_count_flag = 0;
data = zeros(M,N);%定義圖像存儲(chǔ)矩陣,M,N為像素?cái)?shù)
n = s.BytesAvailable;%讀取緩存區(qū)中當(dāng)前圖像大小
out = fread(s,n,char);%讀取圖像
out = char(out);
for a = 1:n
if out(a) ~= 13%判斷是否是一幀圖像終止符
if out(a) ~= 10%判斷是否是單個(gè)像素終止符
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格式轉(zhuǎn)化成適合計(jì)算機(jī)處理的形式
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);%存儲(chǔ)當(dāng)前幀
3.3GUI界面布局
利用MATLAB GUIDE開發(fā)工具,添加完成必要的控制框,包括靜態(tài)文本框、彈出式菜單、可編輯文本框、按鈕、坐標(biāo)軸。
完成后的界面如圖5所示。界面設(shè)計(jì)了一般串行通信參數(shù)設(shè)置按鈕,可對(duì)波特率、數(shù)據(jù)位、停止位等數(shù)值進(jìn)行設(shè)置,這里根據(jù)STM32程序中的對(duì)應(yīng)設(shè)置,選擇相應(yīng)的參數(shù)。Pixel為像素?cái)?shù)的大小,由圖像傳感器寄存器中的相應(yīng)設(shè)置來選擇接收像素?cái)?shù)。方形靜態(tài)文本框顯示當(dāng)前執(zhí)行狀態(tài)。坐標(biāo)軸(axes1)顯示當(dāng)前接收到的圖像。右邊打開串口(open serial)完成串口參數(shù)的讀取設(shè)置,并發(fā)送握手信號(hào)。發(fā)送控制信號(hào)(send control signal)通過串口發(fā)送控制信號(hào)給伺服電機(jī),完成精確的太陽定位跟蹤。關(guān)閉(close)按鈕釋放串口對(duì)象在MATLAB工作區(qū)中占用的存儲(chǔ)空間,并退出應(yīng)用。
4實(shí)驗(yàn)
設(shè)置波特率為115 200,數(shù)據(jù)位8 bit,停止位1 bit,無奇偶校驗(yàn)位,像素?cái)?shù)為240×240。圖片以45 s為周期進(jìn)行刷新,滿足預(yù)期。太陽圖像顯示結(jié)果如圖6所示。
5結(jié)論
針對(duì)目前太陽輻射測(cè)量中的跟蹤系統(tǒng)累積誤差較大、速度較慢等問題,提出了一種基于MATLAB與ARM的太陽圖像采集系統(tǒng)。該系統(tǒng)可以直觀、快速地顯示當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)與太陽的實(shí)時(shí)變化,使控制過程可視化。同時(shí),上位機(jī)采用MATLAB編程實(shí)現(xiàn),可以利用軟件本身的圖像處理方法與工具箱,為下一步太陽質(zhì)心提取算法的開發(fā)提供良好的平臺(tái),可大大節(jié)省開發(fā)時(shí)間。GUI程序發(fā)布后,移植方便,無需安裝MATLAB軟件,可在任意一臺(tái)PC上以靜態(tài)或動(dòng)態(tài)的圖像處理結(jié)果,驅(qū)動(dòng)電機(jī)等執(zhí)行器,實(shí)現(xiàn)高精度的太陽跟蹤自動(dòng)控制。
參考文獻(xiàn)
?。?] 陳麗娟, 周鑫. 基于ARM嵌入式圖像處理平臺(tái)的太陽跟蹤系統(tǒng)[J]. 現(xiàn)代電子技術(shù), 2012, 35(4): 71-74.
?。?] 劉麗微. 基于視覺的太陽光線自動(dòng)跟蹤裝置[D]. 沈陽:沈陽工業(yè)大學(xué), 2008.
?。?] 任松林. 主動(dòng)式太陽跟蹤及驅(qū)動(dòng)系統(tǒng)研究與設(shè)計(jì)[D]. 重慶:重慶大學(xué), 2008.
?。?] 薛飛, 楊友良, 孟凡偉, 等. 基于Matlab GUI串口通信的實(shí)時(shí)溫度監(jiān)控系統(tǒng)設(shè)計(jì)[J]. 計(jì)算機(jī)應(yīng)用, 2014, 34(1): 292-296.
[5] 劉火良,楊森. STM32庫開發(fā)實(shí)戰(zhàn)指南[M]. 北京:機(jī)械工業(yè)出版社,2013.
[6] 王戰(zhàn)軍, 沈明. 基于MATLAB GUI的串口通信編程實(shí)現(xiàn)[J]. 現(xiàn)代電子技術(shù), 2010, 39(9): 38-40.