Phần 4: Demo giao tiếp với  ESP8266 thông qua AT commands

Wearable

Tiếp tục tìm hiểu chủ đề sử dụng ESP8266 nào! Trong phần trước, chúng ta đã giới thiệu các firmware được cung cấp sẵn từ nhà sản xuất để ESP8266 hoạt động như 1 wifi module độc lập và công việc lập trình ứng dụng là viết code cho 1 MCU bên ngoài để gửi các lệnh AT command để cấu hình wifi cho ESP8266 và truyền nhận dữ liệu qua Wifi thông qua ESP8266. Trong bài viết này, chúng ta sẽ thực hiện quá trình nạp firmware và lập trình 3 demo trên Arduino cho ứng dụng truyền dữ liệu qua Wifi.

Bước chuẩn bị

Chúng ta sẽ sử dụng các module phần cứng sau:

  • 2 module ESP-01
    Đây là module đơn giản nhất, giá thấp nhất trong các module của ESP8266. Module có sẵn các jumper để chúng ta kết nối đến các board MCU như Arduino dễ dàng hơn để test nhanh code ứng dụng trên Arduino. Thông tin chi tiết về module này có thể xem ở đây

    esp-01

  • 2 board Arduino
    Chúng ta sẽ có demo 2 board Arudino giao tiếp với nhau qua mạng Wifi tạo bởi ESP8266, do đó chúng ta cần tối thiểu 2 board Arduino để làm 2 node trong demo này. Ở đây chúng ta sẽ dùng board Due và board ATmega2560

arduino_boards

  • 1 module FTDI FT232RL để nạp firmware xuống module ESP-01
  • 1 smartphone
  • 1 wifi router 

Về software thì chúng ta cần chuẩn bị:

  • Cài 2 app WIFI TCP Test Tool và WIFI UDP Test Tool vào iPhone.
    Với Android thì chúng ta có thể sử dụng app TCP Socket và Simple UDP Tester
  • Download và cài Arduino IDE. Download ở đây
  • Phần mềm ESP8266 Flash Download Tool. Download ở đây

Nạp firmware cho ESP8266

Bài viết trong phần 2 đã giới thiệu các file *.bin trong thư mục at/ của Non RTOS SDK và các file nào được nạp trong trường hợp chúng ta muốn có chức năng FOTA hoặc không có FTOA. Trong phần này, chúng ta sẽ demo việc nạp firmware theo cả 2 hướng.

Chúng ta sẽ kết nối module ESP-01 và module FT232RL để nạp firmware như hình bên dưới:

load_fw

Trên module ESP-01 sử dụng chip Flash dung lượng 1MB nên các địa chỉ bắt đầu của các file .bin sẽ khác với module ESP khác sử dụng chip Flash dung lượng 4MB.

Nạp firmware không hỗ trợ FOTA

Chúng ta sẽ mở chương trình ESP8266 Flash Download Tool và chọn các file .bin, chọn các địa chỉ bắt đầu tương ứng và dung lượng chip Flash 8Mbit như hình bên dưới:

Screen Shot 2016-11-17 at 10.57.15 PM

 

Ở đây địa chỉ bắt đầu của các file .bin khi sử dụng chip Flash 1MB (=8Mbit) trên board như sau:

  • esp_init_data_default.bin = 0xfc000
  • blank.bin = 0x7e000 và 0xfe000
  • eagle.flash.bin = 0x00000
  • eagle.irom0text.bin = 0x10000

Chọn FLASH SIZE là 8Mbit
Ấn Start để bắt đầu quá trình nạp firmware xuống module ESP-01

 

 

 

 

 

 

 

 

 

Nạp firmware có hỗ trợ FOTA

Chúng ta có thể nạp các file .bin khác để ESP8266 có thêm tính năng FOTA với ESP8266 Flash Download Tool như sau:

Untitled

 

Thông tin địa chỉ bắt đầu của các file .bin cho Flash chip 1MB như sau:

  • boot_v1.2.bin = 0x00000
  • user1.1024.new.2.bin = 0x01000
  • user2.1024.new.2.bin = 0x41000
  • esp_init_data_default.bin = 0xfc000
  • blank.bin = 0xfe000 và 0x7e000

 

 

 

 

 

 

 

 

OK, tới đây chúng ta đã nạp các file .bin cần thiết để module ESP-01 có thể hoạt động như 1 Wifi module độc lập rồi. Các bạn có thể chọn nạp có hỗ trợ FOTA hoặc không hỗ trợ chức năng này như trên. Hiện tại chúng ta chưa quan tâm đến FOTA nên cách nào cũng OK, tùy các bạn.

Demo truyền dữ liệu với web server dùng ESP8266

Với demo này, chúng ta sẽ lập trình Arduino gửi AT commands để module ESP-01 thành 1 thiết bị Wifi, kết nối vào mạng Wifi xung quanh, gửi lệnh PING lên 1 web server và nhận response từ web server đó.

Về phần cứng, chúng ta sẽ kết nối Arduino Due và ESP-01 như hình sau:

Arduino_esp

Công việc còn lại là lập trình board Due trên Arduino IDE để gửi các lệnh AT command cần thiết.

Flow chương trình trên Arduino sẽ như sau:

  • Gửi lệnh “AT” để kiểm tra kết nối module với ESP-01 và đợi nhận “OK” từ ESP8266
  • Gửi lệnh “AT+CWMODE=1” để module ESP-01 hoạt động như 1 thiết bị Wifi
  • Gửi lệnh “AT+CWJAP=\”<tên mạng wifi>\”,\”<password>\” ” để chọn mạng Wifi và password để kết nối
    Các bạn có thể thay thế <tên mạng wifi> và <password> tương ứng với mạng Wifi của mình nha
    Sau khi lệnh này, chúng ta cần đợi vài giây để module ESP-01 tìm và kết nối vào mạng Wifi đã chọn, trong code chúng ta có thể đợi đến khi nhận được “OK” từ ESP8266
  • Gửi lệnh “AT+PING=\”google.com\” ” để ping server của Google
  • Nhận PING response từ module ESP-01

Đơn giản phải không nào! Các bạn có thể download Arduino sketch của demo Adruino_Esp8266_PingGoogle

Hình bên dưới là màn hình log COM trên Arduino quá trình khởi động và ping web server của Google:

COM_win

Done! Khá là đơn giản phải không nào. Chỉ vài dòng lệnh trên Arduino chúng ta đã có thể kết nối vào internet và trao đổi dữ liệu với 1 web server rồi. Dựa vào demo này, chúng ta có thể thêm tính năng kết nối internet vào thiết bị IoT của mình 1 cách dễ dàng và nhanh chóng

Demo giao tiếp với Smartphone dùng ESP8266

Trong demo này, chúng ta sẽ tạo 1 ứng dụng trong đó smartphone sẽ trao đổi dữ liệu với thiết bị có ESP8266. Chúng ta có thể sử dụng 1 wifi router trung gian giữa 2 thiết bị Wifi là ESP8266 và smartphone. Cách khác đơn giản và hiệu quả hơn là sử dụng ESP8266 như là 1 rounter để kết nối với smartphone, do đó sẽ không cần router trung gian nữa. Chúng ta sẽ chọn cách đơn giản bằng cách sử dụng module ESP-01 như 1 Access Point để smartphone có thể kết nối vào mạng Wifi tạo bởi module ESP-01. Đồng  thời chúng ta cũng tạo TCP server và UDP server trên ESP8266 để truyền nhận dữ liệu với smartphone thông qua các port TCP, UDP

Về phần cứng chúng ta sẽ sử dụng board Arduino ATmega2560, module ESP-01 và iPhone như hình bên dưới:

hw_demo2

Mega_ESP

Truyền dữ liệu TCP với smartphone

Các lệnh AT commands được sử dụng theo thứ tự như sau:

  • Gửi lệnh “AT” đầu tiên để kiểm tra giao tiếp, kết nối với module ESP-01
  • Gửi lệnh “AT+CWMODE=2” để module ESP-01 hoạt động như 1 Access Point
  • Gửi lệnh “AT+CWSAP=\”ESP_HTelectronics\”,\”\”,5,0″ đẻ tạo mạng Wifi tên là “ESP_HTelectronics”, không security và không password
  • Gửi lệnh “AT+CIPMUX=1” để cho phép các kết nối TCP/UDP
  • Gửi lệnh “AT+CIPSERVER=1,1234” để tạo 1 TCP server, port 1234 trên module ESP-01
  • Liên tục kiểm tra dữ liệu nhận được từ port 1234 gửi lên từ ESP-01 và xử lý dữ liệu tương ứng

