結論
M5Stack Core2同士でI2C通信する際は、I2C用のPORT.A端子同士をそのまま接続してはいけない。
5V線を切断するなどして、接続する必要がある。
はじめに
この記事では、M5Stack Core2同士でI2C通信を行う方法と注意点について説明します。I2C通信は、コントローラーとターゲット間でデータをやり取りするためのシリアル通信プロトコルです。
取引先から「M5Stackって簡単なんでしょ?ちゃちゃっと開発しちゃってよ(非システムエンジニアの戯言)」という流れになり、会社で初めてM5Stack Core2を触りましたが、結構難しかったです。というのも、電子回路を気にしなくて良い作りになっていることが災いして、回路的に接続して良いかの判断がしにくいと感じました。本末転倒ですが、マイコン単体であれば自分で電子回路も設計するため、このような迷いは無いでしょう。
とは言えM5Stackはとても便利で、開発速度が向上するのは間違いないと思います。そこで備忘録として、M5Stack Core2でI2C通信する際に電子回路的に注意すべき内容を残しておきます。
必要なもの
- M5Stack Core2 x 2台
- M5Stack用GROVE互換ケーブル
開発環境:Arduino IDE
配線
以下のように接続する。5Vの線は切断するか、繋がらないように工夫してSDA、SCL、GND同士を接続する。
※写真は分かりやすいように中途半端な外し方をしています。実際は全て外すか端子部分を絶縁テープで覆ってください。
5V端子同士を接続してしまう場合、多分問題なく動くかもしれないが、もしかしたら回路が壊れてしまうかもしれないです。
5V端子は、昇圧レギュレーターICのアウトプット側に接続されています。昇圧レギュレーターICはリチウムイオンバッテリーの電圧を5Vに昇圧するものですが、全く正確な5Vを出力している訳ではありません。
そのため、5V端子同士を接続すると電位差が発生してしまい、片方の昇圧レギュレーターICはアウトプット端子に電圧がかかってしまう状態になります。
これですぐに破損はしないと思いますが、ICの想定と異なる使い方であることは間違いないです。
コード
I2C確認用のサンプルコードです。以下のコードはChatGPT 4oで作成しています。
コントローラー側のコード
コントローラー側のM5Stack Core2は、データを送信する役割を担います。
#include <Wire.h>
void setup() {
Wire.begin(); // I2Cバスを初期化
Serial.begin(115200);
}
void loop() {
Wire.beginTransmission(8); // ターゲットデバイスのアドレスを指定
Wire.write("Hello, Target!"); // データを送信
Wire.endTransmission(); // 送信終了
Serial.println("Data sent to target.");
delay(1000); // 1秒待機
}
ターゲット側のコード
ターゲット側のM5Stack Core2は、データを受信する役割を担います。
#include <Wire.h>
void setup() {
Wire.begin(8); // ターゲットデバイスのアドレスを指定
Wire.onReceive(receiveEvent); // データ受信時のイベントハンドラを設定
Serial.begin(115200);
}
void loop() {
delay(100); // メインループを少し待機
}
void receiveEvent(int howMany) {
while (Wire.available()) {
char c = Wire.read(); // 受信データを読み取る
Serial.print(c); // シリアルモニタに出力
}
Serial.println();
}
動作確認
コントローラー側とターゲット側のM5Stack Core2にそれぞれのコードを書き込みます。
また、両方のM5Stack Core2を接続し、電源を入れます。
Arduino IDEのシリアルモニタを開き、ターゲット側のM5Stack Core2が「Hello, Target!」というメッセージを受信していることを確認できれば成功です。
まとめ
この記事では、M5Stack Core2同士でI2C通信を行う際の注意点を記載しました。仕事で用いて使いやすかったので個人的にも買おうと思ったのですが、約1万円もするんですね...。それならESP32を普通に買った方が良いかも...。