MicroPython用于单片机实验教学新模式的设计与研究
2019-04-01徐志江
徐志江,饶 晨,徐 红,彭 宏
(浙江工业大学 信息工程学院,浙江 杭州 310023)
1 现有单片机实验教学存在的问题
目前各大高校在单片机及嵌入式的教学方面均开设“单片机原理及应用”“嵌入式系统”等相关课程。通过该方向的课程,学生了解到相关设备的硬件结构、各模块功能、指令集操作、软硬件的开发环境、嵌入式系统方面的一些基础知识,而且大部分的课程是以课堂教学结合动手实验操作的模式。实验既巩固了学生在课堂所学的相关理论知识,又培养了学生对于单片机、嵌入式系统的学习兴趣,提高了学生的动手实践能力,而这对于培养行业企业所需要的高素质应用型工程技术人才,是十分有帮助的。
现有的单片机教学一般采用“理论为主,实验为辅”的教学模式[1],现在课堂上都是讲授单片机的硬件结构、汇编指令、外设的硬件结构及存储器读写等相关知识,然后结合IO控制、AD、DA、中断、定时器、DMA、I2C、SPI、串口、数码管、LCD显示等,做一些验证性实验。但是,现有的单片机实验,必须在电脑上安装好相应的开发环境,历经编程、编译、仿真调试、烧写以及验证等多个环节。在整个过程中,单个环节出错往往会影响整体,哪怕出现一点问题,都必须重新来一遍[2]。也就是说,单片机实验不能像解释性语言一样,在线修改、调试。经验告诉我们,一个没有单片机编程经验的初学者,要想让芯片跑起来,一旦出现问题,就要对照一两千页的英文文档来排除,这绝非一天两天学习就可以打下坚实的基础,而需要长期的经验积累。而且在实际的实验教学场景中,一些学生由于编程基础差,理解实验模块代码较慢,而课堂时间又有限,学生难以感受到单片机实验所带来的乐趣,因而失去学习单片机课程的兴趣。
2 MicroPython介绍
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板子上实现开发的经典指导书籍。
3 基于MicroPython的单片机实验教学
3.1 实验教学改革思路与方案
MicroPython的流行必将推动着嵌入式系统[9]相关产业的高速发展。随着嵌入式相关产业的需求不断扩大,对相关专业人才的需求量也在不断增加,嵌入式相关专业也会变得越来越热门。单片机相关教学课程作为嵌入式系统的启蒙教育,对学生在今后嵌入式系统方面的学习非常重要。因此我们针对现有单片机实验教学中出现的学生编程基础差、实验上手慢、编译调试耗时长等问题,提出了新的教学方案目标与思路。
考虑到随着Python编程语言纳入高考项目被越来越多的学生所使用,在单片机实验教学时,因为编程语法的相近,有Python编程语言经验的学生,在使用MicroPython语言编程时,会更加得心应手。因此我们的教学方案的目标是通过将MicroPython引入到单片机实验课程中,一方面使学生不再畏惧编程,对于底层设备的操作更容易上手,不再被繁琐的调试开发流程所困扰,采用MicroPython作为编程语言,学生可以实现在线调试,而无需经历仿真调试、烧写等过程。修改完代码后,可以立即看到实验结果,使学生更加专注于嵌入式系统设备的学习与操作,享受实验成功所带给他们的快感,从而能够更容易地提升他们对于嵌入式相关课程的兴趣,以真正达到实验辅助理论的效果。另一方面,学生在具备单片机开发的基本知识之后,能够更容易地深入嵌入式系统方面的学习当中,使其更好地具备现代嵌入式系统开发与研究的能力。
STM32单片机是目前市场上功能强、速度快、资源丰富、支持的型号多、适应性好、库全面的一款非常适用于教学的单片机。同时,Python基于其跨平台的特性,可以在Windows、Linux、Mac系统上直接运行。MicroPython结合两者的长处,配合单片机课程的教学需要,研发制作模块化、多功能、符合实际需求的单片机实验装置以及编写配套实验指导书。学生基于此单片机实验装置,可以直接进行相关的实验操作,从而加强学生的学习兴趣,进而提高对理论知识的认知、概念的理解,以强化教学效果;同时,对于培养学生的自学能力、创新能力都有重要的意义[10]。
3.2 简约但不简单的MicroPython开发板
开发板可选用官网(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,非常容易上手。
3.3 层次化实验内容设计
结合单片机相关课程的理论内容,充分考虑嵌入式系统开发的特点,配合不同层次实验教学的需要,以实践为主导的立体化方式进行单片机教学,符合学生在学习过程中由浅入深、由易到难、由硬件到软件、由基础到综合、由验证到创新的规律[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中,从串口接收数据,然后调用解析函数的过程。
3.4 MicroPython实验教学的特色
基于MicroPython的单片机实验教学,使得单片机容易上手,学生通过MicroPython可以轻松实现对微控制器的控制,这能够在一定程度上提高学生的兴趣。最直观来说,哪怕对于不懂C语言基础的学生来说,简单的控制也非常容易,只需要几行MicroPython脚本语言,就能实现硬件底层的访问和控制,如控制LED灯、LCD显示器、读取电压、模拟鼠标等操作,这就让更多的计算机初学者也能来动手做硬件DIY,完全颠覆了对传统单片机学习的认知,整个实验的过程变得简单明了。
在实验教材的编写方面,可以将实验内容标识为不同层次,加入可选步骤,便于区分选择。学生可以根据自己相应水平能力与兴趣,按不同难度层次自主选择单片机相关的实验项目,结合不同的外置传感器和通信模块来定制实验内容,满足各种学习需求,有助于培养本科生的研究、探索、实践、创新能力。
4 结语
近年来,随着计算机技术以及相关技术的高速发展,嵌入式技术在越来越多的领域发挥着重要的作用,国家、行业企业对嵌入式专业人才的需求也越来越迫切,而各个高校所开设的单片机以及嵌入式相关课程,无疑对人才的培养起到关键性的启蒙作用。将MicroPython与单片机实验教学相结合,使学生能够以一种新的模式学习嵌入式编程,更容易将所学的理论与实际相结合。这对于培养学生的动手实践能力,提高对于新技术的动手开发能力具有重要意义。