孔德肖,張晴暉,李俊萩,鄧祥忠,秦明明,鐘麗輝
(西南林業(yè)大學(xué)大數(shù)據(jù)與智能工程學(xué)院,云南昆明 650224)
智能車(chē),也稱(chēng)為輪式機(jī)器人,適合應(yīng)用于人類(lèi)無(wú)法或較困難工作的環(huán)境。例如,可應(yīng)用于無(wú)人生產(chǎn)線,災(zāi)后救援,無(wú)人倉(cāng)庫(kù),地形勘測(cè),服務(wù)機(jī)器人等領(lǐng)域[1]。選擇手機(jī)作為智能車(chē)的遠(yuǎn)程控制端是最便捷的[2]。本設(shè)計(jì)使用Android手機(jī)端對(duì)智能小車(chē)的行駛方向及行進(jìn)路線進(jìn)行控制,同時(shí)顯示小車(chē)采集的環(huán)境視頻。本系統(tǒng)具有很好的便捷性和易用性,在智能家居安防方面具有實(shí)用價(jià)值[3]。
圖1 系統(tǒng)總體框架圖
圖1為本設(shè)計(jì)的系統(tǒng)總體框架圖,由單片機(jī)、樹(shù)莓派和Android手機(jī)端組成[4-6]。STM32F103RCT6單片機(jī)接收手機(jī)端發(fā)送的控制指令,處理后對(duì)電機(jī)驅(qū)動(dòng)板進(jìn)行控制,從而實(shí)現(xiàn)小車(chē)的前進(jìn)后退以及轉(zhuǎn)向;與MPU6050角度傳感器模塊連接讀取出小車(chē)姿態(tài)的原始數(shù)據(jù)并進(jìn)行處理,將處理后的數(shù)據(jù)加入PID控制以實(shí)現(xiàn)小車(chē)走直線,同時(shí)將每個(gè)時(shí)刻小車(chē)的姿態(tài)數(shù)據(jù)顯示在OLED顯示器上。樹(shù)莓派用于在小車(chē)行進(jìn)過(guò)程中進(jìn)行視頻拍攝,并將視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸?shù)紸ndroid手機(jī)端進(jìn)行顯示。Android手機(jī)端程序基于Android Stduio平臺(tái)進(jìn)行開(kāi)發(fā),實(shí)現(xiàn)了用戶(hù)與小車(chē)的交互,用戶(hù)可以通過(guò)虛擬按鍵、語(yǔ)音識(shí)別、重力感應(yīng)方式對(duì)小車(chē)進(jìn)行控制,同時(shí)查看小車(chē)行進(jìn)過(guò)程中采集的視頻信息。
圖2所示是STM32單片機(jī)供電電路,使用LM1117將外部接入的5 V電壓轉(zhuǎn)化成為3.3 V的電壓給STM32單片機(jī)供電。
直流電機(jī)功率較大,不能直接與單片機(jī)進(jìn)行連接,而且直流電機(jī)在轉(zhuǎn)動(dòng)時(shí)存在回流,如果直接與單片機(jī)連接會(huì)燒壞單片機(jī)管腳,嚴(yán)重時(shí)還會(huì)使整個(gè)單片機(jī)最小系統(tǒng)都被燒壞。本次設(shè)計(jì)采用圖3所示的直流電機(jī)驅(qū)動(dòng)電路,通過(guò)單片機(jī)管腳輸出的PWM信號(hào)對(duì)電機(jī)轉(zhuǎn)速進(jìn)行控制,可以保證電機(jī)工作所需的功率,同時(shí)又保護(hù)單片機(jī)不被損壞。
圖2 單片機(jī)電源供電電路
圖3 電機(jī)驅(qū)動(dòng)電路
直流電機(jī)驅(qū)動(dòng)電路使用2片IR2104半橋電機(jī)驅(qū)動(dòng)芯片,通過(guò)74LS08與門(mén)芯片根據(jù)輸入端來(lái)控制其中一片IR2104半橋電機(jī)驅(qū)動(dòng)工作。當(dāng)Ctrl-A管腳輸入為高電平,Ctrl-B管腳輸入為低電平時(shí),PWM信號(hào)被送到左側(cè)IR2104電機(jī)驅(qū)動(dòng)芯片上,4個(gè)MOS管形成的H橋驅(qū)動(dòng)電路中Q2和Q4導(dǎo)通,電機(jī)正轉(zhuǎn);當(dāng)Ctrl-A管腳輸入為低電平,Ctrl-B管腳輸入為高電平時(shí),PWM信號(hào)被送到右側(cè)IR2104電機(jī)驅(qū)動(dòng)芯片上,4個(gè)MOS管形成的H橋驅(qū)動(dòng)電路中Q3和Q1導(dǎo)通,電機(jī)反轉(zhuǎn)。電機(jī)驅(qū)動(dòng)邏輯如表1所示,當(dāng)PWM輸入的占空比為0時(shí),電機(jī)處于停止?fàn)顟B(tài)[3]。當(dāng)PWM輸入的占空比為0~100之間時(shí),可以使用控制管腳來(lái)控制電機(jī)正轉(zhuǎn)、反轉(zhuǎn)和停止。
圖4所示為核心控制器與其他硬件模塊的連接圖,以STM32F103RCT6作為控制器和數(shù)據(jù)處理器,外圍連接MPU6050模塊、OLED顯示模塊、WiFi模塊、E3F-DS30C4測(cè)距模塊、電機(jī)驅(qū)動(dòng)板、攝像頭舵機(jī)和電機(jī)編碼器。
MPU6050模塊用于測(cè)量小車(chē)姿態(tài)的原始數(shù)據(jù);MPU6050模塊初始化成功后,OLED顯示模塊即顯示
表1 電機(jī)驅(qū)動(dòng)邏輯表
圖4 STM32與外圍硬件系統(tǒng)連接圖
小車(chē)每個(gè)時(shí)刻的姿態(tài)數(shù)據(jù);WiFi模塊實(shí)現(xiàn)單片機(jī)與Android手機(jī)的連接;電機(jī)驅(qū)動(dòng)板用于控制電機(jī)轉(zhuǎn)速和小車(chē)轉(zhuǎn)向;電機(jī)編碼器用于測(cè)量車(chē)輪轉(zhuǎn)速和所轉(zhuǎn)圈數(shù);ESF-DS30C4紅外測(cè)距模塊用于實(shí)現(xiàn)小車(chē)避障;攝像頭舵機(jī)控制攝像頭的轉(zhuǎn)向。
手機(jī)端可以設(shè)置小車(chē)自動(dòng)行走的距離,圖5所示是控制小車(chē)走固定距離的流程圖。通過(guò)采集得到車(chē)輪旋轉(zhuǎn)圈數(shù)乘以車(chē)輪周長(zhǎng)來(lái)控制小車(chē)所行走的距離。本設(shè)計(jì)通過(guò)記錄電機(jī)編碼器的值,而后轉(zhuǎn)換得到車(chē)輪旋轉(zhuǎn)圈數(shù)。經(jīng)過(guò)測(cè)量,該系統(tǒng)的小車(chē)輪子直徑為d=6.5 cm,小車(chē)周長(zhǎng)為C=3.14d,輪子每轉(zhuǎn)一圈對(duì)應(yīng)780個(gè)編碼器值,所以計(jì)算小車(chē)所走距離公式為:X=N/780×C,N為記錄的電機(jī)編碼器值,將計(jì)算得到的X和Android手機(jī)端設(shè)定的距離值進(jìn)行比較,如果相等,則小車(chē)停止,否則定時(shí)器繼續(xù)記錄編碼器的值直到小車(chē)停止。
圖5 小車(chē)走固定距離流程圖
控制小車(chē)走直線很有必要,因?yàn)槿粜≤?chē)電機(jī)存在性能差異,會(huì)導(dǎo)致小車(chē)行走偏離直線。控制小車(chē)走直線主要有2種方法:直接使用電機(jī)編碼器的值進(jìn)行控制,但是此法在使用PID調(diào)節(jié)時(shí)不穩(wěn)定,不易實(shí)現(xiàn);另一種方法是通過(guò)使用角度傳感器獲得小車(chē)的偏航角,從而控制小車(chē)走直線。本系統(tǒng)采用了更易實(shí)現(xiàn)PID控制的第2種方法。如圖6所示,首先通過(guò)MPU6050角度傳感器獲得小車(chē)的初始偏航角,然后使用四元數(shù)算法得到小車(chē)行走過(guò)程中每個(gè)時(shí)刻的偏航角,再與初始偏航角進(jìn)行差值計(jì)算,放入PID控制器分別對(duì)左右兩側(cè)電機(jī)的轉(zhuǎn)速進(jìn)行控制,從而實(shí)現(xiàn)小車(chē)走直線。
圖6 小車(chē)走直線流程圖
四元數(shù)的表示式為:
q=[w,x,y,z]T|q|2=w2+x2+y2+z2=1
(1)
式中:w為實(shí)數(shù);(x,y,z)為三維空間向量。
通過(guò)四元數(shù)轉(zhuǎn)化得到歐拉角過(guò)程如下:
首先,通過(guò)旋轉(zhuǎn)軸和繞該軸旋轉(zhuǎn)的角度可以構(gòu)造一個(gè)四元數(shù),根據(jù)旋轉(zhuǎn)角度得到四元數(shù)。其中α表示旋轉(zhuǎn)角度,cos(βx)、cos(βy)、cos (βz)表示旋轉(zhuǎn)軸在X、Y、Z方向上的分量,如式(2)所示。
w=cos(α/2),x=cos(βx)·sin(α/2)y=cos(βy)·sin(α/2),z=cos(βz)·sin(α/2)
(2)
然后,將四元數(shù)轉(zhuǎn)換成為歐拉角[7-8]。其中Roll、Yaw、Pitch分別表示物體繞x、y、z軸旋轉(zhuǎn)的角度,如式(3)所示。
Roll=atan(2(wx+yz),1-2(x2+y2)) Yaw=arcsin(2(wy-zx)) Pitch=atan(2(wz+xy),1-2(y2+z2))
(3)
Android手機(jī)端使用Java語(yǔ)言編程,基于Android Studio平臺(tái)開(kāi)發(fā)[9-10]。用戶(hù)在手機(jī)端首先選擇控制模式(分為按鍵控制、語(yǔ)音控制、重力感應(yīng)控制),然后控制小車(chē)的速度及方向,同時(shí)查看小車(chē)采集并上傳的實(shí)時(shí)視頻。
圖7所示為手機(jī)端控制界面,虛擬按鍵模式和重力感應(yīng)控制模式可以控制小車(chē)前進(jìn)、后退和轉(zhuǎn)向,語(yǔ)音控制模式主要用來(lái)控制小車(chē)行走固定距離和小車(chē)轉(zhuǎn)動(dòng)固定角度[11]。視頻按鈕可以加載實(shí)時(shí)視頻畫(huà)面,2個(gè)進(jìn)度條分別調(diào)節(jié)攝像頭進(jìn)行水平轉(zhuǎn)動(dòng)和垂直轉(zhuǎn)動(dòng),加速和減速按鈕進(jìn)行速度調(diào)節(jié),發(fā)送按鈕進(jìn)行控制命令的發(fā)送。
圖7 Android手機(jī)端控制界面
圖8 智能小車(chē)實(shí)物圖
本設(shè)計(jì)的視頻采集智能小車(chē)實(shí)物如圖8所示。經(jīng)測(cè)試,該系統(tǒng)性能穩(wěn)定,用戶(hù)可以用手機(jī)控制小車(chē)行走,且在手機(jī)端可查看小車(chē)采集的現(xiàn)場(chǎng)視頻。
手機(jī)端虛擬按鍵模式下可以通過(guò)按鍵來(lái)發(fā)送指令到單片機(jī),來(lái)控制小車(chē)轉(zhuǎn)向、后退和前進(jìn)。當(dāng)前進(jìn)按鈕或后退按鈕一直被按下時(shí),小車(chē)前進(jìn)或后退,當(dāng)放開(kāi)按鍵時(shí),小車(chē)停止;當(dāng)轉(zhuǎn)向按鈕被按下時(shí),小車(chē)執(zhí)行轉(zhuǎn)向動(dòng)作,按下的時(shí)間越長(zhǎng),轉(zhuǎn)向的角度越大,放開(kāi)按鍵時(shí)小車(chē)停止轉(zhuǎn)向。
手機(jī)端重力模式下可以通過(guò)傾斜手機(jī)來(lái)控制小車(chē)前進(jìn)、后退和轉(zhuǎn)向。手機(jī)前傾時(shí)小車(chē)前進(jìn);手機(jī)后仰時(shí),小車(chē)后退;手機(jī)向左切斜時(shí)小車(chē)左轉(zhuǎn),手機(jī)向右傾斜時(shí)小車(chē)右轉(zhuǎn);手機(jī)處于水平狀態(tài)時(shí)小車(chē)停止。
表2是語(yǔ)音識(shí)別發(fā)送數(shù)據(jù)表,如果語(yǔ)音識(shí)別轉(zhuǎn)換為字符串與已定義的語(yǔ)音數(shù)據(jù)幀匹配,則調(diào)用數(shù)據(jù)發(fā)送線程進(jìn)行控制命令的發(fā)送,如果不匹配則通過(guò)語(yǔ)音提醒用戶(hù)進(jìn)行重新輸入。在該模式下,可以通過(guò)語(yǔ)音控制小車(chē)行走的固定距離和固定角度,測(cè)試結(jié)果如表3和表4所示。
表2 語(yǔ)音識(shí)別發(fā)送數(shù)據(jù)表
表3 小車(chē)走固定距離測(cè)試表
表4 小車(chē)轉(zhuǎn)固定角度測(cè)試表
本文設(shè)計(jì)的智能小車(chē)使用STM32單片機(jī)作為核心控制器,Android手機(jī)端作為用戶(hù)控制端,樹(shù)莓派實(shí)時(shí)拍攝監(jiān)控視頻。經(jīng)過(guò)測(cè)試,本系統(tǒng)的硬件部分和軟件部分具有良好的協(xié)調(diào)性,小車(chē)能夠即時(shí)執(zhí)行Android手機(jī)端發(fā)送的各種控制指令,實(shí)時(shí)視頻傳輸具有良好實(shí)時(shí)性和穩(wěn)定性。