※この記事は「Arduino IDE 2.3.6」「esp32 ライブラリ 3.1.3」時点での記事です。将来的に仕様が変わる可能性があります。
ESP32同士でI2C通信をしようとして、特にSlave側での設定でつまづいたので、そのメモ
結論
先に結論。I2CでデフォルトのPINを使うときはWire.setPins(SDAピン番号,SCLピン番号)を使う(特にSlave側)。
Master | Slave | |
デフォルトのピン番号(SDA=21, SCL=22)を使用 | Wire.begin(); | Wire.begin(Slaveアドレス); |
それ以外のピンをI2Cに使用 | Wire.begin(SDAピン番号, SCLピン番号); →これは使える Wire.setPins(SDAピン番号, SCLピン番号); Wire.begin(); →これも使える | Wire.begin(SDAピン番号, SCLピン番号, Slaveアドレス); →これは使えない Wire.setPins(SDAピン番号, SCLピン番号); Wire.begin(Slaveアドレス); →こっちは使える |
やったこと
M5 ATOM同士をGroveケーブルでつないでI2C通信。

プログラム
ESPRESSISの例から抜粋
・Master側
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <Wire.h> #define SLAVE_ADDR 0x08 #define Wire_SDA 26 #define Wire_SCL 32 uint32_t i = 0; String inputString = ""; void setup() { Serial.begin(115200); //Wire.begin(Wire_SDA,Wire_SCL); // Masterとして起動 (SDA=21, SCL=22がデフォルト) Wire.setPins(Wire_SDA,Wire_SCL); Wire.begin(); Serial.println("I2C Master ready. Enter text:"); } void loop() { delay(5000); //Write message to the slave Wire.beginTransmission(SLAVE_ADDR); Wire.printf("Hello World! %lu", i++); uint8_t error = Wire.endTransmission(true); Serial.printf("endTransmission: %u\n", error); //Read 16 bytes from the slave uint8_t bytesReceived = Wire.requestFrom(SLAVE_ADDR, 16); Serial.printf("requestFrom: %u\n", bytesReceived); if ((bool)bytesReceived) { //If received more than zero bytes uint8_t temp[bytesReceived]; Wire.readBytes(temp, bytesReceived); log_print_buf(temp, bytesReceived); } } |
・Slave側
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <Wire.h> #define SLAVE_ADDR 0x08 #define Wire_SDA 26 #define Wire_SCL 32 uint32_t i = 0; void receiveEvent(int howMany) { Serial.printf("onReceive[%d]: ", howMany); while (Wire.available()) { Serial.write(Wire.read()); } Serial.println(); } void requestEvent() { Wire.print(i++); Wire.print(" Packets."); Serial.println("onRequest"); } void setup() { Serial.begin(115200); //Wire.begin(Wire_SDA, Wire_SCL, SLAVE_ADDR); // ESP32用の形式:ESP Core 2.x系ではうまくいかない Wire.setPins(Wire_SDA,Wire_SCL); Wire.begin(SLAVE_ADDR); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); Serial.println("I2C Slave ready."); } void loop() { // 特にメイン処理は不要 } |
コメント