Làm chủ giao tiếp nối tiếp với Arduino

Truyền thông nối tiếp Truyền tín hiệu

Khi làm việc trên các dự án Arduino lớn, việc hết các chân khả dụng để kết nối các thành phần là điều khá phổ biến. Giả sử bạn muốn kết nối nhiều cảm biến/bộ truyền động với nhu cầu cấp thiết là vẫn bảo toàn các chân bổ sung để cung cấp cho mô-đun hiển thị đang ngốn pin.


Trừ khi bạn thực hiện một số phép thuật, đôi khi rất khó để xử lý tất cả các kết nối này trên một bảng Arduino duy nhất, đặc biệt là khi bạn quyết định sử dụng các bảng nhỏ hơn vì bạn bị ép về không gian. Đó là khi giao tiếp nối tiếp phát huy tác dụng.

Hãy khám phá giao tiếp nối tiếp là gì và cách bạn có thể thiết lập nó với Arduino cho các tác vụ như xử lý phân tán và tích hợp chung.


Giao tiếp nối tiếp là gì?

Giao tiếp nối tiếp là phương pháp gửi và nhận dữ liệu giữa hai hoặc nhiều thiết bị điện tử, từng bit một trên một đường truyền thông. Như tên gợi ý, dữ liệu đang được gửi theo “chuỗi.

Ngay cả việc có thể tải các bản phác thảo lên bảng Arduino yêu thích của bạn cũng sử dụng giao tiếp nối tiếp qua USB.

Giao thức truyền thông nối tiếp trên Arduino

Arduino được kết nối với breadboard, cảm biến và LCD

Các bo mạch Arduino cực kỳ linh hoạt và có thể giao tiếp với nhiều loại thiết bị. Chúng hỗ trợ bốn giao thức truyền thông nối tiếp: Nối tiếp mềm, SPI (Giao diện ngoại vi nối tiếp), UART tiêu chuẩn (Bộ thu-phát không đồng bộ đa năng) và I2C (Mạch tích hợp liên kết). Để biết thêm chi tiết, hãy xem hướng dẫn toàn diện của chúng tôi về cách hoạt động của giao tiếp nối tiếp UART, SPI và I2C.

Hướng dẫn này sử dụng các bản phác thảo cơ bản để chỉ ra cách bạn có thể thiết lập kết nối nối tiếp giữa hai bo mạch Arduino Uno bằng các giao thức khác nhau. Điều chỉnh mã để đáp ứng các yêu cầu cụ thể của bạn.

SPI (Giao diện ngoại vi nối tiếp)

SPI là một giao thức truyền thông nối tiếp đồng bộ cho phép truyền thông tốc độ cao giữa các bộ vi điều khiển và các thiết bị ngoại vi. Giao thức này yêu cầu bốn dây để liên lạc: SCK (Đồng hồ nối tiếp), MOSI (Làm chủ ra nô lệ vào), MISO (Master In Slave Out), và SS (Chọn nô lệ).

Sơ đồ kết nối SPI

Các SPI.h thư viện rất tiện dụng cho kiểu giao tiếp này và phải được đưa vào đầu bản phác thảo của bạn.

 #include <SPI.h> 

Đây là các chân SPI trên bo mạch Arduino Uno:

Chức năng

Số Pin (Kỹ thuật số)

Số Pin (Tiêu đề ICSP)

MOS

11

4

MISO

12

1

SCK

13

3

SS

10 (Mặc định)

1 (Thay thế)

Sau khi khởi tạo giao tiếp nối tiếp, bạn sẽ cần định cấu hình các chân giao tiếp.

 void setup() {
  SPI.begin(115200);
  
  pinMode(SS, OUTPUT);
  pinMode(MOSI, OUTPUT);
  pinMode(MISO, INPUT);
  pinMode(SCK, OUTPUT);
  
  digitalWrite(SS, HIGH);
}

Tín hiệu SS được sử dụng để thông báo cho thiết bị nô lệ khi dữ liệu đang được truyền.

 
digitalWrite(SS, LOW);

SPI.transfer(data);



digitalWrite(SS, HIGH);

Đây là cách kết nối hai bảng Arduino bằng SPI.

Giao tiếp SPI 2 sơ đồ nối dây bo mạch Arduino Uno

Mã cho bảng chính:

 #include <SPI.h>
