ESP32 PythonでLCD制御する実験
背景
LCD関連の作業では、実装と確認をかなりの回数、繰り返すことが多い
位置合わせや色の確認など
C言語で実装した場合、コンパイル、転送、書き込みで時間がかかる
ライブラリ(TFT_eSPIなど)のエミュレーターを作れればよいのだが、かなり大変だ
そこで、MicroPythonでLCDに描画することについて調査した
M5 StickPlus CなどではMicroPythonでLCDの描画できる
SPIで通信さえできれば、描画できるはずだ
今回は、st7789に対応している、MicroPython LCD Driver in Pythonを試してみた
(2022/12頃の実験、2023/12頃に再実験)
環境
ESP32 Dev Board
MicroPython v1.19.1 on 2022-06-18; ESP32 module with ESP32
Arduino IDE
WAVESHARE 240×240, General 1.54inch LCD Display Module, IPS, 65K RGB
MicroPython LCD Driver in Python
PythonでSPI通信を行っているライブラリ
commit ID: ba0b3911d93305439219fcae52621f0cc7406ef2
配線
配線については以下の記事と同様に、SPI_*というピンを利用
結果
描画はできたが、描画速度が遅い
以下に試したときの様子をGIFアニメにしたもの
GIFアニメにしたため実際の速度より遅くなっているが
描画面積が広いと、徐々に塗られていくのが認識できるレベルになる
試した限りでは、SoftSPI()でしか動作させることができなかった
SoftSPI()を使っているので遅い可能性がある
baudrateを変更してみたが、試した限りでは、描画速度に変化はなかった
コード
動作したコード
import time
from machine import Pin, SPI, SoftSPI
import st7789py as st7789
sspi = SoftSPI(baudrate=40000000, polarity=1, phase=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
tft = st7789.ST7789(sspi, 240, 240,
reset=Pin(4, Pin.OUT),
cs=Pin(5, Pin.OUT),
dc=Pin(16, Pin.OUT),
backlight=Pin(27, Pin.OUT),
rotation=0)
cs=Pin(5, Pin.OUT)
cs.off()
# Draw background in BLUE.
tft.fill(st7789.BLUE)
# Draw rectangles in RED.
for i in range(12):
x = i % 3
y = i // 3
tft.fill_rect(
10 + (60 * x),
10 + (60 * y),
50,
50,
st7789.RED
)
print(y)
time.sleep_ms(1000)
backlight = Pin(27, Pin.OUT)
backlight.off()
動作しなかったコード
SoftSPI()ではなく、SPI()を使うと正常に動作しなかった
ピン番号などが間違っている可能性がある
もう少し調査が必要
(8時間は試行錯誤したが解明しなかったため作戦を練り直す)
# HSPI_*
hspi = SPI(1, baudrate=40000000,
polarity=1,
phase=0,
bits=8,
firstbit=0,
sck=Pin(14), mosi=Pin(13), miso=Pin(12))
# CS0 - GPIO15
# SPI_*
vspi = SPI(2, baudrate=40000000,
polarity=1,
#phase=0,
#bits=8,
#firstbit=0,
sck=Pin(18),
mosi=Pin(23),
miso=Pin(19))
# CS0 - GPIO5
補足
以下のGitHubにある参考コードでは、SPI()を使っているので、
SPI()で動かす方法がありそうだが、みつけられていない
また、miso=Noneを指定すると、「ValueError: expecting a pin」が発生してしまう
return st7789.ST7789(
SPI(2, baudrate=40000000, sck=Pin(18), mosi=Pin(19), miso=None),
135,
240,
reset=Pin(23, Pin.OUT),
cs=Pin(5, Pin.OUT),
dc=Pin(16, Pin.OUT),
backlight=Pin(4, Pin.OUT),
rotation=rotation)
この記事が気に入ったらサポートをしてみませんか?