こんにちは
inukaiです。
西日本を中心としたで豪雨で被災した皆様とそのご家族、関係者の方々に心よりお見舞い申し上げます。一日も早い復旧を心よりお祈り申し上げます。
それに伴って、関西地区大会も延期となりました。
前回までに8×8の迷路を走りきることができましたが、マウス内部の処理としては各車輪のエンコーダ情報を用いてステッパーと同じように走行距離や車体角度を管理していました。今回は今後のためにもジャイロを読み取って制御できるようにしていきたいと思います。
とはいっても読み取り自体は2ヵ月くらい前に実装していたのですが、この度ジャイロ角速度を制御に使えるようにしたので、これを機に記事にしました。
というわけで、ジャイロの読み取りの実装にあたってぶつかった壁をいくつか書きとめていきたいと思います。
①簡易SPI端子割り当て
慣性センサ(ジャイロ)は「ICM-20648」を使用しています。マイコンとの通信はI2CとSPIに対応しており、読み取り速度の速いSPIを使うことにしました。RX631のマニュアルの「機能別端子一覧」より、SPIには下記の端子を割り当てて回路設計をしていました。
RX63Nグループ、RX631グループユーザーズマニュアル ハードウェア編より引用
端子を割り当てる際、MOSI、MISO、SCKの文字だけを見てSPIはここでOKだと思っていました…
しかし、いざプログラムを書こうと思ったら頭に”S”がつく(SMISOなど)ところは簡易SPI機能が割り当てられた端子だったのです。簡易SPIと通常のSPIの大きな違いとしては、簡易SPIは8ビットごとの通信となるところです。これは想定外だったのですが、「ICM-20648」は基本的に8ビットごとの通信で問題なさそうなので特に大きな問題にはなりませんでした。
②SPIのMOSI、MISO接続が逆
以前ご紹介した回路図からSPI周りを抜き出すと下記となるのですが、SPIのMOSI、MISO接続が逆になっていました。
今回の構成は、SPIのMasterはマイコンであるRX631、SlaveはセンサであるICM-20648です。
MOSIは「Master Out Slave In」の略、MISOは「Master In Slave Out」の略として機能名がついています。これを意識していれば間違えないところのはずなのに…
ジャイロは0.4mmピッチなので一番再配線したくなかったのですが…
仕方なくパターンカットと再配線、そして配線がはがれないようホットボンドで固めました。
これらの確認と修正と行ったところで簡易SPIでジャイロを読み取り、まずはいわゆる”宴会芸”を実装。
制御の安定性に余裕を持たせているので少し遅れはありますが、宴会芸ができるようになり角速度方向の制御をできるようになりました。
余談ではありますが、下記が簡易SPIを6MHzに設定して、「ICM-20648」のZ軸周りの角速度を読み取ったときのCS端子の波形です。
読み取りに約11usかかっています。今回は特に割り込みを使用せずにSPIの通信をしていますが、この読み取り時間なら問題なさそうです。
では今週末の金沢草の根大会に向けて、ソフトを詰めていきたいと思います!
ではまた次回!
P.S. 今日の午前中ブログを書いていたら突然ビルが停電になって途中まで書いていた本記事が一回消えて書き直しでした…orz