M5STACK GRAYの地磁気センサーでHSI風の表示
地磁気センサーを使って方位磁針のプログラムはM5STACK Gray用も世に出回っているので航空計器でいうところのHSI風な表示を試しました。
内蔵されている地磁気センサーはBMM150でした。
キャリブレーションを適切に行わないとオフセットがずれているのであさっての方向が指示されます。
USBケーブルの抜き差しだけですぐセンサの値が狂うみたいです。USBケーブル差したままでキャリブレーションしたときは抜かずに表示させたほうが良いようです。
方向は±5°くらいばらつくのでX,Y軸それぞれ移動平均をかけました。
グラフィックはlovyanGFXを使用し、ちらつき防止のためにスプライト機能を使用しています。M5DisplayクラスのM5.Lcdを使うより格段に速いです。
地磁気センサのX-Y軸のみでHeadingを計算しているのでpitch方向やroll方向に傾けるとHeadingが狂います。今後は6軸IMU結果からTilt補正かける方法および、MPU6886とBMM150のXYZ軸の関係を調べている途中で中断したままにしている9軸のIMU実装を再挑戦検討しています。
そのための下準備としてBMM150の各軸のスケール補正をキャリブレーションに入れ込むのとMPU6886のXYZ軸の位置関係とジャイロのサンプリング間隔がらみで長いことはまってました。
文字盤の数字も回転させたかったのですが、実際のデジタル計器は回転していない製品もあるので良しとした。最新のlovyanGFXでは文字盤の回転のサンプルがあるので実装検討しています。見たまま編集ではプログラムコード貼り付けられない。無理にテキスト貼り付けると文字化けするようで、はてな記法やマークダウンに後から変更できなかったので、今後は記法を変えてコードを入れるか(サイドバーにある)Gist開設後にリンクを張り付ける予定です。
M5Stack ESP32 Mpu6886+BMM150 9Axiesモーションセンサーコア開発キットArduino用の拡張可能なIoT開発ボード
M5STACK GRAYを試しました
2019年11月にスイッチサイエンスさんで11%値引きセールを行っていた時にM5STACK GRAYを購入してましたがしばらく放置していました。
理由はWindows+Arduinoの場合コンパイルが長いこと時間かかります。最初はフリーズしたのかと思いビルドを途中でやめていましたが、コンパイル時により詳細な情報を表示すると警告にチェック入れるとちゃんと動いていました。今後はPlatformIOに変えようと考えています。
課題:MPU6886のAHRSでYawが流れる
参考
https://github.com/m5stack/M5Stack/issues/191
があり、ずっとOPEN ISSUEとなっていますので、対策方法をいろいろ探していました。その中でomegatao氏のプログラムを少しいじってテストしてみました。
追記:原作者のOmegatao氏へプルリクを出して承認されました。pitch,roll方向に傾けてもyawはずれることなく表示されていると思います。
https://github.com/omegatao/M5StackGrey_MPU6886_BMM150_AHRS_sample
main.cをarduino IDE用に変更して、main.ino, BMM150class.cpp, BMM150class.hを少し変更しました。
主な変更内容:
オフセットをLoadするコードとCalibrationをユーザが呼べるように変更した。
具体的にはBMM_CalibrationとBMM_Offset_LoadをPrivateからPublicへ変更。
main.inoの60行目にあるMadgwickQuaternionUpdateの磁気センサー入力をRaw値からOffset補正値へ変更。(MagnetX,MagnetYのタイプミスがあったので修正)
9/28追記:MPU9250ではMagnetY,MagnetX,MagnetZの順のままで良いようです。MPU9250データシート38ページの9.1 Orientation of Axis参照。MPU6886+BMM150は調査中
Yaw計算後の偏角値8.5°引き算を削除(-8.5°はSparkfunのあるUSコロラド州のBoulder周辺の偏角値。東京を基準にすると偏角値は+7.66°くらい)
Heading Angleを追加(Offset補正しないと正しく表示されない。-180°~180°のマイナス側を180°~360°表示へ変更)
立ち上げ後のCalibrationをやめた。BTN_Aを押してCalibrationする方法へ変更。
BMM150のオフセット, Head Angle, 比較用にオリジナルのAHRS計算値を同時に表示
表示させたのがこちら
上から順に角速度、加速度、地磁気、地磁気オフセット、方向、地磁気入りフィルタ値、MPU6886のみのフィルタ値、温度表示
Yawは流れなくなりましたが、PitchとRollがオリジナルより小刻みに変動しているようなので、変更したことによる跳ね返りが起きていないかを検証中です。
検証がうまくいきましたら次はM5StackのBluetooth機能を利用した自撮りリモコンや在宅中のプレゼンス詐称ソフトの開発日記を予定しています。
【Nゲージのコントローラ】2重PWM方式の検討
昔の鉄道模型用のパワーパックでPWM方式で20kHzと低周波数の組合せた二重変調というのがありました。今でもアマゾンなどで入手可能ですが、電源とセットでは売っていないようです。
今回はマイコンを使って低周波数と可聴周波数以上の組合せで昔のパワーパック波形を再現させようとしています。
まずは、PWMのデューティーを最小にします。ソフトでは1μsec以下でも設定可能ですがオシロで観測できなくなるので、波形は周波数が18.75kHzに対してデューティーは3.2μsec(約6%)で設定しています。鉄芯入りでは問題ないはずですが、たぶんコアレスだとLED点灯と同時に動き出してしまいます。
コアレスなどでLED点灯と同時に動き出してしまう場合は、低周波数側でも制限します。オシロ波形は極端に設定したものを表示していますが、周波数は55Hzで約20%です。全体では1.2%です。当時マイコンも使わずに最小デューティーも小さくできない時代に、これを製品開発されたメーカーさんは流石です。
従来のPWM方式ではデューティーを広げるだけのため、LED常点灯と低速コントロール域での両立はつまみに神経を集中させないとならないのですが、2重PWMではLEDは暗いですが確実に停止、低速からスムーズです。
牽引重視の機関車のように重たい車両はノイズ音が小さいので気になりませんが、電車のM車ではモーターから低周波数側のノイズ音がカラカラ唸って耳障りです。2重変調なしでは低速時はモーター出力が落ちてしまうので、50%のデューティーで2重変調させるとモーター出力が落ちない状態で低周波ノイズが聞こえなくなります。
最後に、トランジスタやMOSFETを一段でドライブしている自作回路が多く公開されていますが、それぞれ素子固有の理由でトランジスタや高速動作が売りのMOSFETでもモーター側のPWM幅を狭く出来ない制約があり、コアレスモーターのコントロールでは苦労されているようです。理由は自作派されている諸先輩のホームページや半導体メーカーのホームページをググってください。電気工作苦手な方は2Aくらいのモータードライバー搭載基板が売っていますのでそちらを使うという方法もあります。