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

Giới thiệu, nội dung cần nắm

Giao tiếp giữa mạch Arduino là rất quan trọng, vì có nhiều dự án phức tạp và việc lập trình trên 1 Arduino là điều không thể. Hôm nay, mình sẽ hướng dẫn bạn cách giao tiếp giữa 2 mạch Arduino bất kỳ bằng việc sử dụng thư viện Serial Command.

Phần cứng

Thư viện

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 download thư viện ấy tại đây. Sau đó bạn tạo thư mục mang tên "Serial Command" tại thư mục <thư mục cài đặt arduino>\libraries. Sau đó bạn giải nén file thư viện vừa rồi vào thư mục vừa tạo là ok! Cuối cùng bạn tắt Arduino IDE rồi mở lại Arduino IDE.

Hoặc đối với Arduino IDE 1.6.x, chúng ta có thể thêm thư viện bằng cách như hình dưới. Sau đó chọn file zip đã download ở trên là ok.

 

Lắp mạch

Click vào ảnh để xem rõ hơn nhé

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

Ở đây, tớ có ý định dùng Arduino UNO (HOST) gửi lệnh đến Arduino Nano (CLIENT) để điều khiển các đèn LED (thiết bị ngoại vi). Bạn cần hiểu rằng, định nghĩa HOST và CLIENT là do mình tự đặt, vì vậy bạn hoàn toàn có thể dùng Arduino Nano để điều khiển Arduino UNO hoặc tốt hơn nữa là biến nó thành 2 Server trong một "mạng kín" (nghĩa là 2 con này sẽ tự tương tác lẫn nhau, mỗi con vừa là HOST vừa là SLAVE cùng một lúc).

Bạn upload đoạn code sau vào HOST.

void setup() {
  Serial.begin(9600);// Bạn khởi tạo một cổng Serial tại baudrate 9600. Ở Client, bạn cũng phải mở một cổng Serial cùng Baudrate với HOST
}

int Step = 0;

void loop() {
  if (Step == 0) {
    Serial.println("LED_RED 1"); // Đèn đỏ sáng. 1 == HIGH
  } else if (Step == 1) {
    Serial.println("LED_RED 0"); // Đèn đỏ tắt . 0 == LOW
  } else if (Step == 2) {
    Serial.println("LED_BLUE 1");// Đèn xanh sáng
  } else if (Step == 3) {
    Serial.println("LED_BLUE 0");// Đèn xanh tắt
  }
  
  Step = (Step + 1) % 4; //Step sẽ tuần tự tuần hoàn các giá trị trong khoảng từ 0 --> 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 CLIENT


#include <SerialCommand.h> // 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() {
  //Khởi tạo Serial ở baudrate 9600 (trùng với HOST)
  Serial.begin(9600);
  
  //pinMode 2 đèn LED là OUTPUT
  pinMode(red,OUTPUT);
  pinMode(blue,OUTPUT);
  
  
  // Một số hàm trong thư viện Serial Command
  
  sCmd.addCommand("LED_RED",   led_red);  // Khi có câu lệnh tên là LED_RED sẽ chạy hàm led_red
  sCmd.addCommand("LED_BLUE",   led_blue);
  
}

