最近の小型マイコンは高機能で、カラー液晶に簡単に画像を表示できるようになりました。
本記事では 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) ピン |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SCL (SCK) | GP2 |
| SDA (MOSI) | GP3 |
| RES | GP4 |
| DC | GP6 |
| CS | GP7 |
| BLK | GP5 (バックライト制御) |

開発環境(CircuitPython )(Thonny)
CircuitPython ライブラリパックを入手
Adafruit CircuitPython Library Bundle から、
お使いの CircuitPython のバージョンに対応する .zip をダウンロードしてください。
(例: adafruit-circuitpython-bundle-9.x-mpy-20250818.zip など)
解凍して lib フォルダにコピー
- ダウンロードした zip を解凍
- 中の
libフォルダにある以下のファイルを CIRCUITPY ドライブのlib/フォルダにコピー- 必要なファイルは:
adafruit_st7735r.mpyadafruit_framebuf.mpyadafruit_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.mpy,adafruit_framebuf.mpy,adafruit_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形式 に変換するのがポイントです。
小型液晶を組み合わせると、時計やセンサーメーターなど応用が広がります。ぜひ自分の作品に取り入れてみてください!



