NGUYÊN LÝ HOẠT ĐỘNG

Một phần của tài liệu mach Led nháy theo nhạc (Trang 24 - 35)

CHƯƠNG II. THIẾT KẾ MẠCH NGUYÊN LÝ

II. NGUYÊN LÝ HOẠT ĐỘNG

Mạch điện sử dụng Vi Điều Khiển nên về phần cứng khá đơn giản.

Khối điều khiển trung tâm sử dụng Vi Điều Khiển atmega8.

Khối giải mã dữ liệu hàng sử dụng 16 con transistor ,chức năng giống như cổng NOT.

Khối giải mã địa chỉ cột sử dụng IC 74HC595, đây là thanh ghi dịch 8-bit vào nối tiếp ra song song. Ta sử dụng IC này nhằm mục đích tiết kiệm chân giao tiếp giữa IC giải mã với Vi Điều Khiển. Chân DATA-IN (14) để đưa dữ liệu nối tiếp vào, chân CLK (11) đưa xung đồng hồ dịch bit, chân LATCH(12) để chốt

dữ liệu được gửi ra. 8 đầu ra được nối đến 8 cột của bảng LED thông qua mạch đệm dòng.

Nguyên lý hoạt động: Chương trình phần mềm chứa trong Vi Điều Khiển làm nhiệm vụ điều khiển chính mọi hoạt động của mạch. Chương trình phần mềm gồm có nhiều chương trình con: chương trình hiển thị, chương trình cập nhật.

2. Nguyên lý làm việc của ma trận LED a. Nguyên tắc làm sáng đèn trên bảng LED

Khi muốn làm sáng LED đơn, ta cần đưa điên áp dương vào chân Anode và điện áp âm vào chân Cathode với giá trị thích hợp, khi đó LED sáng. Giá trị điện áp và dòng điện tuỳ thuộc vào màu sắc từng loại LED.

Dòng chảy qua các LED để đảm bảo độ sáng bình thường là từ 10mA cho đến 25mA.

Khi ta muốn làm sáng một điểm trên bảng ma trận LED ta cũng làm tương tự. Xét với bảng LED 5x7 dưới đây

b. Nguyên tắc quét bảng ma trận LED

Trong đề tài này em sử dụng hai bảng LED 8x8 ghép lại thành một bảng cỡ 8x16 (8 hàng và 16 cột). Mỗi hiệu ứng sẽ được hiển thị trong một khung cỡ 8x8. Dưới đây là nguyên tắc quét và hiển thị một hiệu ứng trên khung hình 8x8.

Để hiển thị ký tự lên bảng LED, ở đây ta dùng phương pháp quét cột và xuất dữ liệu hàng. Quá trình quét cột là ta gửi tín hiệu cho phép đến từng cột trong từng thời điểm. Cùng lúc đó ta gửi dữ liệu hàng đến 8 hàng. Trong đề tài này tín hiệu cho phép cột là mức logic ‘1’, và dữ liệu hàng tương ứng là mức ‘0’

hay ‘1’ của từng hàng, mức ‘0’ ứng với LED sáng (on) và mức ‘1’ là tắt (off).

• Kích hoạt cột thứ nhất và các LED tương ứng sẽ sáng. Tạo một thời gian trễ, sau đó tắt cột thứ nhất.

• Gửi tiếp giá trị dữ liệu 8 hàng của cột thứ 2, kích hoạt cột thứ 2, tạo trễ và lại tắt cột thứ 2.

• Quá trình quét đó cứ tiếp diễn cho đến khi quét hết 16 cột của bảng LED.

Việc quét hiển thị này diễn ra trong thời gian rất ngắn, cỡ vài chục mili giây, ta sẽ thấy hình ảnh hay chữ hiển thị trên bảng LED. Tuy rằng trong mỗi thời điểm chỉ có một cột được sáng nhưng do thời gian quét rất nhanh và do hiện tương lưu ảnh trong võng mạc của mắt nên ta thấy hình ảnh xuất hiện liên tục. Tần số quét cần phải đảm bảo sao cho đủ hoặc lớn hơn 24hình/s. Thường ta chọn tần số quét từ 40Hz đến 100Hz hoặc có thể lớn hơn.

Dữ liệu hiển thị của hàng được lấy từ EEPROM hoặc từ Flash ROM của Vi Điều Khiển hay từ ROM ngoài.

Trạng thái của một LED sẽ được quyết định bởi tín hiệu điện áp đi vào đồng thời cả 2 chân. Ví dụ để LED sáng thì điện áp 5V phải đưa vào chân dương và chân âm phải được nối đất, LED sẽ tắt khi không có điện áp đưa vào chân dương.Với đề tài này, chúng em chọn loại ma trận LED 8x8 để hiển thị.Ta có sơ đồ nguyên lý của Ma trận LED 8x8:

Để ma trận có thể sáng như hình vẽ:

Thực hiện quét dòng và cột:

Chọn cột 1, đưa điện áp cột 1 về 0.

Sau đó chọn và quét lần lượt các hàng 1,2,3,4,5,6,7,8 như sau:

+ Đèn 1 tắt  Điện áp đưa vào hàng 1 là 0V.

+ Đèn 2 tắt  Điện áp đưa vào hàng 2 là 0V.

+ Đèn 3 sáng  Điện áp đưa vào hàng 3 là 5V.

+ Đèn 4 sáng  Điện áp đưa vào hàng 4 là 5V.

+ Đèn 5 sáng  Điện áp đưa vào hàng 5 là 5V.

+ Đèn 6 sáng  Điện áp đưa vào hàng 6 là 5V.

+ Đèn 7 sáng  Điện áp đưa vào hàng 7 là 5V.

+ Đèn 8 sáng  Điện áp đưa vào hàng 8 là 5V.

Chọn cột 2, nối đất. Sau đó quét lần lượt các hàng 1,2,3,4,5,6,7,8.

+ Đèn 1 tắt  Điện áp đưa vào hàng 1 là 0V.

+ Đèn 2 tắt  Điện áp đưa vào hàng 2 là 5V + Đèn 3 tắt  Điện áp đưa vào hàng 3 là + Đèn 4 tắt  Điện áp đưa vào hàng 4 là 5V + Đèn 5 sáng  Điện áp đưa vào hàng 5 là 0V + Đèn 6 sáng  Điện áp đưa vào hàng 6 là 0V + Đèn 7 sáng  Điện áp đưa vào hàng 7 là 0V + Đèn 8 sáng  Điện áp đưa vào hàng 8 là 0V

- Tiếp tục quét với các cột từ 3 đến 8 bằng cách như trên, sau đó chuyển sang quét đèn LED thứ hai và thứ ba một cách tương tự.

- Để mắt người nhận biết được toàn bộ hình ảnh của ma trận ta phải tiến hành quét nhiều lần. Do mắt người không phân biệt được sự thay đổi ảnh nếu ảnh đó được quét với tốc độ 24 hình/s nên nếu ta quét ảnh với tốc độ lớn hơn hoặc bằng 24 hình/s thì ảnh sẽ chạy liên tục và không bị giật.

c. Phương pháp tạo hiệu ứng nháy DANCER trên bảng LED:

Sau khi đã hiển thị được hình ảnh lên bảng LED. Bây giờ ta sẽ tìm hiểu cách tạo hiệu ứng nháy trên bảng LED. Thủ thuật ở đây là quét và hiển thị một hình ảnh trong một thời gian nhất định, sau đó ta lặp lại chu kỳ quét với một thư viện quét LED khác, khi đó ta sẽ tạo được hiệu ứng nháy dancer trên bảng LED.

Đề tài này ta sử dụng mạch mẫu là bảng LED 8x16, sử dụng 16 byte RAM làm bộ đệm cho màn hình, lưu giá trị dữ liệu hàng của 16 cột. Bộ đệm được khai báo trong RAM nội của chip atmega8 là một mảng gồm 17 phần tử.

Chương trình hiển thị làm nhiệm vụ đọc dữ liệu từ các vị trí 0 đến 16 của bộ đệm và đưa ra màn hình hiển thị.

Sau mỗi lần dịch ta lại gọi chương trình hiển thị. Khi đó trên bảng LED ta sẽ quan sát được hiệu ứng nháy theo nhạc.

3. Lưu đồ thuật toán

Lưu đồ thuật toán

Sau khi xác định được các mức logic cần cấp cho ma trận led thì ta có thể tiến hành điều khiển quá trình cấp nguồn cho led ma trận để có được hình ảnh như ý muốn. Việc cấp nguồn cho led ma trận phụ thuộc vào cách mã hóa dữ liệu (theo từng hàng hay theo từng cột của ma trận). Nếu dữ liệu mã hóa là các hàng trong 1cột (hàng) thì tại một thời điểm ta chỉ cấp nguồn cho một cột (hàng . Quá trình điều khiển hiển thị led ma trận 8x8 theo từng cột (hàng) bao gồm các bước sau :

- B1: Lấy mẫu dữ liệu : lấy các dữ liệu về mức logic cần cấp cho các cột (hàng) của ma trận

- B3: Cấp nguồn cho cột i

- B4: Xuất dữ liệu tương ứng với cột đó ( đã được lấy mẫu từ trước) để cấp nguồn cho các hàng của ma trận

- B5: i=i+1 ; quay lại bước 2 nếu i>8 ,nếu không thì quay lại bước 3.

4. Chương trình lập trình

Sử dụng ngôn ngữ lập trình C để viết chương trình sau đó dung CODEVISION AVR để chuyện dạng file .hex nạp vào IC ATMEGA8.

const int DATA = 12;// pin 12 của Arduino nối với pin DATA của 74HC595 const int CLOCK = 10;//pin 10 của Arduino nối với pin CLOCK của 74HC595 const int LATCH = 11;//pin 11 của Arduino nối với pin LATCH của 74HC595 /* 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};

/*biểu diễn các ký tự chữ và số ở dạng HEX*/

unsigned int characterHEX[][8] = {

{0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x66},//HIEU UNG1 {0x78,0x64,0x68,0x78,0x64,0x66,0x66,0x7C},// HIEU UNG 2 {0x3C,0x62,0x60,0x60,0x60,0x62,0x62,0x3C},// HIEU UNG 3 {0x78,0x64,0x66,0x66,0x66,0x66,0x64,0x78},// HIEU UNG 4 {0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x7E},// HIEU UNG 5 {0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x60},// HIEU UNG 6 {0x3C,0x62,0x60,0x60,0x66,0x62,0x62,0x3C},//HIEU UNG 7 {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x66},// HIEU UNG 8 {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x7E},// HIEU UNG 9 {0x7E,0x18,0x18,0x18,0x18,0x18,0x1A,0x0C},// HIEU UNG10 {0x62,0x64,0x68,0x70,0x70,0x68,0x64,0x62},// HIEU UNG 11 {0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E},// HIEU UNG 12 {0xC3,0xE7,0xDB,0xDB,0xC3,0xC3,0xC3,0xC3},// HIEU UNG13 {0x62,0x62,0x52,0x52,0x4A,0x4A,0x46,0x46},// HIEU UNG14 {0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C},// HIEU UNG15 {0x7C,0x62,0x62,0x7C,0x60,0x60,0x60,0x60},// HIEU UNG16 {0x38,0x64,0x64,0x64,0x64,0x6C,0x64,0x3A},// HIEU UNG17 {0x7C,0x62,0x62,0x7C,0x70,0x68,0x64,0x62},// HIEU UNG18 {0x1C,0x22,0x30,0x18,0x0C,0x46,0x46,0x3C},// HIEU UNG19 {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18},// HIEU UNG20 {0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C},// HIEU UNG21

{0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x18},// HIEU UNG22 {0x81,0x81,0x81,0x81,0x81,0x99,0x99,0x66},// HIEU UNG 23 {0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42},// HIEU UNG24 {0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x18},// HIEU UNG25 {0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E},// HIEU UNG26 {0x3C,0x66,0x66,0x6E,0x76,0x66,0x66,0x3C},// HIEU UNG27 {0x18,0x38,0x58,0x18,0x18,0x18,0x18,0x7E},// HIEU UNG28 {0x3C,0x66,0x66,0x0C,0x18,0x30,0x7E,0x7E},// HIEU UNG29 {0x7E,0x0C,0x18,0x3C,0x06,0x06,0x46,0x3C},// HIEU UNG30 {0x0C,0x18,0x30,0x6C,0x6C,0x7E,0x0C,0x0C},// HIEU UNG31 {0x7E,0x60,0x60,0x7C,0x06,0x06,0x46,0x3C},// HIEU UNG32 {0x04,0x08,0x10,0x38,0x6C,0x66,0x66,0x3C},// HIEU UNG33 {0x7E,0x46,0x0C,0x18,0x18,0x18,0x18,0x18},// HIEU UNG34 {0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C},// HIEU UNG35 {0x3C,0x66,0x66,0x36,0x1C,0x08,0x10,0x20},// HIEU UNG36 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},// HIEU UNG38 {0x00,0x66,0xFF,0xFF,0x7E,0x3C,0x18,0x00}// HIEU UNG37 };

/* ký tự đại diện để biểu diễn trên matrix*/

char character[] = void setup() {

Serial.begin(9600);// Serial với baudrate 9600

/* 3 pins DATA, CLOCK, LATCH cần phải để OUTPUT*/

pinMode(DATA,OUTPUT);

pinMode(CLOCK,OUTPUT);

pinMode(LATCH,OUTPUT);

/* in ra cổng Serial "ENTER A STRING"*/

Serial.println("ENTER A STRING");

}

/* hàm nhấp nháy hiệu ứng*/

times là số lần nhấp nháy, on, off là độ dài của hiệu ứng*/

void blinkImage(unsigned int image[],int times,int on,int off) {

for(int i=0;i<times;i++) {

displayImage(image,on);// hiển thị

clearImage(off);// xóa }

}

/*hàm hiển thị chữ lên LED matrix*/

/* image là hình cần hiển thị, duration là độ dài của hiệu ứng*/

void displayImage(unsigned int image[],int duration) {

for(int hold=0;hold<duration;hold++) {

for(int a=0;a<8;a++) {

digitalWrite(LATCH, LOW);

shiftOut(DATA, CLOCK, MSBFIRST,~image[a]);//column shiftOut(DATA, CLOCK, MSBFIRST,row[a]);//row

digitalWrite(LATCH, HIGH);

delay(1);

} } }

/* hàm clear LED matrix*/

/* duration là độ dài của hiệu ứng clear*/

void clearImage(int duration) {

for(int hold=0;hold<duration;hold++) {

for(int a=0;a<8;a++) {

digitalWrite(LATCH, LOW);

shiftOut(DATA, CLOCK, MSBFIRST,B11111111);//column shiftOut(DATA, CLOCK, MSBFIRST,row[a]);//row

digitalWrite(LATCH, HIGH);

delay(1);

} } }

/*hàm scroll image sang trái*/

/* image là ký tự cần hiển thị*/

void scrollImage(unsigned int image[]) {

int shift, hold, a;//biến shift dùng để lưu số bit cần shiftOut //biến hold dùng để điều chỉnh độ dài của hiệu ứng //biến a dùng để lưu column và row hiện tại

for(shift = 0; shift < 9; shift++) {

for(hold = 0; hold < 30; hold++) {

for(a = 0; a < 8; a++) {

digitalWrite(LATCH, 0);

/* dịch ký tự sang trái*/

shiftOut(DATA,CLOCK,MSBFIRST,~(image[a]<<shift));//column shiftOut(DATA,CLOCK,MSBFIRST,row[a]);//row

digitalWrite(LATCH, 1);

delay(1);

} } } }

void loop() {

String string;// khai báo biến String object /* đọc dữ liệu từ cổng Serial */

while(Serial.available() > 0) {

char ch = Serial.read();

string += ch;// lưu ký tự vừa nhận được vào biến string

delay(5);// delay để đợi ký tự tiếp theo, KHÔNG THỂ THIẾU }

Serial.println(string);// in string ra Serial monitor /* hiển thị ra LED matrix */

while(Serial.available() == 0) {

/*so sánh từng phần tử của string với

Nếu ký tự xuất hiện trong string tồn tại

trong mảng character[] thì hiển thị ra LED matrix, nếu không tồn tại thì báo "invalid character"*/

for(int k = 0;k < string.length();k++) {

for(int i=0;i < sizeof(character);i++) {

if(string.charAt(k) == character[i]) {

//bỏ "//" nếu muốn sử dụng hàm blinkImage() //blinkImage(characterHEX[i],1,30,30);

scrollImage(characterHEX[i]);

break;

}

/* nếu ko tồn tại ký tự xuất hiện trong string*/

if((i == (sizeof(character) - 1)) && (string.charAt(k) != character[i])) {

Serial.print(string.charAt(k));

Serial.println(":invalid character");

} }

/*kiểm tra xem có dữ liệu mới hay không*/

if(Serial.available() > 0) break;

}

delay(300);

} }

Một phần của tài liệu mach Led nháy theo nhạc (Trang 24 - 35)

Tải bản đầy đủ (DOCX)

(43 trang)
w