|

【Arduino UNO Q專欄03】板載點矩陣LED應用

   

作者:Jack OmniXRI

Arduino UNO Q [1] (以下簡稱 UNO Q)開發板上有很多內建的元件可直接調用,為了讓大家能更熟悉開發板上的元件控制,本文將先從能產生簡單顯示介面的 LED 點矩陣介紹起。

1. UNO UNO R4 WIFI 與 UNO Q 點矩陣 LED 比較

第一次拿到 UNO Q 板子的朋友可能會覺得很眼熟,和 Arduino UNO R4 WIFI(以下簡稱 R4 WIFI) 一樣有一個很漂亮的 LED 點矩陣,但點亮後就可明顯發覺很多細節並不一樣,如 Fig. 1 所示。

首先是 LED 數量和顏色不同, R4 WIFI 是 8×12 (96)個紅色 LED,而 UNO Q 是 8×13 (104)個藍色 LED。

再確認硬體規格後,發覺硬體結構也不同,R4 WIFI 為了節省硬體控制腳位,於是使用 MCU 的 11 個通用輸出入腳(GPIO)透過三態邏輯多工(或稱查理多工 Charlieplexing)來直接掃描點亮 96 顆 LED。而 UNO Q 則是使用 STM32 底層脈波寬度調變(PWM)定時器(Timer)和中斷自動對行列進行掃描。

在 LED 亮度控制方面,R4 WIFI 原則上只能控制 LED 顯示二值化影像(亮或不亮),若真的需要顯示不同程度亮度的灰階影像,則需透過軟體 PWM 方式來調控。而 UNO Q 則有內建硬體8級灰階控制,可直接設定硬體定時器自動執行高頻 PWM 掃描,直接呈現不同程度的亮暗影像內容。

在程式控制上,R4 WIFI 使用 「Arduino_LED_Matrix.h」 來驅動。而 UNO Q 可使用Python Arduino Graphics 函式庫結合 RouterBridge 來開發或者使用 MCU 原始開發方式。

Arduino-UNO-Q-03_Fig01

圖1:Arduino UNO R4 WIFI 和 UNO Q LED點矩陣比較表。(OmniXRI整理製作,2026/06/03)

2. 以 MCU 方式在點矩陣顯示靜態圖案

首先安裝好 Arduino APP Lab 並以 Type C 纜線將開發板和電腦連接好,可參考「【Arduino UNO Q 專欄02】軟體開發初體驗」。

接著開啟 APP Lab,進入「My App」,點擊右上角「Create New App」建立新專案並填入自訂名稱,例「LED_Matrix_Test_Arduino_Logo」。

進入後,點擊左側「sketch.ino」,就可開始編輯 MCU 程式。這裡我們假設要在點矩陣 LED 顯示一個靜態 Arduino Logo。只需引用「Arduino_LED_Matrix.h」,再定義一個 13 x 8 (共104個)的資料矩陣。只需依照 LED 排列順序填入 0 或 1 即可。如 Fig. 2 左下所示。

Arduino-UNO-Q-03_Fig02

圖2:UNO Q 板載 LED 及點矩陣資料位置定義。(OmniXRI整理製作,2026/06/03)

原則上點矩陣 LED 是可以控制8階灰度顯示,若只想亮和不亮,則可利用「setGrayscaleBit(1)」來完成,而 1 即代表使用 1 個位元來控制亮度。若設為 3 則代表可控制 2^3 = 8 種亮度。若想令資料格式和一般電腦上以 8 位元來表示亦可設為 8 ,只是系統會自動等比縮到 8 種灰度,即灰度除 64 而得到最後灰度。

只要將下列程式複製到程式區,再按下右上角「RUN」,等待程式編譯和上傳後就可看到自定義圖像顯示在點矩陣 LED 上。如圖3所示。

#include

uint8_t logo[104] = { // 點矩陣顯示內容
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,0,0,0,1,1,1,0,0,
0,1,0,0,0,1,0,1,0,0,0,1,0,
1,0,0,0,0,0,1,0,0,1,0,0,1,
1,0,1,1,1,0,1,0,1,1,1,0,1,
1,0,0,0,0,0,1,0,0,1,0,0,1,
0,1,0,0,0,1,0,1,0,0,0,1,0,
0,0,1,1,1,0,0,0,1,1,1,0,0
};

Arduino_LED_Matrix matrix; // 宣告 Arduino_LED_Matrix

void setup() {
matrix.begin(); // 啟動 Arduino_LED_Matrix
matrix.setGrayscaleBits(1); // 設定灰度為 1bit表示(1 亮 / 0 不亮)
matrix.draw(logo); // 繪製指定圖像

}

void loop() {

}
Arduino-UNO-Q-03_Fig03

圖3:二階及八階灰度顯示結果。(OmniXRI整理製作,2026/06/03)

3. 透過 MPU 呼叫 MCU 在點矩陣顯示動畫

點選左上角 My Apps,再點擊左側 Examples,捲到最下方,選擇「Weather forecast on LED Matrix [3]」,再按左上角複製一份到 My App,專案名稱可採用預設的或自行重新命名。這個 App 程式可以讀取指定城市的天氣,並以簡易動畫形式顯示晴天(Sunny)、多雲(Cloudy)、雨天(Rainy)、下雪(Snowy)及起霧(Foggy)。

