2021年9月7日 星期二

ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制 01-OTA Upload 的板子設定和測試

網頁最後修改時間:2021/09/07

本篇是 ESP32-CAM 二維碼辨識之門鎖控制的第一篇,是關於 ESP32-CAM 開發板在 Arduino IDE 使用 OTA 無線韌體更新的設定和測試。

ESP32-CAM 開發板在 Arduino IDE 可直接選用板子 Board: AI Thinker ESP32-CAM 再設定 port 即可進行開發,方便(初學者)使用但卻限制了 OTA 無線韌體更新功能的實現。

為了解除這個設定,本文將說明 Arduino IDE 開啟 ESP32-CAM 的 OTA 無線韌體更新的參數設定,以及如何上傳和 OTA 更新韌體的步驟。

內容有:


/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

** 本篇內容都是搭配 ESP32-CAM 燒錄與接腳擴充二合一底板 (下文簡稱底板)所進行的測試,參數設定不一定適用於其他的搭配!

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*


OTA 無線韌體更新的功能,看字面意思想也知道,是為了不使用有線的方式上傳韌體到 MCU 中。

若在 Arduino IDE 直接選用("Tools/Board: >")為 ESP32-CAM 開發板所設定的板子參數 Board:AI Thinker ESP32-CAM ,那麼它下面所顯示的那幾個參數,就只有 port 需要作選擇(其他維持預設值)就能用,但其他沒看見的參數中卻限制了 OTA 無線韌體更新功能的開啟,即便你嘗試成功上傳了 "File/Examples/BasicOTA" 這個程式,但還是不能使用無線的方式上傳韌體,原因就是在這些被隱藏的參數中,有參數限制了 OTA 無線韌體上傳的功能。

ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制(動作展示可看這篇部落格網頁最下方的影片,下文簡稱 ESP32QRDoorLck)使用到這個功能,所以要將其開啟!

網路上找一下,應該可以找到不少關於這話題的網頁,大多解決的方法就是要你直接修改 board.txt

建議毋湯這樣做,因為只要你了解晶片、模組和開發板之間的關係,改選用其他的板子選項就可以!


【(01)開啟 ESP32-CAM 開發板 OTA 韌體更新功能的板子參數設定】

** 為了避免版本不同造成看倌困擾,本節所用的 Arduino core for the ESP32 分別是 v1.0.6v2.0.0 兩個版本,請自行選用安裝。

插上 ESP32-CAM 到底板上再用 MicroUSB 與電腦做連接(底板上傳韌體與使用說明,請看這篇部落格網頁),最後切換到韌體上傳模式。

開啟 Arduino IDE,點選 "File/Examples/BasicOTA" 開啟程式碼

程式碼開頭處修改 Line 6 和 Line 7,填入無線分享器的名稱和密碼

然後接著點選 "Tools/Board:/ESP Arduino >/ESP32 Dev Module"。

繼續再次點選 "Tools",修改其以下選項為:

  • Partition Scheme: "Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)"
    預留 OTA 需要的 SPIFFS 空間,否則上傳的程式碼要放在哪裡?
  • Core Debug Level: "Verbose"
    輸出函式庫裡的除錯訊息;完成測試後可設為 "None"
  • PSRAM: "Enabled"
    照著 ESP32-CAM 原先的設定所設的選項。沒開啟這個,攝影機會不能用。
  • Port: "COM#"
    依電腦實際分配給底板的 COM Port 號碼去做選擇,不一定會跟下圖中的一樣,後面使用 OTA 無線韌體上傳時,選擇的就是 ESP32-CAM 開發板的 IP 地址。

其他的,維持預設值不變動;本文就是依這樣的設定上傳程式。


【(02)第一次韌體上傳(Serial Upload)】

完成上面的設定之後,直接按下 "Upload"  按鈕上傳

上傳完成後,切換底板開關(關掉再開啟;或是直接按下 ESP32-CAM 開發板的 RESET 按鈕),再按下右上方的按鈕開啟 Serial Monitor。

如果上面所提供的無線分享器資料無誤,Serial Monitor 最後就會輸出 ESP32-CAM 取得的 IP 地址。

對於網路上只有一台使用 OTA 的裝置,那麼只要確定無線網路連線正常即可,即便不知道 IP 也沒關係,因為 "Tools/Port:" 選單中只會出現那麼一台裝置讓你做選擇。

由於切換使用 OTA 無線韌體上傳的時候 Serial Monitor 會自動被關閉,建議安裝第三方的 Serial Monitor 軟體:

完成後開啟它並與 ESP32-CAM 完成連線。


【(03)第二次和第三次韌體上傳(OTA Upload)】

