Edited at

Arduboy の OLED を叩く

More than 3 years have 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 に変化しま……す?

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


おわり

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