photo credit: tech2 via photopin (license)
photo credit: tech2 via photopin (license)

BLE経由で組み込みソフトのアップデートができるなんてそんな夢みたいな話…あったわ!

こんにちは、おひろです。

今日もReMINEの開発で得たノウハウについて1つ書こうと思います。

アプリやWebなんかだと機能追加や不具合修正といったことでアップデートすることは割と簡単なので、まぁとりあえずリリースしとけ、ってことありますよね。
(ウソだよ!ちゃんとテストしよう!ドラプロはもちろんちゃんとしてるよ!)
でもハードだと一回作っちゃうとそんな簡単にアップデートできねぇよなブルブル、って感じですが、実はそんなこともないようです。

DFU-OTAっていう、Device Firmware Update Over The Airの略なんですが、要は無線でプログラムの書き換えをしちゃう、というすばらしき機能があります。
これ自体は一般的な機能のようで、ReMINEで採用したBLE Nanoにも備わっていますし、全てではないですが他のモジュールでも搭載されてたりするようです。

組み込みソフトでもリリースした後にアップデートすることが割と簡単にできるようになるというわけです。
もちろんリリース時にはその時点での完璧を目指すわけですが、後から修正が効くとなると精神的にもすごく楽じゃないですか?

全てのものに適用はできないかもしれませんが、そういった基盤があるなら可能性が広がりますね。
今回は、BLE Nanoに限った話にはなりますが、実際試してみましたのでそれについて書きたいと思います。

セットアップ

公式のGitHubから関連ファイルを一式ダウンロードしてREADMEの手順に沿っていけば設定完了です。
要点を抜き出すと以下の手順です。

  1. Arduino IDEについてはバージョン1.6.7をインストールする。
  2. Arduino IDEを立ち上げ、Preferenceの「Additional Boards Manager URLs」に「https://redbearlab.github.io/arduino/package_redbearlab_index.json」をコピペする。
  3. ツール→マイコンボード→ボードマネージャを選択し、「RedBearLab」で検索すると「RedBearLab nRF51822 Boards」が出てくるのでバージョン1.0.4をインストールする。
  4. BLE Nanoをライターに装着し、Macに接続するとMBEDという名前でマウントされるので、その直下にブートローダ(bootloader.hex)をコピーする。
    ※ブートローダのコピペに関しては初回に1度やるだけでOK。

ざっくり以上です。
お分かりですね?
4番で書いてある通り初回はライターが必要です。
BLE経由で書き込めるならライターいらんやん!ライター代浮くわーやったー!と思った人、ゴメン!いるねんライター!
ちなみにライターはこの後もう一回使います。

注意その1

ブートローダの書き込みについて一点。
コピペするのに普通Finderでやると思うんですがね、ヨセミテ以降のOS上でやるとコピペ失敗します…。
でも大丈夫!その場合、ターミナルからコマンドで直接コピれば解決!おれ、これ知るまでめっちゃハマった!
※ブートローダの導入を失敗してもプログラムの書き込みなどはできた(エラーなどはでない)ので一見問題ないように見えるのですが、動作はしない、という状況に陥り原因にたどり着くまでに時間がかかりました。

sudo mount -u -w -o sync /Volumes/MBED;
cp -X ~/(your path)/bootloader.hex /Volumes/MBED/
注意その2

公式のGitHubで配布されているブートローダなどはSoftDevice S130に準拠しているようです。
SoftDeviceについてはここを参考にしていただければと思いますが、S110、S120、S130とそれぞれ制限などが異なりますので、要件に沿っているかよく確認の上お試しください。

DFU-OTAの実装

ソースコードに少し手を加える必要があります。
DFUServiceというクラスがありまして、これをsetup関数内などでnewしてやることで有効になります。

#include <BLE_API.h>
#include "ble/services/DFUService.h"

BLE  ble;
DFUService *dfuService;

void setup() {
    dfuService = new DFUService(ble, NULL);
}

例えばこんな感じで動くようになりますが、もうお分かりですね?
つまりこのコードが入ったプログラムを書き込んでないとOTAできないので、初回はライターを使って書き込む必要があります…!オーノー!
でも一度書き込めば準備完了です。

DFU-OTAで書き込み

OTAでの書き込みはiOSまたはAndroidのアプリで行います。
iOS版
Android版

多分PC版は無いかと思われます。なんでやねん。

Arduino IDEを立ち上げて、スケッチ→コンパイルしたバイナリを出力、を選びます。
するとhexファイルが2つ吐き出されるんですが、〜_OTA.hexの方が対象になります。

あとはこのhexファイルを例えばiOSならAirDropなどでスマホ側に転送すれば、nrf toolboxアプリを立ち上げて「DFU」メニューからBLE Nanoに書き込みができます。
ちょっと手順説明めんどいんであとはやってみて!多分簡単だからやればわかる!

ちなみにnrf toolboxのソースコードはここで公開されているので、自分のアプリに転送機能をつけたい時にはこれを真似すればできると思いますヨ。実際やってみましたけどできたから。大丈夫。
あるいはライブラリもあるっぽいですが、これは試してません。今知ったわ。。

以上です。手探りで試してみた、というところなので、理解しきれていないところも多々あるんですが、またじっくり調べたいなと思います。

ではでは。

★★★ツイッターでも情報発信していきますのでフォローお願いします!★★★

Pocket