進入程式編輯頁面後,會有 MPU 的 Python 碼(main.py)、 MCU 的 C++ 程式碼(sketch.ino)和頭文件(weather_frames.h)。這個範例程式的主要功能如下所示。

  • main.py – MPU 主程式,負責讀取天氣結果(文字串)並透過橋接器(Bridge)提供給 MCU,用以改變點矩陣 LED 動畫顯示內容。
  • sketch.ino – MCU 主程式,負責指定城市名稱,接收 MPU 從橋接器(Bridge)送來的天氣內容並載入對應動畫內容並顯示在點矩陣 LED 上。
  • weather_frames.h – 定義五種天氣的動畫內容。

3.1. main.py

定義 get_weather_forecast 函式,從網路取得指定城市的天氣,並傳遞到 MCU 中。

from arduino.app_bricks.weather_forecast import WeatherForecast
from arduino.app_utils import *

forecaster = WeatherForecast()

def get_weather_forecast(city: str) -> str:
// 取得指定城市天氣狀態
forecast = forecaster.get_forecast_by_city(city)
print(f"Weather forecast for {city}: {forecast.description}")
return forecast.category

// 以橋接器(Bridge)將 MPU 內容送到 MCU
Bridge.provide("get_weather_forecast", get_weather_forecast)

App.run()

3.2. sketch.ino

只需改變範例程式的城市名稱即可,接下來就只要等 MPU 送來結果,再由 MCU 改變矩陣 LED 顯示內容即可。這裡使用「loadSequence()」來讀取「weather_frames.h 」中預定義好的動畫資訊,包含顯示內容及延時。

#include
#include
#include "weather_frames.h"

String city = "Taipei"; // 指定城市名稱

Arduino_LED_Matrix matrix;

void setup() {
matrix.begin();
matrix.clear();
Bridge.begin();
}

void loop() {
String weather_forecast;
// 取得天氣結果字串
bool ok = Bridge.call("get_weather_forecast", city).result(weather_forecast);
// 依字串載入對應動畫並顯示
if (ok) {
if (weather_forecast == "sunny") {
matrix.loadSequence(sunny);
playRepeat(10);
} else if (weather_forecast == "cloudy") {
matrix.loadSequence(cloudy);
playRepeat(10);
} else if (weather_forecast == "rainy") {
matrix.loadSequence(rainy);
playRepeat(20);
} else if (weather_forecast == "snowy") {
matrix.loadSequence(snowy);
playRepeat(10);
} else if (weather_forecast == "foggy") {
matrix.loadSequence(foggy);
playRepeat(5);
}
}
}

// 重複顯示次數
void playRepeat(int repeat_count) {
for (int i = 0; i < repeat_count; i++) {
matrix.playSequence();
}
}
3.3. weather_frames.h

以天晴(sunny)為例(如下程式),三列分別三幅圖案,每一列的最後一個數值代表停留多少 mS ,由於 8×13=104,若以32位元整數,16進制8位數表示,則需四組數值,最後一個16進制只使用到前8位元(16進制2位數)。需要幾種變化就設計幾列的數值定義。其它天氣符號動畫依此類推。

const uint32_t sunny[][5] = {
{0x04812805, 0x80138390, 0x03402902, 0x40000000, 500},
{0x12005201, 0xa072009c, 0x0b009400, 0x90000000, 500},
{0x04812805, 0x80138390, 0x03402902, 0x40000000, 500},
};

const uint32_t cloudy[][5] = {
{0x0000380e, 0x20888404, 0x2020fe00, 0x00000000, 500},
{0x00001c07, 0x10444202, 0x10107f00, 0x00000000, 500},
{0x00000e03, 0x88222101, 0x08083f80, 0x00000000, 500},
{0x00001c07, 0x10444202, 0x10107f00, 0x00000000, 500},
};

const uint32_t rainy[][5] = {
{0x0780c208, 0x084041fc, 0x08a05100, 0xa0000000, 200},
{0x0780c208, 0x084041fc, 0x02804502, 0x88000000, 200},
{0x0780c208, 0x084041fc, 0x0a201402, 0x28000000, 200},
};

const uint32_t snowy[][5] = {
{0x0780c208, 0x084041fc, 0x02004400, 0x88000000, 650},
{0x0780c208, 0x084041fc, 0x00201002, 0x20000000, 650},
{0x0780c208, 0x084041fc, 0x08800100, 0x80000000, 650},
};

const uint32_t foggy[][5] = {
{0x0001fb00, 0x006fc000, 0x1f700000, 0x00000000, 660},
{0x0001ef00, 0x0077c000, 0x1fb00000, 0x00000000, 660},
{0x0001fb00, 0x006fc000, 0x1f700000, 0x00000000, 660},
};
Arduino-UNO-Q-03_Fig04

圖4:Weather forecast on LED Matrix 範例程式及執行結果。(OmniXRI整理製作,2026/06/03)

結語

Arduino UNO Q 開發板自帶 8×13 點矩陣 LED,這樣很方便我們顯示文字、靜態圖像甚至是動態圖畫。不管是直接撰寫 MCU C++ 程式控制顯示內容,還是由 MPU Python 程式透過橋接器(Bridge) 來控制 MCU 都很方便,同時還可自定義八個灰度顯示,讓顯示內容更具彈性。後續就有賴使用者的創意,開發出更多有趣的互動顯示裝置。

參考文獻

[1] Arduino, Document – Hardware – UNO Q – UNO Q User Manual
https://docs.arduino.cc/tutorials/uno-q/user-manual/
[2] Arduino, Document – Software – APP Lab – Tutorial: Using Arduino App Lab
https://docs.arduino.cc/software/app-lab/getting-started/quickstart/
[3] Arduino, Github – Weather forecast on LED matrix
https://github.com/arduino/app-bricks-examples/tree/main/examples/weather-forecast

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: Grace Hsieh

喜歡貓,喜歡書,喜歡音樂與電影。

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *