Raspberry Pi Pico - LEDマトリックス

1/29/2023

Pico Raspberry Pi

t f B! P L

Raspberry Pi Picoを久しぶりに引っ張り出したので、熱が冷めないうちに単純な”Lチカ”以外にも手を出してみる。Raspberry Pi 3Bを買ったときに一緒に揃えたパーツの一つであるLEDドットマトリックスを試してみた。

手元にあるLEDマトリックスはMAX7219というLEDディスプレイドライバICがくっついているユニットを4連につなげたもの。インターネットで"MAX7219" AND "PICO"で検索して比較的上位に表示された下記のサイト情報を基に、文字やセンサ読み値を表示させてみた。日本語を表示させるまで今回は至らず、もう少し調査が必要。

細かいチュートリアル的な内容は下記サイト参照…

https://microcontrollerslab.com/max7219-led-dot-matrix-display-raspberry-pi-pico/


使用した機材等

  • その他
    • ブレッドボード
    • 配線類

配線

LEDマトリックスとPICO間の配線は、電源とSPI通信の計5本。LEDマトリックスはデイジーチェーンの様に連続して複数繋がるようになっている。

SPI0に配線。電源はVBUS(USB電源)

MAX7219RPi PicoPin
VCCVBUS (DC5V)40
GNDGND3
DINSPI0_TX5
CSSPI0_CSn7
CLKSPI0_SCK4

プログラム

MAX7219 ライブラリ

参考サイトで公開されているドライバ『max7219.py』をコピー(サイトからテキストコピーし.pyに保存)。(https://github.com/mcauser/micropython-max7219

RPi Pico内に、ライブラリフォルダ(lib)を作成して、その中にmax7219.pyファイルを保存する。Picoへのファイル保存はWindowsのエクスプローラ上ではできないため、Thonnyから保存。メニュー > View > Filesを表示させると、Picoの内部が表示されるようになり、新しいファイルやフォルダを作成可能。

これまでずっとThonnyから直接実行していたので、ファイル転送できることを知らなかった…

テストコード

参考サイトに載っていたコードをそのまま実行してみると、何の問題もなく表示できた。

from machine import Pin, SPI
import max7219
from time import sleep

spi = SPI(0,sck=Pin(2),mosi=Pin(3))
cs = Pin(5, Pin.OUT)
num_matrix = 4

display = max7219.Matrix8x8(spi, cs, num_matrix)
display.brightness(5)

while True:

    display.fill(0)
    display.text('PICO',0,0,1)
    display.show()
    sleep(1)

    display.fill(0)
    display.text('1234',0,0,1)
    display.show()
    sleep(1)

    display.fill(0)
   display.text('done',0,0,1)
    display.show()
    sleep(1)

メッセージのスクロール

forループで表示させる位置をずらしていくことでスクロールする。

from machine import Pin, SPI
import max7219
from time import sleep

spi = SPI(0,sck=Pin(2),mosi=Pin(3))
cs = Pin(5, Pin.OUT)
num_matrix = 4

display = max7219.Matrix8x8(spi, cs, num_matrix)
display.brightness(5)

scrolling_message = "Raspberry Pi PICO & MAX7219 DOT MATRIX!"
length = len(scrolling_message)
column = (length * 8)

while True:
    for x in range(num_matrix*8, -column, -1):
        display.fill(0)
        display.text(scrolling_message, x, 0, 1)
        display.show()
        sleep(0.05)

温度計の値を表示

Picoに載っている温度計の値をADCで読み取ってstringに変換して表示。温度は小数点を合わせてちょうど4文字なのでスクロールなしでピッタリ収まるように表示された。

from machine import Pin, SPI
import max7219
from time import sleep

# Dot Matrix LED
spi = SPI(0,sck=Pin(2),mosi=Pin(3))
cs = Pin(5, Pin.OUT)
num_matrix = 4
display = max7219.Matrix8x8(spi, cs, num_matrix)
display.brightness(5)

# 内蔵センサ
sensor_temp = machine.ADC(4) # 内蔵温度センサーはADC4
conversion_factor = 3.3 / (65535) # センサの変換係数

while True:
    # 温度計の値を読み取り
    reading = sensor_temp.read_u16() * conversion_factor
    temperature = 27 - (reading - 0.706)/0.001721
    string = str(temperature) # 文字列に変換
    # LEDに表示
    display.fill(0)
    display.text(string, 0, 0, 1)
    display.show()
    sleep(0.25)
RPi Pico上の温度は部屋の温度計より2℃ほど高め、校正が必要そう。

各種コマンド

ここまではdisplay.text()を使って指定した文字を表示させたが、使用したmax7219.pyでは以下のFrameBufferのmethodを使って描画できるようになっている。
  • display.pixel(x, y, s)
    • ピクセル指定
    • x: x座標: 左が0、4x8x8では一番右が31
    • y: y座標: 上が0、一番下が7
    • s: 1=点灯、0=消灯
  • display.hline(x, y, l, s)
    • 横線
    • x, y: 開始位置の座標
    • l:  線の長さ(ピクセル数)
    • s: 1=点灯、0=消灯
  • display.vline(x, y, l, s)
    • 縦線
    • x, y: 開始位置の座標
    • l:  線の長さ(ピクセル数)
    • s: 1=点灯、0=消灯
  • display.line(x1, y1, x2, y2, s)
    • 始点と終点を指定した線
    • x1, y1: 始点座標
    • x2, y2: 終点座標
    • s: 1=点灯、0=消灯
  • display.rect(x1, y1, lx, ly, s)
    • 四角形(白抜き)
    • x1, y1: 左上頂点座標
    • lx, ly: 四角形サイズ(ピクセル数)
    • s: 1=点灯、0=消灯
  • display.fill_rect(x1, y1, lx, ly, s)
    • 四角形(塗りつぶし)
    • x1, y1: 左上頂点座標
    • lx, ly: 四角形サイズ(ピクセル数)
    • s: 1=点灯、0=消灯
  • display.scroll(x, y)
    • 表示されている状態をシフトさせる。
    • x: 横方向変位量
    • y: 縦方向変位量
    • ループさせればスクロールさせられるが、ループさせて描きなおす方がやりやすいと感じた。

ここまでうまくできたので、日本語や画像から表示させられるようにしたいが、ちょっと調べただけだと良くわからなかったので少し調査に時間かかりそうだ。

参考にしたサイト


このブログを検索

ラベル

Outdoor (18) 3D Printer (12) Raspberry Pi (10) Learning (9) Movie (7) Pico (6) FreeCAD (5) Game (5) Blog (4) MSFS (4) Python (4) Gadget (1) Unity (1)

ブログ アーカイブ

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

人気の投稿

QooQ