ショップ

製品概要

OLED ディスプレイは、128x64 ドットのグラフィックディスプレイになっており、ボードの稼働状態や利用者に伝えたい情報を、画像や文字で分かり易く表示できるようになります。

鮮やかな発色で、白、水色、黄色などの単色のものが一般的です。また、サイズは、0.96インチと1.3インチのものの入手性が良いようです。0.96インチのOLEDディスプレイと1.3インチのOLEDディスプレイでは、使用されているコントローラが異なっているため、それぞれに適したライブラリ・ドライバを使用する必要があります。

インターフェースは、I2CとSPIがありますが、私自身は、I2Cの方が信号線が少なく結線が簡単なことと、いくつかのセンサーと一緒に使用するのであれば、センサーのインターフェースがI2Cであることが多いため、実質的に使用するMCUの信号線が減るために、ほとんどの場合I2Cのディスプレイを使用しています。


Arduinoでの利用

ライブラリのインストール

OLED ディスプレイを利用するためのライブラリとして、U8g2 ライブラリを使用する例を示します。

この他にも、よく利用されるライブラリとしてAdafruit のSSD1306 などがあります。
U8g2 ライブラリは、Arduino IDE のライブラリマネージャを利用してインストールすることができます。ライブラリマネージャの検索フィルタに[U8g2] を入力して絞り込むと、図のように表示されます。

ライブラリマネージャのダイアログ上でインストールするライブラリの欄をクリックすると、インストールボタンが表示されるので、最新バージョンを選択して、ライブラリをインストールします。関連するライブラリも合わせてインストールするか聞かれた場合には、それらもすべてインストールしてください。

U8g2 ライブラリの利用

ライブラリのインストール後、Arduino IDE メニューから[ファイル] ⇒ [スケッチの例] を選択すると、リストの下の方にU8g2 フォルダが追加されているのが確認できます。U8g2 フォルダの中を確認するといくつかのサンプルスケッチがあり、選択して実行することができます。
例として[u8g2] ⇒ [full buffer] ⇒ [GraphicsTest] を選択します。このスケッチは、デモ用の簡単なグラフィック表示を行うものです。
このサンプルスケッチをコンパイル・実行するためには、コメントアウトされたリストの中から適切なu8g2 コンストラクタを選択するか、自分自身で追加する必要があります。ここで利用するOLED ディスプレイはI2C インターフェースで接続されており、コントローラとして、0.96インチの場合にはSSD1306、1.3インチの場合にはSH1106を使用しているので、サンプルスケッチの60 行あたりの、以下のコンストラクタを有効にしてください。

// 0.96インチの場合
//U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE); 	      
// 1.3インチの場合
//U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);

このコンストラクタを有効にすることにより、スケッチのコンパイル、実行ができるようになり
ます。

文字表示のスケッチ例

前述のサンプルスケッチはグラフィックスの例でしたが、以下に0.96インチでの文字表示のスケッチ例を示します。

#include <U8x8lib.h>

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE); 	      

void setup(void)
{
  u8x8.begin();
  u8x8.setPowerSave(0);
}

void loop(void)
{
  u8x8.setFont(u8x8_font_chroma48medium8_r);

  u8x8.drawString(0,0,"  ESP32-SLIM");
  u8x8.drawString(0,1,"  ----------");
  u8x8.drawString(0,3,"ESP32E,16M Flash");
  u8x8.drawString(0,4,"USB,WiFi,Bluet");
  u8x8.drawString(0,5,"NARROW DIL");
  u8x8.drawString(0,6,"OLED, TFT Disp.");
  u8x8.drawString(0,7,"   MicroFan");

  delay(2000);
}

MicroPythonでの利用

マイクロファンが提供するMicroPythonのファームウェアには、OLEDディスプレイ(0.96インチ)を操作するためのssd1306ライブラリが組み込まれ初めから利用できるようになっています。そのため、以下のssd1306ライブラリのインストールは行う必要はありません。

ssd1306ライブラリがあらかじめファームウェアに組み込まれているか否かは、以下のように実際にインポートすれば確認できます。インポートに失敗した場合には、インストールが必要です。

>>> import ssd1306

また、以下のように、ファームウェアに組み込まれているライブラリのリストを表示させて確認することもできます。リストの中にssd1306ライブラリがなければ、インストールが必要です。

>>> help('modules')

ssd1306ライブラリがファームウェアに組み込まれていない場合には、まずssd1306ライブラリを開発ボードにインストールして使用する必要があります。

ライブラリのインストール方法は、以下のページでご確認ください。

OLEDディスプレイへの文字表示

コントローラにSSD1306を使用した0.96インチのOLEDディスプレイに文字列を表示するプログラム例です。

I2Cの引数には、一般的にはコメントで書いている例のように、それぞれのMCUやボードの端子の設定に合わせたSCL,SDA端子の指定が必要です。しかしながら、マイクロファンのファームウェアを使用している場合には、ファームウェアの中に端子情報が埋め込まれているため、明示的に端子を指定する必要はありません。このため、異なる開発ボードを使用する場合でも、I2Cの初期化処理の端子設定など、個別の情報に惑わされずプログラムを書くことができます。

from machine import Pin, I2C
import ssd1306

i2c = I2C(0) # STM32では引数を3にしてください。
# i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000) # ESP32-S3, ESP32-C3
# i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # ESP32
# i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) # ESP8266
# i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000) # RP2040
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.text('- SENSOR-PLUS -', 8, 0) # 第二引数は文字を出力する横のピクセル座標、第三引数は縦のピクセル座標
oled.text('MicroFan', 32, 8)
oled.text('OLED Display', 0, 16)
oled.text('Piezo Speaker', 0, 24)
oled.text('Brightness SNSR', 0, 32)
oled.text('Temp. Hum. SNSR ', 0, 40)
oled.text('Accelerometer', 0, 48)
oled.text('WS2812 RGB LED', 0, 56)
oled.show() # 操作結果を画面に反映させる

OLEDディスプレイへのグラフィックス表示

コントローラにSSD1306を使用した0.96インチのOLEDディスプレイにグラフィックス表示するプログラム例です。

ESP32-C3用のMicroPythonでは、現状ではなぜだかわかりませんがframebufにellipse()メソッドが実装されていません。

from machine import Pin, I2C
import ssd1306
import time

i2c = I2C(0) # STM32では引数を3にしてください。
# i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000) # ESP32-S3, ESP32-C3
# i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # ESP32
# i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) # ESP8266
# i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000) # RP2040
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0) # 画面のクリア
for y in range(0,64,8):
    oled.line(0,0,127,y,1) # 斜線
    oled.show()

for x in range(127,0,-8):
    oled.line(0,0,x,63,1) # 斜線
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(0,32,4):
    oled.rect(64-n*2,32-n,n*4,n*2,1) # 方形
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(0,32,2):
    oled.fill_rect(64-n*2,32-n,n*4,n*2,1) # 塗潰し方形
    oled.show()

# ESP32-C3ではこれ以降を削除
time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(2,32,2):
    oled.ellipse(64,32,n*4,n*2,1) # 楕円
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(2,18,2):
    oled.ellipse(64,32,n*4,n*2,1,True) # 塗潰し楕円
    oled.show()

1.3インチ(SH1106)のOLEDディスプレイへの文字表示

1.3インチのOLEDディスプレイには、SH1106というコントローラが使用されています。SH1106はSSD1306とほぼ同じ構造と操作体系のコントローラですが、表示用メモリの構造が異なっているため、SSD1306用のドライバでは表示することができません。しかしながら、SSD1306のshow()メソッドを差し替えてSSH1106のメモリ構成に適合させることにより、わずかなコードで1.3インチのOLEDディスプレイを利用できるようになります。

ちなみに、SSD1306のデータシートの表題には[128X64 Dot Matrix ...] と書かれているのに対して、SH1106のデータシートの表題には、[132X64 Dot Matrix ...]と書かれており、表題から微妙な差異が現れています。

以下に、ESP32-C3M-SLIMを対象として、1.3インチのOLEDディスプレイへの文字表示プログラム例を示します。ここでは文字表示のプログラム例しか示しませんが、この拡張で1.3インチのOLEDディスプレイに、グラフィックス表示も行うことができます。

from machine import Pin, I2C
import ssd1306
from micropython import const

### SH1106用のshow()メソッドの差し替え
SET_LOW_COL = const(0x00)
SET_HIGH_COL = const(0x10)
SET_PAGE_ADDR = const(0xb0)

class SH1106_I2C(ssd1306.SSD1306_I2C):
    def show(self):
        for page in range(0, self.pages):
            self.write_cmd(SET_PAGE_ADDR | page)
            self.write_cmd(SET_LOW_COL | 2)
            self.write_cmd(SET_HIGH_COL | 0)
            self.write_data(self.buffer[page * 128:(page + 1) * 128])
### --------------------

i2c = I2C(0) # STM32では引数を3にしてください。
# i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000)
display = SH1106_I2C(128, 64, i2c)
display.text('ESP32-C3M-SLIM', 8, 0, 1)
display.text('USB/JTAG,4MFlash', 0, 16, 1)
display.text('WiFi,Blutooth', 0, 24, 1)
display.text('OPT OLED Display', 0, 32, 1)
display.text('MicroFan', 32, 56, 1)
display.show()

なお、SH1106専用のドライバーの使用が望ましいということであれば、以下のページに公開されているドライバを使用することができます。

このドライバは、SSD1306の単なるSH1106への焼き直しではなく、機能、性能向上のための様々な意欲的な取り組みがなされています。例えば、画面に描画する際にダーティービットを管理して、フレームバッファの内容をOLEDディスプレイに転送する際に、内容に変更があった部分のみの転送を行うことで、転送効率(結局のところ処理速度)を向上させることなどを行っています。変更内容を内容を読んでみると、時間ができたらやろうと思っていたことが実現されており、面白かったです。


関連記事