PICO-LEDART

ショップ


製品概要

PICO-LEDART は Raspberry Pi PICO/PICO2をHUB75(E) インターフェースを使用するLEDコントローラに変身させる拡張ボードです。

PICO-LEDART

鮮やかな色で文字や画像を表示できるLED マトリックスパネルが広く使われるようになり、LED マトリックスパネルを手軽に制御できる高性能なコントローラが求められています。
PICO-LEDART は Raspberry Pi PICO/PICO2をLEDコントローラに変身させる拡張ボードです。HUB75(E) インターフェースを使用するLED マトリックスパネルを手軽に利用できるように開発されたコントローラボードです。
PICO-LEDART はLED マトリックスパネルの裏面のHUB75 コネクタに直付けすることも可能で、手軽に使用できます。また、LED マトリックスパネルのプログラミングは、CircuitPythonのrgbmatrixライブラリを使用して行うことができます。
PICO-LEDART はLED マトリックスパネルを初めて使用する人や、それを利用して多様なアプリケーションを作成・使用したい人に最適なコントローラボードです。

LED マトリックスパネルコントローラとしての特徴

PICO-LEDARTはLED マトリックスパネルコントローラとして以下のような特徴を持っています。

  • HUB75(E) インターフェースを利用した、1/16 または1/32 スキャンのLED マトリックスパネルを制御することができます。
  • 信号電圧が3.3V のPICO/PICO2から信号電圧が5V のHUB75(E) を適切に制御するために、信号電圧の変換回路を備えており、HUB75(E) を安定して制御できます。
  • 複数枚のLED マトリックスパネル(PICO/PICO2のメモリによる枚数制限はあります)を接続 して制御することもできます。
  • LED マトリックスパネルの使用時に、USB コネクタにLED マトリックスパネルが必要とする大容量の電流が流れないように安全回路が組み込まれています。
  • 電子工作で広く利用されているCircuitPython などの無償、便利、高機能な開発環境を利用してLED 表示用のソフトウェアを開発できます。
  • LED マトリックスパネルの制御にはCircuitPythonのrgbmatrixライブラリを使用できます。
  • 圧電スピーカーを搭載しており、LED での表示に合わせて音を出すことができます。
  • タクトスイッチを4個搭載しており、表示内容の選択やゲームへの入力などに利用できます。
  • I2C端子を備えており、温度や湿度、加速度などのセンサーを搭載することができ、その計測値をLED 表示に利用することができます。
  • PICO/PICO2接続コネクタ、HUB75用コネクタ、電源ターミナルブロックは、はんだ付けが必要です。
  • PICO/PICO2は付属しません。

CircuitPythonでのプログラム例

PICO/PICO2には、それぞれに対応したCircuitPythonファームウェアを書き込んでください。さらに、そのファームウェアのバージョンに対応したライブラリbundleのlibフォルダの内容をPICO/PICO2のフラッシュのlibフォルダに書き込んでください。

以下にプログラム例を示しますが、すべてPICO/PICO2に共通のプログラムです。

文字列と図形を交互に表示するプログラム例

始めに、PICO-LEDARTを64x32ピクセルのLEDパネルに接続して表示を行うプログラム例を示します。

import board
import displayio
import rgbmatrix
import framebufferio
import time

# LEDパネルの初期化
displayio.release_displays()

matrix = rgbmatrix.RGBMatrix(
  width=64, height=32, bit_depth=5,
  rgb_pins=[board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5],
  addr_pins=[board.GP6, board.GP7, board.GP8, board.GP9],
  clock_pin=board.GP11, latch_pin=board.GP12, output_enable_pin=board.GP13)

display = framebufferio.FramebufferDisplay(matrix)

# 文字や図形の表示処理
groupt = displayio.Group() # 文字列表示用のグループ
groups = displayio.Group() # 図形表示用のグループ

# 文字列の表示(登録)を行う
from adafruit_display_text import label
import terminalio

groupt.append(label.Label(terminalio.FONT, text="MicroFan", x=0, y=4, color=0xFFFFFF))
groupt.append(label.Label(terminalio.FONT, text="PICO-LEDART", x=0, y=12, color=0xFFFF00))
groupt.append(label.Label(terminalio.FONT, text="Circuit", x=0, y=20, color=0xFF00FF))
groupt.append(label.Label(terminalio.FONT, text="Python", x=25, y=28, color=0xFF00FF))

# 図形の表示(登録)を行う
from adafruit_display_shapes.rect import Rect
from adafruit_display_shapes.circle import Circle
from adafruit_display_shapes.triangle import Triangle

groups.append(Rect(2, 2, 20, 20, fill=0xFF0000, outline=0xFFFF00))
groups.append(Triangle(30, 5, 20, 25, 40, 25, fill=0x00FF00, outline=0xFFFF00))
groups.append(Circle(50, 20, 10, fill=0x0000FF, outline=0xFFFF00))

