網頁最後修改時間: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.6 和 v2.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。
.
.
<<部落格相關文章>>
- 新產品上市-ESP32-CAM 燒錄與接腳擴充二合一底板介紹、使用方法和實作展示
- ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制 01-OTA Upload 的板子設定和測試
- ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制 02-週邊裝置的控制
- ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制 03-FreeRTOS WiFi Watchdog 監控
- ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制 04-攝像模組之二維碼辨識
- ESP32 CAMRA 二維碼(QR Code)辨識之門鎖控制 05-狀態控制工作流程
.
.
沒有留言:
張貼留言
留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!
發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?
不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !