今年買ったボード:RP2040-GEEK

今年、MicroPython用に買ったボードシリーズ。

[RP2040-GEEK](https://www.switch-science.com/products/9447)

2024年4月5日 スイッチサイエンスで購入

1.14inch (135x240) のLCD搭載で USB に直挿しできるのが特徴な RP2040 (Raspberry Pi PICO のMCUと同じ)ボード。SDカードスロットあり。UART, I2C, DEBUG 用に線を引き出せるケーブル付属。

![IMG_1636.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/9db77a89-e939-55be-0de7-eaf34b98dca1.jpeg)

![IMG_1637.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/2c34e259-2f5e-d1b0-3735-e0773ff61345.jpeg)

![IMG_1638.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/f59773c0-7987-34e1-6e1e-31a3307e2907.jpeg)

# LCDのドライバを探す

調べてみると LCD のコントローラは ST7789。[Awesome MicroPython](https://awesome-micropython.com/)でドライバを探してみて、以下を使うことに。

https://github.com/russhughes/st7789_mpy

# ファームウェアのビルド

以下の手順で MicroPython ファームウェアをビルド。ビルド環境としては Raspberry Pi 5 上の Raspberry Pi OS bookworm 64bit を利用。画面小さいので、フォントは 8x8 のビットマップフォントのみにしてみる。

```bash
$ 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 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` がアンマウントされる。

```bash
cp build-RPI_PICO/firmware.uf2 /media/{ログインアカウント名}/RPI-RP2/
```

# 起動テスト

ファームウェアがインストールされると、自動でリセットがかかり、MicroPython が起動される。

mpremote で REPL に入れるかチェック。

```bash
$ 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
```python
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のファイルシステムにコピー。

```bash
$ mpremote cp mandel.py :main.py
```

![IMG_1629.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/139b1d1c-6c0d-a3cc-6ebd-05234d339429.jpeg)