学童のプログラミング教室で、Minecraft on Scratch から子供の興味を引きはがすべく、micro:bit を 5個(増税前、消費税8%の駆け込み)購入しました。
実はスイッチサイエンスさんはキャッシュレス還元に対応したそうなので、10/1 以降に購入したほうがお得だったわけですが。まあ、いいや、勢いで送料無料になる1万円まで大人買いです。
※ああ、結果だけ欲しい方は、一番最後にジャンプするといいです.
学童で子どもに試してみる
プログラミング教室をやっている学童に先に請求してもよいのですが、ここは実験も兼ねて自腹で購入。うまくいけば後で、欲しい子には2,000円也で購入してもらうか、学童に請求を上げるかというところなのですが。
あえなく「玉砕」です。
まず、数あるプログラミング教室の中で、私が行っているところは、
- 小学3-6年生が10人ちょい雑多に集まっている感じ。
- 予算の関係上、中古 ノート PC の Windows 7 を使っている。
- 場所が共有スペースを使っているので、デスクトップ PC は置けない。
- 有線 LAN が使えず、無線 LAN(私物の Pocket WiFi)を使っている。
- ノート PC に Bluetooth が付随していないものが多い。
- 中古のノートPCなので、USB が 1個しか生きていないものが多くて、USB ケーブルのマウスと付け替えないといけない。
- そもそも、micro:bit(mbed) への HEX ファイルのドラッグ&ドロップが子供には難しい。
このプログラミング教室は、3年前から始めたのですが、プログラミングを教える…ってのは雑多な環境では難しかったので、「Scratch で遊ぶ」にシフトしました。いは、Scratch で作られているゲームならば、なんでも ok ってことで、ファミスタもどきとか青鬼もどきとか、いろいろ流行りがあって、今はマインクラフトもどきなのです。
ちなみに、ゲームばかりやっている子ばかりではなくて、Scratch でゲームを自作している子もいます。
- ゲームを自作している子には、適宜質問に答える&適宜手伝う。
- ゲームをしている子は、攻略法は友達同士で話し合ってね
というルールでやっています。学童の目的として「安全に子供を預かる」が有線なので、プログラム自体を教えるってのは二の次なのです。とはいえ、漠然と遊ばせるだけはつまらないので、毎回プリントを配るし(1回300円也を徴収しているので)、それなりに「パソコンに慣れる」ことを目的としています。
と、いう状況はさておき、プログラミング環境としてはあまりリッチな環境ではありませんが、そこは工夫次第というところです。
Scratch から micro:bit を操作する
micro:bit を操作する方法は2種類あります。
MakeCode を使ってプログラミング
https://makecode.microbit.org/
こんな感じでブロックを使ってプログラムをして、micro:bit に流し込みます。ダウンロードした後に HEX ファイルをドラッグ&ドロップする方法と、あらかじめ micro:bit とリンク(たぶん、BLEを使っている)させておいて「ダウンロード」ボタンを押したら直接流し込んでくれる方法です。
手元の PC でやると、この自動流し込みが便利なので操作的にはさほど気にならないのですが。Bluetooth の付いてないデスクトップPCとか、古い Windows 7 のノートPCだと結構な手間です。
あと、Scratch に慣れていると、この
- プログラムをコンパイルして、マイコン(micro:bit)に流し込む
という流れが難しかったりします。そのあたりは、電子工作で Arduino を使っていれば慣れるので(というか慣れないといけない)ので、それはいずれやるつもり。
Scratch 3.0 から直接 micro:bit を操作
https://scratch.mit.edu/
もうひとつ、Scratch 3.0 の拡張機能を使う方法です。Scratch 3.0 では、あらかじめ micro:bit に scratch-microbit-1.1.0.hex なファームを書き込んでおいて、BLE 通信をしながら操作する方法です。これだと、いちいち micro:bit に書き込む必要がなくて、Scratch の操作だけで micro:bit を扱えます。
micro:bit と BLE 通信で連携をするので、
- micro:bit のAボタンを押したら、猫に喋らせる
- Scratch 猫をクリックしたら、micro:bit の LED を光らせる
という動きが簡単にできます。これだと、物理的なものを「プログラミングで操作する」というのが直感的にわかっていいです。内部は、ややこしいことになっているのですが。
Scratch で micro:bit を操作するためには、条件があって、
- BLE 接続できること
- Scratch Link を動かしておくこと
があります。micro:bit と BLE 通信をするので、Buetooth が必要なのはいいのですが、さて、Scratch Link がちょっと癖ものなのです。
Scratch Link の動作条件が、
- Windows 10 以降
- macOS
ということになっていて、Windows 7 では動かない。何故?ってことになります。
scratch-link
https://github.com/LLK/scratch-link
理由は、Scratch Link のコードを見るとわかります。Windows の場合、UWP で使われている Bluetooth モジュールを使っていて、これが Windows 10 以降しか入っていないんですよね。Windows 8 が出た頃に、BLE 通信が流行った時代があって、そのときに Windows 7 で動かそうとして悪戦苦闘した覚えがあります。結局 BLE 通信は無理なので Bluetooth のシリアル通信にしましたが。実は、Scratch Link 内部ではシリアル通信も対応しているのですが、インストール環境が Windows 10 以降になってしまっているので、これでも Winodws 7 は使えないのです。まあ、そのときは自前ビルドをするわけですが。
Scratch 3.0 – Scratch Link – micro:bit の関係を紐解く
Scrach 3.0 のコードは Github で公開されているので、
- LLK/scratch-gui: Graphical User Interface for creating and running Scratch 3.0 projects.
- LLK/scratch-vm: Virtual Machine used to represent, run, and maintain the state of programs for Scratch 3.0
- LLK/scratch-link: Device interoperability layer for Windows and MacOS
の3つから調べることができます。scratch-microbit-1.1.0.hex のコードは見つからなかったのですが、まあ、これは BLE のペリフェラルなところなので省略してもokでしょう。
ざっと、調べたところこんな感じです。
Scratch on Browser
WebSocket
^
| JSON-RPC
v
WebSocketServer
JSONRPCWebSocket
+ didReceiveCall
Scratch Link
BLESession
+ DidReceiveCall
+ OnValueChanged
^
| BLE GATT
v
BLE
micro:bit
- Scratch 3.0 で WebSocket を使っている
- Scratch Link は WebSocketServer で待ち受け
- Scratch 3.0 – Scratch Link の間は JSON-RPC で通信
- Scratch Link と micro:bit は BLESession で BLE 通信
そうなると、Scratch Link の JSON-RPC で受けているところを適当に WiFi に切り替えてやって、ラズパイや適当な Windows 10 を挟み込んだプロキシを作ればいけそうですね。
と思って、Scratch Link のコードを .NET Core で書き換えようとしたところ、Scratch 3.0 -> Scratch Link な URL ってどうなっているのか?と思い至りました。いやいや、WebSocket を使ったことがなかったので。
Scratch Link – Japanese Scratch-Wiki
を改めてみると、『そのため、Scratchはlocalhostに直接アクセスできないため、device-manager.scratch.mit.eduに接続する。』という一文があります。たしかに、scratch-vm のコードを検索すると、この URL が書いてあって、直接ローカルなPC(localhost とか 127.0.0.1 とか)には接続していないんですね。
なるほど!WebSocket って localhost が使えないのか!ってことでした。
思い込みで、localhost しか使えないのかと思っていたのですが、実は localhost「は」使えないという落とし穴が(苦笑)あったのですね。
なので、Scratch 3.0 は、拡張機能で WebSocket を使うたびに device-manager.scratch.mit.edu を呼び出して DNS で 127.0.0.1 を返して貰っています。
hosts を変更する
となれば、話は簡単です。
いちいち、ローカルホストに接続するために device-manager.scratch.mit.edu を呼び出しているということは、他の PC を呼び出したい場合は device-manager.scratch.mit.edu を通す必要がない、ということです。
なので、実現したい環境として、
- Scratch 3.0 が動いている Windows 7
- micro:bit と接続している BLE ありの Windows 10
という別々の環境を作った場合、Windows 7 から Windows 10 の Scratch Link への通信に切り替えてやればよいわけで、
- Windows ならば、C:\Windows\System32\drivers\etc\hosts
- Linux ならば /etc/hosts
を書き加えます。
192.168.1.28 device-manager.scratch.mit.edu
「192.168.1.28」なところは、Windows 10 のある PC の IP に書き換えてください。こうすることで、device-manager.scratch.mit.edu への呼び出しが偽装されて、micro:bit に繋がっている Scratch Link(Windows 10 あるいは macOS) へ接続されます。
2以上繋がっている場合は、こんな風に並ぶので名前で使い分ければよいでしょう。
scratch-vm のほうを書き換える
なお、もう一つの方は、scratch-vm にある WebScoket の接続先を書き換えます。
scratch-vm/scratch-link-websocket.js at develop · LLK/scratch-vm
scrach-gui/vm/link をあれこれやっているのは、自前でオリジナルなブロックを創ったり、Android の Firemate に繋げたりしたいので、こっちのほうはいずれ試してみる予定。