子育てしながらエンジニアしたい

現在 3 歳女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Wemos Lolin ESP32 OLED で、MicroPython から OLED 出力をする

前回の記事で、ESP32 に MicroPython を導入することができました。

edosha.hatenablog.jp

これで ESP32 上で Python REPL を動かせるようになりました。
今回は、せっかくついている OLED に文字や図形を出力してみたいと思います。
それにあたって、便利のために MicroPython 用の IDE も導入することにしました。

uPyCraft (IDE) の導入

uPyCraft は DFRobot 社が無償で提供している、MicroPython 用の IDE です。

uPyCraft

IDE とはいっても、Python のコーディングには PyCharm を使っているので、uPyCraft はファイル転送用に使います。

uPyCraft のダウンロード

最新版は Github の以下のページからダウンロードするようです。

github.com

exe ファイルはインストーラではなく、IDE の実体です。
なのでインストール等の必要はなく、ただ exe を開けば良いようです。

uPyCraft にポートの設定をする

uPyCraft から ESP32 を見えるようにするため、ポートの設定をします。
これはとても簡単で、uPyCraft の Tools -> Serial から適切なポートを選ぶだけです。
ポートは前回の記事のようにデバイスマネージャーで確認できます。

f:id:edosha:20180111130201p:plain

OLED に出力する

Wemos Lolin ESP32 OLED にのっている OLED は、SSD1306 というモジュールのようです。
ありがたいことに MicroPython では、SSD1306 のドライバーがすでに用意されています。
このドライバーを導入すれば、非常に簡単に OLED 出力をすることができます。

ドライバーの導入

MicroPython の Github から、ssd1306.py をダウンロードします。

github.com

これを uPyCraft を使って、ESP32 にダウンロードすれば導入完了です。
ダウンロードしたいファイルを開いて、Tools -> Download すればダウンロードできます。
うまくいくと、左側の device ディレクトリにファイルが追加されます。

f:id:edosha:20180111130614p:plain

ドライバーを使って OLED に出力する

I2C か SPI を使って OLED に出力することができます。
ひとまず I2C を使ってみることにしました。
I2C を使う場合は、SCL と SDA を指定する必要があります。
Wemos Lolin ESP32 OLED では、それぞれ以下のように接続されています。

  • SCL: GPIO 4
  • SDA: GPIO 5

これを ssd1306 ドライバーに教えてあげましょう。

import ssd1306
import machine

i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
oled = ssd1306.SSD1306_I2C(width=128, height=64, i2c=i2c)

上で作った oled インスタンスを介して、文字などを OLED 出力します。
ssd1306.py では、MicroPython の framebuf クラスを使って文字出力などを実現しています。
そのため framebuf のメソッドをそのまま使うことができます。

framebuf — Frame buffer manipulation — MicroPython 1.9.3 documentation

なお framebuf の引数で、色を指定する c がありますが、この OLED は 0 か 1 以上しか判定しないようです。
0 で消去、1 で描画というイメージです。

  • 文字出力
oled.text("Hello", 0, 0)
oled.show()

f:id:edosha:20180111133619j:plain

  • 直線をひく
oled.line(0, 0, 128, 64, 1)
oled.show()

f:id:edosha:20180111133857j:plain

  • 四角をかく
oled.rect(10, 10, 108, 44, 1)
oled.show()

f:id:edosha:20180111133923j:plain

  • 塗りつぶす
oled.fill(1)
oled.show()

f:id:edosha:20180111133834j:plain

まとめ

今回は OLED に文字出力ができるようになりました。
次回はより IoT っぽく (?)、BME280 温湿度センサーモジュールから値を取得して、OLED 出力してみたいと思います。