I2C通信を実験してみました。
※現時点の情報ですので、最新情報はM5StickC非公式日本語リファレンスを確認してください。
概要
ESP32は最大2組のI2Cが可能で、M5StickCは内部で1つ使っています。
入力専用のIO36を除き、外部接続可能な4PINはどんな組み合わせでもI2Cで通信が可能でした。
接続方法
M5StickCは上側に外部接続用のピンソケットと、下側にGrove端子がついています。IO26とIO0のような組み合わせも可能でしたが、通常はピンソケットのIO0とIO26、Grove端子のIO32とIO33の組み合わせで使うと思います。
おすすめピンアサイン
- ピンソケット SDA:IO0, SCL:26
- Grove端子 SDA:IO32, SCL:33
GroveのI2C端子が上記のアサインなので、逆に使うと混乱します。ピンソケット側はどちらでも構わないのですが、OfficialのI2Cを使ったHATがこのピンアサインだったので、こちらを使ったほうが無難だと思います。
同時に2系統使えるの?
内部のI2C通信を使わないのであれば、同時に利用が可能でした。
void setup() { M5.begin(); Wire.begin(32, 33); Wire1.begin(0, 26); }
Wireが1系統目のI2C通信で、Wire1が2系統目のI2C通信です。通常Wire1は電源管理などの内部接続用I2Cとして使われています。
M5.begin()で電源管理の初期化をしてしまえば、あとは接続していなくても問題ないかと思いますので、Wire1.begin()で別のピンにアサインしなおします。
3系統同時に使えないの?
#include <M5StickC.h> void setup() { M5.begin(); Wire.begin(32, 33); } void loop() { byte error, address; int nDevices; Serial.println("Scanning... Wire"); nDevices = 0; for (address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address, HEX); Serial.println(" !"); nDevices++; } else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); Serial.println("Scanning... Wire1"); Wire1.begin(0, 26); nDevices = 0; for (address = 1; address < 127; address++ ) { Wire1.beginTransmission(address); error = Wire1.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address, HEX); Serial.println(" !"); nDevices++; } else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); Serial.println("Scanning... Wire1-2"); Wire1.begin(21, 22); nDevices = 0; for (address = 1; address < 127; address++ ) { Wire1.beginTransmission(address); error = Wire1.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address, HEX); Serial.println(" !"); nDevices++; } else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); }
I2Cのアドレススキャナで検証しましたが、使う前にbigin()でアドレス指定をすれば使えそうです。
ただ、複数使うのはトラブルになりそうなので、可能であればピンソケットかGroveのどちらか1系統だけを使ったほうが安全だと思います。
コメント
こんにちは。いつも田中先生の記事とサンプルプログラムを読んで、勉強中です。大変参考になっています。
田中先生の研究された情報は素晴らしくこれからも、記事を読んで私なりに、消化して先生の様にいつかは、なりたいと思ってます。これからも参考にして、勉強させてもらいます。記事の内容も、整理されてて大変読みやすいです。感謝。
なにか不明点があればお気軽に書き込みお願いします