Giao tiếp Arduino với một số linh kiện điện tử.
7) Project 7: Giao tiếp Arduino với LCD 16×2.
Giao tiếp giữa Arduino và LCD 16×2 rất đơn giản bởi vì Arduino IDE đã có sẵn thư viện cho LCD là LiquidCrystal.h, công việc của chúng ta là hiểu và biết cách sử dụng thư viện này mà thôi.
Sơ đồ mạch:
Code chương trình :
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // thiet lap chan cho LCD
void setup() {
lcd.begin(16, 2); // thiet lap loai LCD su dung la 16 cot va 2 dong
}
void loop() {
introduce();
basicPrintDemo();
displayOnOffDemo();
setCursorDemo();
scrollLeftDemo();
scrollRightDemo();
cursorDemo();
createGlyphDemo();
}
void introduce(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“HV HANG KHONG VN”);
lcd.setCursor(1,1);
lcd.print(“HD SD ARDUINO”);
delay (1000);
for(int x=0; x < 3; x++) {
lcd.noDisplay(); //tat hien thi
delay(300);
lcd.display(); // bat hien thi
delay(300);
}
}
void basicPrintDemo() {
lcd.clear(); // xoa man hinh
lcd.print(“HV HANG KHONG”);
delay(1000);
}
void displayOnOffDemo() {
lcd.clear();
lcd.print(“BAT/TAT MAN HINH”);
for(int x=0; x < 3; x++) {
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
}
}
void setCursorDemo() {
lcd.clear();
lcd.print(“Setup Cursor”);
delay(500);
lcd.clear();
lcd.setCursor(5,0); // thiet lap con tro o vi tri cot 5 hang 0
lcd.print(“5,0”);
delay(500);
lcd.setCursor(10,1); // thiet lap con tro cot 10 hang thu 1
lcd.print(“10,1”);
delay(500);
lcd.setCursor(3,1); // thiet lap con tro o vi tri cot 3 hang 1
lcd.print(“3,1”);
delay(500);
}
void scrollLeftDemo() {
lcd.clear();
lcd.print(“Scroll Left Demo”);
delay(500);
lcd.clear();
lcd.setCursor(7,0);
lcd.print(“Beginning”);
lcd.setCursor(9,1);
lcd.print(“Arduino”);
delay(500);
for(int x=0; x<16; x++) {
lcd.scrollDisplayLeft(); // cuon man hinh sang trai
delay(250);
}
}
void scrollRightDemo() {
lcd.clear();
lcd.print(“Scroll Right”);
lcd.setCursor(0,1);
lcd.print(“Demo”);
delay(500);
lcd.clear();
lcd.print(“Beginning”);
lcd.setCursor(0,1);
lcd.print(“Arduino”);
delay(500);
for(int x=0; x<16; x++) {
lcd.scrollDisplayRight(); // cuon mang hinh sang phai
delay(250);
}
}
void cursorDemo() {
lcd.clear();
lcd.cursor(); // bat con tro
lcd.print(“Cursor On”);
delay(1000);
lcd.clear();
lcd.noCursor(); // tat con tro
lcd.print(“Cursor Off”);
delay(1000);
lcd.clear();
lcd.cursor();
lcd.blink(); // nhap nhay con tro
lcd.print(“Cursor Blink On”);
delay(1000);
lcd.noCursor();
lcd.noBlink(); // tat nhap nhay con tro
}
void createGlyphDemo() {
lcd.clear();
byte char1[8] = { //tạo chữ “ô”
B01110,
B10001,
B00000,
B01110,
B10001,
B10001,
B01110,
B00000
};
byte char2[8] = { //tạo chữ “ơ”
B01110,
B00001,
B00010,
B01110,
B10001,
B10001,
B01110,
B00000
};
lcd.createChar(0, char1); // tao ky tự tuỳ chỉnh 0
lcd.createChar(1, char2); // tạo ký tự tuỳ chỉnh 1
for(int x=0; x<5; x++) {
lcd.setCursor(8,0);
lcd.write(byte(0)); // in chữ “ô” ra màn hình
delay(1000);
lcd.setCursor(8,0);
lcd.write(byte(1)); // in chữ “ơ” ra màn hình
delay(1000);
}
}
Giải thích chương trình:
Đầu tiên chúng ta khai báo thư viện mà chúng ta sẽ sử dụng để điều khiển LCD. Như đã nói ở trên chúng ta sẽ sử dụng thư viện có tên là LiquidCrystal.h. Có rất nhiều thư viện và code mẫu cho những loại LCD khác, bạn có thể truy cập vào trang web
http://www.arduino.cc/playground/Code/LCD để tải về sử dụng.
Để khai báo thư viện cho LCD hay bất cứ thư viện nào khác ta dùng câu lệnh
#include <tenthuvien.h>
Trong trường hợp này ta khai báo là :
#include <LiquidCrystal.h>
Tiếp theo tạo một đổi tượng và gán chân cho nó bằng câu lệnh :
LiquidCrystal Object(RS, E, D4, D5, D6, D7);
Như vậy trong đoạn code trên tôi đã khai báo một đối tượng có tên là lcd ( các bạn có thể thay thế lcd bằng những từ khác mà các bạn muốn ) và chân 12 của Arduino nối với chân RS, chân 11 nối với E và các chân 5 đến chân 2 lần lượt nối với D4 đến D7 trên LCD 16×2.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Trong hàm setup() chúng ta cần khai báo loại LCD mà chúng ta sử dụng. Vì trong thư viện LiquidCrystal.h hỗ trợ rất nhiều loại LCD chẳng hạn như 16×2, 16×4, 20×2, 20×4, GLCD….Ở đây chúng ta sử dụng 16×2 thì ta khai báo.
lcd.begin(16,2);
Trong loop() chúng ta có 8 chương trình con, và tôi sẽ giải thích từng chương trình
con.
Chương trình con thứ 1: introduce().
Đây là chương trình giới thiệu.
Chương trình con thứ 2: basicPrintDemo()
Trong chương trình con này chúng ta sẽ điều khiển sao cho LCD hiển thị dòng chứ mà ta mong muốn.
Đầu tiên chúng ta xoá tất cả màn hình bằng câu lệnh:
lcd.clear();
Chúng ta cần lưu ý đối tượng lcd : nếu như ban đầu chúng ta khai báo đổi tượng là
LCD16x2 thì chúng ta phải viết câu lệnh là LCD16x2.clear().
Để hiển thị một dòng ký tự bất kỳ lên màn hình thì ta dùng câu lệnh print() cụ thể trong trường hợp này là:
lcd.print(“HV HANG KHONG”);
Các ký tự bên trong ngoặc kép sẽ được hiển thị lên màn hình, nếu tổng các ký tự lớn hơn 16, thì các ký tự từ thứ 17 trở đi sẽ không được hiển thị lên màn hình.
Chương trình con thứ 3: displayOnOffDemo()
Trong chương trình con này hướng dẫn cho chúng ta các câu lệnh chức năng bật và tắt màn hình. Ta cần quan tâm tới 2 câu lệnh sau.
lcd.nodisplay();
Câu lệnh này có chức năng tắt màn hình hiển thị.
lcd.display();
Câu lệnh này cho phép hiển thị màn hình.
Chương trình con thứ 4: setCursorDemo()
Chương trình con này hướng dẫn chúng ta các câu lệnh dịch chuyển vị trí con trỏ theo ý muốn, các câu lệnh cần quan tâm đó là:
lcd.setCursor(5,0);
lcd.print(“5,0”);
Dịch con trỏ đến cột thứ 5 hàng thứ 0. Sau đó xuất ra màn hình LCD “5,0” từ cột thứ 5 hàng 0 trở đi.
lcd.setCursor(10,1); // thiet lap con tro cot 10 hang thu 1
lcd.print(“10,1”);
Dịch con trỏ đến vị trí cột 10 hàng thứ 1. Xuất ra màn hình “10,1”
Tương tự như vậy đối vơi 2 câu lệnh cuối là :
lcd.setCursor(3,1); // thiet lap con tro o vi tri cot 3 hang 1
lcd.print(“3,1”);
Chương trình con thứ 5: scrollLeftDemo()
Chương trình con này sẽ dịch các ký tự đang hiển thị trên màn hình sang bên trái. Các câu lệnh trong chương trình con này không khó, chúng ta chỉ quan tâm tới các câu lệnh sau:
for(int x=0; x<16; x++) {
lcd.scrollDisplayLeft(); // cuon man hinh sang trai delay(250);
}
Trong vòng lặp chúng ta có câu lệnh:
lcd.scrollDisplayLeft();
Mỗi lần chương trình thực hiện câu lệnh này sẽ dịch tất cả các ký tự đang hiển thị trên màn hình sang bên trái 1 cột. Chúng ta có vòng lặp 16 lần như vậy các ký tự sẽ được dịch hết về bên trái.
Khi vòng lặp thực hiện được 16 lần thì màn hình sẽ trống hoàn toàn.
Chương trình con thứ 6: scrollRightDemo()
Hoàn toàn tương tự như scrollLeftDemo() chương trình con này sẽ thực hiện dịch phải các ký tự trên màn hình.
Câu lệnh cần quan tâm là: lcd.scrollDisplayRight();
Chương trình con thứ 7: cursorDemo()
Ở phần này chúng ta sẽ tìm hiểu các câu lệnh điều khiển con trỏ bật, tắt và nhấp nháy.
lcd.cursor() : câu lệnh này cho phép chúng ta bật con trỏ.
lcd.noCursor(): tắt con trỏ
lcd.blink(): nhấp nháy con trỏ
Chương trình con thứ 8: createGlyphDemo()
Bây giờ chúng ta sẽ tìm hiều cách tự tạo ra một ký tự không thuộc hệ thống mã ASCII, chẳng hạn như các chữ cái có dấu trong hệ thống chữ cái tiếng việt như ă, â, ô,ơ ….
Đối với LCD 16×2 cứ mỗi ký tự trong một ô sẽ được tạo thành từ 5×8 ô nhỏ ( 5 cột, 8 dòng)
Để tạo một ký tự thì chúng ta dùng một mãng gồm 8 phần tử, mỗi phần tử là 1 byte, nhưng chỉ sử dụng 5 bit thấp của 1 byte để biểu diễn ký tự đó.
byte happy[8] = { //tạo chữ “ô”
B01110,
B10001,
B00000,
B01110,
B10001,
B10001,
B01110,
B00000
};
byte sad[8] = { tạo chữ “ơ”
B01110,
B00001,
B00010,
B01110,
B10001,
B10001,
B01110,
B00000
};
Sau khi đã tạo được ký tự mong muốn ta sử dụng câu lệnh:
lcd.createchar(num,data);
Trong đó:
num: là các chữ số tứ 0 đến 7.
data: là các mãng chứa ký tự của chúng ta.
Câu lệnh này sẽ gán ký tự ta đã tạo vào một chữ số.
lcd.createChar(0, happy);
lcd.createChar(1, sad);
Để hiển thị một ký tự ra màn hình ta dùng câu lệnh lcd.write(data).
Hiển thị chữ “ô” ra màn hình LCD.
lcd.write(byte(0));
Hiển thị chữ “ơ” ra màn hình LCD
lcd.write(byte(1));
8) Project 8: Giao tiếp với máy tính.
Trong phần này tôi sẽ trình bày cách để giao tiếp giữa Arduino với máy tính thông qua chuẩn giao tiếp nối tiếp không đồng bộ UART.
Điều khiển bật tắt bằng cách gửi lệnh từ máy tính.
Sơ đồ mạch:
Dùng cáp USB kết nối Arduino với máy tính. Led nối với chân 13 thông qua điện trở 220 ohm.
Code chương trình:
int ledpin =13;
void setup() {
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
}
void loop() {
if( Serial.available()>0)
char setupled = Serial.read();}
switch(setupled)
{
case ‘1’ : {
digitalWrite(ledpin,HIGH); break;
}
case ‘0’:
{
digitalWrite(ledpin,LOW); break; }}}
Giải thích chương trình:
Để có thể điều khiển được led bật tắt chúng ta cần mở Serial monitor bằng cách nhấp
Trong chương trình ta cần chú ý tới các câu lệnh sau:
Serial.begin(9600);
Câu lệnh này thiết lập tốc độ truyền dữ liệu của chúng ta là 9600 bps.
Chúng ta có thể thiết lập các tốc độ khác như 300, 1200, 2400, 4600, 9600, 19200, 57600, 115200. Cần lưu ý rằng để tốc độ truyền giữa máy tính và thiết bị phải giồng nhau, nêu không thì dữ liệu nhận được sẽ bị lỗi.
Trong vòng lặp loop() chúng ta có câu lệnh:
Serial.available()>0
Câu lệnh này dùng để kiểm tra xem có dữ liệu truyền tới hay không. Ngoài ra Serial.available() còn trả về cho chúng ta số ký tự đã được truyền tới Arduino
char setupled = Serial.read();
Khi dữ liệu được truyền tới Arduino thì dữ liệu sẽ được lưu vào bộ nhớ đệm. Chúng ta khai báo biến setupled với kiểu dữ liệu char và dùng hàm Serial.read() để truy suất dữ liệu trong bộ nhớ đệm và lưu vào trong nó. Như vậy ký tự đầu tiên trong chuỗi ký tự được truyền tới sẽ được gán vào setupled. Dùng hàm Switch-case để kiểm tra, nếu là “1” thì sáng led, nếu là “0” thì tắt led, các trường hợp còn lại thì không làm gì.