RGBMATRIX-FUNX

ショップ


製品概要

WS2812Bを81+1個搭載した9x9ドットマトリックスカラーLED基板です。1本の制御信号で81+1個のカラーLEDを制御できます。

TRYGEARシリーズではTFTディスプレイ端子に接続して利用することができます。

高密度で実装できる小さなカラーLEDを81個で9x9のドットマトリックスを構成し、パッケージ内の3色のLEDやICを目視できる標準的なサイズのカラーLEDを1個搭載しています。

■ 9×9ドットの「RGBMATRIX-FUNX」:情報デザインを追求する「最小単位」

プログラミング演習において、LEDマトリクスなどの限られた表現空間をどう使いこなすかは、学生の「デザイン思考」を育む絶好の機会です。ドット数が多すぎれば物理的な描写力に頼ってしまい、少なすぎれば表現が不可能になります。 そこでマイクロファンは、「9×9ドット」こそが、文字の視認性、アナログ時計などの幾何学的な美しさ、そして限られた空間を有効活用する情報デザインのアイデアを試すための、濃密で論理的な「最小の実験場」であると考えました。

RGBMATRIX-FUNX-2H.jpg

「RGBMATRIX-FUNX」は、「TRYGEAR」シリーズのマイコン基板の標準インターフェースであるTFTディスプレイコネクタへ直接ドッキングし、煩雑な配線なしで「9×9ドットの実験場」を構築できます。

RGBMATRIX-FUNX-3H.jpg

7×5ドットフォントの1.5文字の連結性を利用して文字列メッセージをスクロールで見せる情報表現、ひらがなやカタカナ、さらには多くの漢字の判読可能な情報表現、中心点を持つアナログ時計の幾何学的構成の情報表現まで、この9×9という制約の中でいかに情報を整理し、表現するか。「RGBMATRIX-FUNX」はプログラミングの技術だけでなく、その背後にある情報デザインの試行錯誤までを一体的に学べる、エンジニアの創造性を刺激する最小・最適のツールです。

RGBMATRIX-FUNX-4H.jpg

■ 「RGBMATRIX-FUNX」の主要な特長と活用法

情報デザイン・認知特性に配慮した、独自の「9×9ドット」構成

【文字列の連結性と視認性の向上(デジタル時計への応用)】 7×5ドットなどの標準的なASCIIフォントを表示した際、横方向に「1.5文字分」の領域を確保できます。文字を横スクロールさせる際、次に続く文字の頭が常に画面内に見え続けるため、読み手は「文字列としての繋がり(連結性)」を自然に認識でき、スクロール時の視認性が劇的に向上します。このスクロール表現を利用することで、限られたドット数でもわかりやすいメッセージ表示やスマートな「デジタル時計」を構築可能です。

RGBMATRIX-FUNX-5H.jpg

【均等で美しいアナログ時計表示】 偶数ドット(8×8等)とは異なり、中央に「真の中心点(1ドット)」が存在するため、そこから上下左右、12時のすべての方向に各時刻を表すドットや針を均等に配置することができます。綺麗な円形のアナログ時計を歪みなく描画でき、時計デザインの本質を学ぶことができます。

RGBMATRIX-FUNX-6H.jpg

【アナログ vs デジタルの情報デザイン比較演習】 同じ9×9の空間の中に、「空間的な幾何学で時間を伝えるアナログ時計」と、「文字のスクロールで正確に伝えるデジタル時計」の双方を実装することで、人間への情報の伝わり方やレイアウトの工夫といった「情報デザインの比較・評価」を実践的に学ぶ演習が可能です。

【少ないドットでの日本語表示法・デザイン演習】 「美咲フォント」などの先行事例を参考にしながら、ひらがなやカタカナ、さらには複雑な漢字を9×9という「1ドットのアドバンテージ」を活かしてどう美しく、判読可能に表現するかという、タイポグラフィと情報表現の深い検討演習に対応します。

3.3V信号に正式対応、TRYGEAR直結からArduino UNOまでハイブリッドに対応

【レベルシフター不要の電気的特性】 「RGBLED-FUNX」と同様に入力信号のしきい値がVIH = 0.55×VDDの高性能カラーLEDチップを採用。5V電源駆動時でも、3.3Vマイコンが出力するHigh信号(2.75V 以上)を確実に認識します。レベルシフター(電圧変換回路)を挟む必要がなく、誤動作のない安定したプロトタイピングが可能です。

