そして I2Cマルチプレクサ

Home > 電子工作 > そして I2Cマルチプレクサ
すき 1
うんこ 0

これまでSimpleFOCによるブラシレスモータ制御で倒立振子やリアクションホイール姿勢制御モジュールなどの製作を楽しんできました。

モータを複数制御する際はエンコーダとしてA/B相出力のあるAS5601を使用してきました。
A/B相出力ではパルスカウンタで回転を検知するため異常回転時に絶対位置がずれて再度初期化する必要が時々ありました。

I2C通信で常に絶対角度をエンコーダから得たいのですが、ESP32には2個のI2Cユニットしかありません。

そこでここではI2Cマルチプレクサを試してみました。

AudiostockでBGM・効果音を販売中!

I2Cマルチプレクサ

I2Cマルチプレクサの使用は遅延が心配で初手から検討は外してA/B相出力エンコーダを選択してきました。

Amazonサーフィンを楽しんでいたところ、ふと非常に低価格のI2Cマルチプレクサが目に入りました。

TI製のTCA9548Aが載ったモジュールでI2Cデバイスを8個まで接続可能です。

 

SimpleFOCの利用にも慣れて作りたいものが作れるようにもなり余裕もありましたので I2Cマルチプレクサの味見でもしてみようと思います。

味見動作

早速 TCA9548AにエンコーダAS5600とブラシレスモータを2セットつないで1個のI2Cバスから制御してみました。

特に問題なくモータを動かすことができました。

 

TCA9548A制御コードは以下を参考にしました。
 Adafruit TCA9548A 1-to-8 I2C Multiplexer Breakout

 

↓エンコーダ基板のみ使用

 

目視ではI2Cマルチプレクサ TCA9548Aの使用による遅延などは分かりませんでしたので倒立振子などに展開して検証を進めます。

倒立振子

前回製作した倒立振子にI2Cマルチプレクサ TCA9548Aを導入します。

SimpleFOC で倒立振子2

 

先ほどの味見構成で倒立振子を組む
ちょっと雑だけど 味見だからいいの

動作

特に問題なく倒立走行が実現されました。マルチプレクサの影響は大きくないようです。

 

本倒立振子では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軸姿勢制御モジュールでも検証してみます。

SimpleFOC で3軸姿勢制御モジュール

 

AS5601のI2C通信部はAS5600と全く同じで、TCA9548Aを介してAS5601のI2Cモードによる回転制御動作を確認できました。

 

ハード的にはAS5601のA/B相出力の配線をI2Cピンに移しただけです。

 

同じようにエンコーダ3つ全てをI2Cマルチプレクサ TCA9548Aにつないで回転を確認しました。

配線は問題ないようなので点倒立動作を確認します。

動作

モータ3つの3軸姿勢制御モジュールでもI2Cマルチプレクサによる影響はなく、無事に点倒立動作が確認できました。

 

強い先入観により今までI2Cマルチプレクサは避けてきましたが、全然問題なく利用できることが判明しました。

ディスプレイ復活

3軸姿勢制御モジュールにI2Cマルチプレクサ TCA9548Aを追加したことにより、I2CインターフェースのOLEDディスプレイを外しておりましたが不便なので復活させます。

 

TCA9548Aを裏面に移動して、プリント配線カット&空中配線で以下のように接続
 ・Wire0:IMUとOLEDディスプレイを接続
 ・Wire1:マルチプレクサを介して3個エンコーダ接続
バッテリはオモテ面のESP32の下に移動

 

IMUセンサMPU6050とOLEDディスプレイを同一I2Cバスに接続しましたが、特に問題ないようです。

 

点倒立動作も確認できました。

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バスの共有は有意義に使っていけそうだと感じています。

先入観にとらわれず色々試すことは大事ですね。

というか通信仕様などをきちんと読み込んでデータ量や制御ループ時間など考慮して事前にもっと明確に調べればいいのですが 私はそんな性格ではありません。
勘とセンスで生きています。

それではまた

次の記事

SimpleFOCによるベクトル制御への誘い

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください