LoginSignup
0
0

M5StampPICO(S3) をI2Cサブ(スレーブ)にする

Last updated at Posted at 2024-04-27

SS 192.png できたっぽい

やること

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までしかあがりませんでした。
なにか良い方法があるのかも。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0