讓掌控板和Scratch無縫連接

Scratch是一款由美國麻省理工學院(MIT)設計開發的少兒編程工具。因為其採用了積木式的圖形化編程形式,只要會使用滑鼠,就能編寫出各式各樣的作品,大大降低了編程的門檻。目前很多地區的小學生編程課,大都是基於Scratch進行教學的。一些創客企業也在Scratch的基礎上開發出硬體編程的工具,如mblock、mind+等。

Scratch不僅僅是一款利用積木式工具製作二維動畫的軟體,還是一個學習互動媒體技術的平台。Scratch可結合PicoBoard、樂高WeDo、Arduino、micro:bit等相關硬體,與外部世界進行互動,如讀取感測器值,驅動電機等,從而設計出各種有趣的互動作品。

圖PicoBoard板

PicoBoard是Scratch開發團隊設計的感測器板,通常稱為「Scratch感測器板」,其功能已經內置在Scratch的各個版本中。早在2011年,我就嘗試用Arduino自製了一款PicoBoard,但是因為各種感測器不好固定,外形也不好看,就沒有真正在教學中使用。而最近拿到掌控板的時候,不禁萌發一種想法:能不能把掌控板模擬為PicoBoard,讓掌控板和Scratch無縫連接起來?

一、分析規劃

PicoBoard上有按鍵、光線、聲音、滑桿等感測器,另外還有四個普通的電阻。這些信息可以從Scratch的擴展功能模塊中看出,以Scratch2.0為例,編程模塊的界面如下。

圖 Scratch的PicoBoard功能模塊

掌控板上集成了光線和聲音感測器,同時有A、B兩個按鈕,分別對應了PicoBoard上的按鍵、光線、聲音這三種感測器。而滑桿感測器可以使用六個觸摸按鍵來模擬,這樣就基本上具備了模擬PicoBoard的條件。另外,掌控板的加速度感測器數據,可以用阻力(電阻)A、B、C來輸出,學生就能做出更加有趣的交互作品了。

圖 掌控板的板載資源介紹

考慮到使用習慣,我們將掌控板的按鍵B,模擬為PicoBoard的按鈕。加速度感測器Z軸信息,一般不太容易使用,於是捨棄,留出一個「阻力D」作為擴展介面。確定這些信息後,再對應PicoBoard的協議,分別進行了通道的編號。

二、代碼編寫

Scratch開發團隊定義了PicoBoard的協議。二者採用串口通訊,波特率38400bps。當Scratch發送0x01時,PicoBoard就發送八路的感測器數值。這些信息都是開源的,可以參考sparkfun分享在github的PicoBoard源碼。

sparkfu的PicoBoard開源地址:github.com/sparkfun/Pic

其實有很多人基於各種硬體,編寫了模擬PicoBoard的代碼,如ákos Vecsei的Scratchbit,能夠將micro:bit模擬為PicoBoard,用MicroPython編寫。研究這些代碼,很快就能弄明白PicoBoard的通訊機制。

Scratchbit的開源地址:github.com/vecsei/Scrat

我們採用MicroPython來編寫PicoBoard的代碼,核心代碼如下:

if request[0] == 0x01: #當接收到Scratch發來的0x01位元組

extValue=int(ext.read()/4)

convert(0,extValue)

reading = accelerometer.get_y()*1000 # 加速度的y軸

if reading >= 0:

reading = int(reading / 2) + 512

convert(1, reading)

else:

reading = 512 - abs(int(reading / 2))

convert(1, reading)

reading = accelerometer.get_x()*1000 #加速度的x軸

if reading >= 0:

reading = int(reading / 2) + 512

convert(2, reading)

else:

reading = 512 - abs(int(reading / 2))

convert(2, reading)

if button_b.value()==0: # 按鍵B

convert(3, 0)

else:

convert(3, 1023)

if button_a.value()==0: # 按鍵A

convert(4, 1023)

else:

convert(4, 0)

convert(5, 1023-light.read()) # 光線感測器

convert(6, sound.read()) # 聲音感測器

convert(7, ScanTouchpad()) # 觸摸按鍵

需要說明的是,為了讓交互更加友好,當掌控板和Scratch進行通訊時,板子上的RGB燈將會點亮。限於篇幅,這些並沒有在上述的核心代碼中體現出來。完整的代碼可以在掌控板的GitHub地址的examples中下載。

掌控板的開源地址:github.com/labplus-cn/m

三、功能測試

打開mPython軟體,將上述代碼刷入,並設置為默認啟動。

掌握板顯示如下文字,表示啟動成功。

1.在Scratch1.4測試

打開Scratch1.4,在「偵測」中找到PicoBoard的編程模塊,並編寫一個讀取感測器值的程序,並單擊綠旗運行。等待10來秒,當三個RGB燈都亮綠燈時,表示連接成功。這時,就能看到掌控板發來的各種感測器信息了。

2.在Scratch2.0中測試

打開Scratch2.0,在 「更多積木」中添加擴展板PicoBoard。

稍等片刻,軟體界面上出現「PicoBoard」指令模塊,當「PicoBoard」右邊的黃色圖標變成綠色時表示連接成功,同時掌控板上的三個RGB燈為綠色閃爍狀態。

註:直接使用網頁編程(https://Scratch.mit.edu),也可以使用PicoBoard,但要根據安裝Web瀏覽器插件。

四、應用拓展

下面以Scratch 2.0為例,利用「滑桿」來做一個「黃山日出」的效果。

(一)前期準備:

1.下載黃山圖片,並利用圖像編輯工具將圖片中的「山」摳出來。

2.掌控板滑桿數值取值的測試。

掌控板對應的滑桿為6個觸摸按鍵(即p、y、t、h、o、n六個字母),滑桿的初始值約為50.0。按p鍵是0,同時按住py是10,以此類推,剛好把100分為10檔。

(二)製作過程

將掌控板設置為Scratch感測器板模式,並與Scratch成功連接。

角色

黃山圖片為背景,黃山摳圖為角色1,太陽為角色2。

腳本

背景:

因滑桿的初始值約為50,所以將滑桿感測器值進行四捨五入,如果其等於50的話一直等待。當觸摸其他按鍵時,返回值將發生變化,不等於50,進入下面的「重複執行」,然後亮度隨著滑桿感測器值的變化而變化。

角色1(黃山摳圖):

開始移至最上層,這樣可以擋住太陽,讓日出效果更佳。同樣在滑桿感測器值沒有發生變化時一直等待,然後亮度隨著滑桿感測器值的變化而變化。

角色2(太陽):

開始先將太陽固定在(-20,-20)的坐標位置。同樣在滑桿感測器值沒有發生變化時一直等待。為了實現太陽斜向上的效果,將X,Y坐標都隨著滑桿感測器值的變化而變化。

這樣當單擊綠旗運行時,我們用手指從掌握板的p鍵劃向n鍵,這時太陽會慢慢從山的後面升起,而且天色也慢慢變亮了。

當掌握板處在PicoBoard模式時是無法讀取文件和刷入程序的。如果想進入讀取文件或刷入程序的編程模式,那得讓掌控板進入REPL模式,具體方法為按下按鍵B不放,然後按下REST鍵,直到OLED顯示屏上顯示「replMode」字樣才鬆開按鍵B。這時,掌控板又可以恢復到自由編程模式了。

從價格上看,市場上通用的Scratch感測器板大約是200左右,而掌控板的價格僅99,還可以隨時恢復到可編程模式,可謂一板多用,價美物廉。相信很快會有更多的教育創客會開發出新的玩法,比如利用掌控板的無線通訊功能,做網路版本的Scratch感測器板,讓更多的孩子愛上Scratch,愛上編程。


推薦閱讀:

TAG:編程學習 | 創客 |