新增 Scratch 2.0 HTTP Extension (使用blockext開源python module) 來接收並控制 BBC micro:bit (使用uart module)

動機:暨上一篇...使用 micro:bit 玩 Scratch 2.0小遊戲 (跨平台 Mac, Windows, Raspberry Pi篇) ( https://davistseng.blogspot.tw/2017/09/microbit-scratch-20-mac-windows.html ) 後,思考如何在 Scratch 2.0 中新增 HTTP Extension 並撰寫 Python 2 程式,藉由 UART 來 接收/傳送 及控制 micro:bit...(亂搞篇)

目的:透過實作來學習 Scratch 2.0 Extension 的原理與運作,並練習 micro:bit uart module的python/micropython相關程式開發...

構想圖

電路示意圖


UART接收/傳送區塊圖


準備環境
1.Windows 10 / MacBook Pro / Ubuntu 筆電(或PC)
2.BBC micro:bit (需要USB線連接)
3.Scratch 2.0 (離線版,請自行下載安裝)
4.Python 2.7.14 (請自行下載安裝)

事前準備
1.請自行參攷前篇安裝 Python 2.7.14 及 pip2 (MacBook不需另外安裝)
2.請自行參攷前篇安裝 Windows10的 USB Virtual Serial Port,確認 COM連接埠
  • Windows - mbed Serial Port (COMx)
  • Mac OS X - Use the command ls /dev/cu.usbmodem*
  • Linux - Use the command ls /dev/ttyACM*
3.請自行參攷前篇安裝python套件 blockextpyserial
4.請自行下載並安裝 Scratch 2.0 離線版

執行步驟
1.Windows10筆電
首先,先到 Git repository https://github.com/dvsseed/microbit_helpler 下載程式,如下圖

接著,按下 Win-R 輸入 cmd,如下圖

再著,在 命令提示字元 輸入git下載複製的指令(以 D:\ 為例),如下圖

將 micro:bit 插上筆電的USB連接埠,並將 microbit_hex.hex 傳送到(N) micro:bit的磁碟機[ MICROBIT (F:) ]...

接下來,直接到下載目錄中 microbit_helper.py 檔案上雙擊滑鼠執行之(我設計 COM port 採os自動判定,但若同時插入二片micro:bit時只會選其一),如下圖

上述執行畫面(我設定 port number = 54321),如下圖

最後,再到目錄 D:\microbit_helpler\ScratchFiles\ScratchProjects 中 範例檔 microbit_sample.sb2 上雙擊滑鼠執行之,如下圖

Scratch 運作畫面(燈閃爍),如下圖

再到Scratch中按下 綠旗 開始執行範例遊戲(我將大部分的自訂積木拉出示範操作),同時,在 命令指示字元 視窗中,可明顯的看到 Scratch 2.0 HTTP Extension 的 GET /poll request 封包內容(傳遞的參數),如下圖(如要深研可參攷 C:\Python27\Lib\site-packages\blockext\server.py 中的 class GetRequestHandler)


2.MacBook Pro筆電
首先,下載 git 源碼如前述...

將 micro:bit 插上筆電的USB連接埠,並複製 microbit_hex.hex 到 micro:bit的disk drive磁碟(MICROBIT)...

接著,請開 終端機.app 並到 microbit_helper 目錄內,修改 microbit_helper.py 的檔案屬性,如下圖


再者,修改 打開檔案的應用程式 為 終端機.app,如下圖




就會看到執行畫面(我設計 COM port 採os自動判定,但若同時插入二片micro:bit時只會選其一),如下圖


接下來再到目錄 /Users/davis/microbit_helper 中點擊 範例檔 microbit_sample.sb2,如下圖


就會看見Scratch開啟示範遊戲,及燈閃爍,如下圖


再到Scratch中按下 綠旗 執行範例遊戲,同時在 終端機 視窗中,可看到 Scratch 2.0 HTTP Extension 的 GET /poll request 封包內容(傳遞的參數),如下圖


如果要關閉 GET request 顯示,可修改 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/blockext/server.py 第 62 行(加註 #),如下圖


示範影片:(因同時有數據傳送及接收,導致動作控制有些慢lag,如果取消 music、led等積木,將可加快反應速度)

擴充積木,如下圖

以上積木,有三個( 關閉音樂清除屏幕重置microbit )是為了避免 micro:bit 錯亂時,可以停止音樂播放、清除LED矩陣顯示、Reset micro:bit(含 Stop、led、reset可勾選看Boolean值)...

另外,積木已分類(中隔符號)分別抓取 micro:bit 各種感測器(Accelerometer、Compass、Button_a、Button_b、Temperature)的數據並傳回 Scratch,同時,也從積木中將 LED顯示、Music播放、Pin0~Pin2數位值的控制傳至 micro:bit...
有關Scratch helper(python程式) 及 micro:bit hex(micropython程式),請參攷 microbit_helper.py, microbit_hex.py

microbit_helper.py 源碼,請參攷 github


microbit_hex.py 是拖到 http://micro-edit.codeguild.co/editor.html# 編譯的,如下圖


提供以上範例的源碼...
Scratch Extension for micro:bit 中文積木,如下
micro:bit hex 的 micropython源碼,如下
Scratch Extension helper for micro:bit 的python源碼,如下



Git開源連結https://github.com/dvsseed/microbit_helpler


後續發展建議
  1. 有關 Python 的學習環境,建議尋找一個適用的 IDE(Integrated Develop Environment),強化其撰寫、編譯、連結、除錯、執行等過程,並節省時效...我最近試用 JetBrains PyCharm Community Edition 2017.2.2 x64 還不錯...
  2. 對於此次程式,我嘗試應用 Test-Driven Development(TDD) 的開發模式(如下圖),但對於Red、Green的控制不良及Refactor重構程式碼未完成,後續應多做test-cases及留下log記錄(logging module)...
      3. 有關 Python 的物件導向(Object-Oriented)及類別(Class)...等應強化...
      4. 對於此程式的效率不彰,建議試用多執行緒 threading...
      5. 有關 Scratch 2.0 HTTP Extension 的正統作法應遵從 HTTP GET request 來讀取各積木的動作及參數來判斷,可試著從 blockext/server.py 中著手,或是參攷 張文宏老師的大作 用Python擴充我的Scratch2 -- 原理與Hello World篇 ...不要像我這樣子亂搞


誌謝
  1. BBC micro:bit, http://microbit.org/
  2. MIT SCRATCH, https://scratch.mit.edu/
  3. Python, https://www.python.org/
  4. 謝立益老師,https://github.com/lyshie/scratch2-microbit
  5. blockext, http://blockext.org(網站已失效)

後記:查看了Scratch 2.0 Extension 源碼,發現其遵循 HTTP requests(GET) 通訊協定及使用Javascript來製作,對於像我這樣子亂搞~硬是在uart 傳送/接收 數據的方式不可取也!!

留言