在 Arduino IDE 選單選擇 "File/New" 開啟一個新檔,複製加貼上下面程式碼,儲存為 x01_ESP32CamOTAProgramming,記住第 56 行會輸出的文字。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/** 是否使用 OTA 功能? 不使用就註解下一行 */
#define ENABLE_OTA

#ifdef ENABLE_OTA
    #include <ArduinoOTA.h>
#endif

//** 無線分享器名稱與密碼 */
const char* SSID        = "填入無線分享器名稱";
const char* PASSWORD    = "填入無線分享器連線密碼";
// 裝置名稱
const char* DEVICENAME  = "ESP32QRDoorLock";

/**
 * setupOTA
 *     程式內容取用自 ArduinoOTA/examples/BasicOTA
 */
void setupOTA () {

    #ifdef ENABLE_OTA
        ArduinoOTA
            .onStart([]() {
                String type;
                if (ArduinoOTA.getCommand() == U_FLASH)
                    type = "sketch";
                else // U_SPIFFS
                    type = "filesystem";
                
                // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
                Serial.println("Start updating " + type);
            })
            .onEnd([]() {
                Serial.println(F("\nEnd"));
            })
            .onProgress([](unsigned int progress, unsigned int total) {
                Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
            })
            .onError([](ota_error_t error) {
                Serial.printf("Error[%u]: ", error);
                if      (error == OTA_AUTH_ERROR)    Serial.println(F("Auth Failed"));
                else if (error == OTA_BEGIN_ERROR)   Serial.println(F("Begin Failed"));
                else if (error == OTA_CONNECT_ERROR) Serial.println(F("Connect Failed"));
                else if (error == OTA_RECEIVE_ERROR) Serial.println(F("Receive Failed"));
                else if (error == OTA_END_ERROR)     Serial.println(F("End Failed"));
            });
        ArduinoOTA.setHostname (DEVICENAME);
        ArduinoOTA.begin();
    #endif
}

void setup () {
    delay (2000);

    //* UART 初始化
    Serial.begin (115200);
    Serial.println("\nBooting...OTAOOTTAA");
    
    //* WiFi 設定
    WiFi.mode (WIFI_STA);
    WiFi.setHostname (DEVICENAME);
    WiFi.begin (SSID, PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
        delay (500);
        Serial.print (".");
    }
    Serial.println ("");

    //* OTA 設定
    setupOTA ();

    //* 印出 ESP32 Heap 和 PSRAM 的資訊
    log_d("Total heap: %d",  ESP.getHeapSize());
    log_d("Free heap: %d",   ESP.getFreeHeap());
    log_d("Total PSRAM: %d", ESP.getPsramSize());
    log_d("Free PSRAM: %d",  ESP.getFreePsram());
}

void loop () {
    ArduinoOTA.handle();
}

選擇選單 "Tools/Ports: "esp32-@#&^$@$%&*#% at 192.168.0.125"" ,其中:

  • 紛紅色的字會是 MAC Address,每一台會不一樣。
  • 紫色的字是 IP Address,跟上一節中的一樣。

按下 "Upload"  按鈕上傳

程式編譯完成後,在開始傳送韌體之前會與 ESP32-CAM 連線,一旦確認連線後就會開始有 Progress: 進度百分比出現,完成之後就會更新韌體並重新開機。

如下圖所示,可看到韌體更新之後的訊息輸出。

詳細的韌體更新後的開機除錯訊息,如下圖所示。

修改第 56 行為  Serial.println("\nBooting...OTA"); 後存檔,再次按下 "Upload"  按鈕上傳。

完成後請注意輸出訊息是否與程式設定一模一樣!

為什麼要重複上傳同樣的程式兩次?

很重要的一點要記住:可以正常用 OTA 無線上傳韌體並正常重新開機的程式,並不能百分百保證再一次的 OTA 無線韌體能正常上傳,因為這部分的程式只有在韌體更新的時候才會被執行,如果網路通訊不順暢或是程式設計上的影響,又或是有使用 Watchdog Timer 等等...,都會對原本可以用的 OTA 無線上傳韌體這部分的程式造成影響,導致無法正常運作。因此,實際再次測試才能把這部分的問題找出來,避免真的要用的時候才出現問題,很難處理的!


【(04)結論】

ESP32-CAM 開發板韌體的更新,雖然可以使用有線連接的方式來上傳,但是當實際使用的時候應該不會就在旁邊,因此支援 OTA 無線韌體更新就顯得方便和重要許多。

ESP32QRDoorLcok 支援 OTA 無線韌體更新的功能,整個程式以 x01_ESP32CamProgramming 為基底繼續加入其他的部分。

下一篇,來看看 ESP32-CAM 怎麼來驅動電磁鎖、門磁開關和 WS2812B RGB LED。


.

.


<<部落格相關文章>>


.

.

沒有留言:

張貼留言

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !