MicroPythonの対話型インタフェースはREPL(Read Evaluate Print Loop)と呼ばれている。最近のバージョンのMicroPythonであればサンプルプログラムを使ってBLE経由でREPLにワイヤレス接続することが出来る。試してみた。
MicroPython(ESP32)本体側の設定
モジュールの転送
本家MicroPythonのGitHubリポジトリexample下にあるbluetoothサブディレクトリ
ここに置いてある3つのモジュールファイルをampyなどでMicroPython側に転送しておく。
- ble_advertising.py
- ble_uart_peripheral.py
- ble_uart_repl.py
初期化コードの実行
BLE経由で接続するためには、予めMicroPython本体で以下の2行の実行が必要。
import ble_uart_repl
ble_uart_repl.start()
boot.pyやmain.pyに書いておくと、起動時に自動で実行されるので簡単だ。
MicroPythonへBLE接続する
MicroPythonへBLEで接続するためには、NUS(Nordic UART Service)に対応したソフトが必要。NUSはBluetooth Classicで言う所のSPP(Serial Port Profile)と機能的には同じだが、BluetoothチップベンダのNordicが作った物で主にBLE開発のデバッグ用途に使われている。そのせいかNordicのBLE開発ツールにおまけで付いてくる以外に対応ソフトが極端に少なくWindows版のNUS対応ソフトでまともに動作する物は見つけられなかった。
というわけで、Windows以外でMicroPythonにBLE接続する方法を挙げておく。
Androidスマホから
PCなどと比べて、スマホの方が案外NUS対応アプリは多かったりする。試したのはSerial Bluetooth Terminalという物で、Google Playからインストール可能。
アプリを起動してメニューからDevicesを選択すると、BLEデバイスの検索画面になるので”SCAN”をタップする。

名前が”mpy-repl”のデバイスがMicroPython。タップすると接続しに行く。

紙飛行機のアイコンが送信ボタンで、その左側の窓にMicroPythonに送りたい文字列を入力する。ソフトウエアキーボードだと打ちにくいので、スマホにBluetoothキーボードを接続すると使いやすいかも。

こんな感じで遠隔操作出来るので、スマホをMicroPythonのリモコン代わりに使えそうだ。
Linux or Mac
LinuxやMacであればPythonで書かれたupydevというツールでBLE REPLが使える。upydevはかなり高機能で別途記事にも使い方をまとめている。

今回は、BLE接続する最低限の方法だけ簡単にまとめておく。upydevのインストールはpipで一発。
pip install upydev
BLEデバイスの検索にはupydev scan -blで出来る。mpy-replという名前を探そう。
$ upydev scan -bl
Bluetooth Low Energy scan:
Scanning...
BleDevice/s found: 15
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ NAME ┃ UUID ┃ RSSI ┃ Services ┃
┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ 71-F8-58-FD-D6-58 ┃ 71:F8:58:FD:D6:58 ┃ -75 ┃ ┃
┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ mpy-repl ┃ 9C:9C:1F:C5:CB:92 ┃ -61 ┃ Generic Access Profile,Generic Attribute Profile,Nordic UART Service ┃
┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ 7E-F3-7F-A6-A4-EF ┃ 7E:F3:7F:A6:A4:EF ┃ -78 ┃ ┃
┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
:
upydev付属のblereplというコマンドに-tオプションでMACアドレスを指定し、MicroPythonとBLE接続する
$ blerepl -t 9C:9C:1F:C5:CB:92
BLE SHELL-REPL connected
MicroPython v1.18 on 2022-01-17; ESP32 module with ESP32
Type "help()" for more information.
Use CTRL-x to exit, Use CTRL-s to toggle shell/repl mode
Use CTRL-k to see more info
esp32@9c9c1fc5cb90:~ $
キーボードでCTRL-sを押すとREPLモードになってリモートのMicroPythonを動かす事が出来る。
esp32@9c9c1fc5cb90:~ $
>>> import os
>>> os.listdir()
['ble_advertising.py', 'ble_uart_peripheral.py', 'ble_uart_repl.py', 'boot.py']
>>>
電波の状態が良ければそれなりに使えそうだが、電波が弱いと反応しなくなって暴走状態になる事があり、完成度は高くない印象だ。
まとめ
MicroPythonをBLE経由のワイヤレスで遠隔操作してみた。スマホをリモコン代わりに使えるので、何か面白い使い方が出来るかも知れない。
ただAndroidスマホのNUSアプリが安定動作するのとは対照的に、LinuxではNUS以前にPythonのBLEインタフェース自体の完成度が低いようで電波の状態が悪くなるとエラーを吐いて死んでしまう事が多発した。普段使いするほどこなれておらず未だベータ版かな、という感触。
コメント