SPI接続のOLEDを使う


SPI接続の128x64 のOLEDを入手したので、Raspberryで使ってみました。
コントローラーはSSD1306、スクリーンサイズは0.96inchです。


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

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

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


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

モジュールの結線は以下の通りです。
OLEDモジュール RPI/OPI
(Pin#)
PIN SIG
1 GND Gnd
2 VCC 3.3V
3 D0 SCLK(#23)
4 D1 MOSI(#19)
5 RES GPIO18(#12)(※)
6 DC GPIO17(#11)(※)
7 CS CS0(#24)

(※)プログラムの以下の箇所を変更することで、好きなピンに変更可能です。番号はWiringPiの番号です。
// Hardware/Software SPI
#define RST  1  // You can change
#define DC   0  // 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 -lpthread -DSOFT_SPI

ソフトウェアSPIの時のモジュールの結線は以下の通りです。
OLEDモジュール RPI/OPI
(Pin#)
PIN SIG
1 GND Gnd
2 VCC 3.3V
3 D0 GPIO11(#23)(※)
4 D1 GPIO10(#19)(※)
5 RES GPIO18(#12)(※)
6 DC GPIO17(#11)(※)
7 CS GPIO8(#24)(※)

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

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



1.3inchのOLEDを入手しました。
コントローラーはSH1106、解像度は128x64です。
解像度は0.96inchのSSD1306と同じですが、パネルサイズが大きいので、文字が大きく表示されます。
このモジュールは横方向に2ドットのオフセットが有ります。
カラム=2が左端となり、カラム=2から描画しないと、左端の表示が2ドット分欠けます。
どうやら、SH1106​​は128x64ではなく132x64ピクセルで動作する様で、両端の2ピクセルは使っていない様です。
同じソースで表示できますが、SSD1306と違ってハードウェアスクロールの機能は有りません。

SH1106を使った128x64のOLEDには1.54inch、2.42inchのパネルサイズのモジュールも売られています。
SSD1306もSH1106も、縦方向に8ページの表示メモリーを持っています。
1ページは128x8ドットですが、さすがに8ドットフォントだと表示が小さすぎて読めません。
2ページ分のメモリー(128x16)を使って、16ドットフォントを表示していますが、
2.42inchになると文字の大きさがかなり大きくなるので、8ドットフォントでも見えると思います。
ただし、1.54inchからぐっと高価になります。


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