Trong bài hướng dẫn Arduino này, chúng ta sẽ tìm hiểu về LED ma trận và cách điều khiển LED ma trận 8×8 bằng IC điều khiển Max7219 và board Arduino.
LED ma trận thực chất là một bảng các LED đơn được xếp theo hàng và cột (thông thường là 8 hàng và 8 cột) được sử dụng để hiển thị các ký hiệu, ký tự hoặc thậm chí hình ảnh. Dựa trên hướng của các đèn LED trong LED ma trận, có thể phân thành hai loại LED ma trận. Loại nhàng Anode chung và loại hàng Cathode chung.
Mô đun LED ma trận là một trong những thiết bị hiển thị thường được sử dụng trong các ứng dụng chính như bảng hiển thị điện tử và hệ thống thông báo.
Chuẩn bị
Phần cứng
Linh kiện | Số lượng |
Arduino Uno | 1 |
LED ma trận 8×8 | 1 |
IC Max7219 | 1 |
Điện trở 10kΩ | 1 |
Tụ điện 0.1 µF | |
Tụ điện 10 µF | |
Breadboard | 1 |
Dây cắm Breadboard |
Phần mềm: Arduino IDE
LED ma trận
Hình trên là một LED matrix 8×8 đơn sắc, nó chỉ có một màu đỏ. Nó là tập hợp của 64 chiếc đèn LED được xếp theo hàng và cột. Với cách bộ trí các led đơn như vậy LED ma trận có thể hiển thị hình ảnh, văn bản như một màn hình TV.
LED ma trận có nhiều loại khác nhau như màu đơn, màu kép, đa màu hoặc LED ma trận RGB .
Chúng cũng có nhiều kích thước khác nhau như 5 x 7, 8 x 8, 16 x 16, 32 x 32 v.v.. Dựa trên sự sắp xếp của đèn LED trong LED ma trận, ma trận LED có thể là loại hàng anode chung hoặc hàng cathode chung.
Trong trường hợp LED ma trận loại hàng anode chung, các dòng source (điện áp cao hoặc dương) được cấp cho các hàng A-D và các hiện tại sink (điện áp thấp hoặc điện áp âm hoặc điểm nối đất) được cấp cho các cột 1-4.
Trong trường hợp LED ma trận loại hàng cathode chung, các dòng source (điện áp cao hoặc dương) được cấp cho các cột 1-4 và các dòng sink (điện áp thấp hoặc điện áp âm hoặc điểm nối đất) được cấp cho các hàng A-D.
LED ma trận được sử dụng trong dự án này là loại hàng cathode chung. Trong khi phát triển dự án, loại ma trận LED phải được biết và chương trình phải được viết phù hợp.
IC Max7219
LED ma trận có thể được điều khiển theo hai cách. Theo kiểu song song (mỗi hàng hoặc cột được gửi cùng với dữ liệu song song) và theo kiểu nối tiếp (nơi dữ liệu được gửi một cách nối tiếp và một IC được sử dụng để chuyển dữ liệu nối tiếp này thành dữ liệu song song).
Max7219 là bộ lái LED ma trận loại hàng cathode chung với đầu vào nối tiếp và đầu ra song song. Nó được sử dụng để giao tiếp với các bộ vi xử lý và vi điều khiển với 64 đèn LED đơn (LED ma trận 8 x 8 có 64 đèn LED), LED 7 đoạn hiển thị lên đến 8 con số hoặc các màn hình biểu đồ thanh.
Để đơn giản việc kết nối dây, các bạn có thể sử dụng module IC MAX7219 và LED ma trận 8×8 hiện có bán trên thị trường.
Sơ đồ mạch
Hoạt động
Mục đích của dự án này là giao tiếp một board Arduino Uno với LED ma trận 8 x 8 để hiển thị thông tin.
Mặc dù một LED ma trận 8 x 8 với IC MAX 7219 tương ứng được sử dụng trong dự án này. Tuy nhiên, bạn có thể kết nối nhiều LED ma trận nối tiếp nhau cho màn hình cuộn dài. Kết nối các thành phần như trong sơ đồ mạch. Hoạt động của hệ thống như sau.
3 trong số 14 chân input / output có sẵn của Arduino được sử dụng để điều khiển bộ lái hiển thị IC MAX 7219. 3 chân trên MAX7219 IC là CLOCK, DATA IN và LOAD (hoặc CS trong trường hợp IC MAX 7221). Có thể sử dụng tần số xung nhịp tối đa là 10MHz. DIN (DATA IN) nhận dữ liệu nối tiếp từ vi điều khiển hoặc board Arduino.
Với độ dài 16 bit trong đó 8 bit đầu tiên (D0 – D7) dùng để điều khiển các cột (SEG AG và DP của IC MAX 7219) của ma trận LED và 8 bit tiếp theo (D8 – D15) là để điều khiển (DIG 0-7 của MAX 7219 IC) hàng của LED ma trận.
Chân LOAD (hoặc CS hoặc chân CHIP SELECT trong trường hợp IC Max 7221) chốt dữ liệu đầu vào nối tiếp khi có xung cạnh lên (từ 0 lên 1) tác động vào.
Một chân quan trọng khác trên MAX 7219 là ISET, chân này thiết lập giá trị cực đại của dòng điện để điều khiển tất cả các đèn LED. Nó được kết nối thông qua một điện trở (R1), được gọi là RSET. Các tụ điện có tác dụng lọc nhiễu cho nguồn cung cấp.
Khi dữ liệu nối tiếp được gửi bằng Arduino (thông qua chương trình), dữ liệu nối tiếp được chuyển đổi thành các phân đoạn và chữ số để điều khiển các cột và hàng của LED ma trận. Theo dữ liệu được gửi, các đèn LED tương ứng trên LED ma trận sáng lên và hiển thị thông tin.
Chương trình được viết ở đây là để cuộn hiển thị văn bản. Có thể khó xem dữ liệu cuộn dài trên một ma trận LED 8 x 8. Do đó, nhiều ma trận LED có thể được ghép nối tiếp để tạo thành một ma trận dài.
Số IC MAX 7219 bằng với số LED ma trận 8 x 8. Để mở rộng hiển thị cho nhiều LED ma trận, chân OUT OUT (DOUT) của MAX 7219 đầu tiên phải được kết nối với chân IN (DIN) của MAX 7219 IC thứ hai. Thực hiện kết nối tương tự như vậy cho nhiều ma trận LED.
(Vị trí của LED ma trận trong chuỗi là quan trọng. LED ma trận đầu tiên phải được đặt ở bên phải của chuỗi.)
Chương trình
#include <LedControl.h>
int DIN = 13;
int CS = 12;
int CLK = 11;
byte E[8] = {0x3C, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x3C};
byte L[8] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E};
byte C[8] = {0x1C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1C};
byte T[8] = {0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};
byte R[8] = {0x38, 0x24, 0x24, 0x28, 0x30, 0x28, 0x24, 0x24};
byte O[8] = {0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C};
byte N[8] = {0x42, 0x62, 0x52, 0x52, 0x4A, 0x46, 0x46, 0x42};
byte I[8] = {0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38};
byte S[8] = {0x1C, 0x20, 0x20, 0x10, 0x08, 0x04, 0x04, 0x38};
byte H[8] = {0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x22};
byte U[8] = {0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C,};
byte B[8] = {0x38, 0x24, 0x24, 0x38, 0x38, 0x24, 0x24, 0x38};
byte smile[8] = {0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C};
byte neutral[8] = {0x3C, 0x42, 0xA5, 0x81, 0xBD, 0x81, 0x42, 0x3C};
byte frown[8] = {0x3C, 0x42, 0xA5, 0x81, 0x99, 0xA5, 0x42, 0x3C};
LedControl lc = LedControl(DIN, CLK, CS, 1);
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 5);
lc.clearDisplay(0);
}
void loop()
{
printByte(smile);
delay(1000);
printByte(neutral);
delay(1000);
printByte(frown);
delay(1000);
printByte(E);
delay(1000);
printByte(L);
delay(1000);
printByte(E);
delay(1000);
printByte(C);
delay(1000);
printByte(T);
delay(1000);
printByte(R);
delay(1000);
printByte(O);
delay(1000);
printByte(N);
delay(1000);
printByte(I);
delay(1000);
printByte(C);
delay(1000);
printByte(S);
delay(1000);
lc.clearDisplay(0);
delay(1000);
printByte(H);
delay(1000);
printByte(U);
delay(1000);
printByte(B);
delay(1000);
lc.clearDisplay(0);
delay(1000);
}
void printByte(byte character [])
{
int i = 0;
for (i = 0; i < 8; i++)
{
lc.setRow(0, i, character[i]);
}
}
Giải thích
Để đảm bảo quá trình viết code được dễ dàng, chúng ta sẽ sử dụng thư viện LEDcontrol. Thư viện này làm cho quá trình lập trình Arduino để điều khiển LED ma trận được dễ dàng. Vì vậy, như thường lệ, tải về thư viện, giải nén nó và sao chép vào thư mục thư viện Arduino của bạn, sau đó bắt đầu Arduino IDE.
Điều đầu tiên chúng ta làm trong code như thông thường, là include các thư viện sẽ được sử dụng, sau đó chúng ta khai báo các chân trên Arduino mà LED ma trận LED được kết nối.
#include <LedControl.h>
int DIN = 13;
int CS = 12;
int CLK = 11;
Sau khi khai báo các chân, chúng ta khai báo các mảng byte mô tả đồ họa sẽ được hiển thị. Ví dụ đầu tiên là mảng byte để hiển thị một nụ cười.
byte E[8] = {0x3C, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x3C};
byte L[8] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E};
byte C[8] = {0x1C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1C};
byte T[8] = {0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};
byte R[8] = {0x38, 0x24, 0x24, 0x28, 0x30, 0x28, 0x24, 0x24};
byte O[8] = {0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C};
byte N[8] = {0x42, 0x62, 0x52, 0x52, 0x4A, 0x46, 0x46, 0x42};
byte I[8] = {0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38};
byte S[8] = {0x1C, 0x20, 0x20, 0x10, 0x08, 0x04, 0x04, 0x38};
byte H[8] = {0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x22};
byte U[8] = {0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C,};
byte B[8] = {0x38, 0x24, 0x24, 0x38, 0x38, 0x24, 0x24, 0x38};
byte smile[8] = {0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C};
byte neutral[8] = {0x3C, 0x42, 0xA5, 0x81, 0xBD, 0x81, 0x42, 0x3C};
byte frown[8] = {0x3C, 0x42, 0xA5, 0x81, 0x99, 0xA5, 0x42, 0x3C};
Sau khi mảng byte cho đồ họa được hiển thị đã được tạo, chúng tôi sau đó tạo một đối tượng của thư viện LCDcontrol.
LedControl lc = LedControl(DIN, CLK, CS, 1);
Tiếp theo, chúng ta chuyển đến phần void setup () của code. Với thư viện có sẵn, chúng tôi không cần phải lập trình nhiều. Điều đầu tiên chúng ta thực hiện trong phần loop là gọi MAX7219 ra khỏi chế độ tiết kiệm điện, sau đó chúng ta thiết lập độ sáng của màn hình bằng cách sử dụng hàm lc.setintensity (), sau đó chúng ta xóa màn hình, làm cho nó sẵn sàng nhận dữ liệu.
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 5);
lc.clearDisplay(0);
}
Khi điều này đã được thực hiện, chúng ta tiếp tục đi đến hàm void loop () trong đó đặc trưng một số tuyên bố nhiều hơn của mảng byte đồ họa, và hiển thị các đồ họa trên LED ma trận. Hiển thị đồ họa trên LED ma trận được thực hiện thông qua hàm, printbyte (), với đối số của hàm là tên của mảng byte biểu diễn đồ họa sẽ được hiển thị. Ví dụ, printbyte (smile) in đồ họa “smile” như được mô tả bởi mảng byte của nó. Sau khi hiển thị đồ họa, hàm delay () được sử dụng để giữ đồ họa trên LED ma trận trong khoảng thời gian nhất định.
void loop()
{
printByte(smile);
delay(1000);