Tìm theo

Danh mục

Xem tất cả
top banner

Ví dụ về giao tiếp ESP32 UART

Ví dụ về giao tiếp ESP32 UART

Giới thiệu UART

Universal Asynchronous Receive Transmit (UART) hoặc Serial communication là một trong những giao thức truyền thông đơn giản nhất giữa hai thiết bị. Nó truyền dữ liệu giữa các thiết bị bằng cách kết nối hai dây giữa các thiết bị, một là đường truyền trong khi dây còn lại là đường truyền. Dữ liệu truyền từng chút một kỹ thuật số dưới dạng bit từ thiết bị này sang thiết bị khác. Ưu điểm chính của giao thức truyền thông này là không cần thiết cho cả hai thiết bị có cùng tần số hoạt động. Ví dụ, hai bộ vi điều khiển hoạt động ở các tần số xung nhịp khác nhau có thể giao tiếp với nhau dễ dàng thông qua giao tiếp nối tiếp. Tuy nhiên, tốc độ bit được xác định trước được gọi là tốc độ truyền thường được đặt trong bộ nhớ flash của cả hai bộ vi điều khiển để cả hai thiết bị hiểu lệnh.

Truyền và nhận dữ liệu nối tiếp

UART truyền lấy byte dữ liệu và truyền các bit ở dạng tuần tự. Máy phát thứ hai là máy thu tập hợp lại các bit thành một byte hoàn chỉnh. Truyền dữ liệu nối tiếp qua một dây thực sự tiết kiệm chi phí hơn so với truyền song song qua nhiều dây.

Giao tiếp giữa hai thiết bị UART có thể là một mặt, song công toàn phần hoặc nửa song công. Giao tiếp Simplex là một loại giao tiếp một hướng trong đó tín hiệu di chuyển từ UART này sang UART khác. Nó không có điều khoản cho UART nhận để gửi tín hiệu trở lại. Song công toàn phần là khi cả hai thiết bị có thể truyền và nhận thông tin liên lạc cùng một lúc. Một nửa song công là khi các thiết bị thay phiên nhau truyền và nhận.

Cấu trúc của giao thức UART

  • Một UART chứa một máy phát điện đồng hồ. Điều này cho phép lấy mẫu trong một khoảng thời gian ngắn.

  • Nó cũng chứa các thanh ghi ca đầu vào và đầu ra.

  • Điều khiển truyền và nhận.

  • Một logic điều khiển đọc hoặc ghi.

  • Các thành phần tùy chọn khác của UART là: truyền hoặc nhận bộ đệm, bộ nhớ đệm FIFO và bộ điều khiển DMA.

Công nghệ UART

Cách đây không lâu, bàn phím, chuột và máy in có dây cáp dày và đầu nối rườm rà. Chúng phải được vặn vào máy tính theo đúng nghĩa đen. Những thiết bị sử dụng UART để giao tiếp với máy tính. Mặc dù những loại cáp rườm rà này đã được thay thế bằng USB, bạn vẫn có thể tìm thấy UART đang được sử dụng trong các thiết bị điện tử DIY như Raspberry Pi, Arduino và các bộ vi điều khiển phổ biến khác. Chúng ta có thể sử dụng nó để kết nối các mô-đun Bluetooth và mô-đun GPS.

UART có giao thức truyền khác với các giao thức truyền thông khác. Nó là một fount mạch vật lý trong một vi điều khiển. Nó cũng có thể hoạt động như một mạch tích hợp độc lập. Một ưu điểm đáng kể của UART là nó chỉ dựa vào hai dây để truyền dữ liệu.

Làm thế nào để hai thiết bị giao tiếp thông qua UART?

