Arduino
Arduboy

Arduboy の OLED を叩く

More than 1 year has passed since last update.

概要

OLED に直接制御コマンドを流し込みます。

今回はあまり実用的でも初心者向けでもありません。

ハードウェア的な話

OLED の型番

https://github.com/Arduboy/Arduboy/blob/master/src/core/core.h#L112

分解しなくてもライブラリに書いてあったのですぐわかりました。

OLED のデータシート(マニュアル)

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

英語ですが、マニュアルがありました。

ソフトウェア的な話

コマンドの送り方

ArduboyCore クラス( Arduboy クラスのベースクラス )に、関数があります。

void static LCDDataMode(); //< put the display in data mode
void static LCDCommandMode();
void static sendLCDCommand(uint8_t command);

名前についてツッコむのは野暮ってもんです。

  • LCDDataMode() は OLED の受信モードを、表示データを受信するモードにします
  • LCDCommandMode() は OLED の受信モードを、制御コマンドを受信するモードにします
  • sendLCDCommand() は、上記二つを自動で発行し、その間に 1byte の制御コマンドを送信する便利関数です
void ArduboyCore::sendLCDCommand(uint8_t command)
{
  LCDCommandMode();
  SPI.transfer(command);
  LCDDataMode();
}

コアライブラリは、常に表示データ受信モードになっている前提で作られているので、受信モードを変更したあとは必ず戻すようにしておきます。

試しに送ってみる

コントラストを変更するコマンドを発見したので、試しに送ってみます。

u8 c = 0;
void loop() {
  if (!boy.nextFrame()) return;
  boy.clear();
  boy.fillScreen(1);
  boy.display();
  boy.LCDCommandMode();
  SPI.transfer(0x81);
  SPI.transfer(c++);
  boy.LCDDataMode();
}

setup() 関数等は省略しますが、上記のソースでコントラストを 0〜255 に変化しま……す?

確かに変化はしましたが、真っ暗までにはならず、また階調も三階調ほどしか変化しないようでした。残念。フェードイン・フェードアウトに使えるかと思ったのですが('ω`)

おわり

データシートを読むと他にも色々面白そうな制御コマンドがあるので、色々試してみると面白いかもしれません。