手元にあるMEMSセンサー(加速度)の比較です。
近所の公園に出かけ、ADXL312 と MPU6886 で振動を測定してみました。
測定条件は以下の通り。
・ADXL312: 1.5G, 2.9mG/LSB
・MPU6886: 2G, 0.06mG/LSB
・常時微動(10分程度)
・センサー周辺で連続ジャンプ
まずは常時微動。
MPU6886
MPU6886 はその倍くらいのノイズになっています。ドリフトは小さい。
手元にあるMEMSセンサー(加速度)の比較です。
近所の公園に出かけ、ADXL312 と MPU6886 で振動を測定してみました。
測定条件は以下の通り。
・ADXL312: 1.5G, 2.9mG/LSB
・MPU6886: 2G, 0.06mG/LSB
・常時微動(10分程度)
・センサー周辺で連続ジャンプ
まずは常時微動。
M5StickC Plus の MPU6886 には、ジャイロがついています。
ジャイロといえばパッドで利用されています。これまで加速度しか需要がなかったのですが、世間ではジャイロがコントローラーの1機能として使われています。ふと、機能があるなら作ってみようかと思い立ちました。
Google先生に聞いてみると、同じようなことを考えられる方はいらっしゃるというか、ロボットの姿勢制御等に利用されているようでした。自動車にも入っているのでしょうね。制御工学の範疇になるようです。
現在時刻の姿勢を算出する方法として、加速度、角速度から直接回転角度を求める方法と、何らかのフィルターを通す方法があるようで、一般的には後者の方が安定しているとのこと。このあたり、制御工学を勉強しないと理解できないでしょう。
で、M5StickC Plus でどの程度できるのかを試してみることに。
角速度は時間積分しただけ、加速度からの算出式は web の中で分かりやすい説明があった以下から、フィルターは Arduino で配信されているモノ(MadgwickAHRS algorithm)のできあわせ比較です。
https://watako-lab.com/2019/02/15/3axis_acc/
https://github.com/arduino-libraries/MadgwickAHRS
結果はコチラ。
加速度からの算出値もそこそこ良い挙動ですが、細かな振動が現れています。その点、Madgwick filterは安定しています。そこそこ再現できそうです。どういう理屈なのか知りたいところですが、ひとまず恩恵を受けて進めましょう。
SGP30 を利用したタバコ検知の続きです。
窓を閉める季節になってしまい、音のデータ取得を中止しました。貯めたデータでは、低周波側でいくらか特徴のあるピークを得られたものの、ノイズと綺麗に分離できるほどでもない程度でした。
今期のコードは TVOC と eCO2 の両方が閾値を超えたら ライト点滅、ブザー発信、LINE に観測値を送る、という仕様にとどめました。eCO2 も急上昇することが分かったので、両方を組み合わせました。
LINE に関しては、異なる部屋にいたときになかなか気づかないことがあったので、その対応策です。ただ、これにハマりました。
API が用意されていますのでそれを叩くだけ & コードはネットに転がっている & どれも同じ内容、なので間違えようがないのです。でも、スマホに着信しない。Windows から叩いてみると着信しますので、環境的に使えないわけではありません。
3日ほど試行錯誤した結果、原因がわかりました。
常時データを送信している Ambient は WiFiClient でないとダメ、LINE Notify は WiFiClientSecure でないとダメ、でした。
もう一つ、void setup() に setInsecure(); も必要でした。
これをクリアすれば、着信しました。
今期はココまで。また春に出番が来たら、起こしましょう。
時間ステップはコレ↓で数10μsecの誤差に収まりました。CPUクロックは80MHzでもOKです。10msec=100Hzサンプリングの例です。
EXCEL の代わりに MobaXterm でシリアル接続。最大表示&他の作業の裏で動かしていると、欠測が生じました。また、M5側でLCDへの波形の作画自体は問題ないのですが、全消しタイミングで計測の遅れが生じました。MobaXterm 最小表示 & 他の作業ナシ & M5 LCD 波形表示なしでは、欠測なく受信できました。うーん。
SDカードスロットを付けると良いのかな?
今回は、ここまでにしておきましょう。
********************************************************
20221008追記
コード全体です。Aボタンを押す毎に、波形表示・非表示を切り替えます。XYZ 軸の+-方向と重力加速度の方向の扱いについては、イマイチ理解できませんでした。 ←解決。
https://phreeqc.blogspot.com/2022/10/mems.html
公式サンプルコードに加え、波形表示は以下を参考にさせていただきました。感謝。https://gist.github.com/TakehikoShimojima/d136e81e13eeea603a8e594a8f5ef90f#file-m5vibration-ino
M5StickC-Plus 内の加速度センサー(MPU6886)によるデータ取得。
加速度計の場合、msecオーダーの制御が必要です。受信側で時刻を付与すると、転送時間や受信側の処理速度により正しい計測時刻を設定できません。それが規則的にずれているなら補正できますが、ランダムであれば手の施しようがありません。センサー側でデータを保存するか、測定時刻を測定データとともに受信側に送るかでしょう。手元にはSDカードモジュールがないため、後者の選択になります。まずは EXCEL で取り込んでみましょう。
これまで使用してきた delay() を用いて、約10msec 間隔でデータを採取。1 loop の中で 10msec 止めるので、処理時間を加えるとそれ以上の間隔での測定になります。それが何m秒なのか知りたくて、RTC にて時刻を付与したデータをシリアル送信。
ダメでした。RTC の時刻付与は秒単位。msec単位で表示できないのでしょうか?
そうなると最初に RTC で計測開始時刻を定め、あとは一定間隔で値を取り出すしかないでしょう。仕事で使用する加速度計も同じ(計測開始時刻+時間ステップ指定)かもしれません。
センサー側 CPU クロック 80MHz、delay(5)、EXCEL側 10msec で取ってみると、7ms間隔でデータが保存されていました。
センサー側 CPU クロック 240MHz、delay(5)、EXCEL側 10msec だと6ms間隔。
センサー側 CPU クロック 240MHz、delay(9)、EXCEL側 10msec だと10ms間隔。この程度でしょうか。
全てのケースで、たまに欠損があります。これはEXCEL側の問題。やはり表示がダメか。
delay()でもそれなりの結果を得られましたが、やはり正確なデータ間隔をプログラム中で設定したい。このままでは長時間の計測でズレが生じるでしょうし、EXCEL側でも他のソフト次第で欠測の多く発生することが予想されます。
時間刻み、データの保存方法について調べましょう。
自宅にて測定を続けていると、窓から入る色々な匂い?にも反応していることがわかりました。全く匂わないときにもセンサーが反応することがあるので、ドリフトの影響を受けているのかもしれません。ひとまず対象を絞ることにしました。
まずは、タバコ。
隣家が換気扇を回している場合にタバコ臭が室内まで届くことがあるようで、この換気扇の音を利用する目論見です。
FactoryTest から音の FFT 部分を取り出します。整理しながらコードを見ていたのですが、サンプリング周波数がよくわかりません。FFTにかけるデータ数を指定できるのですが、それらが何秒ステップで採取するのか指定するところを把握できませんでした。include したライブラリの中に書かれているのかもしれませんが、ひとまず飛ばします。
抜き出したコードに FFT 結果のシリアル転送する部分を追加。これで値が PC にて見えるようになりました。が、転送結果をファイルに書き出す方法がわかりません。もしかしてないのか?
他の方法を調べてみると、簡易な方法がありました。EXCELです。Data Streamer という com アドインがありました。これで通信結果をターミナルのように取得できます。昔はVBAでしか通信できなかったのですが、いつの間にか実装されていました。Iot 時代の常識なのでしょうか。
使用してみると、少々難あり。1度目はデバイスの接続、解除に手間取り、接続できなくなりました。次はマウスとして認識されてしまい、計測中にカーソルが暴れて制御不能になりました。後者の現象と対処法は web 上でたくさん引っかかりました。Windows あるあるのようです。マウスとして認識されていたデバイスを削除し、COMポートの番号を変えてからは安定していますが、対処療法なのでいずれ復活するかもしれません。
EXCEL につなぐことができたら、データを容易に採取できます。サンプリングは0.01秒毎でも可能でした。200行分表示させていたのですが、その中身は時間とともに更新されます。その範囲で散布図を作っておくと、イコライザーとまではいきませんが、周波数領域のグラフが時間毎に更新されます(そういえば、振幅の単位もわからない)。EXCEL は表示が遅いので、データが飛んだりグラフに空白が生じたりしていましたが、手軽にここまでできるとは驚きでした。
FFT 結果は1度の処理で128行×3列のデータを流すようにしていたのですが、このままでは EXCEL 側で欠損します。そこで表示を 200 行から 5 行に変更。表示の負荷を小さくすることで欠損なく取得できました。これ、振動を図る際に都合が良いですね。次はRTCと振動かな。ま、時間方向にFFT結果が欠損したとしても、その数を集めてプロットすれば周波数領域での特性を把握できそうです。今回はこのまま進めます。
データを集めましょうと思いましたが、そう都合よく隣家が換気扇を回してくれるタイミングに出会えるわけではありません。自宅の換気扇でまずは試しました。
結果は上々。近いので当たり前なのですが、安いセンサーでも音が届けば分離できる可能性はあるようです。ということで、コードはひとまずこれでOK。
それでは、気長にデータを集めましょう。