ゆるく楽しむプログラミング

M5AtomにOLED SSD1306を直結してみた

M5AtomとSSD1306のピン配置を見比べていたら、VCCとGNDの位置は同じだから直結できるのでは?
と言う気がして、やってみたら簡単に出来てしまいました。

ArduinoIDEでボードライブラリにESP32(ESP32 Pico kitやM5STACK-ATOMなど)を指定した場合、
Wireクラス(I2C通信のライブラリ)の初期化時に、SDA/SCLのピン番号と動作クロックを指定できます。
省略時(-1が指定された場合)に SCL=21,SDA=25になるようです。

bool begin(int sda=-1, int scl=-1, uint32_t frequency=0); // returns true, if successful init of i2c bus



begin( ) メソッドのパラメタ指定を変更すれば、スケッチ自体は変更なしで動作します。


adafruitのSSD1306ライブラリを使用する場合の変更箇所

Wire.begin( ) メソッド実行時に引数を設定すれば良いのですが、adafruitのライブラリを使用するサンプルスケッチでは
▼の位置に Wire.begin( ) メソッドを追記すれば良いです。
また、上下左右を反転(180度)回転した方が見やすいかも。
void setup() {
  Serial.begin(9600);
  Wire.begin(21,25);    // ★ ココに追記:I2C SDA-21,SCL-25:GROVE端子を使用する場合は SDA-26,SCL-32

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  // ▼ 表示を180度回転する場合、この2行を追記
  display.ssd1306_command(0xC0) ;
  display.ssd1306_command(0xA0) ;

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds


M5Atom本体とGROVEコネクタの両方にOLEDを接続してみる

ESP32はI2Cバスが2系統使えます。
TowWireクラスのインスタンスとしてWireをWire1が定義されていますが、ディフォルトではWire1にはピンが割り当てられていません。
Wire1.begin(SDA,SCL)を宣言する事でWire1が使えるようになります。
※SDA,SCLは適当なピン番号



解説動画