目次
OLED SSD1306
秋月電子通商や AliExpress などで売られている有機ELディスプレイ OLED SSD1306は、組み込み用の小型のディスプレイとして人気があります。0.96インチで128×64ドットの表示が可能です。
OLED SSD1309
少し大きめの1.54インチの SSD1309 も AliExpress などで売られています。本稿で紹介するドライバは、SSD1306とSSD1309に対応しています。
下記は透過型のタイプを使った一例です。
I2C接続 回路図
OLED SSD1306の多くはI2C接続タイプになっているので、VCC、GND、SCL、SDAを Raspberry Pi の40ピン拡張用IO端子に接続するだけです。プリアップ抵抗もOLEDモジュール側に予め実装されていると思います。
SSD1309の場合は、SPI接続タイプになっていることが多いので、OLEDモジュール基板上のチップ抵抗の変更やリセット回路の追加が必要です。基板裏面のシルク印刷「I2C PORT:R8,R4」「SPI PORT R9」のとおり、チップ抵抗R9を取り外し、R8とR4に0Ωのチップ抵抗を半田付けします。
下図はリセット回路の一例です。詳しくは、IchigoJamの記事を参照してください。
OLED SSD1306 の接続例
秋月電子通商で販売されている OLED SSD1306 の場合は、VCC(1)、GND(2)、SCL(3)、SDA(4)端子を、Raspberry Piの3.3V(1)、GND(9)、I2C_SCL(5)、I2C_SDA(3)に接続します(括弧内はピン番号)。
8×8日本語フォント
ポケコンやマイコン用に良く使われている8×8ドット(文字は7ドット×7ドット)の小さな日本語フォント「美咲フォント」を使いました。128×64ドットの OLED に 16桁×8行の文字を表示することが出来ます。
少ないドット数にも関わらず、下図のように日本語として読むことが出来ます。
Python プログラム
Raspberry Pi 用の Python のプログラムは下記に公開しました。
GitHub:
https://bokunimo.net/git/oled
下記のコマンドでダウンロードし、実行すると OLED に日本語の文字を表示できます。
pi@raspberrypi:~ $ git clone https://bokunimo.net/git/oled ⏎
pi@raspberrypi:~ $ cd oled/raspi ⏎
pi@raspberrypi:~/oled/raspi $ ls -1
misaki.fnt
misaki_README.txt
test_oled.py
test_oled_kanji.py
pi@raspberrypi:~ $ ./test_oled_kanji.py ⏎
プロラム中の変数disp_portとdisp_landには、表示用の文字列を代入してください。末尾がportの変数は縦画面用、landは横画面用です。3秒ごとに繰り返し表示します。
下記が縦画面用の主要部です。20行ほどの短いプログラムで、disp_port内の文字列のフォントデータをOLEDにI2Cで転送します。フォントのアドレスの検索には、二分探索という方法を用い、最小値p_minと最大値p_maxで絞り込んでゆきます。
d_fontx2 = load_fontx2()
def main():
i2c = smbus.SMBus(1)
i2c.write_i2c_block_data(ssd1306, d_mode_i, list(d_init))
i2c.write_i2c_block_data(ssd1306, d_mode_i, list(d_home))
for x in range(8)[::-1]:
for y in range(16):
b = disp_port[y][x].encode('CP932')
c = int.from_bytes(b, 'big')
p_min = 0
p_max = len(d_fontx2_map) - 1
while(p_min < p_max):
p = (p_max - p_min)//2 + p_min
if c >= d_fontx2_map[p][0]:
p_min = p
if c <= d_fontx2_map[p][1]:
p_max = p
if(p_min == p_max):
address = d_fontx2_map[p_min][2] + 8 * (c - d_fontx2_map[p_min][0])
i2c.write_i2c_block_data(ssd1306, d_mode_w, list(d_fontx2[address:address+8]))
縦画面での表示例
下図は縦画面での表示例です。使用した OLED モジュールは、Seeed Studio製の Grove 端子付きの OLED Display 128×64 です。秋月で売られている SSD1306 は3.3Vで動作しますが、Seeed Studio製のモジュールの電源は 5Vです。
MicroPython用ドライバも
本ブログの Raspberry Pi 用の Python プログラムは、下記のMicroPython 用を (通常の)CPythonに移植して製作しました。
MicroPython 用のプログラム:
https://github.com/bokunimowakaru/pico/blob/master/examples/test_oled.py
動作確認済み OLED
筆者が動作を確認した OLED モジュールを以下に示します。
- SUNHOKEY Electronics SSD1306
- Seeed Studio Grove OLED Display 0.96″ module
- DIY MORE (深圳市四海芯舟科技) Transparent OLED Screen SSD1309
美咲フォントのライセンス
Num Kadoma氏が商用利用も含めて無料で配布している8×8 ドット日本語フォント「美咲フォント」2012-06-03 版を使用しました。ライセンスについては下記を参照してください。
「美咲フォント」ライセンス(無料):
https://bokunimo.net/git/oled/blob/master/raspi/misaki_README.txt
by bokunimo.net