Phần 2: Các mô hình lập trình với ESP8266

Wearable

Tiếp tục  hành trình với ESP8266 nào! Qua bài đầu tiên, chúng ta đã thảo luận một cách tổng quan về kiến trúc phần cứng, các ưu điểm không thể bỏ qua như kích thước nhỏ, không yêu cầu linh kiện phức tạp cũng như giá thành rất thấp của chip ESP8266 trong các ứng dụng có giao tiếp Wifi.  Trong bài viết này chúng ta sẽ thảo luận 3 mô hình lập trình ứng dụng với ESP8266 để có cái nhìn tổng quát và lựa chọn được mô hình lập trình phù hợp với dự án IoT của mình

Mô hình 1: Sử dụng firmware có sẵn giao tiếp AT command

Trong mô hình này, chúng ta sẽ nạp một firmware có sẵn được cung cấp bởi Espressif để ESP8266 hoạt động như một Wifi module độc lập. Nhiệm vụ của chúng ta là lập trình 1 MCU bên ngoài giao tiếp với ESP8266 để cấu hình cho kết nối Wifi và truyền/nhận dữ liệu từ mạng Wifi.

Nguyên lý hoạt động của mô hình này có thể được thể hiện trong hình bên dưới:

mohinh1

 

Ở đây chúng ta giao tiếp với ESP8266 qua chuẩn UART nên chỉ cần kết nối 2 tín hiệu TXD/RXD và 2 dây nguồn đến module ESP8266 là đã có thể giao tiếp được rồi. External MCU thì có thể là 1 board microcontroller như board Arduino hoặc máy tính PC.

Đây là mô hình lập trình đơn giản nhất và nhanh nhất. Chúng ta sẽ sử dụng ESP8266 như là 1 wifi module và chỉ việc cấu hình mạng Wifi, password, ra lệnh kết nối và truyền nhận dữ liệu trên giao tiếp UART.

Để giao tiếp, chúng ta sẽ truyền lệnh theo 1 định dạng được định nghĩa bởi Espressif và được gọi là các lệnh AT command. Hiện tại các lệnh AT command có thể được chia thành 3 nhóm:

  • Các lệnh cấu hình hoạt động của chip: Cho phép các bạn có thể kiểm tra trạng thái hoạt động, thực hiện reset chip, đọc thông tin firmware version, hoặc cấu hình thông số UART, Sleep mode v.v….
  • Các lệnh xác lập thông tin mạng Wifi: Hỗ trợ các lệnh như chế độ hoạt động (Station, AP, AP+ station),  đọc các danh sách các mạng Wifi xung quanh, cấu hình thông tin mạng Wifi sẽ kết nối, hoặc cấu hình DHCP, WPS, MDNS, smart config,… Đa phần các cấu hình liên quan đến Wifi đều được hỗ trợ đầy đủ cho các nhu cầu sử dụng thông thường cho đến nâng cao.
  • Các tập lệnh cấu hình TCP/IP: cho phép cấu hình TCP, UDP, SSL, các lệnh Ping, cấu hình timeout cho truyền dữ liệu, DNS,… Phần này hỗ trợ chủ yếu cho truyền nhận data

Ví dụ thông tin về lệnh AT command trong tài liệu của Espressif như sau:

Screen Shot 2016-11-06 at 12.32.17 PM

 

 

 

 

 

 

 

Như trên hình, lệnh “AT” có thể dùng để kiểm tra xem kết nối UART tới ESP8266 đã OK chưa. Nếu kết nối UART OK thì chúng ta sẽ nhận được chuỗi “OK”

Tất cả dữ liệu truyền với ESP8266 qua đường UART là mã ASCII của lệnh. Ví dụ như lệnh Restart module, MCU sẽ truyền chuỗi Ascii[]= “AT+RST\r\n” và nếu thành công nó sẽ nhận lại chuỗi Ascii[] = “AT+RST\r\r\n\r\nOK\r\n” . Sau đó Esp8266 sẽ tiến hành khởi động lại . Lưu ý rằng chuỗi Ascii mà MCU và Esp8266 truyền đều phải có kết thúc bằng CR+LF (\r\n) 

