让开源硬件的选择不再成为难题

    谢作如

    

    

    

    ● pinpong库的起源

    2020年初,笔者受清华大学出版社的委托,组建团队来编写初中的信息技术教材。按照主编樊磊教授的要求,教材中不仅要涉及人工智能、数据科学,还要加入物联网和开源硬件等知识。这时笔者发现,教材中应该使用哪一款开源硬件,已经成为一道难题。

    1.开源硬件大盘点

    据不完全统计,目前市场上有一百多种开源硬件,其中在中小学市场占有率较高的有Arduino、micro:bit、掌控板等,这些开源硬件支持的编程语言和工具如表1所示。

    从表1中会发现,树莓派、虚谷号、拿铁熊猫和pcDuino等开源硬件,因为都采用了性能较好的芯片,能够运行标准的Linux操作系统,所以能够支持Python语言,支持Python idle之类任何一款能够运行Linux的Python IDE。而Arduino、micro:bit和掌控板这三种市场占有率最高的开源硬件,都不支持Python。这些硬件中共同支持的编程工具,只有Arduino IDE。

    Arduino的兴起,是因为其采用了标准的编程规范,简化了单片机的开发难度,毕竟创客教育面向的是非专业人群。但是Arduino IDE采用的是C/C++,在开发难度上比Python要高很多。当中小学的主流编程转向Python后,大家不得不重新寻求一种新的解决方案。因而,MicroPython一出现,就很快成为开源硬件编程语言中的热点。micro:bit和掌控板的一夜成名,MU、BXY和mPython等工具的先后面世,并且写入国家教材,正是因为其顺应了中小学编程语言发展的潮流。

    2.选择开源硬件难在哪里

    不同的开源硬件采用了不同的芯片,其支持的编程语言和编程工具也各自不同,甚至连引脚编号和支持的扩展模块也不同。Arduino的优势在于其外部扩展资源多,掌控板的优势在于它能够便捷联网,虚谷号的优势在于它支持标准的Python,那么究竟是选择Arduino、micro:bit还是选择掌控板、虚谷号呢?

    除了Arduino IDE外,有沒有一种编程语言,用统一的编程规范来控制不同的开源硬件?答案肯定是有的,那就是新兴的Mind+、Kittenbot等图形化编程工具。因为类似Scratch、Blockly的图形化代码最终会“转化”为相应的代码,如Arduino代码或者MicroPython代码。这样就降低了编程的门槛,同样的代码规范,在不同的硬件上都通用。

    3.开发pinpong库的可行性分析

    笔者为什么选择用开发Python库的形式,而不是开发一个全新的编程语言,主要有如下几点理由。

    (1)Python已经成为中小学主流编程语言

    Python虽然古老,但因为开源而与时俱进。作为一个为非专业用户设计的编程语言,Python类似Shell,让用户不需要过多关注算法之外的细节,淡化了界面设计,成为培养学生计算思维的最好工具之一。可以肯定,接下来从初中开始,主流的编程语言一定是Python。那么用扩展库的方式,让Python又多了一项功能,是最主流也是最合理的一种选择。

    (2)用Python控制开源硬件已经有一定的基础

    据了解,早在2014年就有创客团队在开发一个名叫pingo的Python库。其初衷也是希望为Raspberry Pi、BeagleBone Black、pcDuino和伽利略等开源硬件的编程提供统一的API,就像Python DBAPI为Python中的数据库编程提供了统一的API一样。只是很可惜,这个项目在四年前停止了开发。除此之外,为Arduino设计的Python库还有多个,如pyfirmata和PyMata,以及虚谷号的xugu库等。

    (3)能运行Python的开源硬件将越来越普及

    继树莓派之后,越来越多的“派”系列产品被设计出来,如pcDuino、香蕉派和香橙派等,这些开源硬件的价格越来越亲民,因此,与其想方设法用MicroPython的方式去兼容单片机,还不如直接用Python代码去控制开源硬件。这样一来,Python的各种“无所不能”的库都可以用起来。

    ● pinpong库的规划

    如何设计一个Python库?笔者首先确定了这个库的第一目标人群是中小学生,是初学者。其次,考虑到micro:bit和掌控板都支持MicroPython,那这个库要兼容它们的语法。因此,这个库需要具备代码简洁、语法灵活和使用简单三大特点。

    1.工作原理

    pinpong库选择的方案是使用标准的Python代码来控制开源硬件,这和MicroPython的做法不一样。MicroPython是借用了Python的语法风格,最终会编译为C语言。而Python中大量的库都要经过重新编写才能使用。

    那么,如何通过pinpong来控制开源硬件呢?笔者借助了一个通用的串口通信协议Firmata。开源硬件会输入一个特定的固件,计算机发送命令给开源硬件,开源硬件执行命令后再反馈信息给计算机,这个过程的速度很快,如同直接控制开源硬件一样。

    2.支持硬件

    pinpong库将支持市场上绝大多数的开源硬件。pinpong库的设计,是为了让开发者在开发过程中不用被繁杂的硬件型号所束缚,而将重点转移到软件的实现。哪怕程序编写初期用Arduino开发,部署时改成了掌控板,只要修改一下硬件的参数就能正常运行,实现了“一次编写处处运行”。

    从表1可以看出,开源硬件的品牌虽然很多,但基本上可以分为Arduino(涵盖了拿铁熊猫和虚谷号等)、ESP32(包括ESP8266和掌控板等)、micro:bit和树莓派(涵盖了pcDuino和banana派等)这四个类别。笔者给这些开源硬件分别起了一个“别名”,即board_name,如下页表2所示。目前,pinpong库已经支持Arduino、虚谷号和掌控板,其他的开源硬件支持已经在规划中。

    3.基本用法

    如何让代码更加简洁,并且容易理解?以Arduino UNO为例,下页表3中的代码将点亮Arduino板载的LED灯(D13引脚)。

    从上述代码可以看出,初始化硬件只要正确输入硬件的品牌和型号即可。如果端口号省略,pinpong会自动扫描本机可用的所有串口,然后给硬件烧录特定的固件。这样一来,开源硬件的入门门槛降到了最低:只需要能辨别开源硬件的型号,并且知道其引脚的正确编号。

    4.基础对象

    pinpong的基础对象分为四种,分别为Board、Pin、Servo和I2C,具体说明如表4。

    控制I/O引脚,是开源硬件的最核心的功能。pinpong库中将引脚模式分为四种,分别为Pin.IN(输?模式)、Pin.OUT(输出模式)、Pin.ANALOG(模拟输入模式)和Pin.PWM(模拟输出模式)。不同的引脚模式,对应不同的读写方法,具体如表5所示。

    ● 结束语

    笔者很幸运地遇上了一个非常专业的创客团队,因而在短短的时间内,pinpong库成形并开始测试。笔者在0.3版上通过基本的功能测试,体验非常好。就在启动pinpong项目的这段时间内,笔者了解到更多人的需求,也越来越体会到开发pinpong库的价值。

    也许pinpong库还有很多不完善之处,但是笔者相信,有这么多一线教师和专业研发团队的支持,pinpong库一定会越来越好用,会助力我国乃至全球的信息技术教育的发展,让更多的孩子爱上编程,爱上开源硬件。