謝作如



● 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庫一定會越來越好用,會助力我國乃至全球的信息技術教育的發展,讓更多的孩子愛上編程,愛上開源硬件。