M5Stack Port A(I2C)拡張ハブユニット(PaHUB UNIT)

概要

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

PaHUBとは?

PaとPbの2つ同じようなHUBがありますが、PaHUBはI2Cの拡張用です。TCA9548Aが内部で利用されており、8チャンネルのセレクタとして利用できます。

デフォルトでは0x70のアドレスでTCA9548Aが動いており、利用するチャンネル番号を0から7で選択すると、0x70以外への通信が選択したチャンネルに転送されます。ハンダ付けすることでアドレスを変更でき、他のアドレスにすることで複数のPaHUBを利用することが可能です。

同じI2Cアドレスのセンサーなどを複数利用したい場合に、違うチャンネルに接続することで、切り替えながら同時に利用することができます。

PbHUBとは?

こちらはATmega328が内部に入っており、I2Cで通信することでATmega328のGPIOを利用することができます。アナログも利用できる反面I2Cでの通信ですので速度は遅いです。

HUBとは?

こちらは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以外を選択したチャンネルに転送している動きになっています。

http://librarymanager/All#SparkFun_I2C_Mux

あと、Arduino IDEで上記のURLをクリックすると、ライブラリマネージャーで「SparkFun_I2C_Mux」が検索された状態で表示されます!

SparkFun以外で使っているのはみませんが、非常に便利な機能ですね。

まとめ

ポートによって相性問題が発生してしまいましたので、事前に安定しているのかを確認してから利用したほうがいいと思います。

また、このユニットは単一のチャンネルだけではなく、複数のチャンネルを同時に送信することなども可能です。LEDを光らせるユニットなどを接続し、選択した複数のチャンネルに同時にコマンドを送ることなどができると思います。

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。