紅熊の日記

マイコン制御の実験など

M5STACK GRAYの地磁気センサーでHSI風の表示

地磁気センサーを使って方位磁針のプログラムはM5STACK Gray用も世に出回っているので航空計器でいうところのHSI風な表示を試しました。
内蔵されている地磁気センサーはBMM150でした。

f:id:x8MkvW:20210102185519j:plain

表示画面

キャリブレーションを適切に行わないとオフセットがずれているのであさっての方向が指示されます。

USBケーブルの抜き差しだけですぐセンサの値が狂うみたいです。USBケーブル差したままでキャリブレーションしたときは抜かずに表示させたほうが良いようです。

方向は±5°くらいばらつくのでX,Y軸それぞれ移動平均をかけました。

グラフィックはlovyanGFXを使用し、ちらつき防止のためにスプライト機能を使用しています。M5DisplayクラスのM5.Lcdを使うより格段に速いです。

らびやん (@lovyan03) | Twitter


地磁気センサの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を購入してましたがしばらく放置していました。

理由はWindowsArduinoの場合コンパイルが長いこと時間かかります。最初はフリーズしたのかと思いビルドを途中でやめていましたが、コンパイル時により詳細な情報を表示すると警告にチェック入れるとちゃんと動いていました。今後は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計算値を同時に表示 

表示させたのがこちら

f:id:x8MkvW:20200914053939j:plain

上から順に角速度、加速度、地磁気地磁気オフセット、方向、地磁気入りフィルタ値、MPU6886のみのフィルタ値、温度表示

 

Yawは流れなくなりましたが、PitchとRollがオリジナルより小刻みに変動しているようなので、変更したことによる跳ね返りが起きていないかを検証中です。

 

検証がうまくいきましたら次はM5StackのBluetooth機能を利用した自撮りリモコンや在宅中のプレゼンス詐称ソフトの開発日記を予定しています。

【Nゲージのコントローラ】2重PWM方式の検討

昔の鉄道模型用のパワーパックでPWM方式で20kHzと低周波数の組合せた二重変調というのがありました。今でもアマゾンなどで入手可能ですが、電源とセットでは売っていないようです。

今回はマイコンを使って低周波数と可聴周波数以上の組合せで昔のパワーパック波形を再現させようとしています。

まずは、PWMのデューティーを最小にします。ソフトでは1μsec以下でも設定可能ですがオシロで観測できなくなるので、波形は周波数が18.75kHzに対してデューティーは3.2μsec(約6%)で設定しています。鉄芯入りでは問題ないはずですが、たぶんコアレスだとLED点灯と同時に動き出してしまいます。

f:id:x8MkvW:20190812080927j:plain

 

コアレスなどでLED点灯と同時に動き出してしまう場合は、低周波数側でも制限します。オシロ波形は極端に設定したものを表示していますが、周波数は55Hzで約20%です。全体では1.2%です。当時マイコンも使わずに最小デューティーも小さくできない時代に、これを製品開発されたメーカーさんは流石です。

f:id:x8MkvW:20190812080725j:plain

 

従来のPWM方式ではデューティーを広げるだけのため、LED常点灯と低速コントロール域での両立はつまみに神経を集中させないとならないのですが、2重PWMではLEDは暗いですが確実に停止、低速からスムーズです。

f:id:x8MkvW:20190812081859j:plain

 

牽引重視の機関車のように重たい車両はノイズ音が小さいので気になりませんが、電車のM車ではモーターから低周波数側のノイズ音がカラカラ唸って耳障りです。2重変調なしでは低速時はモーター出力が落ちてしまうので、50%のデューティーで2重変調させるとモーター出力が落ちない状態で低周波ノイズが聞こえなくなります。

f:id:x8MkvW:20190812082216j:plain

 

最後に、トランジスタMOSFETを一段でドライブしている自作回路が多く公開されていますが、それぞれ素子固有の理由でトランジスタや高速動作が売りのMOSFETでもモーター側のPWM幅を狭く出来ない制約があり、コアレスモーターのコントロールでは苦労されているようです。理由は自作派されている諸先輩のホームページや半導体メーカーのホームページをググってください。電気工作苦手な方は2Aくらいのモータードライバー搭載基板が売っていますのでそちらを使うという方法もあります。

【Nゲージコントローラ作成】PWM周波数を上下しながら等加速させる

いまさらですがいつものマイコンボードとモータードライバーでPWMの周波数を上げ下げしながら等加速させる検討をしてみました。
パルス幅(周波数の逆数)や周波数を単純に可変させただけでは指数関数的な増減をするため、GTOインバータのような駆動音で制御させると、加減速がぎくしゃくしたり、ひどい時にはラピッドスタートするので、今まではCPUタイマーで数十ミリ秒ごとに割り込み処理を行って加減速させる方法をとっていました。ただこのタイマー割り込み関係のレジスタ設定のパラメータの設定は面倒くさく、自由に止めたり、値を書き換えたりの部分はまだデータシートとにらめっこ中です。
そこで、PWMの割り込み処理だけで周波数を変動させても加減速は等加速できるようにして、インバータ風な駆動音のバリエーションを増やしました。(先人は8年以上前にうpしているのでいまさらですが)
 
これをベースとして幽霊風な音を出しています(持っていない車両はそのうち購入)
①発車、停止時に一定の音が出る東芝PMSM風メトロ16000の1次車
 
 
②③日立GTO初期型、過渡期風な音
初期型
 
過渡期
 
④2100のドレミファインバータ風の更新
いままでは、ソの音のまま加減速していましたので、幽霊風に更新しました。
2100赤
 
ブルスカ2100
 
⑤新1000ドレミファインバータ風
いわゆる転調を追加(追記:メータ付きに差し替え)
モーターがミュージックホーンの音を出して出発する。
 
これを電車で何とかの競技用の車両選択データとしてコントローラに入れようとするとメモリーがいっぱいになってしまいました。ソフトの最適化をしないとダメなようです。そのうち自動運転のほうにも組み込みます。

KATOの選択式ポイントでリバース線の自動運転を試す

リバース線をやってみようと思いました。
WEBで調べるとKATOユニトラックのポイントでは分岐側の極性配置の関係でリバース線を組むとショートしますので絶縁ギャップは必須のようです。TOMIX製ポイントは完全選択式というのがあり、簡単にリバース線を実現できるようですがKATOを選んだ以上はしかたない。新規の部品購入を最小限にして自動制御運転が実現できるか検討しました。
まずM1+V1の構成部品のみで寸法ずれを検討。CADや三角関数の計算で5~10mmほど隙間が空いたため、端数線路で調整します。
お座敷レイアウトの最小構成でも隙間は1mmいかに抑えたので、線路を組み立ててみて、レールの浮きなど問題がないようでしたので、
イメージ 1
 
ソフト作成後、ソフトの各機能をデバッグして、都度線路の電圧を測定して問題ないことを確認したのち車両を走らせます。(追記:リバースは逆走でした…)
 
上の場合、センサーを通過すると停止する仕様のため下のように折り返し場所までノンストップの仕様にしました。(追記:リバースは逆走のまま…)
1時間くらい冷たいお茶を飲みながらぼーっと見ていました。
今日のところは以上です。
 

折り返し自動運転にポイントを入れました

 

先日はセンサーを使って往復運転を行いましたが、使っているDUALモータードライバーが4個のハーフブリッジで構成されているので、一部をポイントの切り替えにアサインしました。
 
   イメージ 2
 
     モータードライバーのHブリッジ回路
 
イメージ 1
    ハーフブリッジによるポイント切替回路
 
 
本来はHブリッジ構成にすると電解コンデンサは不要ですが、ソフトの不具合でポイントに通電し続けてコイルが焼損するのを回避するために、先人がトグルSWで使用した回路をそのまま引用しました。
動画ではポイント側から先の停止位置が微妙ですが。一応車止めの手前で止まっています。
 
次回は、面白VVVF音で遊ぶか、KATOの選択式でリバース線路が可能かのどちらかを報告したいと思います。ソフトのはなしが絡むのでたぶん間隔があきそうです。
 

Nゲージ線路の下にセンサーをつけて往復運転させました

NゲージPWMコントローラ試作が一段落したので、模型の自動運転に必要なセンサーを検討しています。TCS自動運転ユニットや他の市販品より安価に導入しないと意味がない(レールはKATOですが)のでフォトリフレクタ―出力をC2000 LaunchPadのADコンバータに入れる方法で試しました。ハーネス込み2個で\500くらいです。最初は車両の床下の色の違いやフォトリフレクタの出力の閾値判定ミスによって誤動作していましたが、床下を白テープまたは修正用白ペンで白く塗り、閾値判定アルゴリズムも改良することにより、誤動作しなくなりました。
動画は動作確認のために進行方向を変えたり、LEDを信号機風(タイマー動作)にしてます。
スピードが出ていると停止時にオーバーランしますね。減速指示用のセンサーをもう一つ追加してみようか。