2019年8月31日 星期六

Arduino 控制 1088BS 八乘八點陣顯示器

八乘八點陣顯示器 (8x8 Dot Matrix LED Display) 的模組編號是 1088BS
八乘八點陣顯示器是一種通告點陣方式顯示靜態圖像,或利用類 書角動畫 的方式顯示動畫

見下文
見下文
八乘八點陣顯示器 的外觀
八乘八點陣顯示器 共有 16支引腳

見下文
電子迴路元件圖示

引腳編排及用途

引腳A引腳B引腳1引腳C引腳2引腳D引腳E引腳3
引腳4引腳5引腳F引腳G引腳6引腳H引腳7引腳8
用途第8行接地第7行接地第2排電源第1行接地第4排電源第6行接地第4行接地第1排電源
第5排電源第7排電源第2行接地第3行接地第8排電源第5行接地第6排電源第3排電源

引腳編號用途
A第8行 接地線
B第7行 接地線
1第2排 電源線
C第1行 接地線
2第4排 電源線
D第6行 接地線
E第4行 接地線
3第1排 電源線
4第3排 電源線
5第6排 電源線
F第5行 接地線
6第8排 電源線
G第3行 接地線
H第2行 接地線
7第7排 電源線
8第5排 電源線


LED 位置 (模擬及示範效果)


見下文
基本的接駁方法

見下文
在下的接駁方法

見下文
八乘八點陣顯示器 的正面、前方、右側

見下文
八乘八點陣顯示器 的正面、前方、左側

見下文
八乘八點陣顯示器 的正面、後方、左側

見下文
八乘八點陣顯示器 的正面

見下文
跳線 接駁至 Arduino A0號 至 A3號 引腳

見下文
跳線 接駁至 Arduino 13號 至 2號 引腳

見下文
八乘八點陣顯示器 接駁至 麵包板 上,通過 跳線 接駁至 Arduino

八乘八點陣顯示器 由於佔據比較多空間,一塊麵包板未必有足夠空間安置引腳及跳線

見下文
八乘八點陣顯示器 拆解後的線路

見下文
點陣顯示器 基本上與 多位七段顯示器 操作上相似
8支引腳電源線,控制 8排(橫) LED
8支引腳接地線,控制 8行(直) LED
將16支引腳接駁正確,當然是八乘八點陣顯示器所有 LED 都著亮

要讓不同獨位置亮著不同 LED ,同讓不能讓 LED 持續接通電源
需要 不斷接通與切斷對應位置及 LED 的電源
只要 接通與切斷電源的時間比人類視覺更新時間少,在人類視覺上便不會發生 LED 有切斷感覺

自訂圖示示範

const byte ROW_LENGTH = 8;
const byte COLUMN_LENGTH = 8;
const byte ROW_PINS[ROW_LENGTH] = {13, 12, 11, 10, 9, 8, 7, 6};
const byte COLUMN_PINS[COLUMN_LENGTH] = {5, 4, 3, 2, A0, A1, A2, A3};
const unsigned int INDICES[8] = {
    1 << 0,
    1 << 1,
    1 << 2,
    1 << 3,
    1 << 4,
    1 << 5,
    1 << 6,
    1 << 7
};

void setup() {
    for (byte rowPin : ROW_PINS){
        pinMode(rowPin, OUTPUT);
        digitalWrite(rowPin, LOW);
    }
    for (byte columnPin : COLUMN_PINS){
        pinMode(columnPin, OUTPUT);
        digitalWrite(columnPin, HIGH);
    }
}

void loop() {
    setSmile();
}

void set(byte row, byte columnValue, bool enabled){
    digitalWrite(ROW_PINS[row], ((enabled) ? HIGH : LOW));
    for (byte c = 0; c < COLUMN_LENGTH; c++){
        if ((columnValue & INDICES[c]) > 0){
            digitalWrite(COLUMN_PINS[c], ((enabled) ? LOW : HIGH));
        }
    }
    delayMicroseconds(50);
}

void set(byte row, byte columnValue){
    set(row, columnValue, true);
    set(row, columnValue, false);
}

