王寅文,易文淏,易宇琦,張 輝,鄭子豪
(哈爾濱商業(yè)大學(xué),黑龍江 哈爾濱 150028)
隨著世界逐步進入信息化時代,計算機技術(shù)已運用在生活的方方面面,而我國更是計算機技術(shù)的大國。在這樣的時代背景下,讓青少年從小接觸編程教育就顯得尤為重要。正是基于這樣的需求,此外通過研究國內(nèi)外類似產(chǎn)品,例如 SCRACTH、ardublock等,發(fā)現(xiàn)了市面上現(xiàn)存的圖形編程平臺或只局限線上編程,或單單利用了arduino或者樹莓派等硬件平臺進行開發(fā)。類似arduino這樣的硬件平臺很少用于實際工業(yè)以及嵌入式項目的專業(yè)開發(fā)。為了彌補這一不足,同時使學(xué)習(xí)過程更加完善,因此本文采用STM32作為硬件平臺,使學(xué)習(xí)者能夠更接近實際工程的開發(fā),培養(yǎng)其計算思維。本文使用C++作為編程語言,硬件系統(tǒng)以 STM32作為核心處理器,以Qt作為UI界面的工具架構(gòu)。
本文通過搭建一個宿主機上運行的圖形編程平臺,用戶可以通過此平臺熟悉編程,并且通過軟件平臺控制兩個硬件子平臺的運動狀態(tài)來實際檢驗自己的編程成果,并且在硬件平臺上加入多種外圍設(shè)備,以提高軟件編程的趣味性與多樣性。
本文將軟件平臺分為前臺設(shè)計與后臺設(shè)計。前臺設(shè)計指利用QT軟件編程的UI界面,其主要作用是面向使用者展現(xiàn)易于上手的編程界面,通過圖形化的編程方式,得到“所見即所得”的編程效果。而后臺設(shè)計主要指利用C++編程語言實現(xiàn)對STM32的控制,利用相應(yīng)程序進入STM32的BootLoader,將編寫好的程序燒錄至芯片中,通過硬件平臺完成相應(yīng)的功能。
本文將主窗口界面劃分為三個部分,即畫布部件,語句設(shè)計部件和工具部件。在畫布部件中,分割的子窗口提供出用戶想要做的事情,用戶根據(jù)自己的當(dāng)時想法選擇并進入該事件中,用戶點擊語句后語句顯示在語句設(shè)計窗口中并對語句進行排序,不論用戶是否拼接正確,都會彈出消息框來提示用戶,消息框本文采取以卡通人物或者其他的形式彈出,不同的消息框會出現(xiàn)不同的形式,從而吸引用戶的興趣。若用戶拼接成功,在恭喜用戶之后,用戶可以將程序燒入致硬件平臺中,以此來實現(xiàn)相關(guān)的功能。否則,會彈出失敗的對話框來提醒用戶拼接失敗,并在下面的消息框中顯示出用戶拼接錯誤的地方。
在整個主窗口顯示過程中,平臺會插入背景動態(tài)圖,在其他的子窗口本文也會插入相應(yīng)的背景圖,在拼接過程中,每一步都要有相應(yīng)的背景音樂,并擁有不同的效果音。本文采用類似于闖關(guān)的形式設(shè)置編程難度,分別不同學(xué)習(xí)能力的用戶。
本文在使用Qt軟件進行實際設(shè)計中,將各部分類別以及功能進行了詳細的劃分:
(1)主窗口類
主窗口類的基本元素有菜單欄,狀態(tài)欄、工具
欄,錨接部件和中心部件。主窗口中可以部署其他子窗口,而本文在主窗口中部署了三個子窗口,分別為畫布部件,語句設(shè)計部件和工具部件。

圖1 Qt界面布局Fig.1 Qt interface layout
(2)工具部件
本文通過在主窗口中添加子窗口并命名為工具部件,主要完成設(shè)置鼠標拖拽事件,即用戶將要拖拽的代碼條框所在區(qū),在此窗口中的程序可以拖拽但不可修改。以及繪制場景,本文會在此子窗口中單獨繪制其專屬場景。
(3)畫布部件
本文在主窗口中添加子窗口并命名為畫布部件,主要完成繪制場景,本文會在此子窗口中單獨繪制其專屬場景;以及功能選擇,用戶可以在此窗口中選擇想要小車實現(xiàn)的功能并再點擊后將相關(guān)的代碼條框在工具部件中顯示。
(4)語句設(shè)計部件
本文通過在主窗口中添加子窗口并命名為語句設(shè)計部件,用以實現(xiàn)設(shè)置拖拽事件,用戶可以在此界面中用鼠標對程序進行拖拽排序。手動添加代碼,用戶可以在此界面中補全程序所缺內(nèi)容或自己敲寫代碼。
(5)記錄行為類
即用戶在語句設(shè)計中拼接成功的可實現(xiàn)小車功能的完整程序。
使用Qt完成軟件前臺設(shè)計理論框圖如圖2所示。
此外本文還通過unity實現(xiàn)來軟件前臺的制作。首先編寫坐標變換函數(shù),通過模塊對于攝像機的方向來計算被拖動模塊在單位向量上的法向量,從而將屏幕坐標轉(zhuǎn)換為世界坐標,再將鼠標的屏幕坐標通過以上函數(shù)也轉(zhuǎn)換成世界坐標,獲得鼠標點擊位置的坐標點,然后賦值給模塊。最后計算獲取鼠標拖拽后的坐標以及物體與鼠標間的偏移量實現(xiàn)模塊的拖動功能。

圖2 Qt理論框圖Fig.2 Qt theoretical block diagram
通過計算模塊間重心的相對距離向量、最小間距與上下高度判斷從而改變世界坐標,亦或加入碰撞檢測以實現(xiàn)模塊聯(lián)動間的拖動插入調(diào)整。將程序指令塊以字符串的形式封裝在各自的模塊里,順序拼接模塊完善程序、實現(xiàn)功能。
通過對Qt以及unity的對比,由于Qt的方便性以及專用性,本文最終選擇使用Qt軟件進行軟件前臺的設(shè)計。
本文將軟件后臺設(shè)計為主要完成對用戶的圖形模塊程序的編譯、綜合、下載,可以分為以下幾步。
1.2.1 模塊編譯
在本文中,系統(tǒng)使用模塊C語言文本映射法,完成圖形模塊到C語言的轉(zhuǎn)換,主要完成以下幾個工作。
(1)確定模塊的邏輯位置
將模塊分為兩個類別,一個是為位于程序主干的非填充類,和位于循環(huán)和選擇語句中的填充類,每一個填充類對于其中的選擇循環(huán)語句又屬于非填充類,這樣語句就有了層層鏈條的關(guān)系,對于同屬于一個類別的模塊們,使用指針將其串成鏈表,這樣就確定了模塊的邏輯順序。
(2)循環(huán)與代碼填充
通過循環(huán)與選擇后的關(guān)鍵字確定循環(huán)與選擇語句的尾部,填充到尾前即可。
(3)參數(shù)修改
用戶通過接口為字符串修改參數(shù)
(4)邏輯查錯
由于已經(jīng)對代碼進行了封裝,一定程度上不會存在語法錯誤,而只有邏輯上的錯誤。
(5)字符串拼接
同樣通過關(guān)鍵字確定每個模塊的字符串的尾部,然后根據(jù)這個位置按順序拼接字符串。

圖3 模塊邏輯位置確定示意圖Fig.3 Schematic diagram of module logical position determination
1.2.2 C語言文件綜合
用戶使用特別定制編譯器完成C語言到匯編語言再到hex文件的轉(zhuǎn)換,編譯器是專門為STM32單片機設(shè)計的,符合STM32的配置習(xí)慣。
1.2.3 將HEX轉(zhuǎn)換bin文件并通過串口下載到單片機中
先將Hex文件轉(zhuǎn)化為bin文件,然后根據(jù)STM32的 Bootloader協(xié)議使用動態(tài)庫 STMBLLIB.dll與STUARTBLLIB.dll完成下載工作,具體步驟如圖4。

圖4 文件轉(zhuǎn)換燒錄示意圖Fig.4 Schematic diagram of file conversion and programing
本文將硬件平臺分為兩個子平臺,一個是智能小車平臺,另一個是無人機平臺。兩個平臺的主控制芯片都為STM32。通過前文所述的軟件平臺將編譯好的程序直接燒錄其中,通過小車以及無人機的相應(yīng)動作來驗證程序的正確性。
STM32是由ST公司開發(fā)的32位微控制器,該芯片內(nèi)核是由ARM公司推出的全新的基于ARMv7架構(gòu)的32位Cortex-M3微控制器內(nèi)核,并由ST公司添加了相應(yīng)的外圍設(shè)備。而STM32憑借其產(chǎn)品的多樣化、極高的性價比,簡單易用的開發(fā)方式脫穎而出,在現(xiàn)代嵌入式設(shè)計中起著不可替代的作用。
本文使用 STM32F103ZET6作為智能小車的控制芯片,通過添加光電傳感器、超聲波測距以及電機驅(qū)動芯片等外圍設(shè)備,實現(xiàn)上位機程序在硬件上的運行。使青少年在學(xué)習(xí)編程中,能夠直觀地檢查所編寫的程序邏輯與語法是否有錯誤,此外,還能通過小車不同的行為模式來激發(fā)青少年學(xué)習(xí)興趣,達到寓教于樂的作用。
智能小車的運動采用 PWM控制電機驅(qū)動芯片L293D,即脈寬調(diào)制方式來控制小車的前進與轉(zhuǎn)向。
STM32F103ZET6包含 8個定時器,其中有 2個高級定時器,6個通用定時器;其中一個定時器擁有4路通道,每一路通道可以輸出4路占空比不同的 PWM波,這極大的簡化了小車的控制。本文利用TIM2定時器,輸出4路PWM波,通過選用相應(yīng)引腳是否開啟復(fù)用功能以確定小車前進方向;利用差速轉(zhuǎn)向的原理控制小車的左右;同時改變PWM波的占空比來調(diào)整小車的運動速度,達到了比較良好的小車運動狀態(tài)。

圖5 輸出四路不同占空比的PWM波Fig.5 Output four PWM waves with different duty cycles
同時再利用其它不同的傳感器,例如光電傳感器,通過對光線的反射而達到避障或巡線的功能;或者使用其它傳感器通過直接與 MCU相連或者使用IIC、SPI等協(xié)議進行通信,可以使小車完成許多實驗與測試,可以讓使用者充分發(fā)揮主觀能動性,從而提高平臺編程的多樣性與趣味性。
本文著重介紹如何實現(xiàn)無人機子平臺的飛行姿態(tài)解算過程。其他外圍設(shè)備則可通過IIC,SPI等通信協(xié)議進行添加,實現(xiàn)不同的功能。
本文通過STM32讀取MPU60506個原始數(shù)據(jù),即加速度計測得的三軸的加速度與陀螺儀測得的角速度。通過加速度和角速度都可以得到Pitch和Roll角(加速度不能得到Y(jié)aw角)[13],但MPU6050的加速度計和陀螺儀各有優(yōu)缺點,三軸的加速度值可以直接通過正切運算得到傾角,但是包含待測物運動震動時產(chǎn)生的噪聲,使得誤差較大;陀螺儀對外界振動影響小,精度高,通過對角速度積分可以得到傾角,但是會隨著時間累計,產(chǎn)生的誤差越大。因此,不能單獨使用MPU6050的加速度計或陀螺儀來得到傾角[13],需要采取姿態(tài)融合的方法,盡量減小噪聲。常見的姿態(tài)融合算法有四元數(shù)解算,一階互補濾波,二階互補濾波,卡爾曼濾波等。
姿態(tài)解算后,得到歐拉角,其對時間求導(dǎo)即得到角速度,然后利用串行PID算法對電機進行PWM控制。
內(nèi)外環(huán)PID(式1)算法如下:

其中,εθ為當(dāng)前角度誤差,θe為期望角度,θn當(dāng)前角度, Pout為外環(huán)PID的P項輸出, K pout為外環(huán)PID的P項系數(shù), εθ(t )為當(dāng)前角度誤差,Iout為外環(huán)PID的I項輸出,K iout為外環(huán)PID的I項參數(shù),PIDout為外環(huán)PID輸出。
內(nèi)環(huán)PID(式2):

其中, εω( t )為當(dāng)前角速度誤差, ωn(t )為當(dāng)前角速度, Pin為內(nèi)環(huán)PID的P項輸出, 為內(nèi)環(huán)PID的P項參數(shù), Iin為內(nèi)環(huán)PID的I項輸出, K iin為內(nèi)環(huán)PID的I項參數(shù),Din為內(nèi)環(huán)PID的D項輸出,K din為內(nèi)環(huán)PID的D項參數(shù),P IDin為內(nèi)環(huán)PID的輸出。

圖6 串行PID控制方框圖Fig.6 Block diagram of serial PID control
本文通過研究模塊化編程以及建立軟件與硬件之間的相互聯(lián)系,找到了有效的編程燒錄方法,通過軟件編程的圖示化,有效的達到了“所見即所得”的編程目標,同時也與硬件教具相聯(lián)系,能夠較好地支持與輔導(dǎo)青少年的編程學(xué)習(xí)。但在如何提高平臺的編程趣味性以及簡化軟硬件平臺之間的下載與通信有著較大的研究空間。