徐志江,饒 晨,徐 紅,彭 宏
(浙江工業大學 信息工程學院,浙江 杭州 310023)
目前各大高校在單片機及嵌入式的教學方面均開設“單片機原理及應用”“嵌入式系統”等相關課程。通過該方向的課程,學生了解到相關設備的硬件結構、各模塊功能、指令集操作、軟硬件的開發環境、嵌入式系統方面的一些基礎知識,而且大部分的課程是以課堂教學結合動手實驗操作的模式。實驗既鞏固了學生在課堂所學的相關理論知識,又培養了學生對于單片機、嵌入式系統的學習興趣,提高了學生的動手實踐能力,而這對于培養行業企業所需要的高素質應用型工程技術人才,是十分有幫助的。
現有的單片機教學一般采用“理論為主,實驗為輔”的教學模式[1],現在課堂上都是講授單片機的硬件結構、匯編指令、外設的硬件結構及存儲器讀寫等相關知識,然后結合IO控制、AD、DA、中斷、定時器、DMA、I2C、SPI、串口、數碼管、LCD顯示等,做一些驗證性實驗。但是,現有的單片機實驗,必須在電腦上安裝好相應的開發環境,歷經編程、編譯、仿真調試、燒寫以及驗證等多個環節。在整個過程中,單個環節出錯往往會影響整體,哪怕出現一點問題,都必須重新來一遍[2]。也就是說,單片機實驗不能像解釋性語言一樣,在線修改、調試。經驗告訴我們,一個沒有單片機編程經驗的初學者,要想讓芯片跑起來,一旦出現問題,就要對照一兩千頁的英文文檔來排除,這絕非一天兩天學習就可以打下堅實的基礎,而需要長期的經驗積累。而且在實際的實驗教學場景中,一些學生由于編程基礎差,理解實驗模塊代碼較慢,而課堂時間又有限,學生難以感受到單片機實驗所帶來的樂趣,因而失去學習單片機課程的興趣。
Python是一種結合了解釋性、編譯性、互動性和面向對象的腳本語言,擁有極其豐富的Python庫,由于其代碼語言易于理解,操作靈活,使其在許多領域得到廣泛應用,近幾年流行的數據挖掘、科學計算、人工智能以及區塊鏈技術等領域,都可以看到Python的身影[3],甚至在一些高考項目領域,也出現Python的身影。近幾年,北京、浙江等省份的信息技術教材使用簡單易懂的Python語言替代晦澀難懂的VB語言,將Python語言設置為高考內容;山東等省份也將在最新出版的小學信息技術六年級教材加入Python內容。使用Python,只需要學會如何引用各個庫中的模塊,在代碼中實現相應的邏輯即可,免去了很多“重復造輪子”的工作,使編程變得純粹,節省開發時間。
MicroPython是基于Python3語言的一個精簡版實現,擁有自家的解析器、編譯器、虛擬機和類庫等,語法基本與Python一致。軟件底層使用ANSI C進行重構,封裝了C語言中的大部分函數,并且可以在資源受限的環境中運行。用C語言或者MicroPython語言實現相同的功能,MicroPython顯得尤為精簡,例如,MicroPython查看系統文件列表,只需要一行代碼就可以實現,但是C語言實現需要數十行的代碼。MicroPython包含了諸如交互式提示、任意精度整數、關閉、列表解析、生成器、異常處理等高級功能[4]。
在實際生活中,MicroPython也被用在越來越多的工程項目中。Matenat Khamphroo等人,使用支持MicroPython語言的STM32L432KC 168MHz Cortex M4處理器芯片,結合Thread網絡協議,制作了支持無線網絡的教育型移動機器人[5]。該機器人底層的MicroPython代碼結合Blockly(由Google提出的一種可視化編程語言),讓沒有基礎的編程初學者,通過圖形化的方式編寫代碼,實現相對應的功能。林賢煉等人則在物聯網領域使用MicroPython作為編程語言,實現了辦公設備的底層驅動以及上網功能[6]。Sebastian Plamauer等人更是基于復雜的小型衛星發射的軟件源代碼部分,比較了MicroPython和C語言的可讀性,發現并使用MicroPython作為編程語言,讓人們可以更專注于功能實現,明顯提高了代碼的可讀性[7]。文獻[8]是一本講述如何在micro:bit板子上實現開發的經典指導書籍。
MicroPython的流行必將推動著嵌入式系統[9]相關產業的高速發展。隨著嵌入式相關產業的需求不斷擴大,對相關專業人才的需求量也在不斷增加,嵌入式相關專業也會變得越來越熱門。單片機相關教學課程作為嵌入式系統的啟蒙教育,對學生在今后嵌入式系統方面的學習非常重要。因此我們針對現有單片機實驗教學中出現的學生編程基礎差、實驗上手慢、編譯調試耗時長等問題,提出了新的教學方案目標與思路。
考慮到隨著Python編程語言納入高考項目被越來越多的學生所使用,在單片機實驗教學時,因為編程語法的相近,有Python編程語言經驗的學生,在使用MicroPython語言編程時,會更加得心應手。因此我們的教學方案的目標是通過將MicroPython引入到單片機實驗課程中,一方面使學生不再畏懼編程,對于底層設備的操作更容易上手,不再被繁瑣的調試開發流程所困擾,采用MicroPython作為編程語言,學生可以實現在線調試,而無需經歷仿真調試、燒寫等過程。修改完代碼后,可以立即看到實驗結果,使學生更加專注于嵌入式系統設備的學習與操作,享受實驗成功所帶給他們的快感,從而能夠更容易地提升他們對于嵌入式相關課程的興趣,以真正達到實驗輔助理論的效果。另一方面,學生在具備單片機開發的基本知識之后,能夠更容易地深入嵌入式系統方面的學習當中,使其更好地具備現代嵌入式系統開發與研究的能力。
STM32單片機是目前市場上功能強、速度快、資源豐富、支持的型號多、適應性好、庫全面的一款非常適用于教學的單片機。同時,Python基于其跨平臺的特性,可以在Windows、Linux、Mac系統上直接運行。MicroPython結合兩者的長處,配合單片機課程的教學需要,研發制作模塊化、多功能、符合實際需求的單片機實驗裝置以及編寫配套實驗指導書。學生基于此單片機實驗裝置,可以直接進行相關的實驗操作,從而加強學生的學習興趣,進而提高對理論知識的認知、概念的理解,以強化教學效果;同時,對于培養學生的自學能力、創新能力都有重要的意義[10]。
開發板可選用官網(http://micropython.org/)指定的Pyboard,也可以采購國內最早支持MicroPython的專業開發板。
開發板非常簡潔,內嵌了一顆ST公司的Cortex-M4高性能芯片STM32F405RGT6,一顆I2C接口的3軸方向/運動檢測傳感器MMA7660,給整塊開發板供電的一顆LDO芯片,外接一個TF卡槽和USB座,兩顆按鍵,4顆紅、黃、綠、藍的LED指示燈以及CPU引腳接口。Pyboard內置了小型內部文件系統,存儲在微控制器的閃存,路徑是/ fl ash。如果將SD卡插入卡槽,路徑是/sd。Pyboard需要選擇一個文件系統來引導,優先使用/sd,如果沒有SD卡,它會使用內部文件系統/ fl ash作為引導文件系統。也可以根據需要在SD卡上創建空文件/lf ash/SKIPSD,Pyboard將會始終使用內部文件系統啟動。Pyboard把STM32F405RGT6這顆芯片的所有外設功能全部引出。這些管腳既可以用作普通的GPIO口,又可以用于特殊功能的外設,如 AD、DA、SPI、I2C、Timer、CAN、UART等。這些外設的功能全部在MicroPython固件中實現了,只需在Python代碼中調用即可。另外,板子上的RST按鍵用于復位,USR按鍵用于普通的輸入按鍵。RST、USR按鍵結合黃、綠LED指示燈,具有“標準啟動”“安全啟動”和“重置Flash文件系統”這3種啟動模式。當Flash文件系統損壞而導致Pyboard不能正常運行時,可以使用“重置Flash文件系統”模式來修復。
Pyboard板子上的USB具有3個作用。一是USB的5V電壓經過LDO芯片,給整塊開發板供電;二是CPU內置的、至多1MB的Flash中,劃出96KB空間虛擬成可移動的U盤;三是USB轉串口,用戶通過這個虛擬串口實現REPL(Read Eval Print Loop,交互式解釋器)功能。U盤中有4個文件,其中boot.py是開發板啟動時的執行腳本,它設置了開發板的多個選項參數;main.py包含了Python程序的主要腳本,在boot.py運行后被執行;README.txt包含開啟開發板的必要基礎信息;pycdc.inf是USB設備連接的Windows 配置文件。
可以添加的設備包括GPRS、GPS、溫濕度傳感器、蜂鳴器、LCD、Camera等,充分利用Cortex-M4/M7處理器的所有外設功能,能夠完成常用的單片機實驗,如控制LED燈亮滅實驗、PWM呼吸燈實驗、流水燈實驗、ADC實驗、OLED液晶屏顯示實驗、DHT11測試溫度實驗等[11-12]。在此基礎上,結合WiFi、LAN等模塊,輕易地實現多對多的廣域的網絡通信[13]。
通過內嵌的USB轉虛擬串口,MicorPython板與電腦USB相連接,即可進行REPL交互。REPL允許用戶和MicorPython的交互式連接,使用REPL是迄今為止來測試代碼和運行命令的最簡單的方法。如果學生熟悉Python,非常容易上手。
結合單片機相關課程的理論內容,充分考慮嵌入式系統開發的特點,配合不同層次實驗教學的需要,以實踐為主導的立體化方式進行單片機教學,符合學生在學習過程中由淺入深、由易到難、由硬件到軟件、由基礎到綜合、由驗證到創新的規律[10,14]。設計的實驗項目既能用MicroPython快速編寫、調試程序,完成常規的單片機實驗,也能在WiFi、LAN、GPRS、Camera等模塊的支持下,完成基于物聯網思想的實驗[15]。更重要的是,對于科研能力較強的學生,還可以用C語言編寫各種外設的固件,再結合C與Python的接口,把它集成到定制的開發板來。

淺顯、易懂的實驗,以呼吸燈為例,Pyboard上的藍色LED 燈比較特別,在讓其亮滅的同時通過函數intensity()的方法控制其亮度,亮度值在0~255之間。代碼3.1實現了藍色LED循環漸亮然后熄滅的過程,實現了呼吸燈功能。對于其它的LED燈,調用toggle()函數,配合delay(),實現LED燈的閃爍。


Damien打造的MicroPython突破了Python操控底層的限制。如代碼3.2所示,第4、5行直接在訪問RTC外設的寄存器中去掉了寫保護;第7行為Micropython修飾符,表明后續的第8~11行點亮LED燈的函數led_on()采用的是ARM匯編代碼,內嵌匯編與匯編語言非常相似。MircoPython規定寄存器r0視為一個整數,其數值在函數返回時供使用者調用,因為Python所有對象都是整數。


上述幾個例子,均可以直接在REPL下輸入、調試和驗證。雖然Python具有代碼簡潔、編程速度快等優勢,但與C語言相比,其執行的速度要慢很多(可能差100倍),在一些實時性要求很高的情況下,必須采用C語言來編寫。為此,必須修改MicroPython固件,添加相應的功能,然后再在Python代碼中調用。因此,對具有一定創新和科研能力的學生,MicroPython不僅要求掌握Python語言,也需要很好地掌握CPU架構和C語言。以一個協議解析為例說明調用接口。
如代碼3.3所示,該協議函數添加在CPU的UART外設中。函數的入口參數為buf_in,一般以bytearray或者bytes的類型傳入。第4~7行,分析了傳入的類型以及數據長度;第9、10、16、17、27、28和30行表明了解析函數的返回為字典ret,該字典有兩個key,分別是“poor_signal”和“asic_eeg”;其中第17行指出“poor_signal”值為整數10;第12~14行為從傳入的buf_in中讀取數據;第19~28行指出,“asic_eeg”返回的是長度為8的元組tuple,元組中的每個元素值為整數,其值由傳入的buf_in給出;第32行表示analyse()函數有2個入口參數;第36行表示在UART中添加了analyse()這個函數。第39~42行為在REPL中,從串口接收數據,然后調用解析函數的過程。
基于MicroPython的單片機實驗教學,使得單片機容易上手,學生通過MicroPython可以輕松實現對微控制器的控制,這能夠在一定程度上提高學生的興趣。最直觀來說,哪怕對于不懂C語言基礎的學生來說,簡單的控制也非常容易,只需要幾行MicroPython腳本語言,就能實現硬件底層的訪問和控制,如控制LED燈、LCD顯示器、讀取電壓、模擬鼠標等操作,這就讓更多的計算機初學者也能來動手做硬件DIY,完全顛覆了對傳統單片機學習的認知,整個實驗的過程變得簡單明了。
在實驗教材的編寫方面,可以將實驗內容標識為不同層次,加入可選步驟,便于區分選擇。學生可以根據自己相應水平能力與興趣,按不同難度層次自主選擇單片機相關的實驗項目,結合不同的外置傳感器和通信模塊來定制實驗內容,滿足各種學習需求,有助于培養本科生的研究、探索、實踐、創新能力。
近年來,隨著計算機技術以及相關技術的高速發展,嵌入式技術在越來越多的領域發揮著重要的作用,國家、行業企業對嵌入式專業人才的需求也越來越迫切,而各個高校所開設的單片機以及嵌入式相關課程,無疑對人才的培養起到關鍵性的啟蒙作用。將MicroPython與單片機實驗教學相結合,使學生能夠以一種新的模式學習嵌入式編程,更容易將所學的理論與實際相結合。這對于培養學生的動手實踐能力,提高對于新技術的動手開發能力具有重要意義。