Phải mất hai UART để giao tiếp trực tiếp với nhau. Ở một đầu, UART truyền chuyển đổi dữ liệu song song từ CPU thành dạng nối tiếp sau đó truyền dữ liệu ở dạng nối tiếp đến UART thứ hai, dữ liệu này sẽ nhận dữ liệu nối tiếp và chuyển đổi nó trở lại thành dữ liệu song song. Dữ liệu này sau đó có thể được truy cập từ thiết bị nhận.

Thay vì áo choàng báo hiệu việc truyền và nhận bit, hãy sử dụng tín hiệu bit bắt đầu và dừng cho các gói dữ liệu. Các bit bắt đầu và dừng này xác định điểm bắt đầu và phần cuối của các gói dữ liệu. Do đó, UART nhận được biết khi nào nên bắt đầu và ngừng đọc các bit.

UART nhận sẽ phát hiện bit bắt đầu sau đó bắt đầu đọc các bit. Tần số cụ thể được sử dụng để đọc các bit đến được gọi là tốc độ truyền. Tốc độ truyền là một thước đo được sử dụng cho tốc độ truyền dữ liệu. Đơn vị được sử dụng cho tốc độ truyền là bit trên giây (bps). Để việc truyền dữ liệu thành công, cả UART truyền và nhận phải hoạt động ở tốc độ truyền gần như nhau. Tuy nhiên, nếu tốc độ truyền khác nhau giữa cả hai UART, chúng chỉ phải khác nhau 10%. UART nhận và truyền phải được định cấu hình để nhận cùng một gói dữ liệu.

Chân ESP32 UART

ESP32 cung cấp ba cổng máy thu và máy phát không đồng bộ phổ quát (UART) như UART0, UART1 và UART2 hoạt động ở mức TTL 3.3V. Ba giao diện nối tiếp này được hỗ trợ phần cứng. Mỗi người trong số họ để lộ 4 chân: RX, TX, RTS và CTS. Tuy nhiên, Arduino IDE chỉ sử dụng chân RX và TX.

Theo mặc định, chỉ có thể sử dụng UART0 và UART2. Để sử dụng UART1, chúng ta phải xác định lại các chân vì các chân mặc định của UART1 như GPIO9 và GPIO10 được kết nối bên trong với bộ nhớ flash SPI. Ngoài ra, trên một số bảng ESP32, chúng thậm chí còn bị lộ trên các tiêu đề sơ đồ chân. Do đó, chúng tôi không thể sử dụng UART1 trực tiếp mà không gán lại các chân trong Arduino IDE.

Bảng dưới đây chỉ định các chân RX và TX cho từng cổng trong số ba cổng UART có sẵn trong ESP32.

Cảng UART

Rx

Tx

Có thể sử dụng

UART0 ·

GPIO3 ·

GPIO1 ·

UART1 ·

GPIO9 ·

GPIO10 ·

Có nhưng yêu cầu gán lại các chân

UART2 ·

GPIO16 ·

GPIO17 ·

Sơ đồ chân ESP32

Khởi tạo ESP32 UART trong Arduino IDE

Chúng tôi sử dụng thư viện HardwareSerial khi làm việc với giao tiếp UART ESP32 sử dụng cổng UART1 hoặc UART2. Vì vậy, trước tiên hãy bao gồm thư viện trong tập lệnh.

#include <HardwareSerial.h>

Tiếp theo, nếu chúng ta sử dụng Serial.begin(), thì các chân 1 và 3 được sử dụng, có nghĩa là chúng ta đang sử dụng UART0. Nếu chúng ta muốn sử dụng các cổng nối tiếp khác, thì chúng ta sẽ phải xác định chúng trong mã. Chúng tôi sử dụng các lệnh sau để xác định cổng UART đã chọn của chúng tôi:

Ở đây chúng ta tạo một đối tượng của thư viện HardwareSerial có tên là 'SerialPort()' và chỉ định port UART bên trong dấu ngoặc đơn.

Serial.begin()   //if using UART0

HardwareSerial SerialPort(1)  //if using UART1

HardwareSerial SerialPort(2)  //if using UART2

Tiếp theo, bên trong hàm setup(), chúng ta sẽ khởi tạo giao tiếp UART bằng đối tượng SerialPort trên phương thức begin() và chỉ định bốn tham số bên trong nó như sau:

SerialPort.begin (BaudRate, SerialMode, RX_pin, TX_pin).

Các thông số bao gồm tốc độ truyền cho giao tiếp nối tiếp, chế độ nối tiếp, chân RX và chân TX đang được sử dụng.

Nếu sử dụng UART2, chúng ta sẽ khởi tạo nó như sau:

#include <HardwareSerial.h>

 

HardwareSerial SerialPort(2); // use UART2

 

void setup()  

{

  SerialPort.begin(15200, SERIAL_8N1, 16, 17); 

}

Nếu sử dụng UART1, chúng ta sẽ khởi tạo nó như sau:

Một điểm quan trọng cần lưu ý ở đây là chân GPIO 9 và chân 10 là một phần của chân UART1 TX và RX, được kết nối bên trong với bộ nhớ flash. Hơn nữa, các chân này cũng không có sẵn trên bảng ESP32. Do đó, chúng tôi sẽ phải gán lại các chân cho UART1 để liên lạc nối tiếp. May mắn thay, bo mạch ESP32 có khả năng sử dụng hầu hết các chân GPIO cho các kết nối nối tiếp. Ở đây chúng tôi đã gán lại GPIO4 làm chân RX và GPIO2 là chân TX.

#include <HardwareSerial.h>

 

HardwareSerial SerialPort(1); // use UART1

 

void setup()  

{

  SerialPort.begin(15200, SERIAL_8N1, 4, 2); 

}

ESP32 đến ESP32 Truyền thông nối tiếp

Hãy để chúng tôi xem một ví dụ về giao tiếp nối tiếp trong đó chủ ESP32 sẽ gửi '1' hoặc '0' cho nô lệ ESP32. Sau đó, chân phụ sẽ nhận dữ liệu đó và điều khiển đèn LED được kết nối với chân kỹ thuật số của nó. Chúng tôi sẽ sử dụng UART2 để giao tiếp giữa hai bảng.

Bạn sẽ yêu cầu các thành phần sau cho dự án này.

Các thành phần bắt buộc

  • Hai bo mạch phát triển ESP32

  • Một đèn LED 5mm

  • Một điện trở 220 ohm

  • Dây kết nối

  • Breadboard

Sơ đồ kết nối

Giao tiếp UART giữa hai sơ đồ kết nối bảng ESP32

Kết nối chân TX2 của bo mạch ESP32 chính với chân RX2 của bảng ESP32 phụ. Tương tự như vậy, kết nối chân RX2 của bo mạch ESP32 chính với chân TX2 của bảng ESP32 phụ.

Chân cực dương của đèn LED được kết nối với chân kỹ thuật số15 (phụ) thông qua điện trở giới hạn dòng điện 220 ohm. Chốt catốt được nối đất.

Ngoài ra, hãy đảm bảo rằng cả hai bảng ESP32 đều có điểm chung.

Giao tiếp UART giữa hai phần cứng bo mạch ESP32

ESP32 Arduino Sketch

Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới và lưu nó.

#include <HardwareSerial.h>

 

HardwareSerial SerialPort(2); // use UART2

 

 

void setup()  

{

  SerialPort.begin(15200, SERIAL_8N1, 16, 17); 

void loop()  

  SerialPort.print(1);

  delay(5000);

  SerialPort.print(0);

  delay(5000);

}

Mã hoạt động như thế nào?

Bây giờ chúng ta hãy xem code trên hoạt động như thế nào.

Đầu tiên bao gồm thư viện nối tiếp phần cứng bằng cách sử dụng các tệp #include. Dòng này bao gồm thư viện HardwareSerial.h.

#include <HardwareSerial.h>

