Kết nối UART ESP32 – Kèm code mẫu trên Arduino IDE

Trong bài này, chúng ta sẽ tìm hiểu về giao tiếp UART ESP32. Cụ thể, chúng ta sẽ thực hiện giao tiếp giữa 2 mạch ESP32, dựa trên thư viện UART đã được hỗ trợ trong Arduino IDE.

Trên thực tế, để chia sẻ khối lượng công việc, các mạch ESP32 cần có sự giao tiếp với nhau. Phương pháp giao tiếp phổ biến nên dùng là UART.

Chúng ta sẽ dùng Arduino IDE để lập trình ESP32, do đó, bạn cần phải cài đặt Arduino IDE phiên bản mới nhất và có cài tiện ích ESP32 bên trong nhé!

UART là gì?

UART (Universal Asynchronous Receive Transmit) còn có thể gọi là giao tiếp nối tiếp (Serial Communication), đây là một trong những cách thức giao tiếp đơn giản nhất giữa các thiết bị. Chúng truyền tải dữ liệu theo thứ tự từng bit.

Ưu điểm của phương thức giao tiếp này là cả 2 thiết bị đều không cần có cùng tần số hoạt động. IoTZone đã có bài viết chi tiết về giao tiếp UART là gì, bạn có thể xem qua bài viết trước đó nhé!

Cách hoạt động của UART ESP32

Cách hoạt động của UART ESP32

Cần phải có 2 UART để chúng có thể liên lạc với nhau:

  • UART 1: Chuyển đổi dữ liệu song song từ CPU thành dữ liệu nối tiếp, sau đó gửi dữ liệu nối tiếp này tới UART 2
  • UART 2: Nhận dữ liệu nối tiếp và chuyển thành dữ liệu song song, để thiết bị nhận có thể truy cập và đọc hiểu.

Dữ liệu khi truyền đi sẽ có bit start và bit stop để xác định điểm bắt đầu và điểm kết thúc của một gói dữ liệu. Nhờ vào đó, thiết bị nhận có thể biết khi nào nên bắt đầu đọc và khi nào nên dừng đọc các bit.

Cụ thể, UART ESP32 nhận sẽ phát hiện các bit start và tiến hành đọc các bit dữ liệu, với tần số đọc (tốc độ truyền) nhất định. Baud là thước của tốc độ truyền này, với đơn vị là bit/giây (bps), chúng ta có thể thay đổi giá trị baud khi lập trình.

Để việc truyền dữ liệu thành công, cả UART gửi và UART nhận đều phải có tốc độ truyền giống nhau. Bạn cần lưu ý vấn đề này khi khởi tạo kết nối ESP32 UART Arduino nhé!

Các chân UART ESP32

Thông thường, các mạch ESP32 được tích hợp sẵn 3 chân UART, bao gồm UART0, UART1 và UART 2. Cả 3 chân này đều hoạt động ở mức điện áp 3,3V và có 4 chân là Rx, Tx, RTS và CTS. Tuy nhiên, khi dùng với Arduino IDE thì chúng ta chỉ cần quan tâm đến Tx và Rx.

Mặc định, chúng ta chỉ có thể dùng các chân UART 0 và UART 2. Với UART 1, bạn cần phải cấu hình lại các chân, vì chân mặc định của chúng thường được nối với GPIO 9, GPIO 10 – đây là những chân được nối với bộ nhớ flash SPI nên có thể gây ra xung đột khi sử dụng.

Ngoài ra, bạn cũng nên tham khảo sơ đồ chân GPIO của mạch ESP32 mình sử dụng, để lựa chọn chân UART ESP32 phù hợp cho dự án này nhé!

Sơ đồ GPIO - Tìm hiểu về các chân UART ESP32

Câu lệnh làm việc với UART ESP32

Trong Arduino IDE, chúng ta sử dụng thư viện HardwareSerial để khởi tạo các giao tiếp UART ESP32. Do đó, bước đầu tiên bạn cần tải thư viện về phần mềm.

Trong code, bạn khai báo thư viện:

#include <HardwareSerial.h>

Tiếp theo, bạn cần khai báo chân UART ESP32 đã dùng:

Serial.begin()   //dùng lệnh này nếu bạn sử dụng UART0
HardwareSerial SerialPort(1)  //dùng lệnh này nếu bạn sử dụng UART1
HardwareSerial SerialPort(2)  //dùng lệnh này nếu bạn sử dụng UART2

Trong setup(), bạn tạo giao tiếp ESP32 UART Arduino bằng câu lệnh bên dưới, bao gồm 4 thông số:

  • BaudRate: Tốc độ truyền của giao tiếp nối tiếp.
  • SerialMode: Chế độ nối tiếp.
  • Rx_pin: Chân Rx đang dùng.
  • Tx_Pin: Chân Tx đang dùng.
SerialPort.begin (BaudRate, SerialMode, RX_pin, TX_pin).