void setSmile() {
    set(0, INDICES[2] | INDICES[3] | INDICES[4] | INDICES[5]);
    set(1, INDICES[1] | INDICES[6]);
    set(2, INDICES[0] | INDICES[2] | INDICES[5] | INDICES[7]);
    set(3, INDICES[0] | INDICES[7]);
    set(4, INDICES[0] | INDICES[2] | INDICES[5] | INDICES[7]);
    set(5, INDICES[0] | INDICES[3] | INDICES[4] | INDICES[7]);
    set(6, INDICES[1] | INDICES[6]);
    set(7, INDICES[2] | INDICES[3] | INDICES[4] | INDICES[5]);
}

自訂圖示效果

見下文
由於 電源線 先由橫排接駁,再由直行到 接地線
例如
  • 接通 第一排電源引腳第一行接地引腳,會亮著 第一排第一行 LED
  • 接通 第二、四排電源引腳第六行接地引腳,會亮著 第二、四排第六行 LED
  • 接通 第三排電源引腳第五、七行接地引腳,會亮著 第三排第五、七行 LED
但由於這種情況會拎 LED 持續亮著
如果只需要亮著 第一排第一行 及 第八排第八行 的 LED ,根據以上接駁方式,同時會令 第一排第八行 及 第八排第一行 的 LED 都會亮著
(閣下可以到本文的「LED 位置 (模擬及示範效果)」測試)
這種情況與 多位七段顯示器 相同
例如接通 第一排電源引腳第一行接地引腳 亮著 LED 後,截斷 電源引腳 及 接地引腳
極短時間後再接通 第八排電源引腳第八行接地引腳 ,然後同樣截斷 電源引腳 及 接地引腳
不斷高速重覆,便會只會亮著 第一排第一行 及 第八排第八行 的 LED


實際示範效果

電源第1行接地第2行接地第3行接地第4行接地第5行接地第6行接地第7行接地第8行接地

LED 編排與數字及字母

在下編寫的數字及字母的點陣位置

數字及字母示範

見下文
在 八乘八點陣顯示器 顯示 0 至 9 及 A 至 Z

走馬燈測試

void setMarquee() {
    const int IMAGE_COLUMN_LENGTH = 8;
    unsigned int ROWS[ROW_LENGTH];
    ROWS[0] = INDICES[3];
    ROWS[1] = ROWS[0] | INDICES[2];
    ROWS[2] = ROWS[1] | INDICES[1];
    ROWS[3] = ROWS[2] | INDICES[0] | INDICES[4] | INDICES[5] | INDICES[6] | INDICES[7];
    ROWS[4] = ROWS[3];
    ROWS[5] = ROWS[2];
    ROWS[6] = ROWS[1];
    ROWS[7] = ROWS[0];
    const unsigned int HEX_LENGTH = (1 << IMAGE_COLUMN_LENGTH) - 1;
    for (int i = -IMAGE_COLUMN_LENGTH; i < IMAGE_COLUMN_LENGTH; i++) {
        for (unsigned int j = 0; j < 50; j++) {
            for (unsigned int k = 0; k < ROW_LENGTH; k++) {
                set(k, ((i < 0) ? (VALUES[k] << -i) : (VALUES[k] >> i)) & HEX_LENGTH);
            }
        }
        delay(1);
    }
}

走馬燈效果

見下文
25 FPS 速度捲動的走馬燈效果

總結

八乘八點陣顯示器 共有 64個 LED 燈,如每個 LED 正負極都需要用 2支引腳,即是總共要用 128支引腳 才能控制全部 LED
但將 LED 有規律地連接一齊,最後只需要 16支引腳便可以控制 (但內部線路腳仍然很複雜)

這種點陣顯示器的應用範圍很大,非常多公共設施、公共服務都有使用
基本上點陣顯示器上的文字、圖案只需要好像點陣圖一般,根據位置點畫內容,人眼會自動修正偏差便可以傳遞資訊
只是可能需要花大量時間將內容畫成點陣圖

走馬燈效果,最初在下使用逐格點畫的方式製作,當然是非常低效率
最後改寫成以 For Loop 運作,便可以只考慮內容,自行計算捲動效果

附加資料

在下在 TinkerCAD 製作的模擬效果
https://www.tinkercad.com/things/geBK5bktiP8

沒有留言 :

張貼留言