Chúng ta sẽ không thảo luận chi tiết quá trình nạp firmware chuẩn, giao tiếp Wifi dùng firmware này và các lệnh AT command tương ứng trong bài viết này. Tất cả kiến thức này sẽ được trình bày trong các bài viết tiếp theo.

Mô hình 2: Lập trình trực tiếp trên chip ESP8266

Trong mô hình này, chúng ta sẽ lập trình ra một firmware cho ESP8266 sử dụng bộ thư viện SDK được cung cấp bởi Espressif. Chúng ta sẽ theo mô hình này cho các ứng dụng muốn dùng ES8266 để điều khiển thiết bị trực tiếp mà không cần một external MCU điều khiển; hoặc chúng ta cần các tính năng mà firmware chuẩn chưa cung cấp.

Bộ thư viện SDK của ESP8266 bao gồm các thành phần sau:

  • Các file code thư viện cung cấp API để điều khiển phần cứng (HAL driver), định nghĩa các địa chỉ của thanh ghi điều khiển, cũng như các module software như RTOS, Memory Managment, v.v..
  • Các chương trình biên dịch (compiler and linker) để biên dịch source code và tạo ra file *.bin firmware cho ESP8266
  • Software để truyền file *.bin xuống ESP8266 qua đường UART (chúng ta cần thay đổi giá trị của vài chân GPIO để ESP8266 vào chế độ nạp firmware từ UART như đã giới thiệu trong bài 1)

Lưu ý Espressif khuyên chúng ta nên biên dịch firmware cho ESP8266 trên nền Linux OS sử dụng các compiler tool được khuyên dùng để đảm bảo firmware được biên dịch đúng. Với môi trường Windows, Espressif cung cấp một file máy ảo (dùng trong Virtual Box) có cài đặt sẵn các trình biên dịch có thể sử dụng ngay. Ngoài ra cộng đồng mạng cũng hỗ trợ 1 bộ toolkit khác dùng trên Windows biên dịch bằng Python. Chúng ta sẽ đi sâu vào hướng dẫn ở các bài sau.

Với các file code thư viện, Espressif hỗ trợ 2 bộ thư viện: Non-OS SDK và RTOS SDK. Chúng ta sẽ dùng bộ thư viện Non-OS SDK để lập trình cho ESP8266 không sử dụng hệ thống RTOS; và RTOS SDK để lập trình ứng dụng có sử dụng các giải pháp đồng bộ các tác vụ ứng dụng của hệ thống RTOS.

Bản chất ứng dụng sử dụng Non-OS SDK và RTOS SDK có thể được mô tả như sau:

  • Non-OS SDK: Do không có sử dụng hệ điều hành quản lý (OS) nên các hoạt động trong chương trình sẽ được quản lý  thông qua timer hay các hàm call-back. Các tác vụ sẽ được gọi khi có 1 điều kiện tương ứng xảy ra và thông thường được xử lý theo phương thức polling để kiểm tra tất cả các điều kiện của các tính năng tương ứng. Đây là mô hình lập trình truyền thống mà chúng ta thường sử dụng khi bắt đầu quá trình học lập trình ứng dụng . Ưu điểm của nó là đơn giản nên ổn định và được nhà sản xuất cập nhật các tính năng mới đầu tiên. Hiện nay, phiên bản mới nhất của Non-OS SDK là  V2.0.0

Cấu trúc thư mục của Non-OS SDK như sau:

app: Thư mục làm việc chính chứa tất cả source code sẽ được compile của ứng dụng

bin: Chứa firmware đã được compile và nạp trực tiếp xuống flash

documents: các tài liệu liên quan đến SDK

driver_lib: Các thư viện hỗ trợ các thiết bị ngoại vi như UART, I2C và GPIO.

examples: Chứa các ví dụ mẫu để tham khảo.

include: Chứa các header file sử dụng trong SDK. Các tập tin này cũng định nghĩa các  API cũng như các macro mà SDK hỗ trợ. Người sử dụng không nên sửa các file này

ld: Chứa các file tương tác với các phần mềm chạy SDK . Nhà sản xuất khuyến cáo không nên sửa đổi nó trừ khi có những yêu cầu đặc biệt.

lib: Chứa các thư viện hỗ trợ bởi SDK như cấu hình chip, Wifi config,.. đến các tính năng cao cấp như Mesh, SmartConfig , mDNS, Sniffer,…

