You are on page 1of 16

BÀI 8: LẬP TRÌNH ĐIỀU KHIỂN

LED MA TRẬN
BÀI 8: LẬP TRÌNH ĐIỀU KHIỂN LED MA TRẬN

Mục tiêu:
- Thành thạo lập trình gửi
tín hiệu digital
- Viết được chương trình
điều khiển LED ma trận
hiển thị hình ảnh, ký tự

AUT208 Lập trình Arduino


8.1. Thiết kế sơ đồ nguyên lý – LED ma trận
LED MATRIX 8x8 được cấu tạo bởi 64 con LED được sắp xếp với nhau theo
dạng ma trận, thành 8 hàng và 8 cột, tức là 16 chân.

Lưu ý mỗi loại LED


MATRIX có sơ đồ
chân riêng nên nối
mạch, ta cần tra cứu
datasheet của nó để
có thể lắp mạch
chính xác các chân
được bố trí như thế
nào

AUT208 Lập trình Arduino


8.1. Thiết kế sơ đồ nguyên lý – LED ma trận
Để làm sáng được 1 LED, ta cần cấp điện
áp “+” và “0” vào 2 chân của hàng và cột
mà con led đó được kết nối.
Ví dụ: để làm sáng led ở vị trí (hàng 1: cột
1) thì phải cấp “+” vào hàng 1 và “0” vào
cột 1.
Như vậy, trong một thời điểm chỉ có lớn
nhất là 8 led (trên 1 hàng hoặc 1 cột) được
sáng đồng thời.

AUT208 Lập trình Arduino


8.1. Thiết kế sơ đồ nguyên lý – LED ma trận
Để có thể hiển thị hình ảnh trên led ma trận.
Ta sử dụng phương pháp quét led. Tức là:
Đầu tiên điều khiển 8 led theo hàng ngang
(hoặc theo cột dọc), sau đó tắt hết đi. Tiếp
theo điều khiển 8 led theo hàng ngang tiếp
theo, sau đó tắt hết đi. Công việc lặp lại tới
hàng ngang cuối cùng.
Vì thời gian sáng và sắt của các hàng rất
nhanh nên mắt người không phân biệt được
việc tắt mà chỉ thấy các led sáng đồng thời.
AUT208 Lập trình Arduino
của mạch

AUT208 Lập trình Arduino


Sơ đồ nguyên lý

AREF
13
PB5/SCK cot8
12
PB4/MISO cot7
RESET 11
~PB3/MOSI/OC2A cot6
10
~ PB2/SS/OC1B cot5
9
~ PB1/OC1A cot4
8
PB0/ICP1/CLKO cot3
1121

7
PD7/AIN1 cot2
6
hang1 A0 ~ PD6/AIN0 cot1
PC0/ADC0 5
hang2 A1 ~ PD5/T1
ATMEGA328P-PU

PC1/ADC1 4
hang3 A2 PD4/T0/XCK
PC2/ADC2 3
hang4 A3 ~ PD3/INT1 hang8
ANALOG IN

PC3/ADC3 2
hang5 A4 PD2/INT0 hang7
PC4/ADC4/SDA 1
DIGITAL (~PWM)

hang6 A5 TX PD1/TXD
PC5/ADC5/SCL 0
RX PD0/RXD
ARD1

hang8
hang7
hang6
hang5
hang4
hang3
hang2
hang1
ARDUINO UNO R3

cot1
cot2
cot3
cot4
cot5
cot6
cot7
cot8
8.1. Thiết kế sơ đồ nguyên lý
2.2. Biên soạn chương trình – Lưu đồ thuật toán

Bước 1a: Điều khiển hàng 1 Start

Bước 1b: Tắt hàng 1


Điều khiển hàng 1
Bước 2a: Điều khiển hàng 2
Bước 2b: Tắt hàng 2 Tắt hàng 1

Bước na: Điều khiển hàng n Điều khiển hàng 2
Bước nb: Tắt hàng n
Lặp lại từ bước 1. Tắt hàng 2

Điều khiển hàng n

INE214 Vi điều khiển


8.2. Biên soạn chương trình – Chương trình điều khiển
Chương trình điều khiển hiển thị chữ H trên led ma trận 8x8
ledmatrix1.ino

INE214 Vi điều khiển


