2025年4月23日水曜日

I2C OLEDを試してみた

M5STACK LCD Unitのファームウェアアップデート」の記事の際に記載した I2C OLEDディスプレイを動かしてみました。

本製品はタイトルや製品説明では、ドライバICはSSD1315 を使用しているとありましたが、詳細説明ではSSD1306を使用と記載されています。購入してから気が付きました...



詳しくは調べていませんが、SSD1315 はSSD1306  の上位互換らしいので、SSD1306として使用してみました。なお、OLEDのライブラリはAdafruit_SSD1306を使用して記述しました

#include <Wire.h>
#include <Adafruit_GFX.h>      // Ver 1.12.1
#include <Adafruit_SSD1306.h>  // Ver 2.5.13

#define SCREEN_WIDTH 128 // OLED 横設定
#define SCREEN_HEIGHT 64 // OLED 高さ設定
#define OLED_RESET    -1 // OLEDリセット(未使用:-1)
#define SCREEN_ADDRESS 0x3C // ボード上の設定:0x78に接続:0x3C、0x7Aに接続:0x3D

// ディスプレイの宣言
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}

void loop() {

  display.clearDisplay();      // 表示クリア
  display.setTextSize(2);      // テキストサイズ
  display.setTextColor(WHITE); // テキストカラー
  display.setCursor(0, 10);    // テキストの表示位置

  display.println("Hello World");
  display.display();           // テキスト表示

  delay(1000);

}

サクッと動いてしまいました。3ボードセットなので各ボードで動作チェックを行い、不良が無いことを先に確認しました

折角なのでスタックチャンアバターを表示しようと調べてみると、M5 GLASS2 unitで使用されているSSD1309はSSD1306と互換性があるという情報を見つけました。早速、ライブラリを変更して試してみます。予定通りスタックチャンを表示しますが、折角なので10秒ごとに表情が変わるようにしました

#include &ltM5UnitGLASS2.h>
#include &ltM5Unified.h>
#include &ltAvatar.h>

using namespace m5avatar;
m5avatar::Avatar avatar;

const Expression expressions[] = {
  Expression::Angry,
  Expression::Sleepy,
  Expression::Happy,
  Expression::Sad,
  Expression::Doubt,
  Expression::Neutral
};

const int expressionsSize = sizeof(expressions) / sizeof(Expression);
int idx = 0;

void setup() {
  auto cfg=M5.config();
  cfg.unit_glass2.pin_sda = 21; // SDA ピン設定
  cfg.unit_glass2.pin_scl = 22; // SCL ピン設定
  M5.begin(cfg);

  // OLED ディスプレイサイズ:128 x 64
  avatar.setScale(.4);         // 縮尺:.4 = 128/320
  avatar.setPosition(-88,-96); // ポジション:88 = (240-64)/2, 96 = (340-128)/2
  avatar.init();               // アバターの初期化
}

void loop() {
  M5.update();

  idx = rand() % expressionsSize;
  avatar.setExpression( expressions[idx] );
  
  delay(10000);

}

スタックチャンアバターは、320x240ディスプレイ用に準備されていますので、小さい液晶で表示する際は縮尺(avatar.setScale())やポジション(avatar.setPosition())の設定を変更する必要があります



とりあえず、動作したので良しとしました。結局、このOLED のディスプレイドライバは不明ですが、SSD1306、SSD1309、SSD1315は互換性があるようですね

参考にさせて頂きましたサイト:

0 件のコメント:

コメントを投稿