Hướng dẫn lập trình ESP32 trên Ubuntu

Xin giới thiệu với các bạn cách tạo môi trường để lập trình cho ESP32 dùng FreeRTOS trên Ubuntu.

Chuẩn bị

Trước khi bắt đầu thì mình cần có một số đồ nghề sau:

  • ESP32, mình dùng kit NodeMCU ESP32
  • Dây cáp.
  • Máy tính xài hệ điều hành Ubuntu

Cài đặt

Như thông thường với lập trình STM32 thì ta dùng Keil C hoặc IAR để lập trình, với ESP8266/ESP32 đều có thể cài thông qua 1 số bước cơ bản với Arduino, nay mình thử sang cái khó hơn xíu để xem coi code không dùng Arduino thì sẽ phải làm thế nào, dưới đây là các bước để bạn có thể cấu hình toolchain(nôm na là gọi là môi trường để build và nạp code) cho ESP32

Cài các tool cần thiết

$ sudo apt-get install git wget make libncurses-dev flex bison gperf python python-serial

Cài đặt pip và cập nhật pyserial

$ sudo apt-get update
$ sudo apt-get -y install python-pip
$ sudo pip install pyserial --upgrade

Tải file binary Toolchain cho ESP32

Bản ESP32 toolchain cho Linux bạn có thể tải từ trang chủ của Espressif sau đó giải nén ra, hoặc có thể chạy bằng lệnh sau để tải và giải nén vào thư mục $HOME/esp32

$ mkdir -p $HOME/esp32
$ cd $HOME/esp32
$ wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
$ tar -xzf xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
$ export PATH=$PATH:$HOME/esp32/xtensa-esp32-elf/bin
$ echo "export PATH=\$PATH:$HOME/esp32/xtensa-esp32-elf/bin" >> ~/.bashrc

Tải ESP-IDF từ Github

Sử dụng git để clone ESP-IDF, repo này sẽ bao gồm các thư viện, các API cũng như các ví dụ mẫu cho ESP32, bạn có thể thấy nó giống như thư viện chuẩn Std của STM32 đấy. Repo này sau khi clone về sẽ nằm trong thư mục $HOME/esp32/esp-idf nhé

$ cd $HOME/esp32
$ git clone --recursive https://github.com/espressif/esp-idf.git
$ export IDF_PATH=$HOME/esp32/esp-idf
$ echo "export IDF_PATH=$HOME/esp32/esp-idf" >> ~/.bashrc

Cập nhật framework ESP-IDF

Vì ESP-IDF được cập nhật thường xuyên nên để có thể có bản mới nhất bạn cần chạy lệnh sau

$ cd $HOME/esp32/esp-idf
$ git pull
$ git submodule update

Lập trình chương trình đầu tiên

Coi như bước chuẩn bị ban đầu đã xong, giờ mình chạy luôn thử chương trình mẫu có sẵn là helloword để xem cách make, compile và nạp chương trình xuống cũng như hoạt động sau đó của ESP32 là thế nào

Biên dịch

Chạy lệnh để vào thư mục và biên dịch code

$ cd $HOME/esp32/esp-idf/examples/get-started/hello_world
$ make

Thông thường lần biên dịch đầu tiên sẽ hiện ra bảng config

Cấu hình

Như với ESP8266 thì bạn thường phải cấu hình bằng command, với ESP32 thì hiện đại hơn đã có GUI cho các bạn có thể cấu hình dễ dàng hơn, ta dùng các phím lên xuống để di chuyển option, phím qua lại để di chuyển giữa select exit,…

Để chạy config bằng tay các bạn có thể gõ lệnh

$ make menuconfig

Trong menu chọn Serial flasher config > Default serial port > Default baudrate, sau đó chọn baud 921600 để có tốc độ nạp nhanh nhất, chọn Save > ok

Build và flash

$ make flash
esptool.py v2.1-beta1
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)…
esptool.py v2.1-beta1
Connecting…..
Chip is ESP32D0WDQ6 (revision 0)
Uploading stub…
Running stub…
Stub running…
Changing baud rate to 921600
Changed.
Configuring flash size…
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 17824 bytes to 10595…
Wrote 17824 bytes (10595 compressed) at 0x00001000 in 0.1 seconds (effective 1169.6 kbit/s)…
Hash of data verified.
Compressed 275120 bytes to 165160…
Wrote 275120 bytes (165160 compressed) at 0x00010000 in 2.7 seconds (effective 816.7 kbit/s)…
Hash of data verified.
Compressed 3072 bytes to 82…
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 8175.7 kbit/s)…
Hash of data verified.

Leaving…
Hard resetting…

Monitor

Sau khi nạp chương trình xong để kiểm tra kết quả thì cần phải monitor, với cách làm này nó cũng giống như kết nối với chương trình terminal để hiển thị log data. Bạn có thể thực hiện monitor bằng lệnh sau

$ make monitor

Kết quả

Ta sẽ thấy chuỗi Hello world! và thông tin về chip được in ra sau mỗi 10 giây.

Các bạn có thể xem tham khảo code chương trình ở bên dưới viết với freertos

/* Hello World Example
   This example code is in the Public Domain (or CC0 licensed, at your option.)
   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"


void app_main()
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
            chip_info.cores,
            (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
            (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    printf("silicon revision %d, ", chip_info.revision);

    printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
            (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}

Tạm kết

Vậy là đã xong được các bước cấu hình môi trường ban đầu để bạn có thể lập trình được cho ESP32, để có thể tìm hiểu sâu hơn các bạn có thể tham khảo thêm các source code mẫu tại /esp32/esp-idf/examples

Tham khảo [1][2]