tools: Chứa các script cần thiết cho quá trình compile firmware: script tạo file binary, script tạo certificate,…  Nhà sản xuất khuyến cáo người sử dụng không nên sửa các file này.

  • RTOS SDK:  Sử dụng FreeRTOS mã nguồn mở giúp hệ thống hoạt động đa nhiệm. Do đó, hệ thống này cho phép người dùng sử dụng các phương thức chuẩn cho việc quản lý tài nguyên, chu kỳ hoạt động theo chu kỳ, quản lý thời gian trễ trong tác vụ , cung cấp thông tin cũng như đồng bộ hóa giữa các tác vụ. Ưu điểm của nó có thể xử lý đa nhiệm trong các yêu cầu dự án lớn tuy nhiên phụ thuộc vào chất lượng SDK mà hệ thống hoạt động ổn định hay không. Do đó thông thường các API mới được cập nhật chậm hơn so với Non-OS. Điểm đặc biệt cần lưu ý là RTOS không hỗ trợ AT command. Do đó nếu bạn muốn viết 1 firmware mà cần hỗ trợ AT command để giao tiếp với MCU bạn phải sử dụng Non-OS SDK. Hiện nay, phiên bản mới nhất của RTOS SDK là  V1.4.0  cung cấp hầu hết tất cả các Api của Non-OS SDK ngoại trừ việc không hỗ trợ AT command.

Cấu trúc thư mục của RTOS SDK như sau:

bin: Chứa firmware đã được compile và nạp trực tiếp xuống flash

documents: các tài liệu liên quan đến SDK

examples: Chứa các ví dụ mẫu để tham khảo.

examples/driver_lib: Các thư viện hỗ trợ các thiết bị ngoại vi như UART, I2C và GPIO.

examples/project_template: template cho project

examples/smart_config: Ví dụ mẫu cho Smart Config

examples/spiffs_test:  Ví dụ mẫu cho SPIFFS

examples/websocket_demo: Ví dụ mẫu cho WebSocket

extra_include: Các header files của Xtensa.

include: Chứa các header file sử dụng trong SDK. Các tập tin này cũng định nghĩa các  API cũng như các macro mà SDK hỗ trợ. Người sử dụng không nên sửa các file này

ld: Chứa các file tương tác với các phần mềm chạy SDK . Nhà sản xuất khuyến cáo không nên sửa đổi nó trừ khi có những yêu cầu đặc biệt.

lib: Chứa các thư viện hỗ trợ bởi SDK như cấu hình chip, Wifi config, FreeRTOS.. đến các tính năng cao cấp như Mesh, SmartConfig , mDNS, Sniffer,…

third_party: Các thư viện hỗ trợ open-source từ các nhà phát triển: Spiffs, Lwip, ssl,…

tools: Chứa các script cần thiết cho quá trình compile firmware: script tạo file binary, script tạo certificate,…  Nhà sản xuất khuyến cáo người sử dụng không nên sửa các file này.

Do bài viết này nhằm mục đích giới thiệu các mô hình lập trình ứng dụng với ESP8266 nên chúng ta chưa thảo luận chi tiết các thư mục này cũng như quá trình lập trình, biên dịch ở đây mà để dành cho các bài viết chuyên mục sau

Hiện tại Espressif  chưa  hỗ trợ 1  chương trình IDE như IAR, Keil để lập trình cho ESP8266. Do đó chúng ta sẽ dùng một trình soạn thảo text cơ bản (Java, Visual Studio, hay thậm chí Notepad,….) để viết code ứng dụng cho ESP8266, sau đó sử dụng trình biên dịch để biên dịch mã code cùng với SDK hỗ trợ ra file binary. Cuối cùng chúng ta sử dụng tool download để nạp firmware xuống device. Cũng không quá phức tạp phải không nào 🙂

Mô hình 3: Sử dụng các firmware thư viện từ cộng đồng phát triển

Ngoài 2 thư viện SDK chuẩn do Espressif  cung cấp, cộng đồng phát triển của ESP8266 cũng góp phần tạo ra các thư viện cũng như môi trường lập trình khác thân thiện hơn giúp cho nhiều người không chuyên về ngôn ngữ C vẫn có thể tiếp cận và sử dụng module ESP8266 một cách dễ dàng hơn.

