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