void loop() {
  sCmd.readSerial();
  //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 gửi hàm LED_RED
void led_red() {
  //Đoạn code này dùng để đọc TỪNG tham số. Các tham số mặc định có kiểu dữ liệu là "chuỗi"
  char *arg;
  arg = sCmd.next();
  
  int value = atoi(arg); // Chuyển chuỗi thành số
  digitalWrite(red,value);
}

// hàm led_blue sẽ được thực thi khi gửi hàm LED_BLUE
void led_blue() { 
  //Đoạn code này dùng để đọc TỪNG tham số. Các tham số mặc định có kiểu dữ liệu là "chuỗi"
  char *arg;
  arg = sCmd.next();
  
  int value = atoi(arg); // Chuyển chuỗi thành số
  digitalWrite(blue,value);
}

Sau khi upload 2 đoạn code này thì cứ sau mỗi một giây thì đèn đỏ sáng rồi tắt tiếp đến là đèn xanh. Tại sao như vậy?

Bởi vì cứ sau mỗi một giây thì HOST lại gửi lệnh đến CLIENT. Và tùy thuộc vào câu lệnh CLIENT sẽ chuyển hướng đến các hàm khác nhau. Vậy như thế nào là lệnh và cách đọc tham số của mỗi lệnh là như thế nào?

  1. Lệnh là gì?

    • Lệnh là một chuỗi gồm có các thành phần sau:
      • Từ đầu tiên được gọi là tên câu lệnh (command name).
      • Các từ sau đó được gọi là tham số.
      • Một lệnh buộc phải có tên câu lệnh
      • Một lệnh có thể có một hoặc nhiều hoặc không có tham số.
    • Ở trong đoạn code mà tớ upload lên mạch HOST, tớ đã tự xây dựng 2 lệnh:
      • LED_RED <tham số 1>
        • LED_RED là tên câu lệnh
        • <tham số 1> là trạng thái sẽ truyền cho led đỏ (sáng - 1 hoặc tắt - 0)
      • LED_BLUE <tham số 1>
        • LED_BLUE là tên câu lệnh
        • <tham số 1> là trạng thái sẽ truyền cho led xanh (sáng - 1 hoặc tắt - 0)
    • Các lệnh thực chất chỉ là một chuỗi được kết thúc bởi ký tự xuống dòng (\n) (nếu bạn dùng hàm Serial.println() thì không cần quan tâm đến ký tự này. Nhưng nếu dùng hàm Serial.print() thì bạn cần thêm một ký tự \n ở cuối mỗi câu lệnh. Ví dụ:
      • Serial.print("LED_RED 1\n");
        
  2. Làm sao để đọc được lệnh từ HOST ở CLIENT?

    • Bạn đã sử dụng thư viện Serial Command cho việc này, vì vậy bạn không cần phải tốn thời gian nghiên cứu việc này. Mình sẽ giải thích câu hỏi này một cách cặn cẽ hơn ở một bài sau trong chuyên mục "Chương trình mẫu > Level: Advanced - Nâng cao".
  3. Làm thế nào để đọc các tham số trong một lệnh ở CLIENT

    • Cực kỳ đơn giản, bạn chỉ cần dùng đoạn code trong hàm led_red() hoặc led_green() để tiến đọc. Mình khuyên bạn chỉ nên gửi các tham số là số nguyên để dễ dàng cho việc xử lý, không nên gửi các tham số là chuỗi, vì bạn cần chuyển sang kiểu String để dùng các phép so sánh, điều này là không nên. Còn nếu muốn gửi một câu ra một màn hình LCD (chẳng hạn) thì bạn phải tự phát triển thêm một tí xíu nữa cho việc đọc tham số. Mình 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ẽ thấy rất thú vị đấy. Trong tương lai, mình sẽ hướng dẫn các bạn dùng máy tính để giao tiếp với Arduino (vấn đề này khá là nâng cao nên bạn có thể sẽ đợi khá lâu từ bài viết này đấy, nhưng mình hứa sẽ có smiley).

Nào, bạn hãy thử chế một mô hình HOST / CLIENT <--> CLIENT / HOST xem nào, không khó đâu!

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

lên
22 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Kết nối điều khiển từ xa sử dụng ESP8266 và Arduino với hệ thống firmware iNut Cảm biến CloudMQTT - 1000 firmware miễn phí

Chuyện kể rằng, có 02 sinh viên Việt Nam, trong lúc làm đồ án đại học kết nối điều khiển từ xa qua Internet. Một người thì chọn phương án truyền thống sử dụng máy tính làm máy chủ và demo các tính năng theo yêu cầu đồ án. Người còn lại biết đến iNut Sensor và tìm cách tối ưu hóa phần mềm và phần cứng nhằm chau chuốt cho đồ án của mình trở nên "xịn" và "nhiều tính năng bá đạo". Đến lúc bảo vệ đồ án, cậu sinh viên 01 cảm thấy choáng ván với muôn vàn vấn đề từ việc nơi trình bày đồ án không có wifi, mạng chập chờn, máy tính mở không lên, đứt cáp biển,... Cuối cùng cũng bảo vệ được với điểm số không ưng ý lắm dù tốn rất nhiều thời gian và công sức. Cậu còn lại nhờ vào việc chau chuốt phần mềm, tối ưu hóa và comment kĩ từng lệnh trong dòng code, viết báo cáo bài bản chuẩn bị slide như ý, dùng điện thoại cài wifi, quét mã QRcode để chia sẻ quyền truy cập đến phần mềm rất chuyên nghiệp, mọi thứ cậu chủ động hoàn toàn mà không bị các vấn đề "học tài thi phận" bủa vây mà kết quả hết sức mĩ mãn, điểm số mĩ miều, kiến thức IoT được chuẩn hóa. Thực vậy, các dự án, đồ án sử dụng nền tảng iNut Platform bên dưới cho phép các bạn sinh viên làm các dự án hết sức hoàn hảo: từ xe điều khiển, bãi giữ xe thông minh, hệ thống máy lạnh, máy bơm, điều hòa thông minh,... do chinh các bạn tự làm nên đã đạt được những điểm số tốt và tuyệt đối. Cũng chính vì thế, iNut JSC (công ty chủ quản của iNut Platform) đã kết hợp với Khu Công nghệ phần mềm - ĐHQGHCM để tổ chức những khóa đào tạo ngắn hạn cho sinh viên Việt Nam sử dụng nền tảng IoT do iNut JSC phát triển. Và để mở con đường tri thức tiếp cận IoT trong nháy mắt, iNut JSC đã tạo ra một phiên bản firmware trị giá 50.000 đồng sử dụng clouding của CloudMQTT và tài trợ 1000 firmware cho tất cả các bạn học sinh, sinh viên Việt Nam có thể tiếp cận IoT một cách dễ dàng và nhanh chóng nhất!

lên
14 thành viên đã đánh giá bài viết này hữu ích.

Vietnam Maker Contest with Intel Galileo - VMIG - Cuộc thi sáng tạo với Galileo dành cho Sinh viên Việt Nam

Hôm nay là một ngày vui, 30/7/2015. Vì chỉ còn 2 ngày nữa (1/8/2015), cuộc thi Sáng tạo với Intel Galileo dành cho sinh viên sẽ được chính sức khởi động. Giải thưởng của cuộc thi rất lớn trên 20 triệu đồng, đồng thời chúng ta được hỗ trợ mạch Galileo Gen 2 và 2 triệu động để làm dự án nữa,... còn chần chừ gì mà không tìm hiểu ngay.

lên
2 thành viên đã đánh giá bài viết này hữu ích.