✈️

Arduinoとケーブルを繋がずに書き込めるOTA(Over The Air)の種類分けと整理

に公開

大きく分けて3種類に分けて考えてみた

Wi-Fiで利用する想定です

  • ArudinoIDEでやる
  • 更新ファイルを取得しにいく
    • サーバを用意しそこに更新ファイルを置き、何らかのタイミングでデバイス自身が更新ファイルを取りにいき、更新する
  • 更新ファイルを受付ておく
    • デバイス自身でサーバを立ち上げ、PCなどから更新ファイルをデバイスに対して送信する

メリットデメリット考えてみる

ArduinoIDEでやる

やる方法の参考記事
https://diysmartmatter.com/archives/328

  • いい感じのArduinoのライブラリとサンプルがあるので、迷わない
    • 筆者もすんなりできた
  • 複数のデバイスに書き込む際のidの振り分けの方法を考えなくていい
    • 例えばそれぞれのipアドレスを固定する際とかコードを直接変更してそれぞれのデバイスに書き込めばいいので
  • サーバを用意しなくてもよい
    • 同じネットワークにいればできる
  • パスワード設定も簡単
  • 大量のものに一斉更新ができない
  • loopで行っている処理(ArduinoOTA.handle())の負荷
    • どのくらい負荷になるのかは未調査

更新ファイルを取得しにいく

  • 一斉更新ができる
  • サーバを用意しなければいけない
    • クラウド上か、ローカルサーバを立ち上げる
  • ArduinoIDEでビルド後、binファイルをサーバにアップしなければならない
    • ひと手間
  • 更新するトリガーを考えなければならない
    • 指定のURL先のbinファイルのバイト数が違ったらとか
    • バージョンが書かれたテキストファイルを置いて、デバイスのEEPROMとかに保存された現在のバージョンとの差分があったらとか
    • サーバから「更新してね!」っていうリクエストを送るとか
      • 結局受付の処理が必要
    • デバイスに取り付けたボタン長押しとか
  • 個体値を設定したいとき方法を考えなければならない
    • デバイスのMacアドレスとidを紐づけたテーブルを作るとか
      • Arduinoのコードに書いて、自分でidを判断できるように
      • テーブルをサーバに置いてもいいかも
    • サーバがIP割り振りしつつ、コードを自動でビルドするとか
      • 各1デバイスに1ビルドファイルができるイメージ
  • それぞれの更新エラーを見つけづらい
    • Arduino側はインジケーターなどでエラー表示必須かも

更新ファイルを受け付けておく

  • 一斉更新ができる
    • 更新ファイルを投げる側のPCの処理が必要
  • 更新の際のエラー検出がPCで見えるので楽
  • デバイスをAPにした場合、ネットワークの構成をしなくてよい
    • wifiルーターなくてもできる
  • パスワード設定も可能
  • 個体値を設定したいとき方法を考えなければならない
    • 同上

利用場面別で考えてみると

自分が今必要になった状態の時、どれを選択するかで考えてみた

複数台(5台以上かなぁ)のデバイスを一気に更新したくて、Wi-Fiルーターがある

「更新ファイルを受け付けておく」がいいかも
たぶんだいたいWi-Fi使って何かするので、ついでに更新用のWebサーバー立ち上げる感覚でやっておくのいいかも

  1. Arduinoの「スケッチ例」->「ArduinoOTA」->「OTAWebUpdater」を参考に追記していく
  2. IPアドレスの固定はデバイスのMacアドレスから割り出すコードをArduinoに書いておく
  3. 更新するPC側をNode.jsやPythonから一斉にファイルを送る
    (次回の記事でここら辺のコード書いていく予定)

大量のデバイスを一気に更新したくて、Wi-Fiルーターがない(使えない状況)

「更新ファイルを受け付けておく」のAPモードにしちゃうがいいかも
もともとWi-Fiを使う予定はなかったけど、OTAのために使うようになるって状況なんだと思う
上記のものがAPモードになって、IPアドレスを固定するところがSSIDをユニークな名前にするようになる感じに

USBケーブル繋げる手間があるとき

高所とか何か箱の中に入れておいたりするとき
今までは、そういったところに置く場合は大枠の修正は終わっている状態で、数値調整のみの状態にしておいて、その数値調整はデバイスがWebサーバ立ち上げて、クライアントのPCから渡すなどしていた
調整した数値を再起動後も保持したいならばEEPROMなどに保存しておいた

けども、それよりArduinoIDEからOTAで数値調整して書き込んじゃったほうが、初期の手間は省けそう

遠隔地のArduinoを更新したい

例えば大阪で展示しているものを東京から更新したいときとか
そもそも更新自体失敗したら詰みなので、そういうことがないようにしたい…が、仕方ないこともあるので…
ということで、こういった異常事態は考えておくけど、手間はそんなにかけたくないよねってものだと思う

なので、「更新ファイルを受け付けておく」のWi-Fiルーターがあるなしで、APモードにするかどうかでいいと思う
で、現地の担当者さんにbinファイルを送って更新してもらうがいいかなと
操作マニュアルはもちろん事前に渡して置きつつ、更新成功の確認ができるようにしておく
そういう状態はVPSやリモートデスクトップなど入れていることが多いので、そこからでもできそうではあるが…やはりリアルに確認できるようにはしておきたいですよね

他にもこういった状況だとどうですか?っていうのがあればコメントもらえるとうれしいです

その他の方法

他にもBluetoothでできたり、クラウドサービスやそういったボードを使ったりする方法もあります
最後におまけでメモ程度に

  • ArduinoへFirmataを書き込む
  • UIFlow
  • Wio Node
  • obniz
  • RaspberryPiを利用する
    • やる意味あるかは置いておいて、ラズパイがArduinoボードとUSBで繋がっていて(複数繋げてもいい)そのラズパイにコードを共有して、ラズパイがビルド、それぞれのArduinoへ書き込み
    • ラズパイがビルドしてくれるので、開発用PCはリソース空きそう
    • ラズパイがビルドしてくれるので、頑張ればidを個別に設定できそう

Discussion