Hai ngôn ngữ đang hỗ trợ mạnh mẽ nhất trong cộng đồng là Adruino và MicroPython

Lập trình cho ESP8266 dùng Arduino IDE

Không cần nói nhiều thêm về ngôn ngữ lập trình Adruino, nó đã quá nổi tiếng và các bạn chỉ cần search Adruino trên google nó sẽ ra hàng đống tài liệu hướng dẫn cả về tiếng Anh và tiếng Việt. Đây là ngôn ngữ khá dễ tiếp cận cho các bạn không chuyên mà vẫn thích khám phá , vọc những điều mới mẻ để tạo cho mình một sản phẩm nào đó.

Hiện tại trong cộng đồng đang phát triển 1 dự án là ArduinoESP8266 cung cấp bộ thư viện core của Arduino để biên dịch ra fimrware của ESP8266 trong khi vẫn sử dụng các lệnh Arduino quen thuộc. Các bạn có thể tham khảo trang chủ của dự án này trong https://github.com/esp8266/Arduino

Mô hình lập trình được mô tả như sau:

AdruinoMô hình sử dụng IDE của Adruino lập trình cho Esp8266

Như mô tả trong hình, chúng ta có thể sử dụng các lệnh quen thuộc trong Adruino IDE. Khi  biên dịch trong Arduino IDE, bộ thư viện ESP8266 sẽ chuyển đổi các lệnh Arduino thành các code của ESP8266 sử dụng các API của Non-OS SDK

Chúng ta có thể hiểu nguyên lý của mô hình này là bộ thư viện ArduinoESP8266 giúp tạo ra các dòng code của ESP8266  từ những lệnh quen thuộc trên Arduino IDE. Vì vậy người lập trình vẫn có thể sử dụng ngôn ngữ Arduino đã quen thuộc và dễ hiểu để lập trình cho ESP8266.  Hơn nữa ArduinoESP8266 cũng hỗ trợ tích hợp trình biên dịch vào Arduino IDE để tạo file firmware và được nạp xuống module ESP8266 thông qua UART.

Với việc hỗ trợ lập trình trực tiếp cho Esp8266 trên nền tảng này giúp các bạn đã quen thuộc với lập trình Adruino  có thể giao tiếp lập trình, mở rộng với các board ESP8266 một cách dễ dàng , tiết kiệm thời gian . Hiện tại, thư viện mới nhất của ESP8266 trên Adruino được viết dựa trên phiên bản Non-OS SDK 1.5.3  hỗ trợ khá đầy đủ các chức năng cần thiết của 1 module wifi như : TCP ,UDP, thiết lập HTTP, mDNS, SSDP, DNS servers, OTA,… Ngoài ra nó cũng hỗ trợ giao tiếp các thiết bị ngoại vi như : flash memory, SD cards, servos, SPI, I2C….

Lập trình ESP8266 với ngôn ngữ MicroPython

Với mô hình này, chúng ta sẽ nạp 1 fimrware được phát triển bởi cộng đồng có hỗ trợ chức năng xử lý các lệnh Python gửi từ kết nối UART.

Mô hình này có thể được mô tả trong hình sau:

MicroPython

Theo trong hình mô tả, phía ESP8266 sẽ được nạp trước 1 fimrware có tích hợp bộ thư viện gọi là MicroPython để nhận dạng và xử lý các lệnh Python nhận được từ UART. Bộ thư viện MicroPython được thiết kế dựa trên tiêu chuẩn của Python 3.4 và cực kì thích hơp sử dụng cho các dòng chip có bộ nhớ ít ỏi. Lợi thế của nó là sử dụng ngôn ngữ bậc cao có thể thực thi từng câu lệnh lập trình trực tiếp trên Terminal qua REPL và Web REPL (phương thức biểu diễn môi trường máy tính như màn hình console trong Linux shell nơi bạn có thể gõ các dòng lệnh và hệ thống sẽ trả về các kết quả). Ngoài ra bạn cũng có thể dùng chương trình ESPlorer để viết code và nạp firmware cho device

