Search…

LED Matrix

10/08/20205 min read
Chúng ta thướng thấy rất nhiếu biển quảng cáo đèn LED với đủ màu sắc và nội dung, bản chất của những biển quảng cáo đó cũng giống như LED matrix. Một chiếc LED matrix có 16 chân, 8 chân row và 8 chân column. Trong bài này tôi sẽ hướng dẫn lập trình trên LED matrix 2388ASR.

Bản chất của những biển quảng cáo với đủ màu sắc và nội dung cũng giống như LED matrix gồm 16 chân: 8 chân row và 8 chân column, có thể lập trình để tạo ra các hình ảnh.

LED matrix 2388ASR

LED matrix mặt trước.
LED matrix mặt trước
LED matrix mặt sau
LED matrix mặt sau

Đây là LED matrix đơn sắc, chỉ có một màu đỏ. Tập hợp của 64 đèn LED được xếp theo hàng và cột. Với bố trí như vậy có thể hiển thị hình ảnh, văn bản như một màn hình.

Tivi LED cũng có thiết kế tương tự nhưng số lượng LED trên hàng và cột rất lớn như vậy sẽ tao được độ mịn cho hình ảnh.

Ưu điểm của những bảng LED matrix là có độ bền cao và khi để ngoài trời sáng vẫn thấy rõ rất phù hợp với ngành quảng cáo.

Cấu trúc

LED matrix 8x8
Cấu trúc LED matrix 8x8

Với:

  • c0 là cột 0, c1 là cột 1, c2 là cột 2, c3 là cột 3, c4 là cột 4, c5 là cột 5, c6 là cột 6, c7 là cột 7.
  • r0 là dòng 0, r1 là dòng 1, r2 là dòng 2, r3 là dòng 3, r4 là dòng 4, r5 là dòng 5, r6 là dòng 6, r7 là dòng 7.

Dự án mẫu sử dụng LED matrix

Để điều khiển LED matrix, Arduino Uno sẽ không đủ chân nên trong sơ đồ sẽ sử dụng 2 IC 74HC595N. IC đầu tiên sẽ làm nhiệm vụ điều khiển các column của LED matrix. Các chân từ Q0 → Q7 của IC đầu tiên tương ứng với các chân col 0 → col 7 theo hình trên. Tương tự với IC thứ 2 sẽ điều khiển các chân row từ row 0 → row 7.

ss_4
Sơ đồ mạch

Nguyên lý

Trong lần dịch bit thứ nhất của IC điều khiển các chân row, sau khi dịch các dòng row đang có giá tri là 1. Những vị trí có số 1 trên đèn LED matrix sẽ là những ô sáng.

void translateTargetBuffer()
{
      digitalWrite(MC_LATCH, LOW);
      shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, B00000000);
      shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, B00000001);
      digitalWrite(MC_LATCH, HIGH);
      delay(1);
}

Hàm translateTargetBuffer trên sẽ hiển thị những điểm sáng trên đèn tùy thuộc vào giá trị data đưa vào. Vòng lặp từ 0 → 7 là 8 dòng và 8 cột.

Do sử dụng 2 IC nên một lần dịch bit phải dịch bit shiftOut của một giá trị 16 bit mà một IC chỉ có khả năng dịch tối da 8 bit nên trong hàm trên cần dịch bit 2 lần.

Ví dụ bật các LED trên 1 dòng

Bật sáng tất cả các đèn tại vị row 1

Bật LED trên LED matrix.

Đầu tiên sử dụng IC thứ nhất để truyền vào col giá trị là B00000000, lúc này tất cả các col đều có giá trị là 0.

ss_6

Sau đó ta truyền vào cho row giá trị B00000001, toán tử giữa các bit là toán tử XOR.

ss_7

Các ô có giá trị là 1 sẽ sáng lên.

Ví dụ bật các LED trên 1 dòng và 1 cột

Làm đèn sáng theo hình dạng sau.

ss_8

Tạo một mảng row như sau:

int row[] = {1, 2, 4, 8, 16, 32, 64, 128}; 

và một mảng gồm 8 phần tử

byte symbol[MC_ROWS] = { 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };

các phần tử trong mảng symbol chỉ đơn giản là chuyển từ kiểu BIN sang HEX.

Mã nguồn đầy đủ

#define MC_CLOCK  10
#define MC_LATCH  11
#define MC_DATA   12

#define MC_ROWS   8
#define MC_COLS   8

byte symbol[MC_ROWS] = { 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };

void setup()  
{
  pinMode(MC_CLOCK,OUTPUT);
  pinMode(MC_LATCH,OUTPUT);
  pinMode(MC_DATA,OUTPUT);
}
 
void loop()
{
  translateTargetBuffer();
}

void translateTargetBuffer()
{
  for (int i = 0; i < MC_ROWS; i++)
  {
      digitalWrite(MC_LATCH, LOW);
      
      shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, ~symbol[i]);
      shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, (1<<i));
      
      digitalWrite(MC_LATCH, HIGH);
      
      delay(1);
  }
}
ss_9

Dòng shiftOut(MC_DATA, MC_CLOCK, MSBFIRST,~symbol[i]) phải đảo ngược các bit, vì nếu không đảo ngược thì 1 XOR 1 = 0 dẫn đến ô muốn sáng thì lại là ô bị tắt.

Ví dụ tạo hiệu ứng chạy chữ

LED matrix chạy chữ.

LED matrix chạy chữ.
#define MC_CLOCK  10
#define MC_LATCH  11
#define MC_DATA   12

#define MC_ROWS   8
#define MC_COLS   8

#define STDIO_MAX_ELEMENTS 5

byte row[] = { 1, 2, 4, 8, 16, 32, 64, 128 };

byte characterList[STDIO_MAX_ELEMENTS][MC_ROWS] = {
{ 0x1C, 0x22, 0x30, 0x18, 0x0C, 0x46, 0x46, 0x3C }, //S
{ 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //T
{ 0x78, 0x64, 0x66, 0x66, 0x66, 0x66, 0x64, 0x78 }, //D
{ 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E }, //I
{ 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C }, //O
};

void setup()
{
  pinMode(MC_CLOCK, OUTPUT);
  pinMode(MC_LATCH, OUTPUT);
  pinMode(MC_DATA,  OUTPUT);
}
 
void loop()
{
  for (int i = 0; i < 5; i++)
  {
    translateTargetBuffer(characterList[i]);
  }
}

void translateTargetBuffer(byte deviceContext[])
{                
  for(int shift = 0; shift < 9; shift++)
  {
    for(int fps = 0; fps < 30; fps++)
    {
      for(int row_present = 0; row_present < 8; row_present++)
      {
        digitalWrite(MC_LATCH, 0);
        
        shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, ~(deviceContext[row_present] << shift)); //col
        shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, row[row_present]);//row

        digitalWrite(MC_LATCH, 1);
        delay(1);
      }
    }
  }
}

Như vậy ta đã có được một bảng đèn LED chạy chữ như những biển quảng cáo thường thấy:

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024