OTA (ESP32 Over The Air)
2024.02.23
YouTube でも紹介しています。画像をクリックすると再生できます。
今回は、ESP32 OTA(Over The Air)機能を使ってみます。
OTAアップデートメカニズムを使用すると、プログラム実行中に、Wi-FiやBluetooth経由でプログラムを更新することができます。
まずは、OTA機能に利用されるパーティション定義についてみてみます。
ここでは、PlatformIOを開発環境に用いて、OTA機能を実装していきます。
Arduino開発環境構築 PlatformIO
$ cd ~/.platformio/packages/framework-arduinoespressif32/tools/partitions
$ ls -1 *.csv
app3M_fat9M_16MB.csv
bare_minimum_2MB.csv
default.csv
default_16MB.csv
default_8MB.csv
default_ffat.csv
ffat.csv
huge_app.csv
large_spiffs_16MB.csv
max_app_8MB.csv
min_spiffs.csv
minimal.csv
no_ota.csv
noota_3g.csv
noota_3gffat.csv
noota_ffat.csv
rainmaker.csv
$ cat default.csv
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x140000,
app1, app, ota_1, 0x150000,0x140000,
spiffs, data, spiffs, 0x290000,0x160000,
coredump, data, coredump,0x3F0000,0x10000,
標準的なESPRESSIF ESP32には、4MBのフラッシュメモリが搭載されています。
この4MBの領域用にデフォルトのパーティション・テーブルが定義されています。
このパーティションテーブルではOTA機能を利用できるように設定されています。
OTAでは、少なくとも2 つのOTAアプリ・ パーティションと1 つのOTA データ パーティションを使用してデバイスのパーティション テーブルが構成されています。
通常のプログラムあるいはOTA機能を持つプログラムを初めて書き込む際にはota_0に書き込まれます。
アプリの状態はotadataパーティションで管理され、カウンター情報を更新します。
カウンターはOTAアプリ・パーティション(ota_0, ota_1,...) へのポインターで、起動アプリとしてカウンター0、つまりota_0がセットされます。
次にOTA機能を持つプログラムから更新プログラムが読み込まれると、新しいプログラムは現在起動用に選択されていないOTAアプリ・パーティションota_1に書き込まれます。
更新用プログラムが検証されると、OTAデータ・パーティションが更新され、ota_1が次回起動用に指定されます。
さらに次にプログラムが更新されるときには、ota_0アプリ・パーティションが上書きされます。
また、ota_1のプログラム実行中に予期せぬエラーが発生すると、ota_0のプログラムにロールバックされます。
詳細を知りたい方は下記のドキュメントをご覧ください。
Over The Air Updates (OTA)
Name |
便宜上の名称(16文字以内)です。機能上の意味はありません。
|
Type |
一般的に使われるのは app とdata の2種類です。 |
SubType |
Typeが app の場合、factory(0x00),ota_0~ota_15,testのいづれかを指定します。
nvs |
WiFiデータ、デバイスPHYキャリブレーションデータなど不揮発性メモリに保存するデータを格納ために使用します。
Non-Volatile Storage Library
|
ota (data) |
OTA管理情報格納領域 |
ota_0~15(app) |
アプリケーション格納領域 |
spiffs |
SPI Flash File System。 フラッシュメモリの一部をストレージとして使うことができます。 |
coredump |
コアダンプをメモリに格納するために使用します。 アプリケーションがクラッシュした際の解析に使用できます。 |
|
Offset |
領域の開始アドレスです。 |
Size |
領域のサイズ指定です。Type=appの場合、最小ブロックサイズは64K(0x10000)の倍数で指定します。 |
詳細は下記が参考になります。
ESP32のPartition Tableの書き方
まずは、PlatformIOを開発環境に用いて未指定でビルドしてみます。
Arduino開発環境構築 PlatformIO
$ pio run
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [ ] 4.3% (used 22864 bytes from 532480 bytes)
Flash: [== ] 22.3% (used 292149 bytes from 1310720 bytes)
プログラムに利用可能なFlashメモリーは 1310720バイトで、その内の292149バイトを使っていて、
ota_0のパーティションサイズ 0x140000 = 1310720バイトに一致しています。
もうちょっとプログラム領域を大きくしたい場合には、SPIファイルシステム領域を減らした min_spiffs.csv が用意されています。
$ cat min_spiffs.csv
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x1E0000,
app1, app, ota_1, 0x1F0000,0x1E0000,
spiffs, data, spiffs, 0x3D0000,0x20000,
coredump, data, coredump,0x3F0000,0x10000,
設定ファイルにパーティションテーブルを追記します。
$ vi platformio.ini
board_build.partitions = min_spiffs.csv
$ pio run
RAM: [ ] 4.3% (used 22864 bytes from 532480 bytes)
Flash: [= ] 14.9% (used 292149 bytes from 1966080 bytes)
OTA機能は利用せず、大きなプログラム領域を確保したい場合には、huge_app.csv があります。
この場合、OTAアプリパーティションは1つしか存在しません。
$ cat huge_app.csv
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x300000,
spiffs, data, spiffs, 0x310000,0xE0000,
coredump, data, coredump,0x3F0000,0x10000,
RAM: [ ] 4.3% (used 22864 bytes from 532480 bytes)
Flash: [= ] 9.3% (used 292149 bytes from 3145728 bytes)
FeatherS2 (ESP32-S2)のように、16MB SPI Flash、8MB Extra PSRAM を持つようなマイコンでは、
default_16MB.csv も利用できます。
$ cat default_16MB.csv
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x640000,
app1, app, ota_1, 0x650000,0x640000,
spiffs, data, spiffs, 0xc90000,0x360000,
coredump, data, coredump,0xFF0000,0x10000,
RAM: [= ] 8.5% (used 27756 bytes from 327680 bytes)
Flash: [ ] 4.2% (used 273582 bytes from 6553600 bytes)
●OTA機能の実装
OTA機能を実装するプログラムはひな形が公開されています。
BasicOTA
これをベースに各種変更を行います。
#include <WiFi.h>
#include <ArduinoOTA.h>
#define SECRET_SSID "xxxxxxxxxx"
#define SECRET_PASS "xxxxxxxxxx"
const uint8_t PRIMARY_DNS[4] = {192,168,11,1};
const uint8_t GATEWAY[4] = {192,168,11,1};
const uint8_t SUBNETMASK[4] = {255,255,255,0};
const uint8_t LOCAL_IP[4] = {192,168,11,62};
#define TELNET_PORT (23)
WiFiServer server(TELNET_PORT);
#include "Debug.h"
Debug debug;
void setup()
{
if (!WiFi.config(LOCAL_IP, GATEWAY, SUBNETMASK, PRIMARY_DNS)) while(1);
// WiFi STA設定
WiFi.mode(WIFI_STA);
WiFi.begin(SECRET_SSID, SECRET_PASS); // Connect to WPA/WPA2 network
while (WiFi.status() != WL_CONNECTED) delay(100);
server.begin();
debug.begin(NULL,NULL,&server);
// OTA設定
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
debug.print("Start updating %s\n",type);
})
.onEnd([]() {
debug.print("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
debug.print("Progress: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
debug.print("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) debug.print("Auth Failed\n");
else if (error == OTA_BEGIN_ERROR) debug.print("Begin Failed\n");
else if (error == OTA_CONNECT_ERROR) debug.print("Connect Failed\n");
else if (error == OTA_RECEIVE_ERROR) debug.print("Receive Failed\n");
else if (error == OTA_END_ERROR) debug.print("End Failed\n");
});
ArduinoOTA.begin();
//=============================================
// 初期化コードを書く
//=============================================
}
void loop()
{
ArduinoOTA.handle();
//=============================================
// 処理コードを書く
//=============================================
}
●少しだけ解説
ローカルIPアドレスの設定
#define SECRET_SSID "xxxxxxxxxx"
#define SECRET_PASS "xxxxxxxxxx"
const uint8_t PRIMARY_DNS[4] = {192,168,11,1};
const uint8_t GATEWAY[4] = {192,168,11,1};
const uint8_t SUBNETMASK[4] = {255,255,255,0};
const uint8_t LOCAL_IP[4] = {192,168,11,62};
ブロードバンドルーター経由で固定IPアドレスを持つLAN内のマイコンボードにアクセスできるようにします。
上記はBUFFALOのルーターを例にして、マイコンのアドレスを192.168.11.62にしています。
Telnetによるメッセージ表示
#define TELNET_PORT (23)
WiFiServer server(TELNET_PORT);
マイコンのプログラムをリモートで更新できるようにしているにも関わらず、シリアル接続してメッセージを表示させるのでは意味がありません。
そこで、パソコン上のTeraTermにメッセージを表示できるようにします。
TeraTermでは、UDP送受信をサポートしていないため、TCP(Telnet:23番)を使います。
OTAアップデートでは、ポート番号:3232が利用されるので競合することはありませんが、OTAポートを指定する場合は、ArduinoOTA.setPort()を使います。
Telnet送受信用クラス
#include "Debug.h"
Debug debug;
うぷ主が独自に作成したクラスです。TeraTermとの送受信に使います。
WiFi各種設定
if (!WiFi.config(LOCAL_IP, GATEWAY, SUBNETMASK, PRIMARY_DNS)) while(1);
マイコンの固定IPアドレスを指定しています。
WiFi.mode(WIFI_STA);
WiFiにステーションモードを指定しています。
WiFi.begin(SECRET_SSID, SECRET_PASS);
while (WiFi.status() != WL_CONNECTED) delay(100);
ブロードバンドルーターに接続します。
server.begin();
Telnet用にサーバを起動します。
debug.print();
client.print()の拡張です。クライアントにメッセージを送信します。
接続が断たれているときは、接続を待ちネゴシエーション処理後に送信します。
プログラムのアップロード
OTAプログラムは初回書き込み時のみUSB接続して、コードをマイコンに書き込みます。
upload_port = /dev/ttyACM0
OTA機能の動作確認用にちょっとした回路を組んでみます。
右側のQT Py ESP32-S2 にGPSモジュールをつなげて、位置情報を送信して、パソコン側のTeraTermで受信しています。
WiFi経由でプログラムをアップロードする際には、USB接続をコメントアウトして、IPアドレスを指定します。
;upload_port = /dev/ttyACM0
upload_protocol = espota
upload_port = 192.168.11.62
$ pio run -t upload
上段のTeraTerm画面がGPS情報表示、下段がRaspberry Piのビルド画面です。
プログラムの遠隔更新がはじまると現在のプロセスが中断され、OTA機能が実施されます。
Start updating sketch
Progress: 34%
上段のGPS情報表示では、更新プログラムのアップロード状況を表示するようにしてあります。
アップロードが完了すると自動リセットが掛かり更新プログラムに切り替わります。
GPS情報を表示しているTeraTermもセッションが切断されるので、再接続します。
●参考文献
・SPI Flash Modes
・ESP8266(ESP-WROOM-02)で、OTA使いながら、UDP(もといOSC)で送受信できるようにするテスト
・TCPとUDPの違いとは?~Ethernet接続におけるオーバーヘッド削減ノウハウ~
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|