const int slaveSelectPin = 10;
void setup() {
  SPI.begin(115200);
  pinMode(slaveSelectPin, OUTPUT);
}
void loop() {
  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer('H');
  digitalWrite(slaveSelectPin, HIGH);
  delay(1000);
}

Mã cho bảng nô lệ:

 #include <SPI.h>
const int slaveSelectPin = 10;
void setup() {
  SPI.begin(115200);
  pinMode(slaveSelectPin, OUTPUT);
}
void loop() {
  if (digitalRead(slaveSelectPin) == LOW) {
    char receivedData = SPI.transfer('L');
    Serial.println(receivedData);
  }
}

Đảm bảo rằng các thiết bị của bạn có chung điểm chung để cấu hình phù hợp.

UART (Bộ thu-phát không đồng bộ phổ quát)

UART là một giao thức truyền thông nối tiếp không đồng bộ, cho phép giao tiếp giữa các thiết bị chỉ sử dụng hai dây: TX (Truyền) và RX (Nhận). UART thường được sử dụng để giao tiếp với các thiết bị như mô-đun GPS, mô-đun Bluetooth và các bộ vi điều khiển khác. Mỗi bo mạch Arduino đều được trang bị ít nhất một cổng cho UART.

Sơ đồ kết nối UART

Các chân UART trên các bo mạch Arduino phổ biến bao gồm:

Bảng

Ghim nối tiếp

Nối tiếp1 chân

Nối tiếp2 Chân

Nối tiếp3 chân

Uno, Nano, Mini

0 (RX), 1 (TX)

không áp dụng

không áp dụng

không áp dụng

Siêu cấp

0 (RX), 1 (TX)

19 (RX), 18 (TX)

17 (RX), 16 (TX)

15 (RX), 14 (TX)

Bạn có thể lấy bảng đầy đủ từ tài liệu trực tuyến của Arduino về giao tiếp nối tiếp.

Đầu tiên, kết nối các bảng của bạn như thế này:

Sơ đồ nối dây giao tiếp UART/USART cho 2 board Arduino Uno

Sau đó, sử dụng mã này cho bảng người gửi:

 void setup() {
   Serial.begin(9600);
}
void loop() {
  
  Serial.println("Hello from the sender board!");
  delay(1000);
}

Mã cho bảng thu:

 void setup() {
    Serial.begin(9600);
}
void loop() {
  
  if (Serial.available() > 0) {
    
    String incomingData = Serial.readString();
    Serial.println(incomingData);
  }
}

Arduino Uno hoạt động ở mức logic 5V trong khi cổng RS232 của máy tính sử dụng mức logic +/- 12V.

Kết nối trực tiếp Arduino Uno với cổng RS232 có thể và sẽ làm hỏng bo mạch của bạn.

I2C (Mạch tích hợp liên kết)

I2C là giao thức truyền thông nối tiếp đồng bộ cho phép truyền thông giữa nhiều thiết bị chỉ bằng hai dây: SDA (Dữ liệu nối tiếp) và SCL (Đồng hồ nối tiếp). I2C thường được sử dụng để giao tiếp với các cảm biến, EEPROM và các thiết bị khác cần truyền dữ liệu trong khoảng cách ngắn.

Các chân I2C trên Arduino Uno là SDA (A4)SCL (A5).

Sơ đồ kết nối I2C

Chúng ta sẽ tạo một chương trình đơn giản để thiết lập kết nối giữa hai bo mạch Arduino bằng giao tiếp I2C. Nhưng trước tiên, hãy kết nối các bảng của bạn như thế này:

Kết nối Arduino_I2C trên breadboard

Mã cho bảng chính:

 #include <Wire.h>
void setup() {
  Wire.begin();
  Serial.begin(9600);
}
void loop() {
  Wire.beginTransmission(9);
  Wire.write('a');
  Wire.endTransmission();


  delay(500);
}

Mã cho bảng nô lệ:

 #include <Wire.h>
void setup() {
  Wire.begin(9);
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
}
void loop() {
  delay(100);
}


void receiveEvent(int bytes) {
  while(Wire.available()) {
    char receivedByte = Wire.read();
    Serial.println(receivedByte);
  }
}

Phần mềm nối tiếp là gì?