8.2. Biên soạn chương trình – Chương trình điều khiển 2
Với cách nối ở trang 6 thì chỉ có thể điều khiển được 1 ma trận led 8x8 vì
Arduino chỉ có 20 chân digital in/out.
Bài toán đặt ra là phải điều khiển không giới hạn số led ma trận.
Để thực hiện được việc điều khiển không giới hạn số led ma trận, ta sử dụng
thêm IC 595 để đệm giữa đầu ra của Arduino với chân của led ma trận. Với
cách sử dụng này, Arduino chỉ cần sử dụng 3 chân digital in/out là có thể điều
khiển được vô số led ma trận. Giới hạn điều khiển lúc này chỉ là tốc độ hoạt
động của Arduino mà thôi.
Để điều khiển 1 LED matrix, ta sử dụng 2 con IC 74HC595, 1 để điều khiển 8
chân row, 1 để điều khiển 8 chân column.
Trước mỗi chân row, ta gắn thêm 1 con trở 560 om để hạn dòng cho LED.
Do lắp IC 74HC595 điều khiển columns nối tiếp theo sau IC 74HC595 điều
khiển rows, do đó, chân 14 của IC 74HC595 điều khiển columns sẽ nối với
chân 9 của IC 74HC595 điều khiển rows.
INE214 Vi điều khiển
8.2. Biên soạn chương trình – Chương trình điều khiển 2
Sơ đồ kết
nối Arduino
với LED ma
trận có
74HC595
đệm ở giữa

INE214 Vi điều khiển


8.2. Biên soạn chương trình – Chương trình điều khiển 2
Chân 11 (CLOCK), 12 (LATCH) của 2 IC nối với nhau, và nối với pin 10,11 của
Arduino
Chân 14 của IC 74HC595 control rows sẽ nối với pin 12 của Arduino
Chân số 10 và 16 của 2 IC sẽ nối VCC, chân số 8 và 13 sẽ nối GND

LED matrix gồm 8 chân row: từ row 0-->row 7; 8 chân column: từ column 0 -->
column 7. Trong sơ đồ mạch phía trên (trang 10), 8 chân ở phía trên của LED
matrix (từ trái qua phải) gồm: column 0, column 1, row 1, column 7, row 3,
column 2, column 4, row 0. 8 chân ở dưới của LED matrix (từ trái qua phải)
gồm: row 4, row 6, column 6, column 5, row 7, column 3, row 5, row 2

INE214 Vi điều khiển


8.2. Biên soạn chương trình – Các câu lệnh liên quan
int row[] = {1, 2, 4, 8, 16, 32, 64, 128}; //Khai báo một mảng có các phần tử
mang kiểu int(nguyên) mang các giá trị cho trước. Phần tử 1 mang giá trị 1,
phần tử thứ 2 mang giá trị 2, phần tử thứ 3 mang giá trị 8…
Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu
unsigned int characterHEX[][8]; //Khai báo một mảng 2 chiều. Kiểu dữ liệu là
unsigned int. Tên mảng là characterHEX. Một chiều của mảng có kích thước là
8 phần tử.
for(int i=0;i<times;i++) { displayImage(image,on;} //Vòng lặp có số lần lặp
xác định. Vòng lặp bắt đầu từ i=0, khi i<times thì Arduino vẫn tiếp tục thực hiện
hàm displayImage(image,on);, mỗi lần lặp lại thì i tăng 1 đơn vị (i++).

INE214 Vi điều khiển


8.2. Biên soạn chương trình – Giải thích chương trình
//hàng và cột của LED matrix
int row[] = {1, 2, 4, 8, 16, 32, 64, 128};
int column[] = {128, 64, 32, 16, 8, 4, 2, 1};
=> dùng để kiểm soát hàng và cột của matrix.
1 = B00000001 => hàng 0
2 = B00000010 => hàng 1
4 = B00000100 => hàng 2
....
128 = B10000000 => hàng 7
tương tự đối với cột.

INE214 Vi điều khiển


8.2. Biên soạn chương trình – Giải thích chương trình
Ví dụ tạo ký tự. Để biểu diễn chữ 'I' ra LED matrix, ta sẽ tạo 1 mảng sau:
I[] = {
B01111110,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B01111110};
những vị trí có số 1 sẽ là những điểm sẽ sáng trên LED matrix. Để ngắn gọn, ta
có thể chuyển mảng trên về dạng số HEX: B0111 1110 => 0111 = 7 (DEC) = 7
(HEX); 1110 = 14 (DEC) = E (HEX); ==> B01111110 = 0x7E;
tương tự ta sẽ được: I[] = {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x7E};
INE214 Vi điều khiển
8.2. Biên soạn chương trình – Giải thích chương trình
Tại 1 thời điểm, chúng ta chỉ có thể điều khiển các LEDs của 1 row, do
đó, trong thực tế, hình ảnh ta thấy được trên LED matrix là do "hiện tượng lưu
ảnh" của mắt, khi chúng ta quét các hàng của matrix với tốc độ rất nhanh. Để
làm được việc này, sau mỗi lần shiftOut, ta chỉ delay 1/1000 giây, và lặp lại
"duration" lần sau khi đã shiftOut hết 8 bit. Giá trị của biến duration càng lớn thì
thời gian của hiệu ứng càng dài.
Ta sử dụng bitwise NOT (~) khi shiftOut columns, vì để bật 1 LED, row cần
được nối VCC (set 1), column cần được nối GND (set 0).

Chương trình điều khiển theo file: ledmatrix2.ino

INE214 Vi điều khiển


Thực hành lab 4-2

AUT208 Lập trình Arduino

You might also like