Giao tiếp giữa hai mạch Arduino bất kỳ

Giao tiếp giữa các mạch Arduino là một khía cạnh quan trọng vì nó cho phép thực hiện các dự án phức tạp và lập trình trên một mạch Arduino không đủ. Trong bài viết này, chúng ta sẽ tìm hiểu cách giao tiếp giữa hai mạch Arduino bất kỳ bằng cách sử dụng thư viện Serial Command.

Các thiết bị cần sử dụng

  • Arduino UNO (mạch HOST)
  • Một mạch Arduino khác (có thể là Arduino Nano hoặc một mạch UNO khác, mạch này sẽ là CLIENT)
  • Dây cắm breadboard
  • Breadboard
  • 2 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm)
  • 1 đèn LED siêu sáng màu xanh
  • 1 đèn LED siêu sáng màu đỏ

Thư viện cần sử dụng

Chúng ta sẽ sử dụng thư viện Serial Command để xây dựng các “câu lệnh” (command). Bạn có thể tải thư viện này tại đây. Sau đó, bạn tạo một thư mục mới với tên “Serial Command” trong thư mục libraries của Arduino IDE. Sau đó, giải nén file thư viện vừa tải vào thư mục vừa tạo. Cuối cùng, bạn tắt Arduino IDE và mở lại.

Hoặc nếu bạn đang sử dụng Arduino IDE 1.6.x, bạn có thể thêm thư viện bằng cách nhấp vào Sketch > Include Library > Add .ZIP Library... và chọn file zip của thư viện đã tải về.

Lắp mạch

Lắp mạch

Giải thích và lập trình

Trong ví dụ này, chúng ta sẽ sử dụng Arduino UNO (HOST) để gửi lệnh đến Arduino Nano (CLIENT) để điều khiển các đèn LED. Tuy nhiên, việc gọi mạch Arduino là HOST và CLIENT là do chúng ta tự đặt, vì vậy bạn hoàn toàn có thể sử dụng Arduino Nano để điều khiển Arduino UNO hoặc thậm chí biến chúng thành 2 Server trong một “mạng kín” (nghĩa là 2 mạch này sẽ tương tác với nhau, mỗi mạch vừa là HOST vừa là CLIENT cùng một lúc).

Bạn upload đoạn code sau vào mạch HOST:

void setup() {
  Serial.begin(9600); // Khởi tạo cổng Serial với tốc độ baud 9600
}

int Step = 0;

void loop() {
  if (Step == 0) {
    Serial.println("LED_RED 1"); // Bật đèn đỏ. 1 tương đương với HIGH
  } else if (Step == 1) {
    Serial.println("LED_RED 0"); // Tắt đèn đỏ. 0 tương đương với LOW
  } else if (Step == 2) {
    Serial.println("LED_BLUE 1"); // Bật đèn xanh
  } else if (Step == 3) {
    Serial.println("LED_BLUE 0"); // Tắt đèn xanh
  }

  Step = (Step + 1) % 4; // Step sẽ tuần tự từ 0 đến 3
  delay(1000); // Dừng một giây giữa các lần gửi
}

Bạn upload đoạn code sau vào mạch CLIENT:

#include  // Thêm vào sketch thư viện Serial Command

SerialCommand sCmd; // Khai báo biến sử dụng thư viện Serial Command
int red = 2, blue = 3;

void setup() {
  Serial.begin(9600); //Khởi tạo cổng Serial với tốc độ baud 9600
  pinMode(red, OUTPUT); // Thiết lập chân 2 là OUTPUT cho đèn LED màu đỏ
  pinMode(blue, OUTPUT); // Thiết lập chân 3 là OUTPUT cho đèn LED màu xanh

  sCmd.addCommand("LED_RED", led_red); // Khi nhận được lệnh LED_RED, thực hiện hàm led_red
  sCmd.addCommand("LED_BLUE", led_blue); // Khi nhận được lệnh LED_BLUE, thực hiện hàm led_blue
}

