カテゴリー
Raspberry Pi

日本語表示 Raspberry Pi に有機ELディスプレイ SSD1306 を I2C 接続

有機EL ディスプレイ OLED を Raspberry Pi に I2C で接続し、日本語を表示してみました。

OLED SSD1306

秋月電子通商や AliExpress などで売られている有機ELディスプレイ OLED SSD1306は、組み込み用の小型のディスプレイとして人気があります。0.96インチで128×64ドットの表示が可能です。

秋月電子通商などで売られている有機ELディスプレイ OLED SSD1306

OLED SSD1309

少し大きめの1.54インチの SSD1309 も AliExpress などで売られています。本稿で紹介するドライバは、SSD1306とSSD1309に対応しています。

少し大きめの1.54インチの SSD1309には、表示の裏面が透けて見える透過型タイプも売られている

下記は透過型のタイプを使った一例です。

I2C接続 回路図

OLED SSD1306の多くはI2C接続タイプになっているので、VCC、GND、SCL、SDAを Raspberry Pi の40ピン拡張用IO端子に接続するだけです。プリアップ抵抗もOLEDモジュール側に予め実装されていると思います。

VCC、GND、SCL、SDAを Raspberry Pi の40ピン拡張用IO端子の1,9,5,3番ピンに接続する

SSD1309の場合は、SPI接続タイプになっていることが多いので、OLEDモジュール基板上のチップ抵抗の変更やリセット回路の追加が必要です。基板裏面のシルク印刷「I2C PORT:R8,R4」「SPI PORT R9」のとおり、チップ抵抗R9を取り外し、R8とR4に0Ωのチップ抵抗を半田付けします。

下図はリセット回路の一例です。詳しくは、IchigoJamの記事を参照してください。

SSD1309の場合は、SPI接続タイプになっていることが多いので、OLEDモジュール基板上のチップ抵抗の変更やリセット回路の追加が必要

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)に接続します(括弧内はピン番号)。

OLEDの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行の文字を表示することが出来ます。

少ないドット数にも関わらず、下図のように日本語として読むことが出来ます。

ポケコンやマイコン用に良く使われている8×8ドットの美咲フォントを使い、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です。

縦画面での表示例。秋月で売られている SSD1306 は3.3Vで動作するが、Seeed Studio製のモジュールの電源は 5V

MicroPython用ドライバも

本ブログの Raspberry Pi 用の Python プログラムは、下記のMicroPython 用を (通常の)CPythonに移植して製作しました。

MicroPython 用のプログラム:
https://github.com/bokunimowakaru/pico/blob/master/examples/test_oled.py

本ブログのプログラムは、MicroPython 用を (通常の)CPythonに移植して製作した

動作確認済み 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es