Phần 3: Lập trình ứng dụng với ESP8266 dùng AT commands

Wearable

Chúng ta lại gặp nhau với loạt bài viết hướng dẫn sử dụng ESP8266. Trong phần 2, chúng ta đã được giới thiệu 3 mô hình lập trình ứng dụng với ESP8266: dùng firmware có sẵn được cung cấp bởi Espressif để ESP8266 làm việc như 1 module wifi độc lập, lập trình firmware mới cho ESP8266 dùng bộ thư viện SDK, hoặc sử dụng các bộ thư viện open source để lập trình ESP8266 trên Arduino hoặc sử dụng ngôn ngữ cấp cao như Python. Trong bài viết này, chúng ta sẽ thảo luận chi tiết mô hình đầu tiên để hiểu được quá trình nạp firmware, sử dụng tập lệnh AT commands để điểu khiển ESP8266 cho ứng dụng của mình.

Giới thiệu về các firmware được cung cấp bởi Espressif

Trong thư mục bin/ của Non-RTOS SDK chúng ta sẽ thấy 1 số file .bin, đây là các file firmware có sẵn từ Espressif để sử dụng ESP8266 như 1 wifi module để truyền/nhận dữ liệu trong mạng Wifi network.

Các file bin được liệt kê trong hình sau:

bin_files3

Đây là các file chương trình để ESP8266 hoạt động như 1 Wifi module. Thông tin sử dụng các file này được mô tả như sau:

Thư mục at_sdio/ chứa firmware có hỗ trợ truyền nhận AT commands qua giao tiếp SDIO (nhanh hơn so với giao tiếp UART). Thư mục “512+512” chức các file bin có hỗ trợ FOTA mà phân chia bộ nhớ Flash thành 2 vùng có dung lượng 512KB và 512KB. Tương tự cho thư mục “1024+1024”.

Chúng ta sẽ nạp các file *.bin này tùy thuộc vào việc chúng ta muốn có chức năng FOTA (FOTA = khả năng cập nhật firmware mới qua Wifi) hay không. Lưu ý là nếu muốn hỗ trợ FTOA thì vùng nhớ chương trình sẽ phải chia làm 2 vùng bằng nhau nên dung lượng bộ nhớ cho chương trình ứng dụng sẽ nhỏ hơn so với khi không hỗ trợ FOTA. Chúng ta thảo luận chi tiết các vấn đề khi hỗ trợ FOTA trong bài viết về chủ đề này nha.

Sau đây là bảng giới thiệu chức năng của từng file bin và khi nào chúng ta sẽ nạp xuống ESP8266:

File *.bin Chức năng Không FTOA Có FOTA
master_device_key.bin Chứa thông tin thiết bị khi cần sử dụng cloud của Espressif (không bắt buộc nạp xuống) YES YES
esp_init_data_default.bin Chứa thông tin mặc định của cấu hình hệ thống YES YES
boot.bin Là chương trình bootloader khi có hỗ trợ FOTA YES
blank.bin Chứa các thông tin RF_CAL mặc định để cân chỉnh hoạt động radio YES YES
eagle.flash.bin Chương trình ứng dụng không có chức năng FOTA  (được tạo ra sau khi biên dịch code trong SDK) YES
eagle.irom0text.bin Chương trình ứng dụng không có chức năng FOTA (được tạo ra sau khi biên dịch code trong SDK) YES
user1.bin Chương trình ứng dụng có chức năng FOTA (chỉ cần nạp 1 lần) (được tạo ra sau khi biên dịch trong SDK) YES
user2.bin Chương trình ứng dụng có chức năng FOTA (được tạo ra sau khi biên dịch trong SDK) YES

Theo bảng trên, chúng ta sẽ nạp các file bin trong 2 trường hợp như sau:

  • Khi ESP8266 không hỗ trợ tính năng FOTA, chúng ta sẽ nạp esp_init_data_default.bin, blank.bin, eagle.flash.bin và eagle.irom0text.bin
  • Khi ESP8266 có hỗ trợ tính năng FOTA, chúng ta sẽ nạp esp_init_data_default.bin, blank.bin, boot.bin, user1.bin và user2.bin. Lưu ý là chúng ta chỉ cần nạp user1.bin 1 lần và có thể không cần nạp user2.bin ngay vì chúng ta có thể sử dụng user1.bin sau này để nạp user2.bin thông qua Wifi với FOTA

