電音の歩み

電子楽器を中心とし、ものづくり関係も含めて紹介していきます。

OLED(SSD1306)用の激軽arduinoライブラリを作る その2

■SSD1306

まずデータシートを見ると、

OLEDディスプレイとしては、SPIとI2Cが選べますが、ここでは高速なSPIを選択します。チップとしては、SPI、I2C、8bitパラレル(制御は懐かしの8080と6800が選べる)か゜サポートされています。内部にハードウエアフレームバッファ(GDDRAM)を持っているので、フレームバッファレスのライブラリにするには、これをどこまで活用できるかです。

 

フレームバッファ(GDDRAM)の構成は

128☓64dot構成で、縦方向はPAGEと呼ぶbyte構成の8スプリットに分割されています。まるでかつてのキャラクタVRAMを彷彿させる面白い構成です。

上下左右の方向や白黒も自由に設定でき、原点もそれに伴い変わります。経験的に最も使い慣れた左上原点の設定に固定します。

縦方向はPAGE内ははリトルエンディアンであり、横方向はdot単位で自由にアクセスできます。

このGDDRAMを使って1dot単位のフルグラッフィック描画を行うには、リード・モディファイ・ライト操作が必要で、PAGE内のByteデータの読み出しが必須です。しかし残念ながらSSD1306は、SPIモードは、ライトオンリーで読み出しはサポートされていません。

しかし、元々、グラフィックディスプレイは、機能が多いほど使うのが大変で、昔のキャラクタディスプレイは、とても手軽に使えました。

そこでライブラリの仕様としては、少し高機能なキャラクタディスプレイにセミグラッフィックを付加した基本とし、ソフトのバッファレスで実現できるものに絞ることにします。

■どんな仕様?

Adafruitのライブラリでの不満のひとつが、フォントのサイズです。用意されている5*7フォントは、0.96"の小さな画面にに、横21文字、縦8文字も表示できます。小さくても多くの情報が表示したいこともあるのですが、使用頻度のより高いのは明らかにもう少し大きいサイズです。Adafruitライブラリでは、フォントサイズを2倍に単純拡大するしかなく、文字品位も悪く、大きくなり過ぎで横10文字、縦4文字しか表示できなくなります。

もうひとつは、ソフトでオフライン描画したフレームパッファをGDDTAMにまとめて転送するため、高速なSPI でも数msec程度処理がストールすることです。

 

そこで、使いやすいサイズのフォントを用意し、GDDTAMの任意のローカルな領域にリアルタイムに分散転送させることにします。

フォントは、Adafruitに相当する5*7サイズのsmallFontと、見やすく使いやすいサイズとして、6*11サイズのmiddleFont(2 PAGEを使用)を作ります。

PAGEの制限内で使うため、縦方向は、smallFontでは1 PAGE単位、middleFontは2PAGEを単位(位置は1PAGE単位で指定可)に限定します。

その代わり横方向は、文字間隔も文字位置も1dot単位で自由に設定できるようにします。

これらのフォントは、PAGE構成に合わせたbit配置で作成ます。目玉は、使いやすくて美しい(と思う)middleFontです。