Energia – Bài 9: Giao tiếp ESP8266 và TIVA C

Hẹn mãi giờ mới làm được bài hướng dẫn giao tiếp giữa TIVA C và ESP8266 cho các bạn. Mình đi vào vấn đề luôn, bài viết này mình xin chia sẻ cách giao tiếp điều khiển ESP8266 thông qua tập lệnh AT. Cách này khác hẳn với những bài viết về lập trình trực tiếp trên ESP8266.

Chuẩn bị

Phần cứng

  • TIVA C Launchpad
  • Mạch ESP8266 phiên bản bất kỳ.
  • Dây nối
  • Nguồn 3v3
  • Mạch USB2UART PL2303 hoặc mạch tương tự (có thể có hoặc không)

Lưu ý:
Ở đây mình sử dụng bản esp8266 có sẵn là bản v1, nếu các bạn mua mới thì nên mua từ bản v7 hoặc v12 thì tốt hơn.
Cách lập trình cho esp8266 các phiên bản là giống nhau, kể cả NodeMCU cũng vậy (NodeMCU là esp8266 v12)
Nguồn cấp cho esp8266 nên dùng nguồn ngoài 3v3. Dùng nguồn có sẵn từ TIVA cũng được nhưng mình không khuyến khích.

Phần mềm

  • Energia IDE
  • Firmware AT-command ai-thinker cho ESP8266

Trước khi bắt đầu, các bạn nên xem qua bài ESP8266 cho người không biết gì, đây là bài cơ bản cũng như là cách để bạn kiểm tra hoạt động của ESP8266 dùng firmware ai-thinker. Nếu gửi lệnh AT và nhận OK là modul hoạt động bình thường, có thể lấy để lập trình với TIVA C được.

Nếu bạn có từng lập trình trực tiếp nạp firmware vào ESP8266 thông qua các bài hướng dẫn trước của mình  thì nên tham khảo cách nạp lại firmware AT-command cho ESP8266.

Sơ đồ chân của ESP8266 v1

Kiểm tra lệnh AT

Sau khi đã kiểm tra xong đảm bảo modul esp8266 hoạt động bình thường thì mình thử viết chương trình để thực hiện gửi lệnh AT và nhận phản hồi.

Nói thêm 1 chút về vai trò của TIVA C ở đây, như các bạn biết thì quá trình kiểm tra modul ban đầu phải qua các bước: mở phần mềm -> kết nối com -> gõ lệnh -> gửi lệnh -> chờ và xem phản hồi. Với 1 lệnh và mục đích test bình thường thì quá đơn giản, nhưng nếu nhiều lệnh hơn thì chẳng lẽ phải ngồi gõ lệnh hoài, làm thế chắc sớm muộn gì cũng lên đường sớm thôi. Cảm ơn TIVA C đã xuất hiện như một vị cứu tinh, giờ chỉ lập trình cho TIVA một chút thôi là chúng ta chỉ việc ngồi chơi xơi nước.

Thôi nhảm hơi nhiều rồi, mình vào vấn đề chính, dưới đây là cách mình kết nối dây và lập trình, chương trình đơn giản nên mình gom hết kết nối mô tả vào làm một

Lệnh sử dụng

Lệnh Phản hồi Mô tả
AT OK Nếu nhận được OK nghĩa là modul hoạt động bình thường
/* Chương trình giao tiếp giữa TIVA và ESP8266 dùng firmware AT-Command của ai-thinker
*  Tạo bởi Hocarm.org
*  Kết nối
*  ESP8266   |  TIVA  | Nguồn ngoài
*  VCC       |  x     | 3.3v
*  GND       |  GND   | GND
*  CH_PD     |  x     | 3.3v
*  RX        |  PB1   | x
*  TX        |  PB0   | x
*
*  Tốc độ baud kết nối với ESP tùy thuộc vào baud của firmware.
*/

void setup() {
  // Khởi tạo serial debug baud 115200
  Serial.begin(115200);
  // Khởi tạo serial giao tiếp với ESP8266 baud 9600
  // Nếu bạn dùng firmware ai-thinker baud 115200 thì đổi lại
  Serial1.begin(9600);  
  // Delay chút cho chắc ăn
  delay(1000);
}

void loop() {
  // Khai báo biến dạng chuỗi
  String inData;
  // In ra thông báo
  Serial.println("Gui AT command...");
  // Gửi lệnh AT xuống ESP8266
  Serial1.println("AT"); 
  // Chờ phản hồi và lưu dữ liệu
  delay(30);  
  inData = "";
  // Kiểm tra nếu có dữ liệu từ cổng serial thì in dữ liệu nhận được ra
  while (Serial1.available()){
     inData = Serial1.readStringUntil('\n');
     Serial.println("Nhan tu ESP8266: " + inData);
  } 
  // Delay 1s cho ESP còn thở
  delay(1000); 
}

Kết quả

Kết nối wifi

Coi như bước đầu giao tiếp đã thành công, giờ mình viết lại hàm gửi lệnh AT cho đơn giản hơn một chút, hàm

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout) có 3 tham số là

  • ATcommand: lệnh AT gửi
  • expected_answer: kết quả phản hồi mong muốn
  • timeout: thời gian timeout cho lệnh

Với hàm này không cần phải delay chờ đợi gì nữa, cứ kiểm tra kết quả nhận được đúng với expected_answer thì thoát hàm, thực hiện lệnh tiếp theo.

Lệnh sử dụng

Lệnh AT Phản hồi Mô tả
AT+CWMODE =1 OK Cài đặt chế độ station
AT+CWJAP = "ten_wifi", "pass" OK Kết nối với mạng wifi
AT+CIPMUX = 1 OK Cài đặt chế độ đa kết nối
AT+CIFSR OK Hiển thị IP
/* Chương trình giao tiếp giữa TIVA và ESP8266 dùng firmware AT-Command của ai-thinker
*  Tạo bởi Hocarm.org
*  Kết nối
*  ESP8266   |  TIVA  | Nguồn ngoài
*  VCC       |  x     | 3.3v
*  GND       |  GND   | GND
*  CH_PD     |  x     | 3.3v
*  RX        |  PB1   | x
*  TX        |  PB0   | x
*
*  Tốc độ baud kết nối với ESP tùy thuộc vào baud của firmware.
*/

void setup() {
  Serial.begin(115200);
  Serial1.begin(9600);  
  sendATcommand("AT", "OK", 3000);                //Kiểm tra kết nối
  sendATcommand("AT+CWMODE=1", "OK", 3000);       //Cấu hình chế độ station
  sendATcommand("AT+CWJAP=\"ten_wifi\",\"mat_khau\"","OK", 3000);   //Thay ten_wifi và mat_khau của bạn
  sendATcommand("AT+CIPMUX=1", "OK", 3000);       // Bật chế độ đa kết nối
  sendATcommand("AT+CIFSR", "OK", 3000); // Hiển thị ip
}

void loop() {
}
// Hàm gửi lệnh AT
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    // xóa buffer
    
    delay(100);
    
    while( Serial1.available() > 0) Serial1.read();    // đọc input
    
    Serial1.println(ATcommand);    // Gửi lệnh AT

    x = 0;
    previous = millis();

    // Chờ phản hồi
    do{
        if(Serial1.available() != 0){    
            // Nếu có dữ liệu trong buffer UART, đọc và kiểm tra nó với expected_answer
            response[x] = Serial1.read();
            x++;
            // Nếu đúng thì trả kết quả answer = 1, thoát hàm
            if (strstr(response, expected_answer) != NULL)    
            {
                answer = 1;
            }
            
        }
    }while((answer == 0) && ((millis() - previous) < timeout));  // Nếu sai thì tiếp tục thử lại cho tới hết thời gian timeout
    Serial.println(response);   // In giá trị nhận được để debug
    return answer;
}

Kết quả

Tạm kết

Thế là tạm xong những bước ban đầu để kiểm tra kết nối của TIVA C và ESP8266, thử được kết nối tới server, có vẻ là hơi vất vả một chút nhưng giờ TIVA gánh được phần xử lý dữ liệu từ các cảm biến, io,.. còn ESP chỉ lo mỗi việc kết nối wifi và gửi dữ liệu lên cloud. Cách gửi dữ liệu lên server mình sẽ giới thiệu với các bạn ở bài tiếp theo.