はじめに
Raspberry Pi Pico を使って 8×8 マトリクスディスプレイ(MAX7219) を制御し、文字を流れるように表示する方法を紹介します。
MAX7219 マトリクスディスプレイとは?
MAX7219 は、LED マトリクスや 7 セグメントディスプレイを制御する シリアル入力対応の LED ドライバ です。
MAX7219 の主な特徴
- SPI(シリアル通信)で制御可能
- 複数の LED マトリクスをカスケード接続可能
- 明るさ(輝度)調整が可能
- 低ピン数で制御できる
作動原理
SPI通信を使用したLED制御
Raspberry Pi Pico から MAX7219 に SPI 通信 を使用してデータを送信し、LED マトリクスの各ピクセルを点灯・消灯します。
framebusを使った描写
MicroPythonのframebusモジュールを活用して、以下のような描写メソッドを使用できます。
メソッド | 説明 |
text(string, x, y, col) | 文字を表示 |
fill(col) | 画面全体を点灯/消灯 |
pixel(x, y, col) | 特定のピクセルを点灯 |
hline(x, y, w, col) | 横線を描写 |
vline(x, y, h, col) | 縦線を描写 |
rect(x, y, w, h, col) | 矩形を描写(枠のみ) |
fill_rect(x, y, w, h, col) | 塗りつぶし矩形を描画 |
scroll(dx, dy) | 画面をスクロール |
スクロールの仕組み
text(message, -i, 0, 1) で文字列を-iピクセル左へオフセットさせて描写
show()を毎回呼び出して新しいフレームを更新
time.sleep(0.1)えスムーズな動きを演出
配線
RaspberryPi Pico | MAX7219 |
VSYS(39番) | VCC |
GND(38番) | GND |
GP11(15番) | DIN |
GP13(17番) | CS |
GP10(14番) | CLK |
流れる文字を表示する
動作にはライブラリが必要です。ダウンロードするか以下を、max7219.pyで保存してください。
from micropython import const
import framebuf
_NOOP = const(0)
_DIGIT0 = const(1)
_DECODEMODE = const(9)
_INTENSITY = const(10)
_SCANLIMIT = const(11)
_SHUTDOWN = const(12)
_DISPLAYTEST = const(15)
class Matrix8x8:
def __init__(self, spi, cs, num):
self.spi = spi
self.cs = cs
self.cs.init(cs.OUT, True)
self.buffer = bytearray(8 * num)
self.num = num
fb = framebuf.FrameBuffer(self.buffer, 8 * num, 8, framebuf.MONO_HLSB)
self.framebuf = fb
self.fill = fb.fill # (col)
self.pixel = fb.pixel # (x, y[, c])
self.hline = fb.hline # (x, y, w, col)
self.vline = fb.vline # (x, y, h, col)
self.line = fb.line # (x1, y1, x2, y2, col)
self.rect = fb.rect # (x, y, w, h, col)
self.fill_rect = fb.fill_rect # (x, y, w, h, col)
self.text = fb.text # (string, x, y, col=1)
self.scroll = fb.scroll # (dx, dy)
self.blit = fb.blit # (fbuf, x, y[, key])
self.init()
def _write(self, command, data):
self.cs(0)
for m in range(self.num):
self.spi.write(bytearray([command, data]))
self.cs(1)
def init(self):
for command, data in (
(_SHUTDOWN, 0),
(_DISPLAYTEST, 0),
(_SCANLIMIT, 7),
(_DECODEMODE, 0),
(_SHUTDOWN, 1),
):
self._write(command, data)
def brightness(self, value):
if not 0 <= value <= 15:
raise ValueError("Brightness out of range")
self._write(_INTENSITY, value)
def show(self):
for y in range(8):
self.cs(0)
for m in range(self.num):
self.spi.write(bytearray([_DIGIT0 + y, self.buffer[(y * self.num) + m]]))
self.cs(1)
「HELLO」という文字を流します
import time
from machine import Pin, SPI
import max7219
# SPIの設定 (SPI1, SCK=GPIO10, MOSI=GPIO11, CS=GPIO13)
spi = SPI(1, baudrate=10000000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11))
cs = Pin(13, Pin.OUT)
# MAX7219の8x8マトリクスディスプレイ1個を使用
display = max7219.Matrix8x8(spi, cs, 1)
# 明るさを設定 (0-15)
display.brightness(5)
# HELLO を無限ループでスクロール
message = " HELLO " # 前後にスペースを入れて滑らかに
while True:
for i in range(len(message) * 8): # 1文字 = 8px
display.fill(0)
display.text(message, -i, 0, 1)
display.show()
time.sleep(0.1) # スクロール速度を調整
まとめ
ドットマトリックスディスプレイは町中でもよく目にすると思います。派手で使い勝手も良いのでぜひプロジェクトに採用してみてください。
コメント