Một đối tượng nối tiếp của thư viện HardwareSerial, được đặt tên là "SerialPort" được khai báo ở đây. Chúng tôi chỉ định số cổng UART là một tham số bên trong nó. Chúng tôi đang sử dụng UART2 trong trường hợp này.

HardwareSerial SerialPort(2); // use UART2

Bên trong hàm setup(), chúng ta sẽ mở giao tiếp nối tiếp của cổng UART2 bằng SerialPort.begin (BaudRate, SerialMode, RX_pin, TX_pin).

void setup()  

{

  SerialPort.begin(15200, SERIAL_8N1, 16, 17); 

  }

Tại đây, chủ sẽ gửi số 1 và 0 cho nô lệ sau mỗi 5 giây.

void loop()  

  SerialPort.print(1);

  delay(5000);

  SerialPort.print(0);

  delay(5000);

}

ESP32 Arduino Sketch

Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới và lưu nó.

#include <HardwareSerial.h>

 

HardwareSerial SerialPort(2); // use UART2

 

 

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);

    }

  }

}

Mã hoạt động như thế nào?

Đầu tiên bao gồm thư viện nối tiếp phần cứng.

#include <HardwareSerial.h>

Một đối tượng nối tiếp của thư viện HardwareSerial, được đặt tên là "SerialPort" được khai báo ở đây. Chúng tôi chỉ định số cổng UART là một tham số bên trong nó. Chúng tôi đang sử dụng UART2 trong trường hợp này.

HardwareSerial SerialPort(2); // use UART2

Một biến char được gọi là 'số' lưu trữ dữ liệu mà nô lệ sẽ nhận được từ chủ.

char number  = ' ';

Đèn LED được kết nối với ESP32 GPIO15 phụ.

int LED = 15;

Bên trong hàm setup(), chúng ta sẽ mở giao tiếp nối tiếp của cổng UART2 bằng SerialPort.begin (BaudRate, SerialMode, RX_pin, TX_pin). Ngoài ra, hãy đặt chân LED làm chân đầu ra bằng chức năng pinMode (). Chỉ định chân làm tham số đầu tiên và chế độ làm tham số thứ hai.

Một điểm quan trọng cần lưu ý ở đây là tốc độ truyền của cả bảng chủ và bảng phụ ESP32 phải giống nhau.

void setup()

{

  SerialPort.begin(15200, SERIAL_8N1, 16, 17);

  pinMode(LED, OUTPUT);

}

Bên trong hàm loop(), chúng ta sẽ kiểm tra xem dữ liệu có trong buffer hay không. Nếu một số dữ liệu có sẵn, nó được lưu trữ trong 'số' biến. Nếu số là '0', thì hãy TẮT đèn LED. Nếu số là '1', thì đèn LED sẽ được BẬT.

Chủ sẽ gửi '1' và '0' với độ trễ 5 giây liên tục cho nô lệ. Do đó, đèn LED sẽ BẬT trong 5 giây và sau đó TẮT trong 5 giây.

void loop()

{

  if (SerialPort.available())

  {

    char number = SerialPort.read();

    if (number == '0') {

      digitalWrite(LED, LOW);

    }

    if (number == '1') {

      digitalWrite(LED, HIGH);

    }

  }

}

Trình diễn phần cứng

Để xem bản trình diễn, hãy tải mã chính và mã người gửi lên hai bảng ESP32. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn Mô-đun ESP32 Dev từ Bảng > Công cụ và cũng chọn đúng cổng COM mà bo mạch được kết nối từ Công cụ > Cổng.

Lựa chọn mô-đun phát triển ESP32 cho máy chủ web

Chọn COM PORT ESP32

Đèn LED sẽ BẬT và BẬT trong 5 giây trước khi TẮT trong 5 giây. Điều này tiếp tục khi mã chính tiếp tục gửi 1/0 cho máy.

UART Giao tiếp giữa hai bo mạch ESP32 demo phần cứng

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn