Micropython + SH1106 OLEDでの表示

sh1106-spi-esp32.jpg

前回表示させたOLEDは0.96インチの製品でしたが、実は1.3インチのOLEDモジュールも買ったまま放置していました。
AmazonマーケットプレイスでHiLetGoが販売していたものです。
こちらもSPIインタフェースなので、差し替えて動くかどうか試してみたところ、以下のように正常な表示はできませんでした。

sh1106-spi-esp32b.jpg

上記の製品ページの説明をよく見ると、

ドライバIC:SSH1106 or SSD1306

と記載されています。
製品には手がかりは書かれていないのですが、おそらくSSD1306のドライバで動かないからにはSSH1106(これも記載ミスで、正確には「SH1106」です)なのだろうと推測しました。

ネット上の情報をいろいろ見てみると、SSD1306とSH1106はかなり似ているものの、SH1106は内部的には132×64ピクセルの構成になっているようです。
さらに、データシートもダウンロードして眺めてみると、内部のメモリは下図のようになっており、データを転送するには「Page」「Column」の両方を指定する必要があることが分かりました。

sh1106.png

開始位置としてPageとColumnを指定し、データをどんどん転送していくとColumn値が勝手に増えていきますが、上限である0x83を超えてもPageは繰り上がりません。
従って、Column 0x83に到達したらPageを1増やし、Columnをリセットしてやる必要があります。
実際のディスプレイは横128ピクセルしかなく、メモリのColumn 2~Column130が表示されますので、この範囲にフレームバッファを転送すれば良いことになります。

以上を踏まえて、Micropython用のSH1106ドライバをSSD1306のサブクラスとして実装したのが以下のコードです。
SSD1306との違いはフレームバッファを転送するところだけです。

使い方の例は以下のようになります。
ESP32-DevKitCとの結線は前回と同じです。

SSD1306-ESP32.png

>>> from machine import Pin, SPI
>>> spi = SPI(1, baudrate=8000000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
>>> oled = SH1106_SPI(128, 64, spi, dc=Pin(16), res=Pin(17), cs=Pin(18))
>>> oled.line(0,0,128,64,1);oled.show()
>>> oled.line(128,0,0,64,1);oled.show()
>>> oled.text('SH1106',36,0);oled.show()
>>> oled.text('Micropython',24,56);oled.show()
>>>

コメント