Arduboy のOLEDを叩く

概要

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 クラスのベースクラス )に、関数があります。

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

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

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

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

試しに送ってみる

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

1
2
3
4
5
6
7
8
9
10
11
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 に変化しま……す?

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

おわり

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