Thư viện Arduino SoftwareSerial được phát triển để mô phỏng giao tiếp UART, cho phép giao tiếp nối tiếp thông qua hai chân kỹ thuật số bất kỳ trên bo mạch Arduino. Nó hữu ích khi UART phần cứng đã được sử dụng bởi các thiết bị khác.

Để thiết lập SoftwareSerial, trước tiên hãy đưa thư viện SoftwareSerial vào bản phác thảo.

 #include <SoftwareSerial.h> 

Sau đó, tạo một thể hiện của đối tượng SoftwareSerial bằng cách chỉ định RXTX chân được sử dụng để giao tiếp.

 SoftwareSerial mySerial(2, 3);  

Đây là một mã ví dụ cho Arduino minh họa việc sử dụng SoftwareSerial:

 #include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
}
void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Thư viện nối tiếp

Thư viện Serial là một công cụ mạnh mẽ trong Arduino cho phép giao tiếp giữa vi điều khiển với máy tính hoặc các thiết bị khác thông qua kết nối nối tiếp. Một số chức năng phổ biến bao gồm:

Chức năng

Sự miêu tả

Nối tiếp.bắt đầu (tốc độ)

Khởi tạo giao tiếp nối tiếp với tốc độ dữ liệu được chỉ định.

Serial.print(dữ liệu)

Gửi dữ liệu đến cổng nối tiếp để truyền dưới dạng văn bản ASCII.

Serial.write(dữ liệu)

Gửi dữ liệu nhị phân thô qua cổng nối tiếp.

Nối tiếp.có sẵn ()

Trả về số byte có sẵn để đọc từ bộ đệm nối tiếp.

Serial.flush()

Đợi dữ liệu nối tiếp gửi đi hoàn tất quá trình truyền trước khi tiếp tục.

Nối tiếp.read()

Đọc byte đầu tiên của dữ liệu nối tiếp đến và trả về dưới dạng số nguyên.

Tốc độ truyền và định dạng dữ liệu nối tiếp

đồ họa của mạng khối màu xanh với các logo nhị phân internet trong mỗi

Tốc độ truyền đề cập đến tốc độ truyền dữ liệu qua kết nối nối tiếp. Nó đại diện cho số bit được truyền mỗi giây. Tốc độ truyền phải được đặt giống nhau trên cả thiết bị gửi và thiết bị nhận, nếu không thì giao tiếp có thể bị cắt xén hoặc hoàn toàn không hoạt động. Tốc độ truyền phổ biến cho Arduino bao gồm 9600, 19200, 38400 và 115200.

Định dạng dữ liệu nối tiếp đề cập đến cấu trúc của dữ liệu được gửi qua kết nối nối tiếp. Có ba thành phần chính đối với định dạng dữ liệu nối tiếp: bit bắt đầu, bit dữ liệu và bit dừng.

  • Bit dữ liệu: Số bit được sử dụng để biểu diễn một byte dữ liệu.
  • Ngang bằng: Một bit tùy chọn được sử dụng để kiểm tra lỗi. Nó có thể được đặt thành không, chẵn hoặc lẻ, tùy thuộc vào yêu cầu của kênh liên lạc.
  • Dừng lại một chút: Số bit dùng để báo hiệu kết thúc một byte dữ liệu.

Định dạng dữ liệu cần giống nhau trên cả thiết bị truyền và nhận để đảm bảo giao tiếp phù hợp. Đây là một ví dụ về cách bạn có thể đặt các định dạng dữ liệu cụ thể:

 void setup() {
  
  Serial.begin(9600, SERIAL_8N1);
}

Đây, SERIAL_8N1 đại diện cho định dạng dữ liệu với số 8 bit dữ liệu, không có tính chẵn lẻ, và 1 dừng chút. Các tùy chọn khác như SERIAL_7E1, SERIAL_8O2vv, có thể được sử dụng tùy thuộc vào yêu cầu cụ thể của dự án.

nói chuyện nối tiếp

Các bo mạch Arduino cung cấp các tùy chọn giao tiếp nối tiếp khác nhau cho phép trao đổi dữ liệu hiệu quả và đáng tin cậy giữa các thiết bị. Bằng cách hiểu cách thiết lập các giao thức truyền thông nối tiếp trên Arduino IDE, bạn có thể tận dụng sức mạnh của xử lý phân tán hoặc giảm đáng kể số lượng dây được sử dụng trong các dự án của mình.

Previous Post
Next Post

post written by: