そして I2Cマルチプレクサ
これまでSimpleFOCによるブラシレスモータ制御で倒立振子やリアクションホイール姿勢制御モジュールなどの製作を楽しんできました。
モータを複数制御する際はエンコーダとしてA/B相出力のあるAS5601を使用してきました。
A/B相出力ではパルスカウンタで回転を検知するため異常回転時に絶対位置がずれて再度初期化する必要が時々ありました。
I2C通信で常に絶対角度をエンコーダから得たいのですが、ESP32には2個のI2Cユニットしかありません。
そこでここではI2Cマルチプレクサを試してみました。
目次
I2Cマルチプレクサ
I2Cマルチプレクサの使用は遅延が心配で初手から検討は外してA/B相出力エンコーダを選択してきました。
Amazonサーフィンを楽しんでいたところ、ふと非常に低価格のI2Cマルチプレクサが目に入りました。
TI製のTCA9548Aが載ったモジュールでI2Cデバイスを8個まで接続可能です。
SimpleFOCの利用にも慣れて作りたいものが作れるようにもなり余裕もありましたので I2Cマルチプレクサの味見でもしてみようと思います。
連菓子みたい pic.twitter.com/pHlWlwPqKQ
— HomeMadeGarbage (@H0meMadeGarbage) October 7, 2024
味見動作
早速 TCA9548AにエンコーダAS5600とブラシレスモータを2セットつないで1個のI2Cバスから制御してみました。
I2Cエンコーダ2個をマルチプレクサTCA9548Aを介してモータ制御
目視では遅延があるのか全く分からん
倒立振子組んでみっか pic.twitter.com/x4u8VhWqKs— HomeMadeGarbage (@H0meMadeGarbage) October 7, 2024
特に問題なくモータを動かすことができました。
TCA9548A制御コードは以下を参考にしました。
Adafruit TCA9548A 1-to-8 I2C Multiplexer Breakout
↓エンコーダ基板のみ使用
目視ではI2Cマルチプレクサ TCA9548Aの使用による遅延などは分かりませんでしたので倒立振子などに展開して検証を進めます。
倒立振子
前回製作した倒立振子にI2Cマルチプレクサ TCA9548Aを導入します。
先ほどの味見構成で倒立振子を組む
ちょっと雑だけど 味見だからいいの
動作
特に問題なく倒立走行が実現されました。マルチプレクサの影響は大きくないようです。
I2Cエンコーダ(AS5600)2個をマルチプレクサTCA9548Aを介して倒立振子
あー全然問題ないわ。先入観で遅延で使えないと思てわざわざA/B相エンコーダ採用しちゃってた。AS5600の方が安いし絶対角度わかるしコレでいいな
8個までI2Cデバイスぶら下げれるから3軸姿勢制御モジュールもマルチプレクサ試すか pic.twitter.com/fNSCp6GcwR— HomeMadeGarbage (@H0meMadeGarbage) October 7, 2024
本倒立振子ではESP32をデュアルコアで使用し以下のように構成を変更しています。
・変更前
core0:Wire0でIMU MPU6050で姿勢センシング
core1:AS5601 A/B相出力エンコーダで モータを2個制御
・変更後
core0:Wire0でIMU MPU6050で姿勢センシング
core1:Wire1でI2Cマルチプレクサ TCA9548Aを介して エンコーダAS5600とI2C通信してモータ2個を制御
3軸姿勢制御モジュール
I2Cマルチプレクサが有用そうであることがわかりましたので更にモータが3個の3軸姿勢制御モジュールでも検証してみます。
AS5601のI2C通信部はAS5600と全く同じで、TCA9548Aを介してAS5601のI2Cモードによる回転制御動作を確認できました。
AS5601のI2C制御はAS5600と全く同じですね
モータユニットの修正は簡単で安心TCA9548A介してAS5601 I2Cモードによる回転制御動作を確認 pic.twitter.com/UBVzbkCUl9
— HomeMadeGarbage (@H0meMadeGarbage) October 8, 2024
ハード的にはAS5601のA/B相出力の配線をI2Cピンに移しただけです。
同じようにエンコーダ3つ全てをI2Cマルチプレクサ TCA9548Aにつないで回転を確認しました。
I2Cマルチプレクサ TCA9548A にI2Cエンコーダ AS5601を3つ つないでモータ動作確認
さてこれて点倒立できるべか pic.twitter.com/Bl3D5kgd4f
— HomeMadeGarbage (@H0meMadeGarbage) October 8, 2024
配線は問題ないようなので点倒立動作を確認します。
動作
モータ3つの3軸姿勢制御モジュールでもI2Cマルチプレクサによる影響はなく、無事に点倒立動作が確認できました。
I2Cマルチプレクサ TCA9548A にI2Cエンコーダ AS5601を3つ つないで点倒立
全然問題ないわ
今後の人生が少し豊かになったTCA9548A追加でI2Cディスプレイ潰したから何とかしたいな pic.twitter.com/kpavoBEutK
— HomeMadeGarbage (@H0meMadeGarbage) October 8, 2024
強い先入観により今までI2Cマルチプレクサは避けてきましたが、全然問題なく利用できることが判明しました。
ディスプレイ復活
3軸姿勢制御モジュールにI2Cマルチプレクサ TCA9548Aを追加したことにより、I2CインターフェースのOLEDディスプレイを外しておりましたが不便なので復活させます。
TCA9548Aを裏面に移動して、プリント配線カット&空中配線で以下のように接続
・Wire0:IMUとOLEDディスプレイを接続
・Wire1:マルチプレクサを介して3個エンコーダ接続
バッテリはオモテ面のESP32の下に移動
IMUセンサMPU6050とOLEDディスプレイを同一I2Cバスに接続しましたが、特に問題ないようです。
IMUとディスプレイを同じI2Cバスで
特に問題なさそう pic.twitter.com/ltjKu5KwuN— HomeMadeGarbage (@H0meMadeGarbage) October 8, 2024
点倒立動作も確認できました。
ESP32デュアルコア以下の構成で点倒立を堪能
core0:Wire0でIMUセンス&OLEDディスプレイ表示
core1:Wire1でマルチプレクサ エンコーダ×3 モータ制御全然問題ないね。ディスプレイが単色 小ピクセルとは言えIMUと共有で点倒立できるとは
今まで潤沢なESP32のリソースに甘えてやろうとも思わなかった pic.twitter.com/I8Ox8e5mxj— HomeMadeGarbage (@H0meMadeGarbage) October 8, 2024
TCA9548Aによる影響もないうえに、IMUセンシングとディスプレイ表示も同一I2Cバスで動作確認できました。
ディスプレイが単色で小ピクセルとは言えIMUと共有で点倒立できるとは驚きました。今まで潤沢なESP32のリソースに甘えてバス共有は試そうとも思わなかったので大変勉強になりました。
結果的に今回の姿勢制御モジュールの変更内容は以下のとおりです。
・変更前
core0:Wire0でIMU MPU6050で姿勢センシング、Wire1でOLEDディスプレイ表示
core1:AS5601 A/B相出力エンコーダで モータを3個制御
・変更後
core0:Wire0でIMU MPU6050で姿勢センシング&OLEDディスプレイ表示
core1:Wire1でI2Cマルチプレクサ TCA9548Aを介してAS5601 と通信してモータ3個を制御
おわりに
ここでは複数のモータのI2Cマルチプレクサを用いた同一I2Cバスによるエンコーダ回転監視での動作を確認しました。
倒立振子やリアクションホイール姿勢制御モジュールで検証しましたがI2Cマルチプレクサによる遅延などの悪影響は見受けられませんでした。
各エンコーダとの監視通信によって絶対回転位置が得られるためむしろ品質は向上したと言えます。
更にIMUセンサとディスプレイのI2Cバス共有においても特に大きな影響がないことに驚きました。
それぞれ応用の条件にもよりますが、今後I2Cマルチプレクサの活用やI2Cバスの共有は有意義に使っていけそうだと感じています。
先入観にとらわれず色々試すことは大事ですね。
というか通信仕様などをきちんと読み込んでデータ量や制御ループ時間など考慮して事前にもっと明確に調べればいいのですが 私はそんな性格ではありません。
勘とセンスで生きています。
それではまた