概要
M5Stack社のI2Cセレクタハブである、PaHUBを使ってみました。

PaHUBとは?
- M5Stack用Port A(I2C)拡張ハブユニット(スイッチサイエンス)
PaとPbの2つ同じようなHUBがありますが、PaHUBはI2Cの拡張用です。TCA9548Aが内部で利用されており、8チャンネルのセレクタとして利用できます。
デフォルトでは0x70のアドレスでTCA9548Aが動いており、利用するチャンネル番号を0から7で選択すると、0x70以外への通信が選択したチャンネルに転送されます。ハンダ付けすることでアドレスを変更でき、他のアドレスにすることで複数のPaHUBを利用することが可能です。
同じI2Cアドレスのセンサーなどを複数利用したい場合に、違うチャンネルに接続することで、切り替えながら同時に利用することができます。
PbHUBとは?
- M5Stack用I/Oハブユニット(スイッチサイエンス)
こちらはATmega328が内部に入っており、I2Cで通信することでATmega328のGPIOを利用することができます。アナログも利用できる反面I2Cでの通信ですので速度は遅いです。
HUBとは?
- M5Stack用拡張ハブユニット(スイッチサイエンス)
こちらはI2C用のハブで、並行で接続されていますので同じアドレスを利用したセンサーなどを同時に接続することができません。違うアドレスのユニットを同時に利用した場合などに使います。
公式スケッチ例
M5StickCとM5Stackのユニットの中にPaHUBというスケッチがあります。
このスケッチを見ると「ClosedCube_TCA9548A.h」というライブラリを利用しています。プロジェクトの中に埋め込んでいるので、ライブラリマネージャーから利用するように変更したいと思います。
当初ライブラリマネージャーに「ClosedCube_TCA9548A」があったので、それを使ったのですがちゃんと動きません。よく見たらこのライブラリは不完全で、スケッチ例に埋め込まれているライブラリは手が入っています、、、
この一見ライブラリを使っているように見えて、変更しているパターンはやめてほしい。。。
スケッチ例
#include <Wire.h> #include <SparkFun_I2C_Mux_Arduino_Library.h> // http://librarymanager/All#SparkFun_I2C_Mux https://github.com/sparkfun/SparkFun_I2C_Mux_Arduino_Library QWIICMUX i2cMux; void setup() { Serial.begin(115200); delay(100); Wire.begin(32, 33); if (i2cMux.begin(0x70, Wire) == false) { Serial.println("Mux not detected. Freezing..."); while (1) ; } Serial.println("Mux detected"); Serial.println("Begin scanning for I2C devices"); } void loop() { for (uint8_t channel = 0; channel < 8; channel++) { Serial.printf("CH%d : ", channel); i2cMux.setPort(channel); Serial.print("I2C device = "); for (uint8_t address = 0x01; address < 0x7F; address++) { Wire.beginTransmission(address); uint8_t returnCode = Wire.endTransmission(); if (returnCode == 0) { Serial.printf("0X%X ", address); } } Serial.println(); } delay(1000); }
ライブラリマネージャーでTCA9548を検索して、全部みたところSparkFunさんのライブラリが良くできていました。チップは最後にAがついているのですが、このライブラリは付いていないので最初は検索に出なかったです。
QWIICMUX i2cMux;
上記で宣言をしておきます。
if (i2cMux.begin(0x70, Wire) == false)
初期化は引数無しでも大丈夫ですが、あとで変更するときにわかりやすいように初期値を入れておきます。
i2cMux.setPort(channel);
上記のように0から7のチャンネル番号を指定します。
CH0 : I2C device = 0X70 CH1 : I2C device = 0X5C 0X70 0X76 CH2 : I2C device = 0X44 0X70 0X76 CH3 : I2C device = 0X70 CH4 : I2C device = 0X70 CH5 : I2C device = 0X70 CH6 : I2C device = 0X70 CH7 : I2C device = 0X70
こんな感じの出力になります。CH1にENVユニット、CH2にENV IIユニットをつなげています。しかしながらENVユニットのDHT12(0x5C)がCH0だと認識したりしなかったりと微妙でした。CH1だと安定していたのでCH1に接続しています。
TCA9548Aの0x70がすべてのチャンネルで反応しています。逆に0x70以外を選択したチャンネルに転送している動きになっています。
あと、Arduino IDEで上記のURLをクリックすると、ライブラリマネージャーで「SparkFun_I2C_Mux」が検索された状態で表示されます!
SparkFun以外で使っているのはみませんが、非常に便利な機能ですね。
まとめ
ポートによって相性問題が発生してしまいましたので、事前に安定しているのかを確認してから利用したほうがいいと思います。
また、このユニットは単一のチャンネルだけではなく、複数のチャンネルを同時に送信することなども可能です。LEDを光らせるユニットなどを接続し、選択した複数のチャンネルに同時にコマンドを送ることなどができると思います。
コメント
記事を参考にK-Meter(K型熱電対用温度センサー)2つをPaHUBに繋いでみました。最初、公式スケッチを動かして、チャンネルをモニターしながらGroveケーブルを各チャンネルに繋げてみると、CH0は全く反応なしで、それ以外のチャンネルだとK-Meterのアドレス0x66が表示されました。なのでCH0は避けて、CH1, CH2にK-Meterを繋ぎました。ライブラリマネージャからTCA9548A(Jonathan Dempseyさん作)をインストールして、例を参考にして、2つのK-Meterから温度をM5Stackに取り込むことができました。