Chỉ đơn giản vậy thôi. Các bạn có thể download demo sketch Adruino_Esp8266_TCP

Sau khi nạp code vào board ATmega2560, chúng ta sẽ dùng smartphone kết nối với module ESP-01 trong Wifi setting, sau đó mở app WIFI TCP Test Tool để truyền/nhận dữ liệu với board Arduino

Dưới đây là màn hình COM trên Arduino  và giao diện app trên smartphone khi demo hoạt động:

IMG_0743      IMG_0744         Screen Shot 2016-11-21 at 10.27.20 PM

Trên phone, chúng ta sẽ connect vào TCP port 1234 đã được mở trong ESP8266 và gửi dòng text “Who are you”, khi ESP-01 nhận được sẽ trả lời “I’m ESP_HTelectronics” lên smartphone và chúng ta thấy hiện trong phần Received data của app. Với nguyên lý này, chúng ta có thể tạo thiết bị IoT sử dụng ESP8266 để giao tiếp trực tiếp với Smartphone.

Truyền dữ liệu UDP với smartphone

Tương tự như demo trên, nhưng chúng ta sẽ thử truyền dữ liệu thông qua UDP server trên ESP8266

Các lệnh AT commands được sử dụng theo thứ tự như sau:

  • Gửi lệnh “AT” đầu tiên để kiểm tra giao tiếp, kết nối với module ESP-01
  • Gửi lệnh “AT+CWMODE=2” để module ESP-01 hoạt động như 1 Access Point
  • Gửi lệnh “AT+CWSAP=\”ESP_HTelectronics\”,\”\”,5,0″ đẻ tạo mạng Wifi tên là “ESP_HTelectronics”, không security và không password
  • Gửi lệnh “AT+CIPMUX=1” để cho phép các kết nối TCP/UDP
  • Gửi lệnh “AT+CIPSTART=0,\”UDP\”,\”255.255.255.255\”,1234,1234,2″ để tạo 1 UDP server, port 1234 trên module ESP-01
  • Liên tục kiểm tra dữ liệu nhận được từ port 1234 gửi lên từ ESP-01 và xử lý dữ liệu tương ứng

Tương tự như demo trên, chúng ta sẽ mở app WIFI UDP Test Tool để truyền nhận dữ liệu với board ATmega2560 thông qua ESP-01 dùng UDP như hình bên dưới:

IMG_0745                   Screen Shot 2016-11-21 at 10.10.49 PM

Các bạn có thể download demo sketch Adruino_Esp8266_UDP

Demo giao tiếp giữa 2 module ESP8266

OK, chúng ta đã đi qua 2 demo sử dụng 2 chế độ hoạt động của ESP8266 là chế độ thiết bị Wifi và chế độ Access Point. Trong phần demo này chúng ta sẽ tạo 1 ứng dụng trong đó 2 board arduino sẽ giao tiếp trực tiếp với nhau qua mạng Wifi được tạo bởi ESP8266. Chúng ta có thể ứng dụng demo này trong các mạng wireless sensor trong đó các thiết bị IoT là các node  và nói chuyện trực tiếp với nhau mà không cần smartphone hay router hay web server ở trung gian.

Về kết nối phần cứng thì chúng ta sẽ giả lập 2 node trong 1 network dùng 2 board ATmega2560 và board Due cùng với 2 module ESP-01 như hình bên dưới:

IMG_0753

Chúng ta sẽ lập trình board Due truyền AT commands để xác lập module ESP-01 thành 1 Access Point và 1 UDP server; và lập trình board ATmega truyền AT commands để xác lập module ESP-01 thành 1 thiết bị Wifi. Hai module ESP8266 sẽ kết nối trực tiếp với nhau và truyền/nhận dữ liệu thông qua UDP server/client.

