ESP32 + MicroPythonでOLEDに表示させてみた

ssd1306-spi-esp32.jpg

Micropython + ESP32でI2C経由の表示ができましたので、次はSPIを試してみました。
Micropythonには既にSSD1306のドライバが用意されていますので、これを使ってみます。
使用したOLEDは0.96インチのSPI接続のもので、使っている方も多いと思います。

結線は下図のとおりです。

SSD1306-ESP32.png

信号線の対応は

OLED ESP32
GND  GND
VCC  3V3
D0   IO14(CLK)
D1   IO13(MOSI)
RES  IO17
DC   IO16
CS   IO5

となります。

SPIの信号線のうち、MISOはこのモジュールにはありませんので結線していませんが、ソフトウェア的にはIO12をMISOに使用することにします。
ESP32にはハードウェアSPIの機能も備わっていますが、そのデフォルトのピン配置は
SPI(1) : sck=Pin(6), mosi=Pin(8), miso=Pin(7)
SPI(2) : sck=Pin(14), mosi=Pin(13), miso=Pin(12)
となっているそうです。今回はSPI(2)のほうへ合わせてみました。

What are ESP32 SPI Ports for Micropython SPI(1)? – MicroPython Forum

次にソフトウェアです。
SSD1306のドライバ「ssd1306.py」はMicropythonのソースコードディレクトリの

micropython-esp32/drivers/display/

の中にあります。
このファイルをWindows側のフォルダへ持ってきます。
そして、uPyCraftを使ってESP32へ転送します。
これはuPyCraftでssd1306.pyを開き、DownloadAndRunボタンを押すだけです。
これでファイルはESP32のファイルシステム内へ保存されます(電源を切っても保持されます)ので、以降はimport文で読み込めるようになります。

ではREPLでOLEDへ表示させてみましょう。

>>> from machine import SPI
>>> from machine import Pin
>>> from ssd1306 import SSD1306_SPI
>>> spi = SPI(1, baudrate=8000000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
>>> oled = SSD1306_SPI(128, 64, spi, dc=Pin(16), res=Pin(17), cs=Pin(18))
>>> oled.fill(0)
>>> oled.text('Micropython', 0, 0)
>>> oled.text('works fine!', 0, 10)
>>> oled.show()
>>>

これで冒頭の写真のように文字が表示されます。

SPIの第一引数は、1か2しか使えないようです。
他の値を指定すると

SPI ID must be either HSPI(1) or VSPI(2)

というメッセージが出ます。(Software SPIの場合はID=-1を指定しますが、これを使うとエラーにはなりませんがOLEDへ表示されませんでした)
MicropythonのSPIクラスの解説ドキュメントはこちらにあります。

OLEDへの表示は、フレームバッファクラスが使われています。
フレームバッファクラスは線、矩形などの描画も可能です。
しかし現時点でmicropython-esp32に一緒に入っていたssd1306.pyには、文字列描画(text(str,x,y))とドット描画(pixel(x,y,color))と塗りつぶし(fill(color))しか実装されていません。

本家の最新版のssd1306.pyでは、それ以外の描画機能もサポートされているようですので、こちらを使えば図形も描画できそうです。
まず、古いファイルを削除しましょう。

>>> import os
>>> os.listdir()
['boot.py', 'ssd1306.py']
>>> os.remove('ssd1306.py')
>>> os.listdir()
['boot.py']
>>>

そして、最新版のssd1306.pyを改めてuPyCraftで転送します。
これで矩形と線が描けるようになりました。
こんな感じで使います。

oled.fill(0)
oled.hline(0,32,128,1)
oled.vline(64,0,64,1)
oled.show()

oled.line(0,0,127,63,1)
oled.rect(72,8,24,16,1)
oled.fill_rect(24,48,24,16,1)
oled.show()

ssd1306-spi-esp32b.jpg

コメント