Điểm bất lợi của phương pháp này là bạn cần phải nạp firmware chứa trình biên dịch cho ngôn ngữ MicroPython vào Esp8266 trước để nó có thể hiểu các câu lệnh bằng ngôn ngữ Python mà các bạn truyền xuống. Sau đó ứng dụng viết bằng python truyền xuống thông qua UART sẽ do trình biên dịch bên dưới chip đảm nhận để chạy ứng dụng mà các bạn mong muốn. Từ đây các bạn có thể viết code theo ngôn ngữ MicroPython và truyền xuống chip một cách dễ dàng.

Phiên bản mới nhất hiện nay của Micropython dành cho Esp8266 là v1.8.5 dựa trên phiên bản Non-OS SDK 2.0.0.  Hiện tại thư viện MicroPython hỗ trợ các tính năng sau đây:

– REPL (Python prompt) trên giao tiếp UART0.

– Garbage collector, exceptions.

– Hỗ trợ Unicode.

– Các module tích hợp: gc, array, collections, io, struct, sys, esp, network.

– Arbitrary-precision long integers and 30-bit precision floats.

– Hỗ trợ WiFi.

– Sockets sử dụng modlwip.

– Hỗ trợ các hàm về GPIO và bit-banging I2C, SPI.

– Hỗ trợ giao thức 1-Wire và WS2812 (aka Neopixel) .

– Sử dụng Internal filesystem thông qua flash.

– WebREPL thông qua WiFi từ trình duyệt ( https://github.com/micropython/webrepl).

– Hỗ trợ HTTP, MQTT, và 1 số chuẩn khác https://github.com/micropython/micropython-lib .

Đánh giá các mô hình lập trình với ESP8266

Chúng ta có thể tổng hợp lại các ưu điểm và nhược điểm của từng cách thức sau đây để các bạn có thể lựa chọn cho mình phương thức sử dụng hợp lý nhất cho nhu cầu của các bạn như sau:

Điểm mạnh Điểm yếu
Firmware với AT command Đơn giản, nhanh gọn
Sử dụng firwmare có sẵn, ổn định
Hạn chế bởi các lệnh AT command được cung cấp
Cần 1 MCU ngoài để điều khiển
Tốc độ đáp ứng không tối ưu
Lập trình trưc tiếp dùng SDK Khả năng sử dụng phần cứng cao
Không cần MCU ngoài
Có thể tối ưu tốc độ truyền dữ liệu
Lập trình C phức tạp, tốn thời gian nghiên cứu
Độ ổn định của chương trình tùy thuộc vào khả năng của người lập trình
Sử dụng các bộ thư viện khác Sử dụng được ngôn ngữ cấp cao (Arduino, Python)
Không cần MCU ngoài (trường hợp ArduinoESP8266)
Đơn giản và nhanh hơn lập trình trực tiếp
Giới hạn bởi bộ thư viện được cung cấp
Khả năng tối ưu phần cứng, tốc độ truyền dữ liệu không cao
Tốn bộ nhớ chương trình và thời gian thực thi cho các bộ thư viện như MicroPython

Nhìn vào bảng đánh giá này chúng ta có thể chọn được mô hình lập trình phù hợp với dự án thực tế cũng như khả năng lập trình của bản thân. Nếu là  dân điện tử chuyên ngành thì nên nghiên cứu lập trình trực tiếp vì nó giúp tối ưu tốc độ xử lý dữ liệu và tăng khả năng tùy biến của ứng dụng mà không yêu cầu thêm phần cứng xung quanh; nếu là người không chuyên thì có thể chọn mô hình 1 hoặc 3 để có thể sử dụng ngôn ngữ lập trình cấp cao quen thuộc.

Như vậy qua bài viết này, chúng ta đã tìm hiểu 3 cách lập trình ứng dụng chính cho module Esp8266 của chúng ta. Tùy thuộc vào nhu cầu cũng như các kiến thức về ngôn ngữ lập trình mà chúng ta sử dụng cách thức phù hợp để đẩy nhanh quá trình tạo sản phẩm. Các bài sau chúng ta sẽ tìm hiểu chi tiết về việc quá trình thực hiện cũng như cách cài đặt cho từng mô hình lập trình này và sẽ có các demo nho nhỏ giúp các bạn làm quen với lập trình ESP8266 một cách nhanh chóng và hiệu quả.

Nguồn htelectronics.vn