Processingを用いてArduinoのシリアル通信からのデータ可視化ツール(テンプレート)の作成
前回 BMX055の9軸センサからオイラー角算出
http://tomi-tomi-pon.hatenablog.com/entry/2018/11/07/012854
9軸センサの値を読み取りましたが数値では大変見にくいため今回はそのデータを可視化させるアニメーションの元として1つのリアルタイムグラフを作ります。
用はProarduinoのシリアルモニタ見たいな物と考えてもらって構いません。
使用するソフトウェアはProcessingです。
以下arduino側のプログラム
以下Processing側のプログラム
ポートは各々使用しているポートに変更してください
このプログラムはarduino側で1秒ごとにインクリメントとデクリメントしたデータをProcessingで表示してるだけのプログラムです。
とりあえずわかりやすいようにコメントアウトしました。
[簡単な補足]
arduino側は表示したいデータnama_1とname_2を
[nama_1]
[,]
[data_1]
改行
…
との順に送信しています。終了文字の改行をprintln("/n")としてデータ仕切り信号としようとしましたがProcessing側の
String myString = myPort.readStringUntil('\n');
で上手くデータが区切られずprintlnとしています。
[まとめ]
arduino側で識別値とデータをカンマで区切りProcessing側で受け取ったのを2つグラフ化するという非常にシンプルなものです。Processingはデバック用のツールではありませんが、シンプルで使い方によって面白い&便利なためおすすめです。
今回は値を増加、減少させただけですが次はこれを応用して9軸センサのデータ可視化を行います。
次 BMX055のデータをグラフ化、3Dアニメーション化させる
Arduinoを用いてBMX 055 9軸センサーモジュールからのオイラー角算出(メモ)
今回はカメラの3軸シンバル(スタビライザ)を作製する(気持ちがあった)ため、その足掛けとして、roll ,pitch, yawのオイラー角をarduinoで計算させました
BMX055使用9軸センサーモジュール: センサ一般 秋月電子通商-電子部品・ネット通販
今回はこれを使用しました。
9軸(3軸加速度+3軸角速度+3軸磁気)の値をI2C通信を用いて、この1300円くらいのICで求めることができます。つよい
もし詳しい詳細が欲しい時はBMX055のデータシート一覧に書いてあります。
図 秋月様の取り扱い説明書抜粋
このJPのショートとは基盤の裏にあるJP○の場所をはんだすることを指します。
私も一度間違えてしまい無事にICを焼いてしましましたので気を付けましょう....
I2C通信ではプルアップ抵抗が必要ですが公式のWrieライブラリを使用するとArduino側でプルアプルアップが行われます。
今回はArduinoのプルアップ抵抗を使用するためJP6をショート(はんだ付け)を行い他のJPをオープンとしました。電源Vccを5Vとします。
[質問があったため追記]
図 ショート例
JP6.をこのように2つのランドにはんだを付けショートさせます。
このようにすることによって電源をVcc 5v駆動 I2Cプルアップ、加速度ジャイロ磁気が0x19 0x69 0x13のアドレスとなります。
図 IC BMx 055を用いた回路図
回路図を見てわかる通りJP4 JP5をショートさせることでプルアップ抵抗が適用されます。(今回は使用しません)
以下arduinoプログラム
#include <math.h>
//
{
BMX055_Gyro();
Serial.print(GRYO);//gryo==1
Serial.print(",");
Serial.print(xGyro);
Serial.print(",");
Serial.print(yGyro);
Serial.print(",");
Serial.println(zGyro);
BMX055_Accl();
Serial.print(ACCL);//accl ==2
Serial.print(",");
Serial.print(xAccl);
Serial.print(",");
Serial.print(yAccl);
Serial.print(",");
Serial.println(zAccl);
BMX055_Mag();
Serial.print(MAG);//mag==3
Serial.print(",");
Serial.print(xMag);
Serial.print(",");
Serial.print(yMag);
MadgwickFilter.update(xGyro,yGyro,zGyro,xAccl,yAccl,zAccl,xMag,yMag,zMag);
roll = MadgwickFilter.getRoll();
pitch = MadgwickFilter.getPitch();
yaw = MadgwickFilter.getYaw();
Serial.print(XYZ_ROTATION);//XYZ_ROTATION=4
Serial.print(",");
Serial.print(roll);
Serial.print(",");
Serial.print(pitch);
Serial.print(",");
Serial.println(yaw);
delay(50);
}
↓git hubに全データ上げています
#include <MadgwickAHRS.h>
を使用しているためライブラリを落としてください。
シリアル通信は115200に設定(好きな値を)
オイラー角を求めるには相補、カルマン、などいろいろありますが、今回は最近開発されたMadgwickフィルタを使用しています。このフィルタはカルマンフィルタよりマイコンに負荷がかかりにくい事で有名なフィルタです。
Madgwickフィルタのサンプリング周波数を10Hzと指定しています。
初期は100Hzらしいです。しかし、応答速度が低く目標の値まで時間がかかってしまったので、下げることにより精度を下げる代わりに応答速度を上げました。
今回は3軸シンバル姿勢制御が目標だったため(一応)応答速度を重視しましたが、各自用途によってサンプリング周波数を変更してください。
さらに磁気センサを使用すると周りの磁気の影響を受けてしましますので、roll,pitch,yawの誤差が酷いようでしたら下のように書き換えて6軸のみの計算に切り替えてみてください。
madgwickFilter.updateIMU(xGyro,yGyro,zGryo,xAccl,yAccl,zAccl);
図 実行結果
このように値を算出する事ができました。yawの値が時間が経過するにつれドリフトしていますが、それ以外の数値の精度はハードウェアに実装しても問題ないレベルの精度です。
補足として
GRYO,ACCL,MAG,XYZ_ROTATIONを数字に置き換えたのはシリアル通信でProcessingにアニメーション化するためにこのようにしました。
次 グラフ化させるため1つのテンプレートを作る
http://tomi-tomi-pon.hatenablog.com/entry/2019/04/08/145913
その次 BMX055のデータをグラフ化させ3Dアニメーションを付ける
http://tomi-tomi-pon.hatenablog.com/entry/2019/04/08/181841
※2019/10/23 一部修正
pubg のディスプレイ解像度変項、およびハイライト自動キャプチャ―ができない対処
PUBGの解像度が変更できなくなる
さて、引っ越しが終わりPCの電源が起動することを確認してpubgを起動したとき
解像度の変項及び、ハイライト自動キャプチャ―が変更できなくなりました。
このように変更の場所がありません、というか押せません。
同時にNVIDEAのGeforce Experienceの共有ボタンも押せなくなり、録画及びスクショができなくなりました。つい先日引っ越すまではできていたのに.......
対処法
対処法はいたって簡単でした。ただ、モニターのケーブルをグラボに直結させるだけでした。マザボ側にさしていたが原因でしたとは完全盲点でした。
無事にGeForce Experience が起動してくれたのでこれで配信やらキャプチャができたりできるようになりました。
まとめ
ggっても出てこないし(あたりまえ) これを発見するまでPCを再起動かけたり、モニターの解像度変更したり、PUBGをアンスコしたりして結構苦労しました。ほんと.....
間違える人なんてまずいなそうですが、参考程度にどうぞ