やること
M5StampPICO をI2Cサブ(スレーブ)として設定し、
Aruduino系(今回はArduino UNO)からI2Cデバイスとして認識させます。
M5StampS3版のサンプルスケッチも最後に掲載しています。
準備物・実施環境
- M5StampPICO
- Arduinod UNO
- Arduino IDE
スケッチ
メイン(マスター)側(Arduino UNO)
アドレス0x58番のI2Cデバイスにアクセスし、16個のデータを要求し、結果を表示します。
#include <Wire.h>
#define I2C_DEV_ADDR 0x58
uint32_t i = 0;
byte pad_data[16];
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.setClock(100000); // 通信速度を100kHzに設定
}
void loop() {
delay(500);
Wire.requestFrom(I2C_DEV_ADDR, 16);
i = 0;
while (Wire.available()) { // バッファにデータがある間
byte c = Wire.read(); // バッファから1バイト読み取り
pad_data[i] = c;
i ++;
}
// 表示
for (int i = 0; i < 16; i++)
{
Serial.print(pad_data[i]);
Serial.print(" ");
}
Serial.println();
}
スレーブ側(M5StampPICO)
今回はアドレス0x58番のI2Cデバイスとして機能し、呼ばれた時に16バイトの数値を返します。データは1ずつ加算されたものになります。
#include <arduino.h>
#include <Wire.h>
#define I2C_DEV_ADDR 0x58
int j = 0;
void onRequest()
{
for (int i = 0; i < 16; i++)
{
Wire.write(j);
j++;
if (j > 254)
{
j = 0;
}
}
}
void setup()
{
Serial.begin(115200);
Wire.onRequest(onRequest);
Wire.begin((uint8_t)I2C_DEV_ADDR);
}
void loop() {}
接続
Arduino UNO | M5StampPICO |
---|---|
GND | GND |
5V | 5V |
SDA | 21番ピン(SDA) |
SCL | 22番ピン(SCL) |
他のI2Cデバイスがある場合も同様に接続します。
実行結果
下記はArduino UNO(I2Cメイン)のシリアルモニタの表示例です。
メイン側をESP32DevkitCにしても同様に動きました。
ESP32DevkitC | M5StampPICO |
---|---|
GND | GND |
5V | 5V |
21番ピン(WIRE_SDA) | 21番ピン(SDA) |
22番ピン(WIRE_SCL) | 22番ピン(SCL) |
メイン側をTeensy4.0にしても同様に動きました。
Teensy4.0 | M5StampPICO |
---|---|
GND | GND |
5V | 5V |
18番ピン(SDA0) | 21番ピン(SDA) |
19番ピン(SCL0) | 22番ピン(SCL) |
サブ側をM5StampS3にする場合のスクリプトは以下で動きます。
Arduino UNO | M5StampS3 |
---|---|
GND | GND |
5V | 5V |
SDA | 13番ピン(SDA) |
SCL | 15番ピン(SCL) |
#include <arduino.h>
#include <Wire.h>
#define PIN_SDA 13
#define PIN_SCL 15
#define I2C_DEV_ADDR 0x58
int j = 0;
void onRequest()
{
for (int i = 0; i < 16; i++)
{
Wire.write(j);
j++;
if (j > 254)
{
j = 0;
}
}
}
void setup()
{
USBSerial.begin(115200);
USBSerial.setDebugOutput(true);
Wire.setPins(PIN_SDA, PIN_SCL);
Wire.onRequest(onRequest);
Wire.begin((uint8_t)I2C_DEV_ADDR);
Wire.setClock(100000); // 通信速度を100kHzに設定
}
void loop() {}
課題感
I2C通信速度がプルアップ抵抗を入れても100kまでしかあがりませんでした。
なにか良い方法があるのかも。
参考