RP2040-Zeroで1.8インチST7735液晶に文字・図形・BMP画像を表示する

RP2040-Zeroで1.8インチST7735液晶に文字・図形・BMP画像を表示する
スポンサーリンク

最近の小型マイコンは高機能で、カラー液晶に簡単に画像を表示できるようになりました。
本記事では RP2040-Zero(ラズベリーパイPicoでも可)と、アマゾンなどで安価に入手できる WINGONEER 1.8インチ フルカラー 128×160 SPI液晶(ST7735ドライバ搭載) を使って、文字表示、図形描画、そして自作のBMP画像を表示するまでを解説します。

開発環境は CircuitPython を使用し、配線方法からサンプルコードまで順に紹介します。

スポンサーリンク

使用するハードウェア

  • RP2040-Zero(または Raspberry Pi Pico)CircuitPhton 仕様
  • WINGONEER 1.8インチ 128×160 SPI液晶(ST7735)
  • ジャンパー線

配線(ISP接続)

自由にピンの設定はできますが今回は下記のようにしました。

液晶(ST7735)RP2040-Zero (Pico) ピン
VCC3.3V
GNDGND
SCL (SCK)GP2
SDA (MOSI)GP3
RESGP4
DCGP6
CSGP7
BLKGP5 (バックライト制御)

開発環境(CircuitPython )(Thonny)

CircuitPython ライブラリパックを入手

Adafruit CircuitPython Library Bundle から、
お使いの CircuitPython のバージョンに対応する .zip をダウンロードしてください。
(例: adafruit-circuitpython-bundle-9.x-mpy-20250818.zip など)

解凍して lib フォルダにコピー

  • ダウンロードした zip を解凍
  • 中の lib フォルダにある以下のファイルを CIRCUITPY ドライブの lib/ フォルダにコピー
    • 必要なファイルは:
      • adafruit_st7735r.mpy
      • adafruit_framebuf.mpy
      • adafruit_bus_device(フォルダごと)
      • adafruit_display_text (フォルダごと)
CIRCUITPY/
├── code.py        ← 自分が書いたプログラム
└── lib/         ← ライブラリを入れるフォルダ
    ├── adafruit_st7735r.mpy
    ├── adafruit_framebuf.mpy
    ├── adafruit_display_text/   ← フォルダごとコピー
    │   ├── __init__.mpy
    │   ├── bitmap_label.mpy
    │   ├── label.mpy
    │   └── ...
    └── adafruit_bus_device/   ← フォルダごとコピー
        ├── __init__.py
        ├── i2c_device.mpy
        ├── spi_device.mpy
        └── ...
  • 最低限必要なのは → adafruit_st7735r.mpyadafruit_framebuf.mpyadafruit_bus_device/
  • 文字も使いたいときは追加で → adafruit_display_text/

文字を表示するサンプル

import board, busio, displayio
from adafruit_st7735r import ST7735R
from fourwire import FourWire
from digitalio import DigitalInOut, Direction
from adafruit_display_text import label
from terminalio import FONT
import time

displayio.release_displays()
spi = busio.SPI(clock=board.GP2, MOSI=board.GP3)
display_bus = FourWire(spi, command=board.GP6, chip_select=board.GP7, reset=board.GP4)
display = ST7735R(display_bus, width=163, height=132, rotation=90, bgr=False)

bl = DigitalInOut(board.GP5)
bl.direction = Direction.OUTPUT
bl.value = True

splash = displayio.Group()
display.root_group = splash

# 背景塗りつぶし
bitmap = displayio.Bitmap(163, 132, 1)
palette = displayio.Palette(1)
palette[0] = 0x001F
tile = displayio.TileGrid(bitmap, pixel_shader=palette)
splash.append(tile)

# 白文字
text_area = label.Label(FONT, text="Hello, ST7735", color=0xFFFFFF, x=1, y=30,scale = 1)
splash.append(text_area)
#ブルー文字
text_area = label.Label(FONT, text="Hello, ST7735", color=0xFFFF00, x=1, y=60,scale = 2)
splash.append(text_area)
#緑文字
text_area = label.Label(FONT, text="Hello", color=0x00FF00, x=1, y=100,scale = 3)
splash.append(text_area)

while True:
    time.sleep(1)

図形と文字を表示する

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import board
import busio
import displayio
from adafruit_st7735r import ST7735R
from fourwire import FourWire
from digitalio import DigitalInOut, Direction
from adafruit_display_text import label
from terminalio import FONT
#import terminalio

displayio.release_displays()

# SPIバス初期化
spi = busio.SPI(clock=board.GP2, MOSI=board.GP3)
display_bus = FourWire(
    spi,
    command=board.GP6,
    chip_select=board.GP7,
    reset=board.GP4
)

display = ST7735R(
    display_bus,
    width=162,
    height=131,
    rotation=90,
    bgr=True
)

# Make the display context
splash = displayio.Group()
display.root_group = splash

color_bitmap = displayio.Bitmap(162, 130, 2)
color_palette = displayio.Palette(2)
color_palette[0] = 0x00FF00  # Bright Green
color_palette[1] = 0xF80000 
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
splash.append(bg_sprite)

