謝作如 李敦勇 唐柳峰
Scratch是一款由美國(guó)麻省理工學(xué)院(MIT)設(shè)計(jì)開(kāi)發(fā)的少兒編程工具。因?yàn)槠洳捎昧朔e木式的圖形化編程形式,只要會(huì)使用鼠標(biāo),就能編寫(xiě)出各式各樣的作品,大大降低了編程的門(mén)檻。目前很多地區(qū)的小學(xué)生編程課,大都是基于Scratch進(jìn)行教學(xué)的。Scratch不僅是一款利用積木式工具制作二維動(dòng)畫(huà)的軟件,還是一個(gè)學(xué)習(xí)互動(dòng)媒體技術(shù)的平臺(tái)。Scratch可結(jié)合PicoBoard、樂(lè)高WeDo、Arduino、micro:bit等相關(guān)硬件,與外部世界進(jìn)行互動(dòng),如讀取傳感器值,驅(qū)動(dòng)電機(jī)等,從而設(shè)計(jì)出各種有趣的互動(dòng)作品。
PicoBoard是Scratch開(kāi)發(fā)團(tuán)隊(duì)設(shè)計(jì)的傳感器板,通常稱(chēng)為“Scratch傳感器板”,其功能已經(jīng)內(nèi)置在Scratch的各個(gè)版本中。早在2011年,筆者就嘗試用Arduino自制了一款PicoBoard,但因?yàn)楦鞣N傳感器不好固定,外形也不看,就沒(méi)有真正在教學(xué)中使用。最近,筆者在拿到掌控板的時(shí)候,不禁萌發(fā)一種想法:能不能把掌控板模擬為PicoBoard,讓掌控板和Scratch無(wú)縫連接起來(lái)呢?
分析規(guī)劃
PicoBoard上有按鍵、光線、聲音、滑桿等傳感器,另外還有四個(gè)普通的電阻。這些信息可以從Scratch的擴(kuò)展功能模塊中看出,以Scratch2.0為例,編程模塊的界面如圖1所示。
掌控板上集成了光線和聲音傳感器,同時(shí)有A、B兩個(gè)按鈕,分別對(duì)應(yīng)了PicoBoard上的按鍵、光線、聲音這三種傳感器(如圖2)。而滑桿傳感器可以使用六個(gè)觸摸按鍵來(lái)模擬,這樣就基本上具備了模擬PicoBoard的條件。另外,掌控板的加速度傳感器數(shù)據(jù),可以用阻力(電阻)A、B、C來(lái)輸出,這樣學(xué)生就能做出更加有趣的交互作品了。
考慮到使用習(xí)慣,筆者將掌控板的按鍵B,模擬為PicoBoard的按鈕。加速度傳感器Z軸信息,一般不太容易使用,于是舍棄,留出一個(gè)“阻力D”作為擴(kuò)展接口。確定這些信息后,再對(duì)應(yīng)PicoBoard的協(xié)議,分別進(jìn)行了通道的編號(hào)(如下頁(yè)表1)。
代碼編寫(xiě)
Scratch開(kāi)發(fā)團(tuán)隊(duì)定義了PicoBoard的協(xié)議。二者采用串口通信,波特率38400bps。當(dāng)Scratch發(fā)送0x01時(shí),PicoBoard就發(fā)送八路的傳感器數(shù)值。這些信息都是開(kāi)源的,可以參考sparkfun分享在github的PicoBoard源碼(開(kāi)源地址:https://github.com/sparkfun/PicoBoard)。
其實(shí)有很多人基于各種硬件,編寫(xiě)了模擬PicoBoard的代碼,如kos Vecsei的Scratchbit,能夠?qū)icro:bit模擬為PicoBoard,用MicroPython編寫(xiě)。研究這些代碼,很快就能弄明白PicoBoard的通信機(jī)制。(Scratchbit的開(kāi)源地址:https://github.com/vecsei/Scratchbit)
我們采用MicroPython來(lái)編寫(xiě)PicoBoard的代碼,核心代碼如表2所示。
需要說(shuō)明的是,為了讓交互更加友好,當(dāng)掌控板和Scratch進(jìn)行通信時(shí),板子上的RGB燈將會(huì)點(diǎn)亮。限于篇幅,這些沒(méi)有在上述的核心代碼中體現(xiàn)出來(lái)。完整的代碼可以在掌控板的GitHub地址的examples中下載。(掌控板的開(kāi)源地址:https://github.com/labplus-cn/mPython/)
功能測(cè)試
打開(kāi)mPython軟件,將上述代碼刷入,并設(shè)置為默認(rèn)啟動(dòng)。掌控板顯示如圖3所示的文字,表示啟動(dòng)成功。
1.在Scratch1.4測(cè)試
打開(kāi)Scratch1.4,在“偵測(cè)”中找到PicoBoard的編程模塊,編寫(xiě)一個(gè)讀取傳感器值的程序,并單擊綠旗運(yùn)行。等待10秒左右,當(dāng)三個(gè)RGB燈都亮綠燈時(shí),表示連接成功。這時(shí),就能看到掌控板發(fā)來(lái)的各種傳感器信息了。
2.在Scratch2.0中測(cè)試
打開(kāi)Scratch2.0,在 “更多積木”中添加擴(kuò)展板PicoBoard。稍等片刻,軟件界面上出現(xiàn)“PicoBoard”指令模塊,當(dāng)“PicoBoard”右邊的黃色圖標(biāo)變成綠色時(shí)表示連接成功,同時(shí)掌控板上的三個(gè)RGB燈為綠色閃爍狀態(tài)[注:可直接使用網(wǎng)頁(yè)編程(https://Scratch.mit.edu),也可以使用PicoBoard,但要安裝Web瀏覽器插件]。
應(yīng)用拓展
下面以Scratch2.0為例,利用“滑桿”來(lái)做一個(gè)“黃山日出”的效果。
1.前期準(zhǔn)備
(1)下載黃山圖片,并利用圖像編輯工具將圖片中的“山”摳出來(lái)。
(2)掌控板滑桿數(shù)值取值的測(cè)試。
掌控板對(duì)應(yīng)的滑桿為6個(gè)觸摸按鍵(p、y、t、h、o、n六個(gè)字母),滑桿的初始值約為50.0。按p鍵是0,同時(shí)按住py是10,以此類(lèi)推,剛好把100分為10檔(如表3)。
2.制作過(guò)程
(1)硬件連接。將掌控板設(shè)置為Scratch傳感器板模式,并與Scratch成功連接。
(2)角色。將黃山圖片設(shè)為背景,黃山摳圖為角色1,太陽(yáng)為角色2。
(3)腳本。
背景:因滑桿的初始值約為50,所以將滑桿傳感器值進(jìn)行四舍五入,如果其等于50的話一直等待。當(dāng)觸摸其他按鍵時(shí),返回值將發(fā)生變化,不等于50,進(jìn)入下面的“重復(fù)執(zhí)行”,然后亮度隨著滑桿傳感器值的變化而變化(如圖4)。
角色1(黃山摳圖):開(kāi)始移至最上層,這樣可以擋住太陽(yáng),讓日出效果更佳。同樣在滑桿傳感器值沒(méi)有發(fā)生變化時(shí)一直等待,然后亮度隨著滑桿傳感器值的變化而變化(如圖5)。
角色2(太陽(yáng)):開(kāi)始先將太陽(yáng)固定在(-20,-20)的坐標(biāo)位置,同樣在滑桿傳感器值沒(méi)有發(fā)生變化時(shí)一直等待。為了實(shí)現(xiàn)太陽(yáng)斜向上的效果,將X、Y坐標(biāo)都隨滑桿傳感器值的變化而變化(如圖6)。這樣當(dāng)單擊綠旗運(yùn)行時(shí),用手指從掌控板的p鍵劃向n鍵,這時(shí)太陽(yáng)會(huì)慢慢從山的后面升起,天色也慢慢變亮。
當(dāng)掌控板處在PicoBoard模式時(shí)是無(wú)法讀取文件和刷入程序的。如果想進(jìn)入讀取文件或刷入程序的編程模式,得讓掌控板進(jìn)入REPL模式,具體方法為按下按鍵B不放,然后按下REST鍵,直到OLED顯示屏上顯示“replMode”字樣才松開(kāi)按鍵B。這時(shí),掌控板又可以恢復(fù)到自由編程模式了。
掌控板的價(jià)格比市場(chǎng)上通用的Scratch傳感器板便宜不少,還可以隨時(shí)恢復(fù)到可編程模式,可謂一板多用,價(jià)美物廉。相信很快會(huì)有更多的教育創(chuàng)客開(kāi)發(fā)出新的玩法,如利用掌控板的無(wú)線通信功能,做網(wǎng)絡(luò)版本的Scratch傳感器板等,從而讓更多的孩子愛(ài)上Scratch,愛(ài)上編程。