void loop() {
  sCmd.readSerial(); // Đọc lệnh từ Serial

  // Bạn không cần phải thêm bất kỳ dòng code nào trong hàm loop này cả
}

// Hàm led_red sẽ được thực thi khi nhận được lệnh LED_RED
void led_red() {
  char *arg;
  arg = sCmd.next();
  int value = atoi(arg);
  digitalWrite(red, value);
}

// Hàm led_blue sẽ được thực thi khi nhận được lệnh LED_BLUE
void led_blue() {
  char *arg;
  arg = sCmd.next();
  int value = atoi(arg);
  digitalWrite(blue, value);
}

Sau khi upload 2 đoạn code này vào 2 mạch Arduino, các đèn LED sẽ bật và tắt theo chuỗi lệnh sau mỗi giây. Vì sao lại như vậy?

Bởi vì sau mỗi giây, mạch HOST sẽ gửi lệnh đến CLIENT. CLIENT sẽ nhận lệnh và thực hiện các hàm tương ứng. Như vậy, cách làm việc của các lệnh và cách đọc các tham số trong lệnh là như thế nào?

Lệnh là gì?

Một lệnh gồm có các thành phần sau:

  • Từ đầu tiên là tên lệnh (command name).
  • Các từ sau đó là các tham số.
  • Một lệnh phải có tên lệnh.
  • Một lệnh có thể có hoặc không có tham số.

Trong đoạn code mà tôi đã cung cấp, tôi đã xây dựng hai lệnh:

  • LED_RED : Lệnh này được sử dụng để điều khiển đèn LED màu đỏ (bật – 1 hoặc tắt – 0).
  • LED_BLUE : Lệnh này được sử dụng để điều khiển đèn LED màu xanh (bật – 1 hoặc tắt – 0).

Các lệnh thực chất chỉ là một chuỗi kết thúc bằng ký tự xuống dòng (n) (nếu bạn sử dụng Serial.println(), bạn không cần quan tâm đến ký tự này. Tuy nhiên, nếu bạn sử dụng Serial.print(), bạn cần thêm ký tự n ở cuối mỗi câu lệnh.

Làm sao để đọc được lệnh từ HOST ở CLIENT?

Bạn đã sử dụng thư viện Serial Command, vì vậy bạn không cần phải tốn thời gian nghiên cứu việc này. Chúng ta sẽ giải thích chi tiết hơn trong một bài viết khác ở mục “Chương trình mẫu > Level: Advanced – Nâng cao”.

Làm thế nào để đọc các tham số trong một lệnh ở CLIENT?

Điều này cực kỳ đơn giản, bạn chỉ cần sử dụng đoạn code trong hàm led_red() hoặc led_blue() để đọc các tham số. Tôi khuyên bạn nên gửi các tham số là số nguyên để dễ dàng xử lý. Không nên gửi các tham số là chuỗi vì bạn sẽ cần chuyển sang kiểu String để so sánh, điều này không nên. Tuy nhiên, nếu bạn muốn gửi một chuỗi đến một màn hình LCD chẵng hạn, bạn sẽ cần phát triển thêm một chút để đọc các tham số. Tôi sẽ viết ở mục bình luận.

Kết luận

Hãy sáng tạo với mô hình HOST -> CLIENT và bạn sẽ khám phá thêm nhiều điều thú vị. Trong tương lai, tôi sẽ hướng dẫn bạn sử dụng máy tính để giao tiếp với Arduino (vấn đề này khá phức tạp, vì vậy có thể bạn phải chờ đợi một thời gian sau bài viết này, nhưng tôi hứa sẽ cập nhật).

Hãy thử tạo một mô hình HOST / CLIENT <-> CLIENT / HOST và khám phá thêm nhé, không khó đâu!

Chúc bạn vui vẻ và thành công!

FEATURED TOPIC

hihi