OLED : SOLOMON SYSTECH SSD1306 (I2C) small driver for Arduino
I2C接続の OLEDをキャラクタLCD ライクに使用するための軽量実装。
このクラスライブラリは SSD1306 を使用した I2C接続の 128x64〜128x32 ピクセルの廉価な 単色グラフィックOLEDを、 キャラクタLCDのように扱えるようにしたものである。 この制御チップは U8glib 等でひろくサポートされいるが、単なる英数文字表示を行いたいだけの場合には 実装サイズが非常に大きく、かつ動作が遅すぎる。
このクラスライブラリは、以下の指針に基づいて設計した。
- チップが有しているSPIおよびパラレルIFには対応せず、I2C接続のみとする。
- 8x16ピクセル英数キャラクタ表示に特化する。 さらに省サイズ化のためフォントデータは1種類のみ用意し、 かつ 0x20〜0x7F の96キャラクタに限定する。
- 改行に関わる "\r" "\n" には対応し、println() を使用可能にする。
- カーソル表示、および点滅表示はサポートしない。 しかしながら未使用の MSBを用いて反転文字表示には対応する。
- 別途漢字表示等の応用を可能とするため、バイト配列でのデータ書込メソッドを設ける。
動作検証および対応製品は aitendo M096P(128x64) および M091P(128x32) とした。
-
.ZIPアーカイブをダウンロードする。Click here
-
ライブラリマネージャで読み込む
スケッチ -> ライブラリをインクルード -> .ZIP形式のライブラリをインストール...
結線は、OLED と Arduino (UNO) の VCC(+5V)と GNDのほか、 SCL(A5) 同士、SDA(A4) 同士を繋ぐだけである。
#include <Arduino.h>
#include "OLED_SSD1306.h"
OLED_M096P oled;
// OLED_M091P oled;
void setup (void) {
oled.begin();
// oled.mirror();
// oled.flip();
oled.println("Hello World");
}
void loop (void) {
oled.println(millis(), DEC);
oled.moveCursor(0, -1);
}
コンストラクタは、対応する製品型番別にある。
OLED_SSD1306 は基礎クラスであり、 128x64 ピクセルのノーマルな OLEDパネルを想定して もっともプレーンと思われる設定を初期値とする。
OLED_M096P は、128x64 ピクセルの OLEDパネルを使用するが 表示開始位置が1ラインずれているのに対応している。
OLED_M091P は、128x32 ピクセルの OLEDパネルを使用する。 表示可能な情報量は半分となる。
第1引数指定の速度でI2Cバスを初期化し、 第2引数指定のアドレスでデバイスとの通信を開始する。 成功すれば真を返す。
第1引数の省略値は I2C_SPEED_FAST(400Kbps)、 第2引数の省略値は SSD1306_ADDR(0x3C)である。
第1引数の指定値でI2Cバス速度を変更する。
画面全部をクリアし、カーソル位置を (0,0) == 左上原点に移動する。 成功すれば真を返す。 begin() メソッド内からは暗黙的に呼ばれる。
カーソル位置を指定した絶対座標に移動する。 x桁(横軸)の有効範囲は 0〜15、 y行(縦軸)の有効範囲は 0〜3で、それ以外の値は画面外となる。
M091Pのような 128x32ピクセルパネルの場合は 上半分だけが表示されている状態であるため、 y行(縦軸)の有効範囲は 0か 1となるが、 flip() メソッドで上下反転している場合は、2か 3となる。
カーソル位置を現在位置から相対指定で移動する。
第1引数で指定した y行の、x桁から右をクリアし、カーソルを(x,y)に移動する。 成功すれば真を返す。 y行指定は省略できない。 x桁指定の省略値は 0である。
指定のキャラクタを現在のカーソル位置に書き込む。 成功すれば真を返す。 カーソルは右に1桁(x + 1)移動する。
ただし '\r' が指定されるとカーソルは左端(x = 0)に移動し、 '\n' が指定されるとカーソルは次行の左端(x = 0, y + 1)に移動する。 その他の制御キャラクタは無視される。
表示できるキャラクタは 0x20〜0x7F の範囲だけである。 MSBのビットを立てておくと(+0x80)ピクセルの明暗を反転して表示する。
本クラスは Print クラスを継承しているので、 print() および println() を使用できる。
点灯ピクセルの明るさを指定値に設定する。 成功すれば真を返す。 指定可能範囲は 0(消灯)〜 255(最大輝度)である。 輝度を上げるほど、かつ点灯しているピクセル数が多いほど、消費電力は増大する。
真を渡すと OLEDパネルを消灯する。 偽を渡せば消灯解除される。 引数省略時は消灯である。 何れにせよ成功すれば真を返す。
消灯中は write() メソッド等は機能せず、偽を返す。
sleep() メソッドの設定状態を真偽値で返す。
真を渡すと OLEDパネルの「明暗点灯」を反転する。 偽を渡すと反転状態は解除される。 引数省略時は反転である。 何れにせよ成功すれば真を返す。
真を渡すと OLEDパネルの「左右表示」を反転する。 偽を渡すと反転状態は解除される。 引数省略時は反転である。 何れにせよ成功すれば真を返す。
真を渡すと OLEDパネルの「上下表示」を反転する。 偽を渡すと反転状態は解除される。 引数省略時は反転である。 何れにせよ成功すれば真を返す。
M091Pのような 128x32ピクセルパネルの場合は 上半分だけが表示されている状態であるため、 y行(縦軸)の有効範囲は 0か 1となるが、 flip() メソッドで上下反転している場合は、2か 3となる。
使用する OLEDパネルのオフセットマッピング値を設定する。 begin() メソッド実行前に使わなければならない。 このメソッドはコンストラクタ内で使用される。
OLEDパネルの表示開始ラインを変更する。 設定可能範囲は 0〜63 である。 成功すれば真を返す。
画面の上下は連続しているので、上下にはみだした表示は反対側に現れる。
8x16ピクセルを表すビットマップを収めた 16バイト配列のポインタを指定し、 現在のカーソル位置に直接書き込む。 成功すれば真を返す。 カーソルは右に1桁進む。
ビットマップは縦8ピクセルが上端をMSBとした1バイトとし、 これを右方向へ8バイト並べた 8x8ピクセル表示を、 下方向へ 2組 == 16バイト並べた配列となっている。
このメソッドは主に漢字ROMを用いた全角キャラクタ表示に使用する。 16x16ピクセルのキャラクタを書き込む場合は、左半分、右半分の 2回に分けて使用する。
- 主要な AVR 以外はテストされていない。
- 古い Arduino IDE には対応しない。1.8.5で動作確認。少なくとも C++11 は使えなければならない。
- 英文マニュアルが未整備である。
- 0.1.1
MIT
朝日薫 / askn (SenseWay Inc.) Twitter: @askn37 GitHub: https://github.com/askn37