Merhaba arkadaşlar, bir önceki yazımda, çok farklı bir konuya değineceğimden bahsetmiştim. Çok da arayı açmadım ne dersiniz 😀
Bu yazım, özellikle benim gibi ESP32 cihazını kullanıp bir şekilde otomatik güncelleme yapmak isteyenlere yardımcı olacaktır. Aslında yazı içerisinde yabancısı olduğunuz bir çok kavram olabilir, bunların muhtemelen bir çoğuna ilişkin bilgiyi bu yazıda bulamayabilirsiniz. Bu sebeple eğer daha önce ESP32’ye ilişkin yazılım geliştirmediyseniz ya da bu kavramı hiç duymadıysanız. Hemen korkmayın, ürkmeyin, burada size biraz giriş niteliğinde bilgi vereceğim ama başka kaynaklardan da, ESP32 ye ilişkin bilgilerinizi desteklemek isteyebilirsiniz. Yine de, merak edenler için ön bilgi olması açısından ya da nereden başlayacaklarını düşünenler için çok kısa bilgi aktarayım (bu arada kaynaklar kısmına bir kaç kaynak ekliyorum, göz atabilirsiniz).
Amacım açıkçası çok detaylı bir OTA nedir ve nasıl yapılırdan ziyade, önemli kavramlardan bahsederek, bu konu için referans alınıp kullanabileceğiniz örnek bir kod paylaşmak ve temel kavramlardan söz etmek olacak. İnternette bu konu ile ilgili örnek yok mu diye sorabilirsiniz. Haklısınız, açıkçası tonla örnek var. Ama arkadaş şöyle basit, anlaşılır, Platform.IO kullanan bir örnek bulmakta zorluk çekebilirsiniz, ha biraz konuya vakıf olunca, resmi sitedeki örnekler de oldukça yol gösterici oluyor ama benimle aynı durumda olanlar için faydalı olması açısından bu yazıyı hazırladım. Hadi daha fazla beklemeden konuya atlayalım.
ESP32 Nedir?
ESP32 kısaca, ucuz, az güç tüketen, fakat aynı zaman içerisinde WiFi ve bluetooth barındıran, yüksek performanslı çift çekirdek (Tensilica Xtensa LX6) ile çok az tüketen yardımcı bir işlemciden oluşan bir mikrokontrolcü cihaz. Espressif Systems isimli Çin menşeli bir firma tarafından geliştirilmiş. Bu özelliklerin yanında bir çok çevresel birimi/arayüz desteklemekte.
Özellikle, IoT, giyilebilir elektronikler ve benzeri kullanımlar için uygun olan bu cihaz sunduğu bağlantı kabiliyetleri ile bir çok geliştiriciyi cezbetmekte. Cihaza ilişkin kabiliyetler için http://esp32.net/ adresine başvurabilirsiniz. Eğer, ESP32’yi duymadıysanız, fakat merak ediyorsanız, bu aktardığım site oldukça yardımcı olacaktır, özellikle “Readings&Videos” başlığı altındaki kaynaklara göz atabilirsiniz.
Kitap olarak da, yine aynı site içerisinde bulunan https://leanpub.com/kolban-ESP32 ve https://docs.espressif.com/projects/esp-idf/en/latest/esp32/ iyi bir kaynak olacaktır.
Aşağıda, bu cihaza ilişkin bir geliştirme kartını [kaynak] ve ilgili fonksiyonel blok diyagramını görebilirsiniz.
Çok kısa bir girişten sonra biraz daha teknik konulara girelim. ESP32 için bir çok geliştirme opsiyonu mevcut:
- Öncelikle komut satırından kabiliyetlerin tamamı gerçekleştirilebilir,
- Eclipse kullanabilirsiniz (Kılavuz),
- Arduino IDE’si kullanabilirsiniz (Örnek),
- VS Code ve Platform.IO kullanabilirsiniz ki, ben bunu kullanıyorum (Örnek). VS Code‘a ilişkin daha önce bir yazım vardı ona da göz atabilirsiniz.
- Hatta Visual Studio kullanarak bile geliştirebilirsiniz (bu biraz daha dolambaçlı).
Hangi yöntemi seçerseniz seçin, genelde oluşturmanız gereken ortam ve izlemeniz gereken adımlar aşağıdakine benzer olacaktır:
Herneyse yeterince giriş yaptık sanırım. Bu arada, ileride, bu konulara ilişkin daha detaylı yazılarım olabilir. Özellikle ESP32 üzerinde FreeRTOS kullanımı çok ilgimi çekmekte 😀
ESP32 için OTA
Gelelim asıl konuya, neden böyle bir ihtiyaç hasıl oldu. Şimdi yukarıda da gösterdiğim gibi normal şartlarda bu cihazlara uygulama yüklemek için USB ile bilgisayar bağlayıp şu adreste verilen adımlarını izlemeniz yeterli.
Fakat, gerçek kullanımı göz önüne alacak olursanız, kuvvetle muhtemel bu cihazlara yeni yazılımlar atmak istediğinizde bir takım sıkıntılar ile karşılaşabilirsiniz. Şöyle ki:
- Cihazlar çok uzakta olabilir,
- Kablolu bağlantı erişiminiz olamayabilir,
- Çok fazla cihaz olabilir,
- Yazılımları güncellemek çok fazla zamanınız olmayabilir.
İste tam da bu sebeplerden ötürü, ESP32 ve benzeri cihazlar “Over-The-Air (OTA)” denilen ve WiFi üzerinden yazılımları güncellemenizi olanak sağlayan bir özellik sunmaktadırlar. Bu özellik sayesinde, bu cihazlardaki yazılımları güncellemeyi, herhangi bir kablo kullanmadan, cihazın üzerindeki WiFi modülünü kullanarak yapabilirsiniz. Aynı zamanda, tek kaynaktan bir çok cihaza da, güncelleme yaptırabilirsiniz. Tabi bunun da bir bedeli var ki, o da aslında çok büyük değil. Kodunuz içerisine ekstra bir kaç satır eklemeniz ve OTA desteği sunacağınız bütün yazılımlarda bunu korumanız olacaktır. Tahmin edebileceğiniz üzere bu çok da büyük bir bedel değil 🙂
Peki bu işlevi nasıl kazandırabiliriz? Resmi kaynaklar için:
- https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/ota.html
- https://docs.espressif.com/projects/esp-jumpstart/en/latest/firmwareupgrade.html
sayfaları oldukça faydalı olacaktır ama içerisinde kaybolmanız oldukça muhtemel, ama konuyu anlamanız için de muhakkak buraları okumanız gerekiyor o sebeple lütfen bu iş ile uğraşacaksanız , buralara göz atın. Ayrıca, resmi OTA örnekleri de sizlere oldukça yardımcı olacaktır.
Şimdi, ESP32 de OTA için neler yapmamız gerekiyor ve bunu nasıl yaparız konularına biraz da eğilelim. Önce OTA’yı nasıl kullanabiliriz ona bir göz atalım.
OTA için temel olarak iki yöntem mevcut (elbette farklı yöntemler mevcut ama temel olanlar):
1. Bir Web Sunucusu üzerinden,
-
- Bir Web Sunucusu üzerinde, yeni yazılımları sağlamak için uygulama geliştiyoruz,
- Hem Web Server hem de ESP32 bu WiFi erişim noktasına bağlanıyor,
- Daha sonra, ister her açılışta, isterseniz özel bir komut ile ESP32, bu sunucu üzerinden yeni bir yazılım kontrolü yapıp, bu sunucuya bağlanarak, ilgili yazılımı yüklüyoruz,
- Buradaki adımlar, aşağıda verilen figürde özetlenmiş durumda.
2. ESP32 üzerinde bir WiFi hotspot oluşturarak.
-
- Esp32, çalışır çalışmaz bir WiFi Hotspot oluşturuyoruz,
- Daha sonra herhangi bir uygulama ile bu hot spot’a bağlanıyoruz. Eğer, REST API’sini kullanacaksanız bir browser üzerinden bile bağlanabilirsiniz,
- Esp32, size bir HTML sayfası sunar ve bu sayfa aracılığı ile ilgili yazılımı seçip, yükleyebilirsiniz.
- Temelde bizim izleyeceğimiz yöntem bu olacak. Bu sayede herhangi bir cihaz ile bu ağa bağlanabilirsiniz. Aşağıda çok basit bir şekilde bu kullanımı görebilirsiniz.
Şimdi de, OTA ile yazılım yükleme ile normal yazılım yükleme arasındaki fark ve yapılması gerekenlerden bahsedeceğim. Burada değinmemiz gereken bir iki kavram daha var, birincisi Flash ikincisi ise cihaz üzerinde bölümlemeye yardımcı olan Bölümleme Tablosu (“Partion Table“).
Öncelikli olarak Flash belleğe bakalım. ESP32, 4MB bir flash belleğe sahip. Bu belleklerin en önemli özelliği, güç kesilse bile, içerisinde barındırdığı verileri saklayabilmesidir. Bu da özellikle, farklı koşumlar arası verileri saklamak için onu iyi bir aday yapıyor. Tabi bu belleklerin olumsuz yanları ise, yazma operasyonlarının sayısı (100K-1000K). Bu sebeple, buraya veri yazarken gerçekten ihtiyaç olup/olmadığını değerlendirmenizde fayda var.
Şimdi gelelim bölümleme tablosuna. İsminde de anlaşılacağı üzere, bu tablo ESP32’nin kullandığı yazılım ve çeşitli verilerin saklandığı tabloyu ifade ediyor. 0x8000 adresinden başlıyor.
Bu tablo, flash bellek üzerinde bulunmakta ve içereceği kalem sayısı da boyutu da sınırlı. Halihazırda sunulan tabloları kullanabileceğiniz gibi, kendiniz de bu tabloyu güncelleyebilirsiniz. İlk etapta hazır olanları kullanmanızı tavsiye ediyorum. Hazır tablolar şu şekilde:
- “Single factory app, no OTA”, yani OTA desteği olmayan ve tek uygulama yüklemek için kullanılabilecek tablo,
- “Factory app, two OTA definitions”, iki farklı OTA yüklenmesine olanak sağlayan tablo
Bu tabloları projenize .csv uzantılı dosyalar ile ekleyebiliyorsunuz.
“Single factory app, no OTA”, için sunulan .csv dosyası şu şekilde:
1 2 3 4 5 |
# ESP-IDF Partition Table # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 1M, |
“Factory app, two OTA definitions”, için sunulan .csv dosyası şu şekilde:
1 2 3 4 5 6 7 8 |
# ESP-IDF Partition Table # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x4000, otadata, data, ota, 0xd000, 0x2000, phy_init, data, phy, 0xf000, 0x1000, factory, 0, 0, 0x10000, 1M, ota_0, 0, ota_0, 0x110000, 1M, ota_1, 0, ota_1, 0x210000, 1M, |
Yukarıda tanımlanan kalemlere bakacak olursak:
- 0x10000 (64KB) offset ve “factory” ile isimlendirilmiş alan, bootloader’ın varsayılan olarak yükleyeceği yazılımın durduğu alan,
- Ayrıca NVS kütüphanesi (Non-volatile storage, detaylar için buraya bakabilirsiniz) “nvs” ve PHY Init Data (fiziksel donanım katmanına ilişkin parametrelerin tutulduğu alan, detaylar için buraya bakabilirsiniz) için ise “phy_init“,
- “ota_0” ve “ota_1” ise, OTA marifetiyle yüklenen yazılımların tutulduğu alanları ifade etmekte.
Tahmin edebileceğiniz gibi bu tablodaki her bir satır için bir format var, ve o da şu sayfada açıklanmakta. Bunların yanında, formata sadık kalarak kendi bölümleme tablolarınızı da oluşturabilirsiniz.
Şimdi gelelim OTA yüklemelerinde izlenen adımlara ve arka planda olanlara. Her bir OTA yüklemesi ile, aşağıdaki figürde de gösterilen, ilgili alanlar doldurulmakta ve “OTA data” alanında yazan veri ışığında (çok basitçe aslında indeks olarak düşünebilirsiniz), ilgili yazılım açılışta yüklenmektedir. Yani;
- Yazılım ilk defa ESP32 ye yüklendiğinde, Bootloader, “factory” alanındaki yazılımı çalıştıracaktır.
- Bir kere OTA yüklemesi yapınca, OTA_0 alanı doldurulacak ve yazılım doğrulanırsa, bir sonraki açılışta bu alandaki yazılım çalıştırılacaktır (kırmızı alanlar)
- İkinci OTA yüklemesi yapınca, OTA_1 alanı doldurulacak ve yazılım doğrulanırsa, bir sonraki açılışta bu alandaki yazılım çalıştırılacaktır (mavi alanlar)
- Üçüncü kez yüklendiğinde ise OTA_0 üzerine yazılacak ve yazılım doğrulanırsa, bir sonraki açılışta bu alandaki yazılım çalıştırılacaktır (turuncu alanlar)
Bu adımlar sırasında elbette sunulan OTA API’lerini kullanarak özelleştirmelere gidebilirsiniz ama sizlere aktaracağım örnek ve genel yaklaşım bu şekilde.
OTA yüklemelerinde herhangi bir hata olmadığı müddetçe, “factory” alanı güncellenmez. Yeni yüklediğiniz her bir yazılımın, aynı bölümleme tablosu ve OTA desteği ile oluşturulması kritik arkadaşlar. Bu adımlara ilişkin, resmi adımlara da buradan ulaşabilirsiniz.
Evet, işin arka planı burada son buluyor.
Web OTA Updater
Evet, sevgili yazılımperver dostlarım, artık bize kod ver dediğinizi duyar gibi oluyorum. Merak etmeyin o vakit geldi 🙂
Her zamanki gibi koda ulaşmak için aşağıdaki adrese bir uğrayabilirsiniz:
https://github.com/yazilimperver/WebOTAUpdater
Öncelikle kullandığım araçlardan kısaca bahsedeyim. Yazılımı VSCode ve Platform.IO eklentisini kullanarak geliştirdim. Burada detaylı adımlara girmeyeceğim ama aşağıdaki adreste oldukça detaylı bir anlatım var, o adımları izleyerek gerekli ortamı oluşturabilirsiniz.
https://docs.platformio.org/en/latest/tutorials/espressif32/arduino_debugging_unit_testing.html
Bu arada Platform.IO için git’i ayağa kaldırmak için de https://www.youtube.com/watch?v=Fk12ELJ9Bww videosu oldukça faydalı olacaktır.
Son bir kaç not:
- Web sunucusu üzerinden sunulan sayfa /src/main/web/index.html olarak tutulmakta,
- Bu html dosyası, gömülü kaynak olarak kullanılmakta. Bu şekilde eklediğiniz dosyalara, “_binary_index_html_start” ve “_binary_index_html_end” ile erişebiliyoruz,
- Platform.io üzerinde, bu bölümleme tablosunu kullanabilmek için platformio.ini içerisindeki ayarı kullanmanız gerekiyor. CMake üzerinden dosyaları gömme olayında başarılı olamadım,
- Farklı platformlar için ilgili platformdaki ayarlara göz atmanızda fayda var.
Evet, arkadaşlar bu yazımın da sonuna geldik. Bundan sonra ara ara ESP32 cihazı ile örnek uygulamalar geliştireceğiz, özellikle FreeRTOS’u keşfetmek için. O zaman kadar almak isteyen aşağıdaki bağlantıdan cihazı temin edebilirler:
Kaynaklar
- https://www.programmersought.com/article/31354513553/
- https://github.com/espressif/idf-eclipse-plugin
- https://leanpub.com/kolban-ESP32
- https://diyprojects.io/install-ide-platformio-extension-visual-studio-code-vscode-windows-32-bit-linux/#.X3Cj42gzZjU
- https://www.wikiwand.com/en/ESP32
- https://komhedos.com/esp32-nedir-programlamaya-giris/
- http://esp32.net/
- https://docs.platformio.org/en/latest/tutorials/espressif32/espidf_debugging_unit_testing_analysis.html
- https://esp32.com/viewtopic.php?t=329
- https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html
- https://docs.espressif.com/projects/esp-jumpstart/en/latest/firmwareupgrade.html
- https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/nvs_flash.html
- https://github.com/espressif/esp-idf/blob/8e4a8e17037c51ce2452e55b5b75bbfaecb25838/components/esp32/include/esp_phy_init.h
- https://github.com/espressif/esp-idf/tree/8bc19ba/examples/system/ota