Phần 7: Lập trình ESP8266 với Arduino và MicroPython firmware

Wearable

Trong các bài trước, 2 mô hình lập trình ứng dụng với ESP8266 đã được thảo luận: 1 là sử dụng firmware AT commands và lập trình MCU bên ngoài để gửi lệnh AT commands để điều khiển ESP8266 kết nối và gửi dữ liệu qua mạng Wifi; 2 là lập trình trực tiếp trên ESP8266 với Eclipse để làm nhiệm vụ giao tiếp Wifi mà không cần sử dụng MCU ngoài cũng như tận dụng được các module hardware trên ESP8266 như I2C, UART, PWM, etc để giao tiếp với các thiết bị xung quanh. Trong bài này, chúng ta sẽ thảo luận mô hình lập trình thứ 3 là sử dụng các bộ thư viện trên Arduino hoặc Micro Python để lập trình cho ESP8266. Với mô hình thứ 3 này, chúng ta có thể lập trình ESP8266 ngay trên chương trình Arduino hoặc sử dụng ngôn ngữ cấp cao là Python để giao tiếp với ESP8266

1/ Thư vin cho ESP8266 đ lp trình trên Arduino

Với những người đã quen thuộc với Arduino thì chắc đã hiểu nguyên lý lập trình trên Arduino IDE là chúng ta sẽ sử dụng các lệnh chuẩn của Arduino như Serial.begin(), digitalRead(), digitalWrite(), analogRead(), v.v… Sử dụng các hàm này sẽ dễ dàng hơn với nhiều người không có kiến thức phần cứng chuyên sâu vì không cần làm việc trực tiếp với các thanh ghi điều khiển phần cứng cũng như tất cả các board hỗ trợ Arduino đều cung cấp các hàm Arduino giống nhau nên không cần phải học tập lệnh riêng biệt cho từng board MCU như lập trình truyền thống.

Với ESP8266 cũng không ngoại lệ, cộng đồng open source đã phát triển 1 bộ thư viện cho ESP8266 trên Arduino. Chúng ta chỉ cần cài đặt bộ thư viện này vào Arduino IDE, tìm hiểu các lệnh Arduino được hỗ trợ rồi sử dụng lệnh cần thiết khi lập trình trên Arduino. Đơn giản phải không nào!

Các thông tin về bộ thư viện này được tham khảo từ website http://esp8266.github.io/Arduino/versions/2.3.0-rc2 . Các bạn có thể tham khảo đầy đủ thông tin về tất cả các hàm API trên ESP8266.

Cài đt thư vin Arudino cho ESP8266

Vào menu File -> Preference trong Arduino, thêm link để download thư viện http://arduino.esp8266.com/stable/package_esp8266com_index.json cho ESP8266 như hình sau:

Arduino_install

Sau đó, vào menu Tool -> Boards / Boards Manager và chọn cài đặt thư viện cho ESP8266 như hình sau:

esp_board_install

Đợi Arduino tự động download và copy thư viện của ESP8266 (mặc định sẽ là thư mục C:\Users\<UserName>\AppData\Local\Arduino15\packages\esp8266 trên Windows )

Sau khi cài đặt xong, chúng ta có thể lập trình cho ESP8266 sử dụng các hàm chuẩn ngay trên Arduino IDE. (Nên nhớ phải set board là ESP8266 nha)

Gii thiu các hàm thư vin Arduino cho ESP8266

Bộ thư viện Arduino cho ESP8266 hỗ trợ các hàm chuẩn để làm việc với Digital IO, Analog IO, Software I2C, UART, timer. Ngoài ra, bộ thư viện còn hỗ trợ các hàm API của riêng ESP8266 như các hàm Wifi, các hàm để lấy thông tin phần cứng trên ESP, các hàm để làm việc với files/folders, và các hàm để thực hiện cả OTA.

Trước tiên chúng ta cần nắm 1 chút về các chức năng của các chân IO trên ESP8266 để lập trình tương ứng trên Arudino.