【TRYGEARにはノンワイヤー直結】 TRYGEARのマイコン基板であれば、一切の配線なしでTFTディスプレイコネクタに直接接続し安定して利用できます。

【Arduino UNO R3/R4でもワイヤー配線で動作可能】 「RGBMATRIX-FUNX」は5V信号にも対応しており、「Arduino UNO R3」や最新の「UNO R4」など様々な5V駆動マイコン基板からでも、信号電圧の違いを気にすることなく、ジャンプワイヤーでピンを繋ぐだけで安全に使用可能です。

実績のAVRから最新のRP2350A、WiFi搭載機まで、あらゆるマイコンでデザイン能力の育成に貢献

【TRYGEAR-AVR / AVR-NANOとの連携】 「RGBMATRIX-FUNX」は、カラーLEDチップそのものが高度な機能を持っているため、継承モデルの「TRYGEAR-AVR」や、「AVR-NANO」といったAVRマイコン(ATmega328Pなど)であっても性能的な問題はなく、滑らかな文字スクロールや美しい時計表示を余裕を持って制御可能です。

【TRYGEAR-DASH-RP2350Aとの連携】 代表的な組み合わせとして、最新の高性能マイコン「RP2350A」の処理能力やメモリ空間を活かし、9×9ドットの表示空間を活用した多彩なアプリケーション演習を実施できます。

【TRYGEAR-NET ESP32-S3との連携】 WiFi機能を備えたNET基板と組み合わせれば、インターネットから取得した時刻と同期する「NTPネットワーク時計」や、Web経由でリアルタイムに表示メッセージを書き換えるメッセージボードが制作できます。

インタラクティブなガジェットへ拡張可能

TRYGEARのマイコン基板上の圧電スピーカーやスイッチ、さらにはネットワーク時刻同期と組み合わせることで、アラーム音と連動した目覚まし時計や、実用的なタイマーガジェット、音の出るミニゲームの作成など、学生のアイデアに応じた柔軟な機能拡張が可能です。

2大プログラミング環境と定番ライブラリへの対応

本製品は、現代の主要な2大プログラミング環境をフルにサポートしており、導入したその日から直感的な表示制御が可能です。

【CircuitPythonによる自在なマトリックス制御】 標準の neopixel ライブラリとadafruit_pixel_framebuf ライブラリの2つを組み合わせることで、1線式シリアルLEDの手軽さを活かしながら、完全な2次元マトリックスとして自在にプログラミングできます。コンパイルの手間なく、インタラクティブに試行錯誤しながら情報表現を学べます。

【Arduino IDEによる自在なマトリックス制御】 定番の Adafruit_NeoPixel ライブラリと、2次元グラフィックを管理する Adafruit_NeoMatrix ライブラリの2つを組み合わせることで、完全な2次元座標系として自在にプログラミングできます。C/C++ベースの高速な描画処理を活かした、実践的なシステム制御演習が可能です。


プログラミング

CircuitPython

デモプログラム

import trygear
import board
import neopixel
from adafruit_pixel_framebuf import PixelFramebuffer
import time

pixel_pin = trygear.RGB_MX
pixel_width = 9
pixel_height = 9

pixels = neopixel.NeoPixel( # カラーLEDが利用できるように設定する(1次元)
    pixel_pin,
    pixel_width * pixel_height,
    brightness=0.1,
    auto_write=False)

pixel_framebuf = PixelFramebuffer( # カラーLEDをマトリックスとして利用できるように設定する(2次元)
    pixels,
    pixel_width, pixel_height,
    alternating=False,
    reverse_x=False,
    reverse_y=True)
## ここまではどのプログラムにも共通のRGBMATRIX-FUNXの初期化処理

def display_RGBW():
  for color in [0xFF0000, 0x00FF00, 0x0000FF, 0x404040, 0x000000]:
    pixel_framebuf.fill(color)
    pixel_framebuf.display()
    time.sleep(1)

def display_boxes():
  pixel_framebuf.rect(0, 0, pixel_width, pixel_height, 0x0000FF)
  pixel_framebuf.rect(1, 1, pixel_width-2, pixel_height-2, 0x00FF00)
  pixel_framebuf.rect(2, 2, pixel_width-4, pixel_height-4, 0xFF0000)
  pixel_framebuf.fill_rect(3, 3, pixel_width-6, pixel_height-6, 0x404040)
  pixel_framebuf.display()
  
