時折Pythonネタなど書かせていただいておりますが、最近はマイコン(MCU)でもPython使う例が増えてきているので「1本タイトルつける」ことにいたしました。今回はRaspberry Pi上のMuエディタで、BBC micro:bitのMicroPythonプログラミング。2台のmicro:bit間で無線つかって伝送したデータをUARTでPCに送り込むところまで。
※「MicroPython的午睡」投稿順 Indexはこちら
PC上でPython書くときには、VS Code使わせていただいております。他にも優秀なPython用のIDEはいろいろある、と聞き及びますが、まあ、VS Codeはいろいろ便利に使えるので手放せませぬ。
Raspberry Pi上でのプログラミングにもPC上のVS Codeをリモートで使うという手がありそれはそれで便利なのですが、今回は、Raspbian OSのGUI上で走るPython開発環境の話であります。手元のRaspberry Pi(3Bだけれども)上には、以下の3つがインストールされております。
- Tonny Python IDE
- mu
- PyCharm
一番下は自分でインストールしたものでありますが、上の2つはRaspbianをインストールしたときに「付属」していたものであります。両方とも “Begineer向け” ということでまったく注意を払ってこなかったのですが、この度、真ん中の
Muエディタ
が、マイコン(MCU)でPythonやるには優れもの、であることに目が見開きました。勿論、Raspberry Pi上のローカル開発(Python3のみ)にも対応しておるのでありますが、
- CircuitPython(Adafruit社のボード向け)
- BBC micro:bit用のMicroPython
の「クロス」開発に対応していたのでございます。知らなかったのは私だけ?micro:bitをUSB接続すれば即座に認識、pythonなのでコーディングも素早くできます。1台のmicro:bitが無線で発したデータをもう一台のmicro:bitで受信、そしてデータをPCにUARTで流す、といったソフトが15分もあれば動きまする。お手軽。MuエディタそのものはRaspberry PiでなくともPCでも動くようですが、乗りかかった船なので、今回はRaspberry Piで行きます。
まず、Muエディタのホームページは下に。
もともとBegineer向けというだけあって使い方は分かり易いです。それでいてローカルなPython3開発であれば、普通にデバッガなども使えるので実用的(micro:bit相手ではデバッガ使えないですが。)
Raspberry PiのUSBポートにmicro:bitを接続した初回は以下のようなウインドウが開きました。これは、最初にローカルなPython3で短いコード書いてみたために、Python3モードになっていたためのようです。一端モードを切り替えた後は、接続時には控えめなメッセージがステータスラインに表示されるだけになりました。
さて、流石 お子様方に人気のBBC micro:bitです。MicroPythonについても充実の日本語ドキュメントがありました。以下にURL貼り付けます。
BBC micro:bit MicroPython ドキュメンテーション
こんなにね、立派な文書があれば、一撃(本当か?)とりあえず、micro:bitの特徴である、LEDアレイ上に流れる表示で”Hello”と3秒毎書き出し続けるスクリプトがこちら。これ書いて、上の「転送」ボタン押せばファイルがmicro:bit側に書きこまれ走ります。なお初回はMicroPythonの処理系自体が書きこまる?のかちょっと時間かかりますが、2回目以降は一瞬です。
この軽快さすばらしいです。即座に調子にのって無線のサンプルプログラムを手元に2台あるmicro:bit(1台が赤、1台が緑)に書き込んでみました。一方のボタンを押すと、他方のLEDアレイがフラッシュするという「蛍」サンプルです。動作はOK。”BLE”無線のアドバタイジング(垂れ流しのブロードキャスト)パケットなんだろうな~などと想像し、Wiresharkで観察(スニッフィング)してみました。
駄目でした。想像したようなアドバタイジング・パケット飛んでません。
慌てて上記のドキュメントに存在する Bluetooth なる項目へ行くと「ちょっと悲しいお知らせ」がありました。そこから一部引用させていただきます。
MicroPython は、無線ハードウェアの利用に radio モジュールを提供しています。~中略~ この radio モジュールで使用されているプロトコルは、BLE よりもはるかに単純であり、教育で使うのも容易です。
なんと、BLEではなかったのです。でも、BLEモドキ(何か良いプロトコルのお名前があると良いのだけれど)は使える。BLEに出来なかったのは、micro:bitのRAMが16KBと小さすぎるためみたいです。数か月前に発売になった
micro:bit v2はRAM128KB
らしいです。今後に期待か。
まあ2台の間で通信できることが分かったですが、その先はどうするか。なんとMicroPythonは、ささやかな「ファイルシステム」をもサポートしており、そこにデータを書きこめるようです(不揮発)。ただし、スクリプトを書き換えるととストレージも初期化されてしまう?みたい。この際、UARTでPCに送り出すことにしたい。調べると micro:bit内蔵のUARTは1つ。端子P0/P1にUARTを向けられるみたい。しかし、もともとREPLなどの通信用にUARTはUSBに向いている。であれば、何も初期化せず、そのままUARTに垂れ流せば、PC側にmicro:bitの「言っていること」が伝わる筈。
とりあえず、無線から受け取ったデータをUART経由で垂れ流すスクリプトがこちら。Aボタンで無線ON、BでOFF。状態に応じてLEDアレイに顔文字?が表示されます。
import radio from microbit import * radio_on = False while True: if button_a.was_pressed(): radio.on() radio_on = True if button_b.was_pressed(): radio.off() radio_on = False if radio_on: dataStr = None try: dataStr = radio.receive() except: display.show(Image.SAD) dataStr = None if dataStr is not None: display.show(Image.HEART) uart.write(dataStr) else: display.show(Image.TRIANGLE) sleep(100) display.show(Image.ASLEEP) sleep(500)
これに対する送信側スクリプトがこちら。とりえあずデータは0から連番の数字。送信する度に送信データを文字スクロール表示。
import radio from microbit import * radio.on() i = 0 while True: radio.send(str(i)) display.scroll(str(i)) i += 1 sleep(3000)
UARTからPCに送られたデータはとりあえずTeraTermで受領。こんな感じ。
Arduino環境もお手軽だけれども、やっぱりPythonもっとお手軽だな。
もっとメモリを!
v2買うか?