見出し画像

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頃に再実験)

環境

配線

  • 配線については以下の記事と同様に、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)

https://github.com/russhughes/st7789py_mpy/blob/master/tft_configs/esp32_320x240/tft_config.py#L26-L34


この記事が気に入ったらサポートをしてみませんか?