Các lệnh AT commands truyền từ board Due như sau:

  • Gửi lệnh “AT” đầu tiên để kiểm tra giao tiếp, kết nối với module ESP-01
  • Gửi lệnh “AT+CWMODE=2” để module ESP-01 hoạt động như 1 Access Point
  • Gửi lệnh “AT+CWSAP=\”ESP_HTelectronics\”,\”\”,5,0″ đẻ tạo mạng Wifi tên là “ESP_HTelectronics”, không security và không password
  • Gửi lệnh “AT+CIPMUX=1” để cho phép các kết nối TCP/UDP
  • Gửi lệnh “AT+CIPSTART=0,\”UDP\”,\”255.255.255.255\”,1234,1234,2″ để tạo 1 UDP server, port 1234 trên module ESP-01
  • Liên tục kiểm tra dữ liệu nhận được từ port 1234 gửi lên từ ESP-01 và xử lý dữ liệu tương ứng

Các lệnh AT commands truyền từ board ATmega2560 như sau:

  • Gửi lệnh “AT” đầu tiên để kiểm tra giao tiếp, kết nối với module ESP-01
  • Gửi lệnh “AT+CWMODE=1” để module ESP-01 hoạt động như 1 thiết bị Wifi
  • Gửi lệnh “AT+CWJAP=\”ESP_HTelectronics\”,\”\”” để kết nối vào mạng Wifi “ESP_HTelectronics” được tạo bởi thiết bị bên board Due. Sau lệnh này chúng ta cần đợi vài giây để module ESP-01 kết nối vào mạng Wifi. Chúng ta sẽ liên tục nhận dữ liệu từ ESP8266 đến khi nhận được “OK”
  • Gửi lệnh “AT+CIPMUX=1” để cho phép các kết nối TCP/UDP
  • Gửi lệnh “AT+CIPSTART=0,\”UDP\”,\”192.168.4.1\”,1234,1234,2″ để kết nối vào UDP server, port 1234 trên server có địa chỉ IP là 192.168.4.1
    Lưu ý địa chỉ IP mặc định của ESP8266 là 192.168.4.1, do đó chúng ta có thể hardcode trong code của UDP client. Nếu ESP8266 bên UDP Server thay đổi địa chỉ IP thì chúng ta cần thay đổi bên UDP client để 2 module ESP-01 có thể kết nối UDP với nhau
  • Gửi dữ liệu là text “Who are you” vào UDP port đã kết nối
  • Nhận dữ liệu truyền lại từ UDP server bên board Due

Dưới đây là cửa sổ COM của board Due và board ATmega2560 khi hoạt động:

Screen Shot 2016-11-21 at 11.03.36 PM    Screen Shot 2016-11-21 at 11.03.44 PM

Các bạn có thể download sketch cho UDP Server và UDP Client Adruino_Esp8266_UDP_Server ,  Adruino_Esp8266_UDP_Client

Done! Chúng ta đã demo quá trình nạp firmware cung cấp sẵn cho ESP8266 để hoạt động như 1 wifi độc lập và thực hiện 3 demo cho việc sử dụng AT commands để điều khiển module ESP-01 trong các ứng dụng giao tiếp qua mạng Wifi. Thông qua các demo, chúng ta có thể dùng ESP8266 để kết nối web server trên internet thông qua 1 wireless router trong nhà, hoặc giao tiếp trực tiếp với smartphone, hoặc giao tiếp lẫn nhau trong 1 mạng wireless network. Tất cả chức năng trên có thể được thực hiện bằng cách gửi các lệnh AT commands đơn giản, dễ hiểu. Nếu chúng ta muốn thêm tính năng giao tiếp wifi cho 1 thiết bị có sẵn thì sử dụng firmware có sẵn của ESP8266 là tối ưu và tiết kiệm thời gian nhất; nhưng nếu chúng ta muốn sử dụng ESP8266 vừa giao tiếp wifi, vừa điều khiển thiết bị thì cần phải lập trình 1 firmware mới dùng bộ thư viện SDK của Espressif. Trong bài viết sau, chúng ta sẽ thảo luận chủ đề sử dụng bộ thư viện SDK này.

Nguồn htelectronics.vn