🌞

有機ELディスプレイ(OLED)の使い方

2023/03/15に公開

部品

https://akizukidenshi.com/catalog/g/gP-12031

項目
制御方式 I2C
解像度 128x64
電源電圧 3.3 〜 5 V
アドレス 0x78 or 0x7A

ググるとみんなアドレス 0x3C を使っていた。秋月電子のスペック表記が間違っているのかと思ったが、そうではなく 0x78 なら 0x3C0x7A なら 0x3A になるらしい。いったいどういうことだ?

配線

モジュール側 Arduino側
SCL A5
SDA A4

ライブラリで指定する場所がなかったのでどことどこを繋ぐかは決まっているようだ。

ライブラリ

https://github.com/adafruit/Adafruit_SSD1306

ドキュメント

https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.h

コード

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DebugLog.h>

#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(128, 64, &Wire);

void setup() {
  int value = display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  ASSERT(value);
}

int count = 0;

void loop() {
  display.clearDisplay();

  display.setCursor(0, 0);
  display.println(count);

  int x = display.width()  / 2 + cos(2 * PI / 60 * count * 3) * display.width()  * 0.4;
  int y = display.height() / 2 + sin(2 * PI / 60 * count * 4) * display.height() * 0.4;
  display.drawCircle(x, y, 24, SSD1306_WHITE);

  display.display();

  count += 1;
  delay(1000 / 60);
}
  • ライブラリのおかげで抽象化されたメソッドを呼ぶだけで制御できる
  • 描画メソッドは内部バッファに書き込む
  • 内部バッファは display() で反映する (見えるようになる)
  • drawPixel でドットを打てる
  • テキストも書ける
    • setCursor(x, y) はドット単位で指定する
    • 半角カナは使えない
  • アニメーションは想像していたよりかなり速い
    • 20FPSはでる
    • 円を書く drawCircle が重いだけ?

結局 0x3C はどこから来た値なのか?

ChatGPT に聞いてみた結果

0x3C は、一般的に OLED ディスプレイの通信相手を識別するために使用されるアドレスである。
具体的には、0x3C は OLED のコントローラチップ SSD1306 と通信するためのアドレスである。

SSD1306 の名前を伝えずに SSD1306 がでてくるってことは SSD1306 の固有アドレスってことなんだろう。

参考

https://qiita.com/jakalada/items/8f83d07291d984a31633

Discussion