PR

【コード付き】ESP32のI2Cポートを同時に2つ使う方法

ESP32にはI2Cが2組用意されています。(下記引用をご参照。)
本記事ではこれらI2Cの2組をArduino-esp32で同時に利用する方法をご紹介します。

ESP32 has 2 I2C controller (also referred to as port), res

ponsible for handling communications on the I2C bus. A single I2C controller can operate as master or slave.

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/i2c.html
記事内の一部に広告を含みます。

ArduinoでESP32のI2Cを使う方法

ArduinoIDEやPlatformIOでArduino-esp32を使ってプログラムする方法については、こちらの記事で詳しく説明させていただいています。

Espressif公式の情報はこちらに記載されています> Arduino-ESP32 Libraries >> I2C

しかしながら、どのドキュメントを読んでも2つ目のI2Cポートを利用する方法が見つかりませんでした。仕方がないので、コード上から探した結果が下記です。

ESP32で2つ目のI2Cポートを利用する方法

結論から書きますと、1つ目のI2Cを利用する際のオブジェクトがWireだったことに対し、2つ目はWire1オブジェクトを利用します

どこで定義されているかというと、https://github.com/espressif/arduino-esp32/blob/master/libraries/Wire/src/Wire.cppの末尾で下記が定義されており、

TwoWire Wire = TwoWire(0);
TwoWire Wire1 = TwoWire(1);

それぞれ、https://github.com/espressif/arduino-esp32/blob/master/libraries/Wire/src/Wire.hの末尾で下記のようにexternされています。

extern TwoWire Wire;
extern TwoWire Wire1;

ですので、例えば、下記の様に記載すれば、2ポート同時に利用できます。

#define Wire1_SDA (33)
#define Wire1_SCL (32)

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  Wire1.begin(Wire1_SDA, Wire1_SCL);
}

一応、注意点ですが、Wire1はデフォルトでピンアサインされていないため、任意のピンを指定してbigin()命令をかけないといけません。

まとめ

以上、簡単ですが、ESP32のI2Cポートを2つ同時に使う方法でした。

上記の通り、Wire1を使うことで、2つ目のポートを利用できます。
なお、設定次第でMaster2つ、Slave2つ、MaterとSlaveそれぞれ動作するようです。

あまり、I2Cを2つ併用することは少ないかと思いますが、ご参考になれば幸いです。

その他のESP32のI2C関連の記事を下記にまとめてありますのでご参照ください。