def display_circles():
  pixel_framebuf.fill(0x000000)
  pixel_framebuf.circle(pixel_width//2, pixel_height//2, 5, 0xFF0000)
  pixel_framebuf.circle(pixel_width//2, pixel_height//2, 4, 0x00FF00)
  pixel_framebuf.circle(pixel_width//2, pixel_height//2, 3, 0x0000FF)
  pixel_framebuf.display()

def display_scrollText(str):
  for x in range(pixel_width, -6 * (len(str) + 2), -1):
    pixel_framebuf.fill(0x000000)
    pixel_framebuf.text(str, x, 1, 0x00FF00)
    pixel_framebuf.display()
    time.sleep(0.05)

while True:
  display_RGBW()
  time.sleep(1)
  
  display_boxes()
  time.sleep(2)

  display_circles()
  time.sleep(2)
  
  display_scrollText("Hello TRYGEAR!")

時計

import trygear
import board
import neopixel
from adafruit_pixel_framebuf import PixelFramebuffer
import time

pixel_pin = trygear.RGB_MX
pixel_width = 9
pixel_height = 9

pixels = neopixel.NeoPixel( # カラーLEDが利用できるように設定する(1次元)
    pixel_pin,
    pixel_width * pixel_height,
    brightness=0.1,
    auto_write=False)

pixel_framebuf = PixelFramebuffer( # カラーLEDをマトリックスとして利用できるように設定する(2次元)
    pixels,
    pixel_width, pixel_height,
    alternating=False,
    reverse_x=False,
    reverse_y=True)
## ここまではどのプログラムにも共通のRGBMATRIX-FUNXの初期化処理

pix_hour = [(4,0),(6,0),(8,2),(8,4),(8,6),(6,8),
        (4,8),(2,8),(0,6),(0,4),(0,2),(2,0)]
pix_min = [(4,1),(5,1),(6,1),(7,2),(7,3),
        (7,4),(7,5),(7,6),(6,7),(5,7),
        (4,7),(3,7),(2,7),(1,6),(1,5),
        (1,4),(1,3),(1,2),(2,1),(3,1)]
col_min=[0x400000, 0x004000,0x000040]

def clock_draw(hour, min):
        pixel_framebuf.fill(0x000000)
        pixel_framebuf.pixel(4, 4, 0xFF0000)
        for x, y in pix_hour:
            pixel_framebuf.pixel(x, y, 0x202020)
        x, y = pix_hour[hour % 12]
        pixel_framebuf.pixel(x, y, 0x00FF00)
        x, y = pix_min[min // 3]
        col = col_min[min % 3]
        pixel_framebuf.pixel(x, y, col)
        pixel_framebuf.display()

while True:
    for t in range(0,23):
      for m in range(0,60):
        clock_draw(t, m)
        time.sleep(0.1)

Arduino

デモプログラム

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include "trygear.h"

#define PIN 10
#define mw 9
#define mh 9

Adafruit_NeoMatrix *matrix = new Adafruit_NeoMatrix(mw, mh, PIN,
                                                    NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
                                                    NEO_GRB + NEO_KHZ800);

#define BRIGHTNESS 10

// This could also be defined as matrix->color(255,0,0) but those defines
// are meant to work for adafruit_gfx backends that are lacking color()
#define LED_BLACK 0

#define LED_RED_VERYLOW (3 << 11)
#define LED_RED_LOW (7 << 11)
#define LED_RED_MEDIUM (15 << 11)
#define LED_RED_HIGH (31 << 11)

#define LED_GREEN_VERYLOW (1 << 5)
#define LED_GREEN_LOW (15 << 5)
#define LED_GREEN_MEDIUM (31 << 5)
#define LED_GREEN_HIGH (63 << 5)

#define LED_BLUE_VERYLOW 3
#define LED_BLUE_LOW 7
#define LED_BLUE_MEDIUM 15
#define LED_BLUE_HIGH 31

#define LED_ORANGE_VERYLOW (LED_RED_VERYLOW + LED_GREEN_VERYLOW)
#define LED_ORANGE_LOW (LED_RED_LOW + LED_GREEN_LOW)
#define LED_ORANGE_MEDIUM (LED_RED_MEDIUM + LED_GREEN_MEDIUM)
#define LED_ORANGE_HIGH (LED_RED_HIGH + LED_GREEN_HIGH)

#define LED_PURPLE_VERYLOW (LED_RED_VERYLOW + LED_BLUE_VERYLOW)
#define LED_PURPLE_LOW (LED_RED_LOW + LED_BLUE_LOW)
#define LED_PURPLE_MEDIUM (LED_RED_MEDIUM + LED_BLUE_MEDIUM)
#define LED_PURPLE_HIGH (LED_RED_HIGH + LED_BLUE_HIGH)

#define LED_CYAN_VERYLOW (LED_GREEN_VERYLOW + LED_BLUE_VERYLOW)
#define LED_CYAN_LOW (LED_GREEN_LOW + LED_BLUE_LOW)
#define LED_CYAN_MEDIUM (LED_GREEN_MEDIUM + LED_BLUE_MEDIUM)
#define LED_CYAN_HIGH (LED_GREEN_HIGH + LED_BLUE_HIGH)

#define LED_WHITE_VERYLOW (LED_RED_VERYLOW + LED_GREEN_VERYLOW + LED_BLUE_VERYLOW)
#define LED_WHITE_LOW (LED_RED_LOW + LED_GREEN_LOW + LED_BLUE_LOW)
#define LED_WHITE_MEDIUM (LED_RED_MEDIUM + LED_GREEN_MEDIUM + LED_BLUE_MEDIUM)
#define LED_WHITE_HIGH (LED_RED_HIGH + LED_GREEN_HIGH + LED_BLUE_HIGH)

void setup() {
  matrix->begin();
  matrix->setTextWrap(false);
  matrix->setBrightness(BRIGHTNESS);
}

void loop() {
  display_RGBW() ;
  delay(1000);

  display_boxes();
  delay(2000);

  display_circles();
  delay(2000);

  display_scrollText();
}


void display_RGBW() {
  matrix->fillScreen(LED_RED_HIGH);
  matrix->show();
  delay(1000);
  matrix->fillScreen(LED_GREEN_HIGH);
  matrix->show();
  delay(1000);
  matrix->fillScreen(LED_BLUE_HIGH);
  matrix->show();
  delay(1000);
  matrix->fillScreen(LED_WHITE_MEDIUM);
  matrix->show();
  delay(1000);
  matrix->clear();
  matrix->show();
}

void display_boxes() {
  matrix->clear();
  matrix->drawRect(0, 0, mw, mh, LED_BLUE_HIGH);
  matrix->drawRect(1, 1, mw - 2, mh - 2, LED_GREEN_HIGH);
  matrix->drawRect(2, 2, mw - 4, mh - 4, LED_RED_HIGH);
  matrix->fillRect(3, 3, mw - 6, mh - 6, LED_WHITE_MEDIUM);
  matrix->show();
}

void display_circles() {
  matrix->clear();
  matrix->drawCircle(mw / 2, mh / 2, 4, LED_RED_HIGH);
  matrix->drawCircle(mw / 2, mh / 2, 3, LED_GREEN_HIGH);
  matrix->fillCircle(mw / 2, mh / 2, 2, LED_WHITE_MEDIUM);
  matrix->drawCircle(mw / 2, mh / 2, 2, LED_BLUE_HIGH);
  matrix->show();
}

void display_scrollText() {
  matrix->setRotation(0);
  matrix->setTextSize(1);
  matrix->setTextColor(LED_GREEN_HIGH);
  for (int8_t x = mw; x >= -6 * 5; x--) {
    matrix->clear();
    matrix->setCursor(x, 1);
    matrix->print("Hello");
    matrix->show();

    delay(70);
  }

  matrix->setRotation(3);
  matrix->setTextSize(1);
  matrix->setTextColor(LED_BLUE_HIGH);
  for (int16_t x = 8; x >= -6 * 8; x--) {
    matrix->clear();
    matrix->setCursor(x, mw / 2 - 3);
    matrix->print("Rotate");
    matrix->show();

    delay(70);
  }
}

回路図


関連製品

TRYGEAR-VIZ-RP2350B

TRYGEAR-NET-ESP32-S3

TRYGEAR-DASH-RP2350A

TRYGEAR-DASH-RP2040

TRYGEAR-AVR