MicroPython的午睡(1) ラズパイ上のMuエディタでmicro:bit

Joseph Halfmoon

時折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のみ)にも対応しておるのでありますが、

  1. CircuitPython(Adafruit社のボード向け)
  2. BBC micro:bit用のMicroPython

の「クロス」開発に対応していたのでございます。知らなかったのは私だけ?micro:bitをUSB接続すれば即座に認識、pythonなのでコーディングも素早くできます。1台のmicro:bitが無線で発したデータをもう一台のmicro:bitで受信、そしてデータをPCにUARTで流す、といったソフトが15分もあれば動きまする。お手軽。MuエディタそのものはRaspberry PiでなくともPCでも動くようですが、乗りかかった船なので、今回はRaspberry Piで行きます。

まず、Muエディタのホームページは下に。

Code with Mu

もともとBegineer向けというだけあって使い方は分かり易いです。それでいてローカルなPython3開発であれば、普通にデバッガなども使えるので実用的(micro:bit相手ではデバッガ使えないですが。)

Raspberry PiのUSBポートにmicro:bitを接続した初回は以下のようなウインドウが開きました。これは、最初にローカルなPython3で短いコード書いてみたために、Python3モードになっていたためのようです。一端モードを切り替えた後は、接続時には控えめなメッセージがステータスラインに表示されるだけになりました。

MU editor detected micro:bitさて、流石 お子様方に人気のBBC micro:bitです。MicroPythonについても充実の日本語ドキュメントがありました。以下にURL貼り付けます。

BBC micro:bit MicroPython ドキュメンテーション

こんなにね、立派な文書があれば、一撃(本当か?)とりあえず、micro:bitの特徴である、LEDアレイ上に流れる表示で”Hello”と3秒毎書き出し続けるスクリプトがこちら。これ書いて、上の「転送」ボタン押せばファイルがmicro:bit側に書きこまれ走ります。なお初回はMicroPythonの処理系自体が書きこまる?のかちょっと時間かかりますが、2回目以降は一瞬です。

HelloLoopこの軽快さすばらしいです。即座に調子にのって無線のサンプルプログラムを手元に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で受領。こんな感じ。

Green to Red radioArduino環境もお手軽だけれども、やっぱりPythonもっとお手軽だな。

もっとメモリを!

v2買うか?

MicroPython的午睡(2) ラズパイ上のMuエディタつづき へ進む