Khi nạp các file bin này với Flash Download tool của Espressif, chúng ta cần xác định địa chỉ bắt đầu cho file bin này. Các địa chỉ bắt đầu này sẽ thay đổi tùy theo dung lượng của SPI Flash chip trên board.

Hiện nay đa số các module ESP8266 hỗ trợ SPI Flash dung lượng 4MB (ví dụ như các module ESP-01ESP-07, và ESP-12F) nên bài viết sẽ giới thiệu các địa chỉ nạp của các file bin tương ứng với dung lượng SPI Flash 4MB như sau:

  • Địa chỉ nạp các file bin nếu ESP8266 không hỗ trợ FOTA:
    master_device_key.bin = 0x3E000
    esp_init_data_default.bin = 0x3FC000
    blank.bin = 0x3FE000
    eagle.irom0text.bin =0x10000
    eagle.flash.bin = 0x00000
  • Địa chỉ nạp các file bin khi ESP8266 có hỗ trợ FOTA:
512+512 1024+1024
master_device_key.bin 0x7E000 0xFE000
esp_init_data_default.bin 0x3FC000
blank.bin 0x3FE000
boot.bin 0x00000
user1.bin 0x01000
user2.bin 0x81000 0x101000

Ví dụ nạp firmware cho ESP8266 khi có hỗ trợ FOTA:

flash_download

Kết nối hardware khi nạp firmware vào module ESP8266

Chúng ta sẽ khởi động ESP8266 trong chế độ download code với UART. Về kết nối phần cứng thì chúng ta cần thỏa mãn các điều kiện sau:

  • GPIO0 và GPIO15 mức LOW
  • GPIO2 mức HIGH
  • Chân CH_PD (chip select) mức HIGH
  • Chân RST không kết nối (để floating)
  • Cấu hình UART: auto-baud, 8-bit data, 1 stop bit, không Parity, không CTS/RTS

Ví dụ kết nối giữa ESP-01 module và module FT232RL (tạo COM ảo trên máy tính) để nạp firmware từ máy tính xuống ESP8266 như sau:

load_fw

Trên máy tính chúng ta chỉ cần mở ESP Flash Download tool và chọn cổng COM ảo tạo bởi FT232RL rồi chọn các file bin tương ứng để thực hiện quá trình ghi code xuống ESP8266. Khi quá trình kết thúc, chân GPIO0 không để LOW nữa để ESP8266 khởi động trong chế độ thực thi chương trình đã được download.

Sử dụng tập lệnh AT commands

Sau khi nạp các file bin phù hợp xuống ESP8266, chúng ta sẽ truyền các lệnh AT commands để cấu hình hoạt động, truyền yêu cầu kết nối mạng wifi cũng như truyền/nhận dữ liệu trên mạng Wifi cho ESP8266. Do đó trong phần này, chúng ta sẽ thảo luận cách sử dụng lệnh AT commands và các lệnh AT commands phổ biến để sử dụng ESP8266 như 1 wifi module với firmware có sẵn từ  Espressif.

Về cấu trúc thì 1 lệnh AT command đều có dạng “AT+<lệnh>”, trong đó <lệnh> sẽ là tên của từng command khác nhau.

Với 1 lệnh AT command, chúng ta có thể có 4 loại lệnh cho command đó:

  • AT command để đọc các giá trị có thể set của biến thuộc command đó: AT+<lệnh>=?
  • AT command để đọc giá trị hiện tại của biến thuộc command đó:  AT+<lệnh>?
  • AT command để ghi giá trị mới cho biến thuộc command đó: AT+<lệnh>=<các giá trị mới>
  • AT command để thực thi tác vụ của command đó: AT+<lệnh>

Tùy vào bản chất của từng lệnh AT command mà nó có thể có 4 loại lệnh trên hoặc chỉ 1 vài lệnh trong 4 loại lệnh đó. Ví dụ lệnh AT+GMR để đọc firmware version chỉ có loại thực thi mà thôi.

Bản chất các lệnh AT command là 1 chuỗi các giá trị ASCII của chuỗi ký tự của lệnh đó. Do đó chúng ta có thể dùng 1 chương trình Terminal trên máy tính là có thể gửi lệnh AT command xuống ESP8266 một cách dễ dàng. Lưu ý là chúng ta phải gắn vào mỗi lệnh AT command hai ký từ “\r\n” để ESP8266 có thể nhận từng lệnh OK.

Các nhóm lệnh AT commands

Các fimrware có sẵn của Espressif hiện hỗ trợ 3 nhóm lệnh AT commands:

  • Nhóm lệnh cơ bản để cấu hình hoạt động của hệ thống như cấu hình UART, sleep mode, TX power, v.v…
  • Nhóm lệnh để cấu hình mạng Wifi (IP addr, Password, SSID, v.v…), yêu cầu kết nối vào mạng Wifi
  • Nhóm lệnh thao tác trên TCP/UDP để truyền/nhận dữ liệu trên mạng Wifi

Trong bài viết này, chúng ta sẽ giới thiệu 1 cách tổng quát các lệnh phổ biến trong 3 nhóm lệnh trên. Để đọc thông tin chi tiết của từng lệnh, các bạn có thể tham khảo tài liệu của Espressif về các AT commands trong ESP AT Instruction Set

Nhóm lệnh AT command cơ bản để cấu hình hệ thống

Các lệnh này bao gồm:

  • AT
    Chỉ bao gồm 2 ký tự “AT” và được dùng để kiểm tra ESP8266 đã hoạt động chưa. Nếu ESP8266 đã hoạt động và kết nối OK thì chúng ta sẽ nhận được chuỗi “OK”
  • AT+RST
    Gửi lệnh này để reset ESP8266. Khi ESP8266 nhận lệnh này thành công, nó sẽ trả về “OK” và tiến hành reset. Chúng ta cần liên tục gửi lệnh “AT” để kiểm tra khi nào ESP8266 reset xong
  • AT+GMR
    Gửi lệnh này để yêu cầu thông tin firmware version hiện tại. ESP8266 sẽ gửi lên <AT version> <SDK version> <compile time>
  • AT+GSLP
    Gửi lệnh để yêu cầu ESP8266 vào chế độ sleep mode và thức dậy sau 1 khoảng thời gian.
    Với lệnh này chúng ta sẽ có các loại lệnh đọc/ghi/thực thi để xác lập khoảng thời gian trong chế độ sleep mode
  • ATE
    Mặc định thì ESP8266 sẽ gửi lại lệnh nó đã nhận được và kết quả của lệnh đó. Nếu chúng ta chỉ muốn nhận kết quả của lệnh thì có thể gửi lệnh này xuống để ESP8266 không cần gửi lại lệnh đã nhận được mỗi khi trả kết quả về
  • AT+RESTORE
    Dùng để reset về factory các thông tin cấu hình của ESP8266. Sau khi thực hiện lệnh này, ESP8266 sẽ reset.
  • AT+UART_CUR
    Dùng lệnh này để thay đổi thông số của UART và không lưu thông số này xuống flash. Sau khi nhận “OK” từ ESP8266 thì chúng ta cần thay đổi thông số UART của MCU ngoài để giao tiếp với ESP8266 với cấu hình UART mới. Sau khi reset, cấu hình UART sẽ trở về trạng thái mặc định
  • AT+UART_DEF
    Tương tự như lệnh UART+CUR nhưng thông số UART sẽ được lưu xuống flash để có thể sử dụng sau khi reset
  • AT+SLEEP
    Xác lập loại sleep mode là ligh-sleep mode hoặc modem-sleep mode hoặc không cho phép sleep mode
  • AT+WAKEUPGPIO
    Chọn GPIO nào có thể dùng để wake up ESP8266 trong chế độ light-sleep mode
  • AT+RFPOWER
    Dùng để chọn công suất phát tối đa cho ESP8266
  • AT+RFVDD
    Tương tự như lệnh RFPOWER, nhưng công suất phát của ESP8266 sẽ thay đổi theo giá trị điện áp ở chân VDD33

Nhóm lệnh kết nối Wifi

Các lệnh này bao gồm:

  • AT+CWMODE_CUR
    Chọn chế độ hoạt động là Wifi device hay Access Point, hoặc cả 2 cùng lúc. Thông tin chế độ hoạt động này sẽ không được lưu xuống flash
  • AT+CWMODE_DEF
    Tương tự như lệnh CWMODE_CUR nhưng thông tin chế độ hoạt động sẽ được lưu xuống flash để có thể sử dụng lại sau khi reset
  • AT+CWJAP_CUR
    Gửi thông tin về mạng Wifi cần kết nối (như SSID và password), ESP8266 sẽ thực hiện kết nối sau khi nhận lệnh này và sau 1 khoảng thời gian (vài giây) sẽ trả về kết quả có kết nối thành công hay không, cũng như lỗi nào đã xảy ra khi không kết nối thành công. Thông tin mạng Wifi sẽ không được lưu xuống flash
  • AT+CWJAP_DEF
    Tương tự như lệnh CWJAP_CUR nhưng thông tin mạng Wifi sẽ được lưu xuống flash và ESP8266 sẽ tự kết nối vào mạng Wifi đó kể cả sau khi reset
  • AT+CWLAP
    Dùng để yêu  cầu ESP8266 scan và trả về thông tin các mạng Wifi xung quanh (Encryption, SSID, RSSI,  địa chỉ MAC, v.v..). Chúng ta có thể gửi thông số của mạng Wifi cần tìm để ESP8266 chỉ scan mạng cụ thể đó mà thôi
  • AT+CWLAPOPT
    Dùng để xác lập nếu lệnh CWLAP sẽ tìm các mạng Wifi theo độ mạnh tín hiệu RSSI hay không
  • AT+CWQAP
    Yêu cầu ESP8266 ngắt kết nối hiện tại tới 1 Access Point
  • AT+CWSAP_CUR
    Thiết lập cấu hình cho ESP8266 khi hoạt động ở chế độ Access Point như SSID, password, loại Encryption, v.v… Thông tin này sẽ không được lưu xuống flash
  • AT+CWSAP_DEF
    Tương tự lệnh CWSAP_CUR nhưng thông tin của Access Point sẽ được lưu xuống flash để sử dụng lại sau khi reset
  • AT+CWLIF
    Yêu cầu ESP8266 ở chế độ Access Point trả về địa chỉ IP / địa chỉ MAC của các thiết bị Wifi đang kết nối vào
  • AT+CWDHCP_CUR
    Cho phép DHCP hoạt động trong các mode (Wifi, Access Point ) hoạt động của ESP8266 để ESP8266 có thể sử dụng hoặc cung cấp các địa chỉ IP động. Thông tin cấu hình DHCP sẽ không được lưu xuống flash
  • AT+CWDHCP_DEF
    Tương tự như lệnh CWDHCP_CUR nhưng thông tin cấu hình DHCP sẽ được lưu xuống flash và được sử dụng lại sau reset
  • AT+CWDHCPS_CUR
    Dùng để cấu hình danh sách các địa chỉ IP động mà ESP8266 Access Point có thể cấp phát cho các thiết bị Wifi kết nối vào (nếu DHCP được cho phép). Thông tin cấu hình sẽ không được lưu xuống flash
  • AT+CWDHCPS_DEF
    Tương tự như lệnh CWDHCPS_CUR nhưng thông tin cấu hình sẽ được lưu xuống flash và được sử dụng lại sau khi reset
  • AT+CIPSTAMAC_CUR
    Dùng để cấu hình địa chỉ MAC của ESP8266 thiết bị Wifi và không lưu xuống flash
  • AT+CIPSTAMAC_DEF
    Tương tự như lệnh CIPSTAMAC_CUR nhưng thông tin cấu hình được lưu xuống flash và sử dụng sau khi reset
  • AT+CIPAPMAC_CUR
    Dùng để cấu hình địa chỉ MAC của ESP8266 Access Point và không lưu thông tin xuống flash
  • AT+CIPAPMAC_DEF
    Tương tự lệnh CIPAPMAC_CUR nhưng thông tin cấu hình sẽ được lưu xuống flash và sử dụng lại sau reset
  • AT+CIPSTA_CUR
    Dùng để cấu hình địa chỉ IP của ESP8266 thiết bị WIFI và không lưu xuống flash
  • AT+CIPSTA_DEF
    Tương tự như lệnh CIPSTA_CUR nhưng thông tin cấu hình sẽ được lưu xuống flash
  • AT+CIPAP_CUR
    Dùng để cấu hình địa chỉ IP của ESP8266 Access Point và không lưu xuống flash
  • AT+CIPAP_DEF
    Tương tự lệnh CIPAP_CUR nhưng thông tin cấu hình sẽ được lưu xuống flash
  • AT+CWSTARTMART
    Yêu cầu ESP8266 thiết bị Wifi thực hiện scan và thu thập thông tin mạng Wifi được phát từ 1 app trên smartphone hay máy tính và sau đó kết nối vào mạng Wifi với thông tin đã scan được
  • AT+CWSTOPSMART
    Yêu cầu ESP8266 kết thúc quá trình scan khi thực hiện SmartConfig
  • AT+WPS
    Cho phép chức năng WPS của ESP8266 thiết bị Wifi
  • AT+MDNS
    Cho phép chức năng MDNS của ESP8266 Access Point

Nhóm lệnh truyền/nhận dữ liệu trên TCP/UDP

Các lệnh này bao gồm:

  • AT+CIPSTATUS
    Yêu cầu ESP8266 trả về thông tin kết nối mạng Wifi hiện tại
  • AT+CIPDOMAIN
    Dùng để cấu hình địa chỉ DNS (địa chỉ server trên internet) mà ESP8266 thiết bị Wifi sẽ kết nối
  • AT+CIPSTART
    Yêu cầu ESP8266 thiết bị Wifi kết nối vào 1 TCP/UDP/SSL server của 1 server trên internet
  • AT+CIPSSLSIZE
    Cấu hình size của SSL buffer khi truyền/nhận dữ liệu
  • AT+CIPSEND
    Dùng để gửi dữ liệu cần send xuống ESP8266
  • AT+CIPSENDEX
    Tương tự lệnh CIPSEND nhưng cách thức kết thúc dữ liệu truyền sử dụng ký tự NULL
  • AT+CIPSENDBUF
    Dùng để ghi dữ liệu vào buffer của TCP_TX và ESP8266 sẽ tự gửi dữ liệu đến khi TCP_TX buffer không còn dữ liệu
  • AT+CIPBUFSTATUS
    Dùng để kiểm tra trạng thái dữ liệu của TCP_TX buffer
  • AT+CIPCHECKSEQ
    Dùng để kiểm tra xem 1 TCP segment đã được gửi thành công hay chưa
  • AT+CIPBUFRESET
    Dùng để reset bộ đếm TCP segment
  • AT+CIPCLOSE
    Dùng để ngắt kết nối TCP/UDP/SSL
  • AT+CIFSR
    Đọc địa chỉ IP của ESP8266
  • AT+CIPMUX
    Cho phép hoặc không cho phép nhiều kết nối TCP/UDP/SSL
  • AT+CIPSERVER
    Cấu hình thông tin TCP Server trong ESP8266
  • AT+CIPMODE
    Dùng để cho phép Transparent mode (dữ liệu truyền trên UART sẽ tự động được truyền đến TCP/UDP port)
  • AT+SAVETRANSLINK
    Dùng để lưu cấu hình của Transparent mode xuống flash
  • AT+CIPSTO
    Dùng để cấu hình timeout cho TCP server trong ESP8266
  • AT+PING
    Yêu cầu ESP8266 thực hiện ping tới 1 trang web để kiểm tra kết nối internet của mạng wifi
  • AT+CIUPDATE
    Dùng để thực hiện quá trình cập nhật firmware mới qua mạng Wifi (FOTA)
  • AT+CIPDINFO
    Yêu cầu ESP8266 trả về địa chỉ IP/giá trị port của thiết bị đang kết nối
  • +IPD
    ESP8266 sẽ tự gửi chuỗi ký tự này để báo rằng nó đã nhận được dữ liệu từ mạng wifi với thông tin về dữ liệu đã nhận được (thông tin thiết bị gửi, độ lớn dữ liệu và dữ liệu)

Đến đây là kết thúc bài viết này rồi. Trong bài viết này, chúng ta đã tìm hiểu chức năng của các file bin được cung cấp bởi Espressif để ESP8266 hoạt động như 1 module Wifi truyền/nhận dữ liệu ứng dụng. Bài viết cũng thảo luận quá trình nạp các file bin này xuống ESP8266 như các file bin nào cần sử dụng, địa chỉ bắt đầu của từng file bin trong bộ nhớ SPI flash cũng như kết nối hardware để tiến hành quá trình download code từ máy tính qua UART vào ESP8266. Cuối cùng, chúng ta cũng thảo luận nguyên lý sử dụng các lệnh AT commands cũng như liệt kê một cách tổng quát các lệnh AT command được hỗ trợ bởi các firmware cung cấp bởi Espressif. Qua bài viết này, chúng ta có thể thấy firmware cung cấp sẵn hỗ trợ khá đầy đủ các chức năng của 1 thiết bị Wifi như scan mạng wifi, kết nối vào mạng wifi, truyền/nhận dữ liệu với TCP/UDP/SSL. Trong bài viết sau, chúng ta sẽ thực hiện 1 số demo có sử dụng firmware này để giao tiếp với thiết bị khác qua mạng Wifi 🙂

Nguồn htelectronics.vn