Giúp người dùng:
Truyền thông nối tiếp là gì?
Truyền thông nối tiếp (UART) là phương thức giao tiếp, truyền thông tin qua lại với nhau giữa các thiết bị.
Hình ảnh truyền nhận 2 thiết bị sử dụng truyền thông nối tiếp UART:
Phương thức giao tiếp
Trong giao tiếp nối tiếp UART, dữ liệu được truyền không đồng bộ, nghĩa là không cần tín hiệu đồng bộ (Clock). Có 1 yếu tố quan trọng trong quá trình truyền nhận dữ liệu UART là tốc độ truyền nhận.
Tốc độ truyền nhận là tốc độ dùng để truyền và nhận dữ liệu. Cả thiết bị truyền và thiết bị nhận cần giao tiếp trên cùng 1 tốc độ để quá trình truyền nhận được hoàn thành.
Một số tốc độ truyền nhận tiêu chuẩn là: 4800 bps, 9600 bps, 19200 bps, 115200 bps… Trong đó, tốc độ 9600 đến 115200 bps là tốc độ thường được sử dụng nhiều nhất.
Đừng quên khi giao tiếp 2 thiết bị ta phải kết nối chung GND, vì nếu chưa thì chúng sẽ không hiểu mức logic của nhau sẽ không giao tiếp được.
Ứng dụng trong thực tế
Ngày nay, UART được sử dụng phổ biến trong các ứng dụng như: Điều khiển thiết bị qua sóng bluetooth, wifi, thiết bị định vị GPS, truyền nhận giao tiếp không dây… Trên tài nguyên mạch C88 được tích hợp sẵn 1 bộ truyền thông nối tiếp UART.
/* Lưu ý cho người mới tiếp cận với lập trình: ngôn ngữ lập trình cho mạch C88 là C/C++ nên chúng ta cần lưu ý phân biệt chữ hoa chữ thường và các dấu chấm, dấu phẩy, dấu chấm phẩy... */
a. Hàm Serial.begin()
Cấu trúc: Serial.begin(x);
Trong đó: x là tốc độ truyền nhận (baud), các tốc độ thường dùng: 9600 bps, 57600 bps, 115200 bps…
Lưu ý: Giữa 2 thiết bị giao tiếp với nhau cần được khai báo tốc độ baud như nhau để trao đổi dữ liệu được hiệu quả và chính xác.
Ý nghĩa: Có chức năng khai báo sử dụng Serial với tốc độ truyền nhận mong muốn
Ứng dụng: Sử dụng để giao tiếp truyền thông UART
Ví dụ: Khởi tạo tốc độ truyền nhận 9600 bps
b. Hàm Serial.available()
Cấu trúc: Serial.available();
Ý nghĩa: Hàm này trả về số byte dữ liệu nhận có trong bộ đệm.
Ứng dụng: Được dùng để xét xem đã có dữ liệu chưa, hoặc lượng dữ liệu cần nhận đã đủ chưa.
Ví dụ: Hiển thị số byte nhận được
c. Hàm Serial.read()
Cấu trúc: Serial.read();
Ý nghĩa: Hàm này sẽ đọc từng byte một, dữ liệu trong bộ đệm mỗi lần gọi sẽ đọc 1 byte. Nếu không có dữ liệu thì sẽ trả về -1.
Ứng dụng: Đọc dữ liệu nhận được.
Ví dụ: Thực hiện đọc dữ liệu gửi về
d. Hàm Serial.print()
Cấu trúc: Serial.print(y);
Trong đó: y là văn bản, dữ liệu này có thể là các kiểu dữ liệu như String, int, byte, char, double,…
Ý nghĩa: Chức năng truyền ghi dữ liệu, văn bản và ta sử dụng hàm này khi cần ghi dữ liệu lên Serial Monitor trên cùng 1 dòng.
Ứng dụng: Hiển thị dữ liệu lên máy tính qua Serial Monitor
Ví dụ: In lên màn hình văn bản “Mach C88” trên cùng một dòng
e. Hàm Serial.println()
Cấu trúc: Serial.println(y);
Trong đó: y là văn bản, dữ liệu này có thể là các kiểu dữ liệu như String, int, byte, char, double,…
Ý nghĩa: Chức năng truyền ghi dữ liệu, văn bản và tự động xuống dòng với nội dung ghi trên Serial Monitor.
Ứng dụng: Hiển thị dữ liệu lên máy tính qua Serial Monitor
Ví dụ: In lên màn hình văn bản “HELLO WORD” kết thúc câu xuống dòng
Bài 1.
Thiết kế, viết chương trình giao tiếp mạch C88 với máy tính, thông qua cổng Serial Monitor và hiển thị kí tự đã nhận từ máy tính gửi xuống.
a. Mã lệnh
char kitu; // tạo biến kiểu char để đọc kí tự gửi về
void setup() {
Serial.begin(9600); // Khởi tạo Serial Monitor tốc độ 9600
}
void loop () {
if (Serial.available() > 0) // nếu có dữ liệu gửi về
{
kitu = Serial.read(); // đọc kí tự gửi về rồi lưu vào biến kitu
Serial.print("ki tu nhan duoc:"); // hiển thị một dòng chữ nội dung quá trình nhận
Serial.println(kitu); // hiển thị kí tự đã nhận được từ mạch C88 lên cổng Serial
}
delay(500); // tạo trễ 500 ms
}
b. Kết quả (Mạch hoạt động thế nào)
Bài 2.
Thiết kế, viết chương trình giao tiếp 2 mạch C88 với nhau:
+) Đặt bo C88 (số 1) làm Master truyền dữ liệu và bo C88 (số 2) làm Slave nhận dữ liệu.
+) Khi bo Slave nhận được kí tự thỏa thuận, đầu ra rơ le R.0 (D4) được điều khiển.
a. Sơ đồ lắp ráp
b. Mã lệnh
Chương trình Master:
void setup() {
Serial.begin(9600); // Khởi tạo Serial Monitor tốc độ 9600
}
void loop () {
Serial.println('A'); // gửi kí tự 'A' đi cho bên bo Slave
delay(1000); // tạo trễ 1 giây
Serial.println('a'); // gửi kí tự 'a' đi cho bên bo Slave
delay(1000); // tạo trễ 1 giây
}
Chương trình Slave:
#define R0 4 // cấu hình rơ le R0 có chiều ra
char kitu; // tạo biến kiểu char để đọc kí tự gửi về
void setup() {
Serial.begin(9600); // Khởi tạo cổng Serial Monitor tốc độ 9600
pinMode(R0, OUTPUT); // cấu hình rơ le R0 có chiều ra
}
void loop () {
if (Serial.available() > 0) // nếu có dữ liệu gửi về
{
kitu = Serial.read(); // đọc kí tự gửi về rồi lưu vào biến kitu
Serial.println(kitu); // hiển thị kí tự đã nhận được từ mạch C88 lên cổng Serial
}
if (kitu == 'A') { // nếu nhận được kí tự 'A' từ bo Master
digitalWrite(R0, HIGH); // bật rơ le R0
}
if (kitu == 'a') { // nếu nhận được kí tự 'a' từ bo Master
digitalWrite(R0, LOW); // tắt rơ le R0
}
}
c. Kết quả (Mạch hoạt động thế nào)
Link video: https://youtu.be/o1HwL2tReJk
Thiết kế, chế tạo hệ thống điều khiển bật / tắt thiết bị qua sóng Bluetooth hệ điều hành Android.
a. Chuẩn bị
+) Mạch C88
+) Module bluetooth HC-05.
Cài đặt mặc định của Mô-đun Bluetooth HC-05:
Khi mua các module bluetooth HC-05 ở các cửa hàng linh kiện hoặc trên web mặc định ban đầu sẽ có các thông số sau.
Giới thiệu app Bluetooth C88:
Cách cài đặt App Bluetooth C88:
Link cài : https://4dot0.net/upload/file/app-bluetoohc88.apk
Video hướng dẫn cài đặt và sử dụng app: https://youtu.be/8xSl3oRfiLs
Lưu ý:
Giao diện ứng dụng:
b. Sơ đồ lắp ráp
c. Mã lệnh
#define R0 4 // Định nghĩa "R0" được kết nối với chân digital 4
#define R1 3 // Định nghĩa "R1" được kết nối với chân digital 3
#define R2 2 // Định nghĩa "R2" được kết nối với chân digital 2
#define R3 17 // Định nghĩa "R3" được kết nối với chân digital 17
char kitu; // tạo biến kiểu char để đọc kí tự gửi về
void setup() {
Serial.begin(9600); // Khởi tạo Serial Monitor tốc độ 9600
pinMode(R0, OUTPUT); // cấu hình rơ le R0 có chiều ra
pinMode(R1, OUTPUT); // cấu hình rơ le R1 có chiều ra
pinMode(R2, OUTPUT); // cấu hình rơ le R2 có chiều ra
pinMode(R3, OUTPUT); // cấu hình rơ le R3 có chiều ra
}
void loop() {
if (Serial.available() > 0) // nếu có dữ liệu gửi về
{
kitu = Serial.read(); // đọc kí tự gửi về rồi lưu vào biến kitu
Serial.print("ki tu nhan duoc:"); // hiển thị một dòng chữ nội dung quá trình nhận
Serial.println(kitu); // hiển thị kí tự đã nhận được từ mạch C88 lên cổng Serial
}
else if (kitu == 'A') { // nếu nhận được kí tự 'A'
digitalWrite(R0, HIGH); // bật rơ le R0
}
else if (kitu == 'a') { // nếu nhận được kí tự 'a'
digitalWrite(R0, LOW); // tắt rơ le R0
}
else if (kitu == 'B') { // nếu nhận được kí tự 'B'
digitalWrite(R1, HIGH); // bật rơ le R1
}
else if (kitu == 'b') { // nếu nhận được kí tự 'b'
digitalWrite(R1, LOW); // tắt rơ le R1
}
else if (kitu == 'C') { // nếu nhận được kí tự 'C'
digitalWrite(R2, HIGH); // bật rơ le R2
}
else if (kitu == 'c') { // nếu nhận được kí tự 'c'
digitalWrite(R2, LOW); // tắt rơ le R2
}
else if (kitu == 'D') { // nếu nhận được kí tự 'D'
digitalWrite(R3, HIGH); // bật rơ le R3
}
else if (kitu == 'd') { // nếu nhận được kí tự 'd'
digitalWrite(R3, LOW); // tắt rơ le R3
}
delay(500); // tạo trễ 500 ms
}
Lưu ý: Trong quá trình, ta nạp chương trình lên bo C88 bạn phải nhớ gỡ 2 dây Tx và Rx trên bo C88 khi đã kết nối với HC - 05 nhé để tránh bị xung đột, lỗi chương trình. Sau khi quá trình nạp hoàn thành thì bạn cắm lại 2 dây kia vào vị trí Rx và Tx.
d. Kết quả (Mạch hoạt động thế nào)
Link video: https://youtu.be/8GcYdwSYgv4