以前、フルカラー液晶ディスプレイ2種類のArduinoでの動かし方を記事にした。
MicroPythonでもこれらを動かせないかとドライバを探したところ、ST7789用が辛うじて見つけられた(ST7735用はちゃんと動く物を見つけられず)。但し一応ドライバは見つかったものの実用性はイマイチで、なんとか動作するレベル。というわけで、今回はST7789液晶ディスプレイのMicroPythonでの動かし方を一応記事にまとめておく。
ドライバの準備
ST7789のMicroPythonライブラリにはドライバ本体がCで書かれた高速版があるのだが、MicroPython自体のカスタムビルドが必要なため今回は利用を断念。ただ同じ作者が”Slow”と律儀に断ってフルMicroPython版のドライバを公開しており、今回はそれを使うことに。
GitHubからライブラリを取得し、ampyで転送する。ドライバ本体はst7789py.pyだが中身は高速版のst7789.pyとAPI互換であり、サンプルプログラム等がst7789.pyを参照する関係でst7789py.pyをst7789.pyにリネームして転送しておく。
git clone https://github.com/devbis/st7789py_mpy
cd st7789py_mpy/
ampy put st7789py.py st7789.py
ハードウエアの配線とドライバの初期化コード
以下の表のようにST7789とESP32を接続する。
ST7789 | ESP32 |
---|---|
GND | GND |
VCC | 3V3 |
SCL | IO18 |
SDA | IO23 |
RES | IO4 |
DC | IO2 |
BLK | 未接続 |
そして、MicroPython上で以下のコード実行によりドライバの初期化がされる。
from machine import Pin, SPI
import st7789
spi = SPI(2, baudrate=40000000, polarity=1, sck=Pin(18), mosi=Pin(23))
display = st7789.ST7789(spi, 240, 240, reset=Pin(4, Pin.OUT), dc=Pin(2, Pin.OUT))
display.init()
カラーで図形を描画する
上記の初期化コードを実行後、displayオブジェクトのメソッドを呼び出すことで基本的な描画が出来る。
- 画面全体をベタ塗り
display.fill(st7789.YELLOW)
- 線を引く
display.line(10, 37, 200, 160, st7789.BLUE)
- 四角形を描く
display.rect(10, 37, 190, 123, st7789.RED)
色々なフォントでテキスト出力させる
上記ドライバは最低限のグラフィック描画機能しか持っていないので、テキスト出力を行うためには別途ライブラリが必要。そこで見つけたのは以下のライブラリ。
git cloneでローカルに持ってきて、フォント(ディレクトリpyfonts/以下)とライブラリ本体(pytext.py)をampyで転送する。
git clone https://github.com/russhughes/ttgo-hershey-fonts
cd ttgo-hershey-fonts
ampy put pytext.py
ampy put pyfonts/
サンプルプログラムはpyhello.pyだが、SPIとdisplayオブジェクトの初期化コードが若干違ったりするので適宜修正したうえでampy runで実行。
ampy run pyhello.py
実行すると、下の写真のように”Hello!”が色々なフォントで表示される。フォントのバリエーションが沢山あって見ていて楽しいが、描画速度は作者が”Slow”と言っている通りでかなり遅い。
以前記事にしたSSD1306ディスプレイのドライバはMicroPython組み込みのframebufライブラリを利用しておりテキスト出力もそこそこ高速(但しフォントサイズは8×8ピクセル固定)だが、今回試したST7789の場合は全てPythonコードで書かれておりオーバーヘッドのせいで遅いのだろう。
サンプルプログラムの中を覗いてみる
pyhello.pyの中身を覗いてみると、テキスト出力をしている部分は一行あたり32ドット使うため240×240のディスプレイでは”Hello!”を7行表示するコードになっている。フォントサイズは色々あるようなので、沢山の文字を表示させたい場合は小さいフォントを選んで詰めて表示も出来るかもしれない。ただスクロール機能は未実装なので、別途実装するか他のライブラリを探す必要があるだろう。
again = True
while again:
color = st7789.color565(
random.getrandbits(8),
random.getrandbits(8),
random.getrandbits(8))
row += 32
pytext.text(display, pick_item(fonts), "Hello!", row, 0, color)
if row > 192:
display.fill(st7789.BLACK)
row = 0
CircuitPythonならドライバが充実している模様
ST77xxのMicroPython用ディスプレイドライバを探している最中に、Adafruit社が過去MicroPython向けに作った各種ディスプレイドライバのGitHubリポジトリを見つけた。
現在Adafruit社は上記リポジトリのメンテをしておらず、CircuitPythonに力を入れているようだ。CircuitPython用のドライバは下記リポジトリに各種置かれている。
まとめ
MicroPythonでST7789フルカラー液晶ディスプレイを一応動作させる事が出来たが、ST7789用ドライバは最低限の描画機能しか持っておらず別途見つけたテキスト描画ライブラリも単に文字が表示出来るだけで、実用性は高くない印象。そのうえ動作が遅い。
動作が遅い点に関してだけ言えばMicroPythonをカスタムビルドすれば改善しそうだが、MicroPythonでフルカラー液晶を使いたい理由も特に無いし諦めた方が無難かも。MicroPythonにはキャラクタ表示タイプのディスプレイ(1602LCDなど)やMicroPython組み込みのframebufライブラリを利用しているSSD1306搭載の物の方が相性が良さそうだ。
一方でCircuitPythonならAdafruit社によるディスプレイドライバが充実している模様。IoTデバイス上のPython環境でどうしてもグラフィック型ディスプレイを使いたくなったら、CircuitPythonをチェックすると良いかもしれない。
コメント