謝作如
● pinpong庫的起源
2020年初,筆者受清華大學(xué)出版社的委托,組建團隊來編寫初中的信息技術(shù)教材。按照主編樊磊教授的要求,教材中不僅要涉及人工智能、數(shù)據(jù)科學(xué),還要加入物聯(lián)網(wǎng)和開源硬件等知識。這時筆者發(fā)現(xiàn),教材中應(yīng)該使用哪一款開源硬件,已經(jīng)成為一道難題。
1.開源硬件大盤點
據(jù)不完全統(tǒng)計,目前市場上有一百多種開源硬件,其中在中小學(xué)市場占有率較高的有Arduino、micro:bit、掌控板等,這些開源硬件支持的編程語言和工具如表1所示。
從表1中會發(fā)現(xiàn),樹莓派、虛谷號、拿鐵熊貓和pcDuino等開源硬件,因為都采用了性能較好的芯片,能夠運行標(biāo)準(zhǔn)的Linux操作系統(tǒng),所以能夠支持Python語言,支持Python idle之類任何一款能夠運行Linux的Python IDE。而Arduino、micro:bit和掌控板這三種市場占有率最高的開源硬件,都不支持Python。這些硬件中共同支持的編程工具,只有Arduino IDE。
Arduino的興起,是因為其采用了標(biāo)準(zhǔn)的編程規(guī)范,簡化了單片機的開發(fā)難度,畢竟創(chuàng)客教育面向的是非專業(yè)人群。但是Arduino IDE采用的是C/C++,在開發(fā)難度上比Python要高很多。當(dāng)中小學(xué)的主流編程轉(zhuǎn)向Python后,大家不得不重新尋求一種新的解決方案。因而,MicroPython一出現(xiàn),就很快成為開源硬件編程語言中的熱點。micro:bit和掌控板的一夜成名,MU、BXY和mPython等工具的先后面世,并且寫入國家教材,正是因為其順應(yīng)了中小學(xué)編程語言發(fā)展的潮流。
2.選擇開源硬件難在哪里
不同的開源硬件采用了不同的芯片,其支持的編程語言和編程工具也各自不同,甚至連引腳編號和支持的擴展模塊也不同。Arduino的優(yōu)勢在于其外部擴展資源多,掌控板的優(yōu)勢在于它能夠便捷聯(lián)網(wǎng),虛谷號的優(yōu)勢在于它支持標(biāo)準(zhǔn)的Python,那么究竟是選擇Arduino、micro:bit還是選擇掌控板、虛谷號呢?
除了Arduino IDE外,有沒有一種編程語言,用統(tǒng)一的編程規(guī)范來控制不同的開源硬件?答案肯定是有的,那就是新興的Mind+、Kittenbot等圖形化編程工具。因為類似Scratch、Blockly的圖形化代碼最終會“轉(zhuǎn)化”為相應(yīng)的代碼,如Arduino代碼或者MicroPython代碼。這樣就降低了編程的門檻,同樣的代碼規(guī)范,在不同的硬件上都通用。
3.開發(fā)pinpong庫的可行性分析
筆者為什么選擇用開發(fā)Python庫的形式,而不是開發(fā)一個全新的編程語言,主要有如下幾點理由。
(1)Python已經(jīng)成為中小學(xué)主流編程語言
Python雖然古老,但因為開源而與時俱進。作為一個為非專業(yè)用戶設(shè)計的編程語言,Python類似Shell,讓用戶不需要過多關(guān)注算法之外的細節(jié),淡化了界面設(shè)計,成為培養(yǎng)學(xué)生計算思維的最好工具之一??梢钥隙ǎ酉聛韽某踔虚_始,主流的編程語言一定是Python。那么用擴展庫的方式,讓Python又多了一項功能,是最主流也是最合理的一種選擇。
(2)用Python控制開源硬件已經(jīng)有一定的基礎(chǔ)
據(jù)了解,早在2014年就有創(chuàng)客團隊在開發(fā)一個名叫pingo的Python庫。其初衷也是希望為Raspberry Pi、BeagleBone Black、pcDuino和伽利略等開源硬件的編程提供統(tǒng)一的API,就像Python DBAPI為Python中的數(shù)據(jù)庫編程提供了統(tǒng)一的API一樣。只是很可惜,這個項目在四年前停止了開發(fā)。除此之外,為Arduino設(shè)計的Python庫還有多個,如pyfirmata和PyMata,以及虛谷號的xugu庫等。
(3)能運行Python的開源硬件將越來越普及
繼樹莓派之后,越來越多的“派”系列產(chǎn)品被設(shè)計出來,如pcDuino、香蕉派和香橙派等,這些開源硬件的價格越來越親民,因此,與其想方設(shè)法用MicroPython的方式去兼容單片機,還不如直接用Python代碼去控制開源硬件。這樣一來,Python的各種“無所不能”的庫都可以用起來。
● pinpong庫的規(guī)劃
如何設(shè)計一個Python庫?筆者首先確定了這個庫的第一目標(biāo)人群是中小學(xué)生,是初學(xué)者。其次,考慮到micro:bit和掌控板都支持MicroPython,那這個庫要兼容它們的語法。因此,這個庫需要具備代碼簡潔、語法靈活和使用簡單三大特點。
1.工作原理
pinpong庫選擇的方案是使用標(biāo)準(zhǔn)的Python代碼來控制開源硬件,這和MicroPython的做法不一樣。MicroPython是借用了Python的語法風(fēng)格,最終會編譯為C語言。而Python中大量的庫都要經(jīng)過重新編寫才能使用。
那么,如何通過pinpong來控制開源硬件呢?筆者借助了一個通用的串口通信協(xié)議Firmata。開源硬件會輸入一個特定的固件,計算機發(fā)送命令給開源硬件,開源硬件執(zhí)行命令后再反饋信息給計算機,這個過程的速度很快,如同直接控制開源硬件一樣。
2.支持硬件
pinpong庫將支持市場上絕大多數(shù)的開源硬件。pinpong庫的設(shè)計,是為了讓開發(fā)者在開發(fā)過程中不用被繁雜的硬件型號所束縛,而將重點轉(zhuǎn)移到軟件的實現(xiàn)。哪怕程序編寫初期用Arduino開發(fā),部署時改成了掌控板,只要修改一下硬件的參數(shù)就能正常運行,實現(xiàn)了“一次編寫處處運行”。
從表1可以看出,開源硬件的品牌雖然很多,但基本上可以分為Arduino(涵蓋了拿鐵熊貓和虛谷號等)、ESP32(包括ESP8266和掌控板等)、micro:bit和樹莓派(涵蓋了pcDuino和banana派等)這四個類別。筆者給這些開源硬件分別起了一個“別名”,即board_name,如下頁表2所示。目前,pinpong庫已經(jīng)支持Arduino、虛谷號和掌控板,其他的開源硬件支持已經(jīng)在規(guī)劃中。
3.基本用法
如何讓代碼更加簡潔,并且容易理解?以Arduino UNO為例,下頁表3中的代碼將點亮Arduino板載的LED燈(D13引腳)。
從上述代碼可以看出,初始化硬件只要正確輸入硬件的品牌和型號即可。如果端口號省略,pinpong會自動掃描本機可用的所有串口,然后給硬件燒錄特定的固件。這樣一來,開源硬件的入門門檻降到了最低:只需要能辨別開源硬件的型號,并且知道其引腳的正確編號。
4.基礎(chǔ)對象
pinpong的基礎(chǔ)對象分為四種,分別為Board、Pin、Servo和I2C,具體說明如表4。
控制I/O引腳,是開源硬件的最核心的功能。pinpong庫中將引腳模式分為四種,分別為Pin.IN(輸?模式)、Pin.OUT(輸出模式)、Pin.ANALOG(模擬輸入模式)和Pin.PWM(模擬輸出模式)。不同的引腳模式,對應(yīng)不同的讀寫方法,具體如表5所示。
● 結(jié)束語
筆者很幸運地遇上了一個非常專業(yè)的創(chuàng)客團隊,因而在短短的時間內(nèi),pinpong庫成形并開始測試。筆者在0.3版上通過基本的功能測試,體驗非常好。就在啟動pinpong項目的這段時間內(nèi),筆者了解到更多人的需求,也越來越體會到開發(fā)pinpong庫的價值。
也許pinpong庫還有很多不完善之處,但是筆者相信,有這么多一線教師和專業(yè)研發(fā)團隊的支持,pinpong庫一定會越來越好用,會助力我國乃至全球的信息技術(shù)教育的發(fā)展,讓更多的孩子愛上編程,愛上開源硬件。