while True:
    display.root_group = groupt # 文字列を表示する
    time.sleep(3)
    display.root_group = groups # 図形を表示する
    time.sleep(1)

システムの初期化

上記の例は、64x32ピクセルパネルを使用する例でしたが、64x64などの64行のパネルを使用する際のLEDパネルの初期化法を示します。

import board
import displayio
import rgbmatrix
import framebufferio

# LEDパネルの初期化
displayio.release_displays()

matrix = rgbmatrix.RGBMatrix(
  width=64, height=64, bit_depth=5,
  rgb_pins=[board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5],
  addr_pins=[board.GP6, board.GP7, board.GP8, board.GP9, , board.GP10],
  clock_pin=board.GP11, latch_pin=board.GP12, output_enable_pin=board.GP13)

display = framebufferio.FramebufferDisplay(matrix)

タクトスイッチとI2Cを初期化するプログラム例を示します。

import board
import digitalio
import busio

# スイッチの初期化
sw1 = digitalio.DigitalInOut(board.GP21) # 初期状態は入力用
sw2 = digitalio.DigitalInOut(board.GP22)
sw3 = digitalio.DigitalInOut(board.GP18)
sw4 = digitalio.DigitalInOut(board.GP19)

# I2Cオブジェクトを作成
i2c = busio.I2C(board.GP15, board.GP14)

ボールをスイッチで動かす

LEDパネルにボールを表示し、sw1-sw4のスイッチで上下左右に動かすプログラム例を示します。

import displayio, board, rgbmatrix, framebufferio, digitalio

displayio.release_displays()

matrix = rgbmatrix.RGBMatrix(
  width=64, height=32, bit_depth=5,
  rgb_pins=[board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5],
  addr_pins=[board.GP6, board.GP7, board.GP8, board.GP9],
  clock_pin=board.GP11, latch_pin=board.GP12, output_enable_pin=board.GP13)

display = framebufferio.FramebufferDisplay(matrix)

group = displayio.Group()
display.root_group = group
# ここまではグラフィックス利用の初期化で今後も共通

sw1 = digitalio.DigitalInOut(board.GP21) # 初期状態は入力用
sw2 = digitalio.DigitalInOut(board.GP22)
sw3 = digitalio.DigitalInOut(board.GP18)
sw4 = digitalio.DigitalInOut(board.GP19)

# 動かすボールの処理
from adafruit_display_shapes.circle import Circle

ball = Circle(10, 10, 3, fill=0x00FF00, outline=0xFFFF00)
group.append(ball)

v = 2
import time
while True:
    if sw1.value == 0: # 上
        if ball.y0 <= ball.r:
            ball.y0 = ball.r
        else:
            ball.y0 -= v
    if sw2.value == 0: # 右
        if ball.x0 >= (display.width-1)-ball.r:
            ball.x0 = (display.width-1)-ball.r
        else:
            ball.x0 += v
    if sw3.value == 0: # 左
        if ball.x0 <= ball.r:
            ball.x0 = ball.r
        else:
            ball.x0 -= v
    if sw4.value == 0: # 下
        if ball.y0 >= (display.height-1)-ball.r:
            ball.y0 = (display.height-1)-ball.r
        else:
            ball.y0 += v
    time.sleep(0.05)

# スイッチを押さないとボールは動かないよ!

壁で跳ね返るボール

ボールが動いてLEDパネルの端にぶつかって音を出して跳ね返るプログラム例を示します。

import displayio, picodvi, board, rgbmatrix, framebufferio

displayio.release_displays()

matrix = rgbmatrix.RGBMatrix(
  width=64, height=32, bit_depth=5,
  rgb_pins=[board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5],
  addr_pins=[board.GP6, board.GP7, board.GP8, board.GP9],
  clock_pin=board.GP11, latch_pin=board.GP12, output_enable_pin=board.GP13)

display = framebufferio.FramebufferDisplay(matrix)

group = displayio.Group()
display.root_group = group
# ここまではグラフィックス利用の初期化で今後も共通

import simpleio
from adafruit_display_shapes.circle import Circle

class Ball(Circle):
    # 初期座標、縦横速度、色を与える
    def __init__(self, x0, y0, r, vx, vy, color):
        super().__init__(x0, y0, r, fill=color, outline=0xFFFF00)
        self.vx = vx
        self.vy = vy
    def tick(self):
        # 縦横速度分移動して
        self.x0 += self.vx
        self.y0 += self.vy
        # 画面の端に来たら速度を反転させて跳ね返る
        if self.x0 <= self.r or self.x0 >= (display.width-1)-self.r:
            simpleio.tone(board.GP20, 1000, 0.01)
            self.vx = -self.vx
        if self.y0 <= self.r or self.y0 >= (display.height-1)-self.r:
            simpleio.tone(board.GP20, 500, 0.01)
            self.vy = -self.vy

ball = Ball(20, 20, 3, 1, 2, 0x00FF00)
group.append(ball)

import time

while True:
    group[0].tick()
    time.sleep(0.05)

回路図