Processingで簡易なシリアルプロッターをチャチャっと作・・れなかった話
先日Processingを使ってみまして、次いでINA226 電流・電圧モニタIC搭載ボードをいじってみましたので、折角なのでProcessingでプロットさせてみようと思いまして。
ササっと出来るかなと思っていたのですが、結構大変ですたorz
しかし何とか形にできたのでブログに。
苦労話を書いてもアレですので作業記録みたいな感じで。
下準備
なるべく高速になる様に、マイコン側のESP32の方では先日のINA226ボードの設定を最速に。
但し手間もかけたくなかったのでprint文で用意します。
watchdogタイマーにやられない様に、ディレイはvTaskDelay(1)程度に。
出力マイコン:ESP32
UART:115200
出力方法:Serial.println
センサー:NA226ボード
ディレイ:vTaskDelay(1)
ソース:INA226計測値
INA226設定:
Bus Voltage ConversionTime:140us
Shunt Voltage ConversionTime:140us
平均化:1~1024
計測対象:前回同様OLED LCDの電源ライン
とりあえず手元の環境で簡単に出来る実測値でなるべく早いサイクルの設定を。
但し、140usとか相当速いですがこのサイクルで出力を得られる訳ではありません。
BusやShuntのConversionTimeを短くしても、リクエストをこれに近い速度で出さない事には全く影響は無いものと思います。
そしてリクエストの頻度はマイコンとI2Cの速度にキャップされると思いますので、結局はESPのループとSerial.printlnの速度かなぁ
面倒なので確かめませんが・・・( ノД`)
世間のシリアルプロッタの状況調査
まずはシリアルプロッタの実態がどんなものかを調査しまして、、、
ArduinoのIDEについているシリアルプロッタを試してみますと、これが結構良いではないですか
同じくArduinoのシリアルモニタにて送出されたテキストを確認したところ、大体1秒間に500サンプル送信されている様です。
たまに垣間見える赤い尖塔
なんだこれは・・・
恐らくこの電源、安っすいACアダプタで入力したものを、これまた激安レギュレータボードで入れている為ではないかと。
アダプタのコードにちょこちょこっと触るとこの様なノイズが入ります。
・・・大丈夫なのか・・・・?
まぁいいか
それはともかく、せめてこのくらいの事が見える様になるものを作りたいなと思い。
突入電流とか見れると何かと便利そうですしおすし
さてArduino標準のほかに、世の中のシリアルプロッタを探してみると、C#であったりProcessingであったり結構乱立している様で。
逆に言えば特にコレといった定番は見つかりませんでした。
とりあえずは何かおかしな動きが無いかを見つけられるものを作りたいですね。
そしてポーズできるやつ。
Arduinoのシリアルプロッタはサッと使えて便利なんですが、ポーズも拡大もできませんのでちょっと;
何れにしても、世間ではシリアルプロッタではオシロスコープの様な速度は初めから求めておらず、変化を見るツールとして位置づけられている様でした。
シリアルで送受信するのですから当然なのでしょうね
要件を定義
さてじゃ作るもの大体の形を決めなくては。
必要な機能を列挙してみます。
・Arduinoのシリアルプロッタと同じ位の手軽さと使いやすさ
・個別にズームして見られる
・データはファイルに保存できる
・ファイルに保存したデータを読み込める
・トリガでポーズをかけられる
・取りこぼさない速度。できれば突入電流くらい見たい
ひとまずはこのくらいは欲しいかもしか。
モーションセンサーやらそういうセンサー類のデータを逃さず見れればいいな
それから当初の目的であった12Vで瞬間50A超えのDCモーターの突入電流を見る為の入口にでもなれば。
コーデイング
コーディングは前述の通り、描画が簡単にできるっぽいProcessingでプロットしてみる事に。
一応Javaですのでそれなりの処理速度は出るのではないかと。
そういえばJavaとかまともに触った事無かったデシね( ノД`)
まぁきっと大丈夫だろう
きっと世の中には膨大なドキュメントで溢れているに違いない
てな感じではじめてみるも
氏ねよJavaァ
JavaaaAAAAAAAAAAAAぁぁぁぁぁぁああああ
リファレンスがバージョンによってアッチャコッチャ動き過ぎなんですが
しかもリファレンスの説明少な杉
Processing自体、controlP5やPGraphのライブラリ資料無さ杉
配列使いづら杉
せめて程度の軽い暗黙キャストは許してほしぃ
うん、、、Java嫌い
新しい目の言語に慣れ切ったせいか、ほんとどうでも良い文法で躓きまくります。
むしろCの方が安心して書けるぽ
などなど、数々の障害が。
どうせWindows上のプログラム経験なんてほぼ無かったんですから、こんな事ならProcessingでは無く、はじめからC#かプレーンなJavaで始めればよかったと後悔しつつ
ソースは、、
見せれません( ノД`)
汚過ぎて
試行錯誤をしたソースというのはちょっとお見せできないですん
いぁ、、普段からも相当汚いですが( ノД`)
実測
何とかソレっぽい動きをする様なものが出来たのでちょっと撮ってみるます
ほんと長々とつまらない動画ですが、、
そして盛大にスパイクノイズが乗っている。
まぁ、、、
コレですからね・・・( ノД`)
動画では4096サンプルx2ラインを配列で格納してぐるぐる回してます。
そして貯めこむサンプル数を増やすと描画が遅くなっていく感じはあります。
シリアルデータは特にエラーもなく秒間500サンプルほど取得出来ているっぽい。
ESP32側の出力がそんなもんなのでしょう。
I/Oに関しては限界どころか余裕あり過ぎ状態っぽいですね
機能:オートスケール
余白を作るのがダルイかったので、上下いっぱいに表示してしまう
一応想定通りの動作はしてるっぽい
貯めこんだデータを上下のレンジに合わせてプロットしてるだけですからね・・・
サンプル中のすべてのデータから描画単位でオートスケールするとちょっと重くなってしまいましたので、基準の取り方を表示領域のみに。
そして余計なデータを読みに行かない様にポインタモドキで対応
Javaaaaaaa!な感じの固定長配列ですから、ほんと扱いづらい。
ポインタも無い。( ノД`)
機能:自動グラフの目盛り
これが地味に面倒でした。
画面スケールを変更しても大丈夫な様に心がけてはみましたが、windowサイズを変更した時のイベントの拾い方がすぐに出て来なかったので、結局サイズ固定でやってしまぃ
おかげで中途半端に;
しかし自作ですので後で直すのもラクなのではないかと・・・
自分で作るのはこういう意味でしかないですね多分。
機能:入力セレクト
なんかまぁ2本くらい入れると見る範囲が全然違うので、片方だけ見れるとかそういうやつです。
片方は描画しないという暴挙でオートスケールと両立
機能:ズーム
本当はx軸y軸ともに任意の箇所でズームしたかったのですが、なにぶんPGraphicsに不慣れなもので・・・
x軸は未実装、y軸は最低限、表示領域いっぱいまでズームできる様にしました。
一応x軸を広げる事で、ゴチャゴチャっとした箇所で何が起こっているのか判る様になるんじゃないだろうかと
機能:現在の値表示
これもマウスポインタ近くのポイントの現在の値が出る様にしたかったのですが、ひとまず最低限、最新の取得データの値を表示できる様に
機能:シリアル送信(文字)
ESP32側にデータの送信を促すためにシリアルが送信できるテキストボックスを設置
まぁオマケです
マイコンにいちいち物理ボタンとか付けなくても良くなる様にと。
宿題とかダメっぽい所とか
要件の半分も出来て無いジャマイカん
りあえず、データを見るだけなら見れる様にはなった・・・かな
しかし機能を追加すればするほど目に見えて重くなっていく・・・
幸いシリアル受信部分はロスなく動作している様ですが、サンプル数を増やしていくと描画が重くなっていく。
これそのうちシリアルからのデータの格納速度が描画の末尾に追いついてしまう可能性が。
描画はちょっと別プロセスに分けたりしたいですね
入力毎にメモリ上で作って合成した方がいい希ガス
受信した所からベタ表示させているだけですので、タイムラインも設けたい。
そうするとまた重くなりそうなorz
Javaのマルチスレッドでどうやるんだ・・・
なんかクラス分けしてインスタンスを生んどけばやってくれるんだっけ・・・・?
何はともあれ
簡単にできると思ってたのに!
なんか色々と先は長そうですハイ
ひとまず宿題リストを
・シリアルポートのセレクト、On/Off
・データ保存/読み込み
・入力の増減をどうするか
・マウスポインタの箇所の値表示
・マウスによるズーム、パン
・見やすい様に表示調整
・時間軸の取り扱い
・トリガ機能
・パフォーマンス改善・マルチスレッド・コントロール分離
・平均化処理
なんかある程度形になったかなと思ったのにまだ山盛りあるますね・・・
描画ももっとGPUに仕事させたいですし、勉強ですn( ノД`)
とりあえず自作って事で、次に繋がる経験値が積めた、、のかな
ディスカッション
コメント一覧
まだ、コメントがありません