WiFi 和藍牙一體的 ESP32 芯片及樂鑫官方的 Arduino 開發工具包


ESP32 芯片是由樂鑫開發的芯片。下圖是基於 ESP32 芯片的開發板:

圖 1:ESP32 DevKitC V4 開發板

ESP32 的多種應用開發方式

至少有四種方式可以選擇:

  • 樂鑫官方的 ESP-IDF[1]
  • 樂鑫官方的 Arduino 開發工具包[2]
  • MicroPython[3]
  • TinyGo[4]
    TinyGo 目前(2021-03-14)還未支持 ESP32 的 WiFi 和藍牙

為了方便開發,通常選擇 Arduino 開發工具包和 MicroPython。下文選擇介紹前者。

Arduino core for the ESP32

官方提供 Arduino 開發工具包是為了使用 Arduino IDE 和 Arduino 的生態,並不是要求一定要再買一塊 Arduino 板來連接。

其工具包在 GitHub 上:

https://github.com/espressif/arduino-esp32

要使用這個工具包進行開發,需要做好兩個准備:

  1. 下載和安裝 Arduino IDE
  2. 把 ESP32 開發工具包導入到 Arduino IDE

第一步簡單,到官方網站下載即可。以下簡要說明第二步。

安裝和配置 Arduino IDE 的 ESP32 開發環境

導入方式有三種,根據情況選擇。資料比較全,這里簡單列舉出來,不再過多重復。

  1. 最簡單的配置和安裝方式是使用 Arduino IDE 的開發板管理器:

    https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md (Installation instructions using Arduino IDE Boards Manager)

    前提是能訪問 raw.githubusercontent.com 這個域名(被牆了)。

  2. 如果沒法訪問,那就自己用 Git 去 Clone GitHub 倉庫:

    https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md (Steps to install Arduino ESP32 support on Windows)

    不過這種方式比較慢,因為要 Clone 整個倉庫,比較大。

  3. 下載倉庫的壓縮文件:

    https://www.cnblogs.com/codeit/p/14323836.html (Arduino配置ESP32開發環境)

    不過由於不能執行 Git 方式的自動 Clone,需要自行下載 Git 子模塊。即文章里已經有提到的 ESP32_AzureIoT_Arduino。這個是開發包的官方依賴,不用擔心存在什么大問題,使用其他方式也得這樣安裝。

如果 GitHub 下載慢,試試 GitLab:

選擇哪塊板

在 Arduino IDE 的 [ 工具 | 開發板 | ESP32 Arduino ] 菜單里面能夠看到有多個選項,不同的選項對應着不同的配置。為了不影響后續開發,需要選擇合適的板。

如果上面有和手頭上相同名稱的板,那么直接選擇就可以了。如果沒有相同名稱或者不太確定,那么就需要根據一些內容來判斷。

從已有信息中找到目標。

菜單的第一個選項是 ESP32 Dev Module。根據這個名稱到工具包代碼里搜索,找到 boards.txt 這個文件。里面就是各種板的配置。

大致對比了一下不同板的配置,基本都一樣。部分區別列舉如下:

  • build.variant 選項
    這個是跟引腳相關的配置。主要關注這個配置。
  • build.flash_freq 選項
    這個是 Flash 存儲器的頻率。默認的值有的是 40m 有的是 80m。
  • menu.PSRAM.* 選項
    有些板帶了 PSRAM,就會多出這部分配置

其他選項在目前階段看起來不太重要,因此這里主要關注 variant (變體)選項,確保選擇的板的引腳對應正確。

build.variant=esp32 為例。在 variants 文件夾里面找到 esp32 文件夾,打開里面的 pins_arduino.h。再結合倉庫里的 README.md 底下的 PINMAP,就能知道 pins_arduino.h 里面配置的含義了。

圖 2:引腳配置文件里的數字與開發板引腳的對應關系

從上圖看出,數字不是亂選的。這些數字分別對應了通用輸入/輸出引腳(GPIO,General Purpose Input Output),其中有一部分引腳只能作為通用輸入(GPI)。