Chương trình mẫu:

  • Trường hợp 1: Nếu sử dụng UART 2, bạn viết code như sau:
#include <HardwareSerial.h>

HardwareSerial SerialPort(2); // dùng lệnh này nếu bạn sử dụng UART2

void setup()  
{
  SerialPort.begin(9600, SERIAL_8N1, 16, 17); 
}
  • Trường hợp 2: Nếu dùng UART 1, bạn viết code như bên dưới (lưu ý: thường thì UART 1 kết nối với chân GPIO 9 và GPIO 10. Như đã giải thích phía trên, dùng chân này sẽ gây xung đột với bộ nhớ Flash. Do đó, mình gán lại chân khác cho UART 1 để khởi tạo giao tiếp UART, cụ thể là chân GPIO 4 và GPIO 2 như bên dưới):
#include <HardwareSerial.h>

HardwareSerial SerialPort(1); // dùng lệnh này nếu bạn sử dụng UART1

void setup()  
{
  SerialPort.begin(15200, SERIAL_8N1, 4, 2); 
}

Cách giao tiếp giữa ESP32 và ESP32 bằng UART

Mình sẽ dùng mô hình Master – Slave để khởi tạo giao tiếp UART ESP32, trong đó 1 mạch ESP32 làm Slave và 1 mạch khác làm Master:

  • ESP32 Master gửi dữ liệu đến ESP32 Slave (là số “0” hoặc “1”)
  • ESP32 Slave nhận dữ liệu và điều khiển bật / tắt đèn, tùy vào dữ liệu nó nhận được là số 1 hay 0.

IoTZone sẽ dùng UART 2 để kết nối 2 mạch ESP32 này.

Chuẩn bị phần cứng

  • 2 mạch ESP32 khác nhau
  • 1 đèn LED 5mm
  • 1 điện trở 220 Ohm
  • Breadboard
  • Dây Jumper

Kết nối phần cứng

ESP32 MasterESP32 Slave
Chân Tx2Chân Rx2
Chân Rx2Chân Tx2

Ngoài ra, chân Anode đèn LED nối với chân Digital 15 trên ESP32 Slave thông qua điện trở 220 Ohm, chân Cathode điện trở thì nối đất.

Sơ đồ kết nối gửi dữ liệu giữa 2 mạch ESP32 qua UART ESP32

Lưu ý: Bạn cần đảm bảo 2 mạch ESP32 đều có điểm chung:

Sơ đồ kết nối gửi dữ liệu giữa 2 mạch ESP32 qua UART ESP32

Code cho ESP32 Master

Bạn copy và nạp code sau vào mạch ESP32 dùng làm Master, để chuẩn bị cho việc kết nối UART ESP32:

#include <HardwareSerial.h>

HardwareSerial SerialPort(2); // Sử dụng dòng lệnh này nếu bạn dùng UART 2


void setup()  
{
  SerialPort.begin(15200, SERIAL_8N1, 16, 17); 
} 
void loop()  
{ 
  SerialPort.print(1);
  delay(5000);
  SerialPort.print(0);
  delay(5000);
}

Code cho ESP32 Slave

Tương tự, bạn copy và nạp code sau vào mạch ESP32 dùng làm Slave, để chuẩn bị cho việc kết nối UART ESP32:

#include <HardwareSerial.h>

HardwareSerial SerialPort(2); //Sử dụng dòng lệnh này nếu bạn dùng UART 2


char number  = ' ';
int LED = 15;

void setup()
{
  SerialPort.begin(15200, SERIAL_8N1, 16, 17);
  pinMode(LED, OUTPUT);
}
void loop()
{
  if (SerialPort.available())
  {
    char number = SerialPort.read();
    if (number == '0') {
      digitalWrite(LED, LOW);
    }
    if (number == '1') {
      digitalWrite(LED, HIGH);
    }
  }
}

Kết quả dự án

Sau khi nạp 2 code vào cả 2 mạch ESP32, bạn sẽ thấy đèn LED sẽ bật trong 5 giây, sau đó tắt trong 5 giây. Trường hợp này sẽ lặp lại liên tục, nếu ESP32 Master tiếp tục gửi giá trị 1 và 0 liên tục tới ESP32 Slave:

Demo cách kết nối UART ESP32 giữa 2 mạch
Demo cách kết nối UART ESP32 giữa 2 mạch

>> Bài viết cùng chủ đề: Cách kết nối Bluetooth ESP32 – Hướng dẫn chi tiết kèm code mẫu

Lời kết

Trên đây là hướng dẫn chi tiết về UART ESP32, kèm theo cách kết nối và code mẫu để 2 mạch ESP32 có thể giao tiếp với nhau qua UART. Chúc các bạn thành công! Bạn cũng có thể tham khảo Blog hướng dẫn ESP32 để tìm kiếm nhiều chủ đề hướng dẫn thú vị khác nhé!

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *