PlatformIOでシリアルプロッターを動かす arduplot をインストールする

タイトル

PlatformIOにもArduino IDEにあるようなシリアルプロッター(Serial Plotter)が欲しいです。シリアルプロッターとはシリアルターミナルで受信した数値をグラフにプロットする機能です。
そこでシリアルプロッターを表示するarduplotを動かしてみます。

PlatformIOの公式にはシリアルプロッターがありません。センサーのデバッグではセンサーの値をグラフに表示できると便利です。
そこでarduplotを動かしてみます。Pythonでシリアルプロッターを表示してくれます。arduplotはPlatformIOのデバイスモニタのカスタムフィルタとして動かせる点が特徴です。
独立したシリアルプロッターならばarduplotよりも高機能なシリアルプロッターがあるでしょう。

arduplot

arduplotはPlatformIOでシリアルプロッターを表示するPythonのプロジェクトです。
yhur/arduplot | GitHub
No Serial Plotter for PlatformIO/VSCode ???
The following picture shows the Arduino IDE's serial plotter which plots the data coming through the serial port.
arduplotのインストールはpipでできます。pipをどこで実行するかで動かなかったりします。PlatformIO内ではpenvフォルダにPython仮想環境を作ってPythonが実行されるようです。OSにインストールしたPythonでpipコマンドを使っても仮想環境が異なるため期待した結果が得られないでしょう。
必ずPlatformIOで新しいターミナルを開きそこで
pip install arduplot
と入れてインストールします。必要なライブラリも自動的に入ります。
インストール途中の文字列に表示されるパスをメモしてください。arduplotがインストールされたパスです。後でそのパスにある一つのファイルをコピーして使います。
インストールが終わったらarduplot単独で動かしてみます。
arduplot
と入れてみましょう。プロット画面が表示されるはずです。
arduplotのプロット画面

ヘルプでオプションを見てみます。
Usage: arduplot [OPTIONS] [LABELS]...
Options:
-w, --width INTEGER   Plotter Width
-i, --width INTEGER   Plotter Y Axis Min
-x, --width INTEGER   Plotter Y Axis Max
-t, --title TEXT      Plotter Title
-s, --socket INTEGER  TCP Socket Port number
-p, --port TEXT       Serial Port, a number or a device name
-b, --baud INTEGER    Set baudrate, default=115200
--help                Show this message and exit.
シリアルのポート番号も指定できます。
プロット画面を閉じる時はターミナルでCtrl+Cを押して停止させた方が良いようです。プロット画面を直接閉じるとターミナルがフリーズする事がありました。

PlatformIOのデバイスモニターのカスタムフィルターとしてarduplotを動かす

単独で動かすのではなく、今回はPlatformIOのデバイスモニタのカスタムフィルターとして動かしてみます。

arduplotを開発する過程でPlatformIOからカスタムフィルターを呼び出す手順が議論されていました。
platformio/platformio-core |GitHub
serialplotter filter #4058
カスタムフィルターはPlatformIO Core 5.2.3から使えるようになりました。
カスタムフィルターではシリアル通信の送受信文字列をPythonで加工する事ができます。その機能でプロッター画面を表示しているようです。

カスタムフィルターを使うにはカスタムフィルターを呼び出すPythonスクリプトを特定のディレクトリに配置します。配置する場所は3箇所選べるようです。
  i. configure every time you create a pio project
 ii. configure your platform wise like esp8266 or esp32
iii. or you just configure globally by setting an environment variable.
1つ目はPlatformIOのプロジェクトごとに配置する。2つ目はマイコンボードのプラットフォーム毎に配置する。そして3つ目は環境変数に指定する方法です。

今回は1つ目の方法で配置します。
自分のプロジェクトのフォルダのルートに
monitor
という名前のフォルダを作ります。このフォルダの中にカスタムフィルターを呼び出すPythonスクリプトを配置します。arduplotの場合は先程arduplotをインストールしたフォルダの中にそのスクリプトがあります。

arduplotのフォルダーがわからない場合はPlatformIO内のターミナルで
pip show arduplot
と入れるとpipでライブラリをインストールする場所が表示されます。
Name: arduplot
Version: X.X.X
Summary: This tool listens the serial port and draws the data to matplotlib.
Home-page: https://github.com/yhur/arduplot
・・・
Location: c:\users\xxx\.platformio\penv\lib\site-packages
・・・
このフォルダにarduplotフォルダがあるのでその中の
filter_plotter.py
というファイルを先程作ったmonitorフォルダにコピーします。これで準備完了です。

デバイスモニターを呼び出す時にカスタムフィルターを指定するとarduplotが動きます。
pio device monitor -f plotter
この記事作成時では"plotter"というフィルター名になっています。この名前はarduplotのバージョンアップで変わるかもしれません。

まとめ

PlatformIOでシリアルプロッター機能を実現するarduplotを動かしてみました。シリアルプロッターを単独で動かすならばarduplotよりも高機能なシリアルプロッターがあるでしょう。
arduplotの動かし方が短期間に変わっていったようで、最初動かすまでかなり遠回りをしました。でも最終的な手順がわかっちゃえばとても簡単に動かせます。
OSにPythonを入れる必要はありません。PlatformIOのPython仮想環境で動かす点に注意してください。

arduplotは数値区切りの認識を失敗しやすいです。数値以外の文字の除外もしてくれません。行列データで複数のプロットを表示しようとするとうまくいかないです。改良されるのを気長に待ちましょう。あるいは自分で改造するのもいいでしょう。
ビデオ内ではプロッターの更新間隔を50msにしています。行列を正しく認識するよう改造を試みましたがうまくできませんでした。間違えると子プロセスが生き残ってデバッグしにくいです。
PlatformIOのカスタムフィルターを使った例はまだ少ないようです。送受信文字列をPythonで好きにできるのでおもしろい事ができそうです。自分でカスタムフィルターを作る時のサンプルとしてarduplotを動かすのも良いでしょう。

arduplotやカスタムフィルターを検索してもまだ何も出てこない状態です。情報が無さすぎてArduPilotが出てくるので勘違いしないように。
オープンソースソフトウェアは短期間に使い方が変わるので古い情報が出てくると混乱の元です。Qなんちゃらサイトも検索で出てこないのでキレイなもんです。だから検索結果が少ないのは良いことだと思う時代です。検索結果が当てにならない時代が来るとは思っていませんでした。まぁ私のブログも古い情報を更新しないとなぁ・・・と思うだけなので人のことは言えませんが。

ビデオ




コメント

最近のコメント

Threaded Recent Comments will be here.