BLE REPLでMicroPythonをBluetooth遠隔操作する

MicroPythonの対話型インタフェースはREPL(Read Evaluate Print Loop)と呼ばれている。最近のバージョンのMicroPythonであればサンプルプログラムを使ってBLE経由でREPLにワイヤレス接続することが出来る。試してみた。

スポンサーリンク

MicroPython(ESP32)本体側の設定

モジュールの転送

本家MicroPythonのGitHubリポジトリexample下にあるbluetoothサブディレクトリ

https://github.com/micropython/micropython/tree/master/examples/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からインストール可能。

Serial Bluetooth Terminal - Google Play のアプリ
ブルートゥース・クラシック/LEに接続されたシリアルデバイスのための端末

アプリを起動してメニューからDevicesを選択すると、BLEデバイスの検索画面になるので”SCAN”をタップする。

Screen

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

Screen

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

Screen

こんな感じで遠隔操作出来るので、スマホをMicroPythonのリモコン代わりに使えそうだ。

Linux or Mac

LinuxやMacであればPythonで書かれたupydevというツールでBLE REPLが使える。upydevはかなり高機能で別途記事にも使い方をまとめている。

MicroPython開発の便利ツールuPyDevを使ってみる
これまでMicroPythonとPC間のファイル転送にampyを好んで使っていたのだが、シリアル接続だけでなくWiFiやBluetooth経由でも使えるuPyDevというツールを見つけた。一方ampyのGitHubページを確認すると長い間更...

今回は、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インタフェース自体の完成度が低いようで電波の状態が悪くなるとエラーを吐いて死んでしまう事が多発した。普段使いするほどこなれておらず未だベータ版かな、という感触。

コメント