今年、MicroPython用に買ったボードシリーズ。
2024年4月5日 スイッチサイエンスで購入
1.14inch (135x240) のLCD搭載で USB に直挿しできるのが特徴な RP2040 (Raspberry Pi PICO のMCUと同じ)ボード。SDカードスロットあり。UART, I2C, DEBUG 用に線を引き出せるケーブル付属。
LCDのドライバを探す
調べてみると LCD のコントローラは ST7789。Awesome MicroPythonでドライバを探してみて、以下を使うことに。
ファームウェアのビルド
以下の手順で MicroPython ファームウェアをビルド。ビルド環境としては Raspberry Pi 5 上の Raspberry Pi OS bookworm 64bit を利用。画面小さいので、フォントは 8x8 のビットマップフォントのみにしてみる。
$ git clone https://github.com/micropython/micropython.git
$ git clone https://github.com/russhughes/st7789_mpy.git
$ sudo apt update
$ sudo apt install cmake gcc-arm-none-eabi
$ cd micropython
$ make -C mpy-cross
$ cd ports/rp2
$ cp ../../../st7789_mpy/fonts/bitmap/vga1_8x8.py modules
$ make BOARD=RPI_PICO submodules
$ make BOARD=RPI_PICO BOARD=RPI_PICO USER_C_MODULES=../../../st7789_mpy/st7789/micropython.cmake FROZEN_MANIFEST="" FROZEN_MPY_DIR=$UPYDIR/modules
ファームウェアのインストール
RP2040-GEEKのbootボタンを押しながら USB ポートに差し込む。自動的に /media/{ログインアカウント名}/RPI-RP2
にファームウェアインストール用のストレージがマウントされる。
以下でファームウェアをコピーする。自動でファームウェアがインストールされ、/media/{ログインアカウント名}/RPI-RP2
がアンマウントされる。
cp build-RPI_PICO/firmware.uf2 /media/{ログインアカウント名}/RPI-RP2/
起動テスト
ファームウェアがインストールされると、自動でリセットがかかり、MicroPython が起動される。
mpremote で REPL に入れるかチェック。
$ mpremote
Connected to MicroPython at /dev/ttyACM0
Use Ctrl-] or Ctrl-x to exit this shell
>>> (Ctrl-Dでソフトウェアリブート)
MPY: soft reboot
MicroPython v1.25.0-preview.81.g2c80d3699 on 2024-12-08; Raspberry Pi Pico with RP2040
Type "help()" for more information
>>>
LCD に表示するプログラミング
マンデルブロ集合を表示してみる。
mandel.py
from machine import Pin, SPI
import st7789
import vga1_8x8 as font
import time
time.sleep(5)
spi = SPI(1, 60_000_000, sck=Pin(10),mosi=Pin(11),miso=None)
display = st7789.ST7789(spi, 135, 240,
cs=Pin(9, Pin.OUT), dc=Pin(8, Pin.OUT),
reset=Pin(12, Pin.OUT), backlight=Pin(25, Pin.OUT),
rotation=3)
display.init()
display.fill(0)
display.on()
@micropython.native
def rainbow(value):
red = 0
green = 0
blue = 0
quadrant = value // 32
if quadrant == 0:
blue = 31
green = 2 * (value % 32)
red = 0
elif quadrant == 1:
blue = 31 - (value % 32)
green = 63
red = 0
elif quadrant == 2:
blue = 0
green = 63
red = value % 32
elif quadrant == 3:
blue = 0
green = 63 - 2 * (value % 32)
red = 31
return st7789.color565(red, green, blue)
@micropython.native
def valmap(value, istart, istop, ostart, ostop):
return ostart + (ostop - ostart) * ((value - istart) / (istop - istart))
@micropython.native
def main():
px = 0
while px < 240:
py = 0
while py < 135:
xx0 = (valmap(px, 0, 240, -125000, -121250)) / 100000.0
yy0 = (valmap(py, 0, 135, -18750, -15250)) / 100000.0
xx = 0.0
yy = 0.0
iteration = 0
max_iteration = 128
while ((xx * xx + yy * yy) < 4) and (iteration < max_iteration):
xtemp = xx * xx - yy * yy + xx0
yy = 2 * xx * yy + yy0
xx = xtemp
iteration += 1
color = rainbow((3 * iteration + 64) % 128)
# yield()
display.pixel(px, py, color)
py += 1
px += 1
startTime = time.ticks_ms()
main()
display.text(font, str(time.ticks_diff(time.ticks_ms(), startTime)/1000), 0, 0, 0xffff)
mpremote でMicroPythonのファイルシステムにコピー。
$ mpremote cp mandel.py :main.py