esp_io

Nếu bỏ các chân liên quan đến SPI (D12, D13, D14 và D15) vì đã được dùng để giao tiếp với SPI Flash chip trên board, thì chúng ta có thể sử dụng các chức năng sau:

  • 1 chân ADC input
  • 1 UART0 (tên là Serial trong Arduino) với TXD/RXD  (chân D1 và D3) và 1 UART1 (tên Serial1 trong Arduino) chỉ có TXD (chân D2)
  • 1 Software I2C (chân D4 và D5)
  • D16 và D0 với chức năng Digital IO. Tuy nhiên, chúng ta có thể dùng các chân khác làm digital IO nếu không cần sử dụng các chức năng kèm theo các chân đó.

Các hàm chuẩn cho digital IO:

pinMode(pin, Mode)        //pin = 0 cho GPIO0, 1 cho GPIO01 và 2 cho GPIO02
digitalRead(pin)
digitalWrite(pin, value)
attachInterrupt(digitalPinToInterrupt(pin), callback_func, mode); //Lưu ý không có interrupt cho GPIO16
deattachInterrupt(digitalPinToInterrupt(pin)

Các hàm chuẩn cho Analog IO:

analogRead(A0)                  //trả về 0-1023 tương ứng với 0-1V
analogWrite(pin, value)    // tạo điện áp analog tại chân GPIO, value từ 0-1023
analogWriteFreq(new_frequency)  //thay đổi tần số 1KHz mặc định của PWM để tạo analog điện áp

Các hàm chuẩn cho timer:

delay(ms)
delayMicroseconds(us)

Lưu ý là chúng ta nên gọi hàm delay(), delayMicroseconds() thường xuyên để firmware xử lý chức năng Wifi của ESP có thể hoạt động bình thường. Nếu chương trình ứng dụng trên Arduino chiếm nhiều thời gian và ít gọi hàm delay(), chức năng Wifi sẽ có thể không hoạt động như mong đợi

Các hàm chuẩn cho UART:

Serial.begin(baudrate)   // và Serial1.begin(baudrate)
Serial.print(), Serial.println(), Serial.readByte(), Serial.readString(), v.v…

Các hàm chuẩn cho I2C:

Wire.begin(sda_pin, scl_pin)    //thay đổi chân mặc định chân GPIO4, GPIO5 cho I2C
Wire.beginTransaction(),Wire.write(), Wire.read(), Wire.endTransaction(), v.v….

Các hàm đọc thông tin phần cứng trên ESP8266:

ESP.restart() //reset ESP
ESP.getResetReason()
ESP.getChipId()
ESP.getFlashChipSize()
ESP.getFlashSpeed()

Các hàm API cho Wifi:

WiFi.mode(mode)   //chọn mode là thiết bị Wifi, Access Point, hoặc Soft Access Point
WiFi.softAP(ssid, password)     //thiết lập thông tin mạng Wifi
WiFi.macAddress(mac)    //thay đổi MAC address khi làm thiết bị Wifi
WiFi.softAPmacAddress(mac)  //thay đổi MAC address khi làm Access Point
Wifi.localIP()        //đọc địa chỉ IP khi hoạt động như 1 thiết bị Wifi
Wifi.softAPIP()    //đọc địa chỉ IP khi hoạt động như 1 Access Point
WifiUDP.xxxx()  // hỗ trợ truyền nhận dữ liệu qua UDP

Với thời gian hạn chế cũng như không muốn lặp lại tất cả thông tin từ website gốc,  bài viết tập trung giới thiệu các thư viện chính để lập trình ESP8266. Để tìm hiểu thêm, các bạn có thể tham khảo đầy đủ các thư viện khác như DNS, Ping, etc trong website http://esp8266.github.io/Arduino/versions/2.3.0-rc2/doc/reference.html

2/ Lập trình với MicroPython firmware cho ESP8266

Với mô hình này, chúng ta sẽ nạp 1 firmware build sẵn cho ESP8266 để điều khiển ESP bằng các lệnh Python. Có thể nói mô hình này tương tự như mô hình sử dụng firmware AT command vì đều sử dụng firmware có sẵn, và cần MCU ngoài để gửi lệnh cho ESP8266. Điểm khác nhau là format của lệnh gửi đi là AT command hay Python command. Thông tin trong bài viết này được tham khảo từ website http://docs.micropython.org/en/latest/esp8266/index.html; các bạn có thể tham khảo chi tiết các chức năng được hỗ trợ bởi firmware MicroPython này.

Nạp MicroPython firmware cho ESP8266

Dĩ nhiên chúng ta cần phải nạp firmware cho MicroPython vào ESP trước khi sử dụng nó bằng 2 bước sau:

  • Đầu tiên xóa toàn bộ vùng Flash của ESP bằng cách nạp file  blank_1MB.bin từ địa chỉ 0x00000. Nếu board ESP có chip SPI Flash dung lượng lớn hơn 1MB thì chỉ cần nạp tiếp file blank_1MB.bin cho các vùng nhớ tiếp theo mà thôi
  • Nạp firmware MicryPython cho ESP8266 esp8266-20161110-v1.8.6.bin  từ địa chỉ 0x00000 (Các bạn có thể xem các file firmware MicroPython version khác trong website http://micropython.org/download)

flash_firmware

Để kiểm tra firmware hoạt động OK không, các bạn có thể mở chương trình Terminal và gửi ENTER, sẽ thấy ký tự promt “>>>” gửi lên từ ESP. Các bạn có thể test firmware bằng cách gửi lệnh Python  “print(“hello”)” từ Terminal

terminal_python

Chúng ta cũng có thể kiểm tra firmware hoạt động OK bằng cách kiểm tra Wifi network được tạo bởi ESP8266 có tên “MicroPython-xxxxxx” với xxxxxx là địa chỉ MAC của thiết bị và password là “micropythoN

Giao tiếp với MicroPython firmware

Tương tự như firmware AT command, chúng ta cũng gửi lệnh Python từ MCU bên ngoài đến ESP8266 đang chạy MicroPython firmware để thực hiện chức năng giao tiếp Wifi; điểm khác biệt là chúng ta gửi lệnh theo format của Python.

Nguyên lý chỉ đơn giản là gửi mã ASCII của dòng lệnh Python qua UART0 tương tự như khi chúng ta viết Python code trên máy tính. Điểm khác biệt ở đây là ESP8266 sẽ xử lý từng lệnh Python nhận được lúc runtime luôn.

Ví dụ chúng ta có thể lập trình để gửi đoạn code Python sau:

from machine import Pin
from apa102 import APA102

clock = Pin(14, Pin.OUT)     # set GPIO14 to output to drive the clock
data = Pin(13, Pin.OUT)      # set GPIO13 to output to drive the data
apa = APA102(clock, data, 8) # create APA102 driver on the clock and the data pin for 8 pixels
apa[0] = (255, 255, 255, 31) # set the first pixel to white with a maximum brightness of 31
apa.write()                  # write data to all pixels
r, g, b, brightness = apa[0] # get first pixel colour

Mỗi dòng lệnh chính là 1 chuỗi mã ASCII kết thúc bằng ký tự ENTER. Đơn giản phải không nào, nếu các bạn đã quen thuộc sử dụng ngôn ngữ Python thì sẽ thấy dễ dàng lập trình với ESP8266 mà vẫn tận dụng các thư viện software của Python.

Ngoài việc gửi lệnh Python qua UART, firmware MicroPython còn hỗ trợ làm việc qua Web browser khi máy tính và ESP8266 trong cùng mạng Wifi. Giao tiếp này gọi là WebREPL.

Mặc định thì tính năng WebREPL sẽ bị disable, do đó chúng ta cần enable nó bằng cách gửi lệnh “import webrepl_setup” và cấu hình password thông qua UART0 như hình sau

enable_webrepl

Sau khi reboot, ESP8266 sẽ tự động tạo mạng Wifi MicroPython-xxxxxx như đã giới thiệu ở trên, các bạn kết nối máy tính mình vào mạng Wifi này và mở website webrepl.html (Lưu ý là mình phải download trước trang webrepl.html ở đây và mở trên máy tính sau khi đã kết nối vào mạng Wifi của ESP nha).

Trong giao diện webrepl.html, các bạn có thể Connect (điền password mình đã setup ví dụ “123456789” như hình trên) và có thể làm việc với lệnh Python ngay trên web rồi. Hiện tại WebREPL chỉ hỗ trợ Firefox and Chrome mà thôi

webrepl

Ngoài ra, chúng ta có thể kết nối máy tính và ESP vào cùng 1 router Wifi (cần gửi lệnh Python qua UART0 để cấu hình ESP thành thiết bị Wifi và kết nối vào mạng Wifi của Rounter). Sau đó cho chạy chương trình WebREPL trên ESP và mở webrepl.html trên máy tính với địa chỉ IP local của ESP là có thể kết nối trên Web rồi. Với phương pháp này, chúng ta có thể điều khiển ESP từ bất cứ máy tính nào trong cùng mạng Wifi.

Các bước thực hiện:

  • Thiết lập cho ESP kết nối vào mạng Wifi

import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(‘<tên mạng wifi’, ‘password’)

  • Sau khi kết nối thành công, gửi lệnh “wlan.ifconfig()” để đọc địa chỉ IP của ESP trong mạng Wifi (là địa chỉ IP đầu tiên trong kết quả trả về)
  • Khởi động WebREPL trên ESP. Trong kết quả trả về, chúng ta có thể thấy port mà WebREPL trên ESP sẽ listen

import webrepl_setup
webrepl.start()

  • Trên 1 máy tính trong cùng mạng Wifi, mở webrepl.html, điền địa chỉ IP và port của WebREPL trên ESP và tiến hành kết nối như bình thường là xong

Đơn giản phải không nào

Giới thiệu các thư viện hỗ trợ bởi MicroPython firmware

Toàn bộ các thư viện hỗ trợ bởi MicroPython firmware có thể chia làm 3 nhóm:

  • Các thư viện chuẩn của Python
    Bao gồm các built-in functions của Python như abs(), dir(), eval(), exec(), print(), open(), v.v…
    Và các hàm thư viện như arraysysmath, v.v…
    Với những người đã quen với ngôn ngữ Python sẽ dễ dàng sử dụng các hàm thư viện chuẩn này vì tất cả đều có chức năng giống như ngôn ngữ Python chạy trên máy tính
  • Các thư viện Python chỉ có trên MicroPython
    Đây là các hàm Python để điều khiển phần cứng của các MCU platform mà MicroPython hỗ trợ (chú ý là không phải hàm Python chuẩn nha).
    Các thư viện này bao gồm machine, network, micropython. Trong đó machine là thư viện chính bao gồm các class như ADC, I2C, Pin, UART, v.v.. cung cấp các function để điều khiển phần cứng trên các MCU được hỗ trợ.
  • Các thư viện riêng cho ESP8266
    Module thư viện esp cung cấp các hàm chỉ có trên ESP8266 như flash_id(), deepsleep(), v.v..

Các sample code sử dụng các thư viện này, cũng như thông tin chi tiết về toàn bộ các hàm thư viện, các bạn có thể tham khảo trên website http://docs.micropython.org/en/latest/esp8266/library/index.html#python-standard-libraries-and-micro-libraries. Do hạn chế về thời gian, cũng như tránh không lặp lại thông tin đã có nên bài viết không giới thiệu lại ở đây.

3/ Demo ESP8266 Web server trên Arduino

Trong demo này, chúng ta sẽ lập trình 1 Webserver đơn giản chạy trên ESP8266 với Arudino IDE. Về phần cứng, chúng ta sẽ sử dụng module ESP01 và module FT232 USB-UART như các bài trước. Kết nối khi nạp chương trình trên Arduino sẽ như hình bên dưới:

load_fw

Về software thì cần cài đặt bộ thư viện cho ESP8266 trên Arduino như phần đầu bài viết đã giới thiệu. Trong demo này, chúng ta sẽ dùng bộ thư viện  ESP8266Wifi, WifiClient, ESP8266WebServer và ESP8266mDNS

Code cho Arduino sketch:

  • Hàm setup()
    Lập trình 1 giao diện web gồm 1 Title và 2 nút nhấn và 1 số label vào biến “webpage”
webPage += “<h1>HT Electronic – ESP8266 Web Server</h1><p>Button #1 <a href=\”button1On\”><button>ON</button></a>&nbsp;<a href=\”button1Off\”><button>OFF</button></a></p>”;
webPage += “<p>Button #2 <a href=\”button2On\”><button>ON</button></a>&nbsp;<a href=\”socket2Off\”><button>OFF</button></a></p>”;

Kết nối vào mạng Wifi, gửi nội dung web server để hiện thị khi có client truy xuất vào

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED);      //đợi kết nối Wifi thành công
server.on(“/”, [](){ server.send(200, “text/html”, webPage);});

Đăng ký các hàm callback khi người dùng ấn nút trên giao diện Web server

server.on(“/button1On”, [](){ server.send(200, “text/html”, webPage); Serial.println(“Ban an Button 1 ON”); delay(1000); });
server.on(“/button1Off”, [](){server.send(200, “text/html”, webPage); Serial.println(“Ban an Button 1 OFF”);delay(1000); });
server.on(“/button2On”, [](){ server.send(200, “text/html”, webPage); Serial.println(“Ban an Button 2 ON”);delay(1000);});
server.on(“/socket2Off”, [](){server.send(200, “text/html”, webPage);Serial.println(“Ban an Button 2 OFF”);delay(1000); });

Bắt đầu chạy Web server

server.begin();
  • Hàm loop()
    Chỉ gọi hàm server.handleClient() để xử lý các event của Web server

Thế là xong, các bạn có thể download sketch ở đây. Tiếp theo thì compile và thiết lập nạp xuống ESP01 trên Arduino như sau:

arduion_download

Sau khi nạp xong, disconnect GPIO0 khỏi GND. Các bước chạy demo như sau:

  • Mở chương trình Terminal để lấy thông tin IP của ESP
  • Kết nối máy tính vào chung mạng Wifi với ESP
  • Mở Chrome hay Firefox, đánh địa chỉ IP của ESP để access Web server trên ESP
  • Nếu thành công, chúng ta sẽ thấy giao diện của Web server và thử ấn nút 1, nút 2 để xem ESP8266 print log trên chương trình Terminal tương ứng “Ban an nut 1 ON”, “Ban an nut 2 Off”, v.v….

arduino_websrv

Enjoy!

Bài viết đến đây là hết rồi. Hy vọng các bạn có thêm thông tin lập trình ESP8266 trên Arduino và sử dụng ngôn ngữ Python với ESP8266 dùng MicroPython firmware. Đến đây chúng ta đã thảo luận các mô hình lập trình 1 ứng dụng với ESP8266 phổ biến hiện này như: sử dụng AT firmware, lập trình trực tiếp với thư viện SDK, lập trình trực tiếp với thư viện Arduino và sử dụng MicroPython firmware. Mỗi mô hình có điểm mạnh, điểm yếu khác nhau như đã giới thiệu, tùy vào nhu cầu điều khiển ứng dụng và trình độ lập trình mà chúng ta lựa chọn cách lập trình thích hợp nhất.

Nguồn htelectronics.vn