PlatformIO で RFC 2217 を利用したマイコンボードへのリモート接続
M5StickC用の開発は PlatformIO + Visual Studio Code(Remote - Container) で行っているのですが、pio
コマンドをコンテナ上で実行した場合、ほとんどの場合で M5StickC (マイコンボード)への接続経路(ポート)が無いため、アップロードやモニターが出来ないことになります。
解決方法はいくつかあるのですが、 PlatformIO では多くの接続方法が用意されているので、今回はその中からRFC 2217 を利用することにしました。
USB 接続できる PC
USB ポートが付いていて Python が動く環境ならば、 RFC 2217 用のサーバー PC を別途用意する 必要はなく 、ローカル PCや Docker Host を利用しても問題はないと思います。
なお、今回は PC に Raspbian Buster(現 Raspberry Pi OS) をインストールしている場合での手順を記載していますが、他の環境でもおおよそ同じ手順でいけると思います。
マイコンボードを接続
PC の USB ポートに M5StickC(マイコンボード) を接続し、接続状態を確認します。
$ lsusb
Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ ls /dev/ttyUSB*
/dev/ttyUSB0
pySerial
PlatformIO で RFC 2217 を使う場合、pySerial を利用するのがおそらく一番簡単です(USB接続している PC に PlatformIO Coreをインストールしてあるならば、この手順はスキップできます)
Raspbian Buster の Python は 2 系がデフォルトですが、今回は Python3 用の python3-serial
をインストールします。
$ sudo apt install python3-serial
rfc2217_server.py
Single-port TCP/IP - serial bridge (RFC 2217)
からrfc2217_server.py
をダウンロードし、以下のように実行します。
$ python3 rfc2217_server.py -p 10011 /dev/ttyUSB0
INFO:root:RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit
INFO:root:Serving serial port: /dev/ttyUSB0
INFO:root:TCP/IP port: 10011
なお、ファイアウォールを設定している場合は、rfc2217_server.py
が利用する TCP ポート(今回は 10011
) を開いておく必要があります。
また、 環境によってはアクセス権のエラーが出るかもしれないので、その場合は group
等を調整するか sudo
などで対応することになります。
リモートで接続する
まず、モニターができるか確認します。
Visual Studio Code で PlatformIO のプロジェクトを開き、ターミナルなどから $ pio device monitor -p rfc2217://xxx.xxx.xxx.xxx:10011 -b 115200
を実行します(xxx.xxx.xxx.xxx
は USB 接続している PC の IP アドレス)。
$ pio device monitor -p rfc2217://xxx.xxx.xxx.xxx:10011 -b 115200
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on rfc2217://xxx.xxx.xxx.xxx:10011 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
�M5StickC initializing...OK
モニターの確認ができたら Ctrl + C
でモニターを終了します。
アップロードも同じように
$ pio run -e m5stick-c -t upload --upload-port rfc2217://xxx.xxx.xxx.xxx:10011
で実行できます。
\[$] pio run -e m5stick-c_screen_shot -t upload --upload-port rfc2217://xxx.xxx.xxx.xxx:10011
Processing m5stick-c_screen_shot (platform: espressif32; board: m5stick-c; framework: arduino)
--------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/m5stick-c.html
PLATFORM: Espressif 32 1.12.0 > M5Stick-C
<< snip >>
Linking .pio/build/m5stick-c_screen_shot/firmware.elf
Retrieving maximum program size .pio/build/m5stick-c_screen_shot/firmware.elf
Building .pio/build/m5stick-c_screen_shot/firmware.bin
Checking size .pio/build/m5stick-c_screen_shot/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [= ] 12.0% (used 39160 bytes from 327680 bytes)
Flash: [======== ] 81.3% (used 1065159 bytes from 1310720 bytes)
esptool.py v2.6
Configuring upload protocol...
AVAILABLE: esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag
-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Use manually specified: rfc2217://xxx.xxx.xxx.xxx:10011
Uploading .pio/build/m5stick-c_screen_shot/firmware.bin
esptool.py v2.6
Serial port rfc2217://xxx.xxx.xxx.xxx:10011
Connecting....
Chip is ESP32-PICO-D4 (revision 1)
<< snip >>
Writing at 0x00088000... (86 %)
Writing at 0x0008c000... (88 %)
Writing at 0x00090000... (91 %)
Writing at 0x00094000... (94 %)
Writing at 0x00098000... (97 %)
Writing at 0x0009c000... (100 %)
Wrote 1062656 bytes (589619 compressed) at 0x00010000 in 15.2 seconds (effective 559.9 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
<< snip >>
ただし、アップロードは Connecting....
から先にすすまない場合があるので、
そのときは (Wi-Fiの場合はとくに)ネットワークの状況を確認し、何度か再実行すると成功することがあります。
改善点
M5StickC を USB 接続する毎に rfc2217_server.py
を実行するのは地味に面倒なので、この辺は udev などで改善できればとは思っています。
その他の解決方法
今回は RFC 2217 を使いましたが、その他の解決方法も少し試してみたので雑感を記載しておきます。
Docker の device
オプションで /dev/ttyUSB0
を利用
- 良い点: コンテナ上でも普通に
pio
コマンドが使える。 - 惜しい点: アクセス権の設定などが面倒になることがある、M5StickC は Docker Host に接続する必要がある。
OTA アップロード
- 良い点: ネットを検索すると設定例などがいろいろ出てくる
- 惜しい点: 「マイコンボードからコンテナに接続しにくる」のでコンテナ側へのポート転送の設定などが必要になる。
pio remote
- 良い点: 公式が「SSHとかポートとか考えなくも大丈夫」と言っている通り、設定などは一番楽に行える。
monitor
が稼働しているときにupload
してもきちんと調整してくれる。 - 惜しい点: 少し遅い(ファームウエアを一旦 PlatformIO のサーバーに転送してから、あらためてリモートに転送している?)、リモート側にも Platform IO Core をインストールする必要がある。