chakokuのブログ(rev4)

日々のごった煮ブログです

M5 StickC Plus用LCDドライバ(ST7789)を導入する

M5 StickCの電源がOnかOffか分かりづらいためLEDを点灯させているが、そもそもLCDに何か表示されていればいいわけで、ST7789用のドライバを探してみた。簡単に見つけられるドライバはC言語で実装されており、C言語版のドライバはビルドが必要なので、Pythonで書かれたドライバをさらに探してみる。MicroPythonで書かれたドライバがあったので入れてみる。

st7789.pyがFlashに書き込まれている状態で以下を実行

from machine import Pin,SPI
import st7789py
lcd_width=135
lcd_height=240
hspi = SPI(1, 1000000, sck=Pin(13), mosi=Pin(15), miso=Pin(14))  # 1MHz
cs = Pin(5,Pin.OUT)
dc = Pin(23,Pin.OUT)
reset = Pin(18,Pin.OUT)
lcd = st7789py.ST7789(hspi,lcd_width,lcd_height,reset=reset,dc=dc,cs=cs)

塗りつぶしをやってみたが、表示が変わらない。なぜか?

lcd.fill(0)
lcd.fill(255)

回路図を見ると、AXP192というチップからLCDコントローラにLCD_BL_VCC / LCD_LOGIC_VCCという線が伸びている。バックライト調整用の電圧と推測。AXP192を制御しないとLCDが表示されないのでは?と推測
さらに探すと、AXP192用のMicroPythonドライバを提供してくださっている人を発見(GitHub上で)。ドライバを入れてみる。

以下でLCD用バックライトの電圧がかかるはずなのだが。。まだ表示されない。なぜだろうか

from machine import I2C
import axp192
sys_i2c  = I2C(0, sda=Pin(21), scl=Pin(22))
axp = axp192.AXP192(sys_i2c)
axp.setup()
axp.set_LD02(True)

AXP192の制御は合ってそうなので、別の人が開発したLCDドライバを使ってみる。
Sebastian Wicki 氏が提供されている、ドライバを使うことで表示が可能になった。
試したドライバは、github/gandroで公開されている、st7789.py と colors.pyを使用
以下のテストサンプルで正常動作を確認(AXPによるバックライト電圧は出ているのを前提)。。したのだが、成功したのは一回だけで、あとはまた真っ黒なのであった。少し頭を冷やして考えよう。

import machine
import colors
import st7789

spi = machine.SPI(1, baudrate=20_000_000, polarity=1,
                  sck=machine.Pin(13, machine.Pin.OUT),
                  miso=machine.Pin(4, machine.Pin.IN),  # NC
                  mosi=machine.Pin(15, machine.Pin.OUT))

tft = st7789.ST7789(spi, 135, 240,
                    reset=machine.Pin(18, machine.Pin.OUT),
                    dc=machine.Pin(23, machine.Pin.OUT),
                    cs=machine.Pin(5, machine.Pin.OUT),
                    buf=bytearray(2048))

c = colors.rgb565(3,3,8)
tft.fill(c)
tft.text("Hello World", 10, 30, colors.WHITE, c)

USBケーブルを抜き差しして本体リセットしたつもりだが、M5は電池内蔵だったので、リセットできていなかった。電源ボタン長押しで再度テスト。以下のコードにより、Hello Worldが描画できた。

from machine import I2C, Pin, SPI
import axp192
import colors
import st7789

sys_i2c  = I2C(0, sda=Pin(21), scl=Pin(22))
axp = axp192.AXP192(sys_i2c)
axp.setup()
axp.set_LD02(True)

spi = SPI(1, baudrate=20_000_000, polarity=1, sck=Pin(13), miso=Pin(14), mosi=Pin(15))
tft = st7789.ST7789(spi, 135, 240,
                    reset=machine.Pin(18, machine.Pin.OUT),
                    dc=machine.Pin(23, machine.Pin.OUT),
                    cs=machine.Pin(5, machine.Pin.OUT),
                    buf=bytearray(2048))
tft.fill(colors.BLACK)
tft.text("-- Power On --",10,120,colors.rgb565(8,8,8),colors.BLACK)

最終的なboot.pyは以下

from machine import I2C, Pin, SPI, PWM
import axp192
import colors
import st7789

LCD_WIDTH = 135
LCD_HEIGHT = 240

# set AXP device
sys_i2c  = I2C(0, sda=Pin(21), scl=Pin(22))
axp = axp192.AXP192(sys_i2c)
axp.setup()
axp.set_LD02(True)


#turn on LED for check power on
pwm_led = PWM(Pin(10), freq=100)
pwm_led.duty(1000)   # 0-1023

# set message on LCD
spi = SPI(1, baudrate=20_000_000, polarity=1, sck=Pin(13), miso=Pin(14), mosi=Pin(15))
                    
rst = Pin(18, Pin.OUT)
dc = Pin(23, Pin.OUT)
cs = Pin(5, Pin.OUT)
buf = bytearray(2048)

tft = st7789.ST7789(spi, LCD_WIDTH, LCD_HEIGHT, reset=rst, dc=dc, cs=cs, buf=buf)
tft.fill(colors.BLACK)
tft.text("-- Power On --",10,120,colors.rgb565(8,8,8),colors.BLACK)

電源投入後は以下のような表示となる。相変わらず地味ですが、、LCDが焼き付いたりするのが嫌なので暗いカラーで表示

だいたい準備はできたので、、次は本来の目的である、BLEによるシャッターボタン作成にとりかかる。。。のだが、IoT勉強会の資料を作らないといかん。逃避している。あっという間に1月になりそうだ。

■ご参考URL
st7789py_mpy/st7789py.py at master · russhughes/st7789py_mpy · GitHub
GitHub - karfas/M5StickC-uPy: Micropython utilities for the M5StickC
Micropython M5StickC LCD Driver · GitHub

正常動作が確認できたLCDドライバ(st7789.py)
GitHub - gandro/micropython-m5stickc-plus: Micropython modules for the M5StickC Plus
Micropython | M5Stack Community