# Draw a smaller inner rectangle
inner_bitmap = displayio.Bitmap(120, 15, 1)
inner_palette = displayio.Palette(1)
inner_palette[0] = 0xAA0088  # Purple
inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=20, y=10)
splash.append(inner_sprite)

# Draw a label
text = "Hello World!"
text_area = label.Label(FONT, text=text, color=0xFFFFFF, x=10, y=64,scale=2)
splash.append(text_area)
# ① Bitmap に先に描画してから TileGrid を作る
cx = 80   # 中心 x
cy = 65   # 中心 y
r = 30    # 半径
for x in range(cx - r, cx + r + 1):
    for y in range(cy - r, cy + r + 1):
        if (x - cx)**2 + (y - cy)**2 <= r**2:
            color_bitmap[x, y] = 1  # 円の部分だけ赤に上書き

# tile = displayio.TileGrid(color_bitmap)
#splash.append(tile)

while True:
    pass

図形を複数表示

import board
import displayio
from digitalio import DigitalInOut, Direction

# --- ディスプレイ初期化 ---
displayio.release_displays()
# ここはあなたのSPI接続に合わせて変更
import busio
from adafruit_st7735r import ST7735R
from fourwire import FourWire

spi = busio.SPI(clock=board.GP2, MOSI=board.GP3)
display_bus = FourWire(spi, command=board.GP6, chip_select=board.GP7, reset=board.GP4)
display = ST7735R(display_bus, width=162, height=131, rotation=90, bgr=True)

# --- バックライト ---
bl = DigitalInOut(board.GP5)
bl.direction = Direction.OUTPUT
bl.value = True

# --- Group と Bitmap 作成 ---
splash = displayio.Group()
display.root_group = splash

bitmap = displayio.Bitmap(162, 131, 4)  # 4色
palette = displayio.Palette(4)
palette[0] = 0x000000  # 黒(背景)
palette[1] = 0xFF0000  # 赤
palette[2] = 0x00FF00  # 緑
palette[3] = 0x0000FF  # 青

tile = displayio.TileGrid(bitmap, pixel_shader=palette)
splash.append(tile)

# --- サンプル画像を描画 ---
# 例:左上に赤い矩形
for x in range(10, 50):
    for y in range(10, 40):
        bitmap[x, y] = 1  # 赤

# 例:右下に青い矩形
for x in range(100, 150):
    for y in range(80, 120):
        bitmap[x, y] = 3  # 青

# 例:緑の円(中心80,65 半径20)
cx = 80
cy = 65
r = 20
for x in range(cx - r, cx + r + 1):
    for y in range(cy - r, cy + r + 1):
        if (x - cx)**2 + (y - cy)**2 <= r**2:
            bitmap[x, y] = 2  # 緑

画像を表示する(.bmp)

ビットマップ形式の画像を表示します

python を使ってビットマップ形式の画像を生成します

こちらはローカルのpython3で動かしますCircuitPythonではありません。
PIL ライブラリーを使いますのでまだの方はpipでインストールしておいてください。

from PIL import Image

# 画像を開く
img = Image.open("pengin.jpg")

# ディスプレイに合わせてリサイズ(例: 160x128)
img = img.resize((160, 128))

# BMP (24bit) として保存
img.save("test22.bmp", format="BMP")

カレントディレクトリにtest22.bmpというファイルができます、次にrp2040-zer本体にファイルをコピペします。

画像を表示

import board
import busio
import displayio
from adafruit_st7735r import ST7735R
from fourwire import FourWire
from digitalio import DigitalInOut, Direction
from adafruit_display_text import label
from terminalio import FONT

displayio.release_displays()

# SPIバス初期化
spi = busio.SPI(clock=board.GP2, MOSI=board.GP3)
display_bus = FourWire(
    spi,
    command=board.GP6,
    chip_select=board.GP7,
    reset=board.GP4
)

# ディスプレイ初期化
display = ST7735R(
    display_bus,
    width=162,
    height=131,
    rotation=90,
    bgr=True
)

# バックライト ON
bl = DigitalInOut(board.GP5)
bl.direction = Direction.OUTPUT
bl.value = True

# 表示グループ
splash = displayio.Group()
display.root_group = splash


# --- BMP ファイルを読み込む ---
bitmap_file = "/test22.bmp"
bmp = displayio.OnDiskBitmap(bitmap_file)

# --- TileGrid にして表示 ---
tile = displayio.TileGrid(bmp, pixel_shader=displayio.ColorConverter())
splash.append(tile)

まとめ

今回、RP2040-Zero / ST7735液晶 を使って、

  • 文字表示
  • 図形(四角・円)描画
  • 自作BMP画像の表示

を一通り試してみました。

最初は四角や円を描いて動作確認を行い、最後に画像表示へステップアップすると理解が深まります。
BMP画像は RGB565形式 に変換するのがポイントです。

小型液晶を組み合わせると、時計やセンサーメーターなど応用が広がります。ぜひ自分の作品に取り入れてみてください!

タイトルとURLをコピーしました