不同的開發板可能會在設計的時候就占用了不同的 GPIO 引腳,因此需要在開發板剩余的 GPIO 中選擇合適的引腳配置到 pins_arduino.h 里面。

在配置的時候,需要參考開發板的引腳文檔。如果缺少文檔,可以直接看板上的引腳數字。這些引腳表示對應數字的 GPIO 引腳。具體的 GPIO 引腳都可以用作哪些功能,可以參考芯片的數據手冊[5]。

在選擇開發板選項的時候,着重注意一下引腳文件的配置就行了。不要選擇那種配置了已被開發板元器件占用的引腳。

引腳配置文件里面還有開頭的幾個宏定義,這些是固定的。例如:

#define NUM_DIGITAL_PINS        40

表示芯片共有 40 個數字管腳。ESP 32 共有 49 個管腳,其中 9 個引腳的類型為 P,即 Power。剩下的要么是通用 I/O ,要么是獨用的 I 或者 O。

SPI 通信

變體引腳配置文件里面跟 SPI 相關的引腳使用的是:

  • SS = GPIO5
  • MOSI = GPIO23
  • MISO = GPIO19
  • SCK = GPIO18

查詢芯片的數據手冊可以看到這些引腳的功能。

圖 3:ESP32 數據手冊里的管腳描述[5]

一個引腳有多個功能,但在使用的時候只選擇一種。

ESP32 共有 3 組 SPI(SPI、HSPI、VSPI),這里是用到其中的 VSPI,沒啥特別。

拿個例子過一遍開發和上傳的流程

在官方的 Arduino 開發工具包里面找到 libraries/ESP32/examples,里面有例子。

在將開發板連接到電腦之后,挑選一個例子的代碼復制到 Arduino IDE 的編輯器里面,編譯並上傳。

例如選擇 examples/ChipID/GetChipID/GetChipID.ino 文件里的代碼:

uint32_t chipId = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  for(int i=0; i<17; i=i+8) {
    chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
  }

  Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
  Serial.printf("This chip has %d cores\n", ESP.getChipCores());
  Serial.print("Chip ID: "); Serial.println(chipId);
  
  delay(3000);

}

然后編譯,這個選項在 [ 項目 | 驗證/編譯 ],或者用快捷鍵 Ctrl+R

編譯通過后上傳,這個選項在 [ 項目 | 上傳 ],或者用快捷鍵 Ctrl+U

以下是上傳的日志:

esptool.py v3.0-dev
Serial port COM7
Connecting.....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: xx:xx:xx:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 16383.2 kbit/s)...
Hash of data verified.
Compressed 18656 bytes to 12053...
Writing at 0x00001000... (100 %)
Wrote 18656 bytes (12053 compressed) at 0x00001000 in 0.2 seconds (effective 938.7 kbit/s)...
Hash of data verified.
Compressed 207008 bytes to 108334...
Writing at 0x00010000... (14 %)
Writing at 0x00014000... (28 %)
Writing at 0x00018000... (42 %)
Writing at 0x0001c000... (57 %)
Writing at 0x00020000... (71 %)
Writing at 0x00024000... (85 %)
Writing at 0x00028000... (100 %)
Wrote 207008 bytes (108334 compressed) at 0x00010000 in 2.2 seconds (effective 767.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 4915.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

這樣就上傳成功了。

接着驗證結果。在 [ 工具 | 串口監視器 ] 里面,把波特率設置為 115200,就可以看到輸出。例如:

ESP32 Chip model = ESP32-D0WDQ6 Rev 1
This chip has 2 cores
Chip ID: 5940616

接下來就可以發揮創造力了~

參考

[1]: https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/ (ESP-IDF 編程指南)
[2]: https://github.com/espressif/arduino-esp32 (Arduino core for the ESP32)
[3]: http://docs.micropython.org/en/latest/esp32/quickref.html (Quick reference for the ESP32)
[4]: https://tinygo.org/microcontrollers/esp32-coreboard-v2/ (ESP32 - CORE BOARD)
[5]: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_cn.pdf (ESP32系列芯片——技術規格書)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM