SPI接続のOLEDを使う


SPI接続の128 X 64 のOLEDを入手したので、Raspberryで使ってみました。


最初は全く期待していなかったのですが、表示がとても綺麗で驚きました。
半角が8X16ドット、全角が16X16ドットのフォントですが、全く問題なく読めます。
しかも値段が250円ぐらいと安いのがうれしいです。

GitHubで探すと、幾つかRaspberry用のライブラリは有りますが、
プログラムを変更することなく、引数の指定で任意の文字を表示させたかったので、新しく作りました。
ソースはこちらからダウン ロードできます。

インストールは以下の手順です。
git clone https://github.com/nopnop2002/ssd1306_rpi.git
cd ssd1306_rpi/
cc -o oled oled.c fontx.c -lwiringPi -DSPI


日本語のフォントファイルはFONTX形式の16ドットフォントを使っています。
FONTX形式のフォントファイルは、こ ちらこちらで 公開されています。

モジュールの結線は以下の通りです。
モジュールのピンマーキングはI2C風ですがSPIインタフェースです。
チップセレクト(CS)ピンは省略されていますが、adafruit のモジュールでも動くと思います。
OLEDモジュール Raspberry
PIN SIG
1 GND Gnd
2 VCC
3.3V
3 SCL
SCLK
4 SDA
MOSI
5 RST
GPIO2(※)
6 D/C
GPIO4(※)

(※)プログラムの以下の箇所を変更することで、好きなピンに変更可能です。
// Hardware/Software SPI
#define RST  8  // You can change
#define DC   7  // You can change

実行時の引数の指定は以下の通りです。
全てのコマンドは[oled s]コマンドで反映されます。
oled +1 文字列 1行目に表示する文字の指定(外部フォントで表示)
oled +2 文字列 2行目に表示する文字の指定(外部フォントで表示)
oled +3 文字列 3行目に表示する文字の指定(外部フォントで表示)
oled +4 文字列 4行目に表示する文字の指定(外部フォントで表示)
oled +a 文字列 1行目に表示する文字の指定(内部フォントで表示)
oled +b 文字列 2行目に表示する文字の指定(内部フォントで表示)
oled +c 文字列 3行目に表示する文字の指定(内部フォントで表示)
oled +d 文字列 4行目に表示する文字の指定(内部フォントで表示)
oled -1 1行目の文字を削除
oled -2 2行目の文字を削除
oled -3 3行目の文字を削除
oled -4 4行目の文字を削除
oled +R 1 1行目を反転で表示
oled +R 2 2行目を反転で表示
oled +R 3 3行目を反転で表示
oled +R 4 4行目を反転で表示
oled -R 1 1行目の反転を解除
oled -R 2 2行目の反転を解除
oled -R 3 3行目の反転を解除
oled -R 4 4行目の反転を解除
oled +U 1 1行目をアンダーライン付きで表示
oled +U 2 2行目をアンダーライン付きで表示
oled +U 3 3行目をアンダーライン付きで表示
oled +U 4 4行目をアンダーライン付きで表示
oled -U 1 1行目のアンダーラインを解除
oled -U 2 2行目のアンダーラインを解除
oled -U 3 3行目のアンダーラインを解除
oled -U 4 4行目のアンダーラインを解除
oled +L 1行分スクロールアップ
oled -L 1行分スクロールダウン
oled P1 n 1行目の表示開始位置をn文字目に設定
oled P2 n 2行目の表示開始位置をn文字目に設定
oled P3 n 3行目の表示開始位置をn文字目に設定
oled P4 n 4行目の表示開始位置をn文字目に設定
oled r 全ての文字を削除、全ての反転、全ての表示開始位置を解除
oled s 表示を反映




このプログラムは内部にASCIIのフォントを抱えています。
ASCII文字に限り、外部フォントで表示/内部フォントで表示を切り替えることができます。
ASCIIのフォントはこ ちらのコードからお借りしました。
写真の上2行が外部フォント、下2行が内部フォントでの表示です。
内部フォントの方が少し文字が大きいです。


反転やアンダーラインの装飾ができます。


表示開始位置を指定するとこのように表示することができます。




以下のシェルを実行するとページ先頭の表示になります。
#!/bin/bash
./oled c
./oled +1 "ANK TEST"
./oled +2 "漢字テスト"
./oled +3 "ハンカクテスト"
./oled +4 "〒123-4567"
sudo ./oled s

SPI通信を行う場合、ハードウェアSPIだけでなく、ソフトウェアSPI(BitBangging SPI)を使うこともできます。
ハードウェアSPIではSCLK(Pin#23)とMOSI(Pin#19)は変更できませんが、ソフトウェアSPIでは全てのピンに好きなピン を使うことができます。
ソフトウエアSPIを使う場合のインストールは以下の手順です。
git clone https://github.com/nopnop2002/ssd1306_rpi.git
cd ssd1306_rpi/
cc -o oled oled.c fontx.c -lwiringPi -DSOFT_SPI

ソフトウェアSPIの時のモジュールの結線は以下の通りです。
OLEDモジュール Raspberry
PIN SIG
1 GND Gnd
2 VCC
3.3V
3 SCL
GPIO10(※)
4 SDA
GPIO11(※)
5 RST
GPIO2(※)
6 D/C
GPIO4(※)

(※)プログラムの以下の箇所を変更することで、好きなピンに変更可能です。
// Hardware/Software SPI
#define RST  8  // You can change
#define DC   7  // You can change

// Software SPI
#define MOSI 12 // You can change
#define SCLK 14 // You can change

次回はI2C接続のOLEDモジュールを紹介します。