Seeed ReButtonを動かしてみる
マイクロソフトが開催している、IoT in Actionというイベントシリーズがあるのですが、
私たちはパートナー企業やお客様とともにあり、IoTの導入によって企業が驚くほど革新的に変わっていく様子を何度も目撃してきました。IoT in Action イベントシリーズは、マイクロソフトのお客様とパートナーエコシステムを活用して、世界を変える新しいIoTソリューションを構築・展開するためのコラボレーションの機会を提供します。
一部地域で開催されたイベントで、アンケートに答えると、なななんと!マイクロソフトとSeeedが一緒に作った、ReButton(非売品)が配られていたんです!!
そして、昨日東京で開催されたイベントでも、ReButtonの配布がありました。
何ができるのか?をざっくり(一例?)書くと、
- ボタンのクリック(5種類)をAzure IoT Centralに通知
- Azure IoT Centralでクリックしたタイミングを可視化
- Azure IoT Centralから外部サービスに連携(メール通知とか)
で、単四電池2本で動くWi-Fi接続型のボタンです。
詳細は公式ドキュメントを見ていただくとして、ここでは、ボタンをクリックしたらAzure IoT Centralに表示されるまでのセットアップ方法を書いておきます。
ハードウェア
電池を入れる
裏蓋を外して、単四電池2本を入れてください。
蓋はシリコン製なのでグンニャリします。隙間にツメを突っ込んで引っ張り上げれば簡単に外れると思います。
電池を入れるとこんな感じになります。
電池を入れたら、裏蓋は元の状態に戻してください。
ボタン操作を練習する
ReButtonは、最初のクリックの反応が遅いです。これは、ボタンを押したときに回路の電源スイッチがONして動き出そうとしている時間です。
そのため、最初のプッシュはちょっと長めに押し続ける必要があります。「強く押す」ではありません!「長く押す」です。
コツとしては、、、LEDが青色に点灯するまで押して、青色になったら離す。ちょっとコツが必要ですw
ボタンの内部プログラムでは、
- 押す→LEDが青色に
- 離す→LEDは青色のまま
- 1秒間放置→シングルクリックと判断
- クラウドへ通知しようとしてエラー(LEDが赤色で3回点滅)
とクリックを判定しています。
まだWi-FiやAzure IoT Centralが設定されていないため、エラー(LEDが赤色)になります。
また、3.の1秒間放置のときに押すと、ダブルクリック、トリプルクリックと変化して、LED表示が変わります。
クリック種類 | LED色 |
---|---|
シングルクリック | 青 |
ダブルクリック | 緑 |
トリプルクリック | 紫 |
何回か試してみて、クリックのコツを掴みましょうw
10秒長押しすると、LEDが消灯しなくなります。(白色の点滅) そうなったときは、一度電池を抜いて電源を断ってください。
Azure IoT Central
Azure IoT Centralを用意する
Azure IoT Centralにアクセスして、マイクロソフトアカウントでサインインしてください。アカウントを持っていない場合は、作成を選んで、アカウントを作ってください。
Azure IoT Centralのアプリケーションマネージャーが表示されたら、新しいアプリケーションをクリックしてください。
アプリケーションの作成に必要な情報を入力します。
Azureサブスクリプションを持っているなら、重量課金制を。持っていないorまずは動くのを見たいだけなら、評価版を選択してください。
アプリケーションテンプレートはカスタムアプリケーションを。
アプリケーション名とURLは任意なので分かりやすいものを入れてください。
このように表示されれば成功です。
これを、Azure IoT Centralのアプリケーションと言います。
Azure IoT Centralアプリケーションにテンプレートを追加する
アプリケーションビルダー画面を表示してください。
右側にある下から3つ目のアイコンをクリックすると表示されます。
デバイステンプレートの作成をクリックしてください。
カスタムをクリックしてください。
デバイステンプレートの名前に分かりやすい文言を入れて、作成をクリックしてください。
これで、テンプレートが追加され、そこにシミュレートのデバイスが1つ追加された状態になりました。
デバイスエクスプローラを見ると、テンプレートとデバイスを確認することができます。
自動的に作成されたシミュレートのデバイスは、削除しても問題ありません。
デバイスを追加する
テンプレートを作成すると、デフォルトでシミュレートのデバイスが1つ追加されますが、これをそのまま物理デバイスに紐づけることはできません。
物理デバイスを追加する必要があります。
デバイスエクスプローラのデバイス一覧の上にあるプラスマークをクリックして、実際(英語だとReal)を選択してください。
デバイス名を分かりやすい文言に変更して、作成をクリックしてください。
このように表示されれば成功です。
イベントにメッセージの項目を追加する
ボタンから送られてくるメッセージを、テンプレートに追加します。
テンプレートに追加ですが、、、実際の操作は、デバイスを選んでから、テンプレートの編集という流れになります。(ちょっと分かりにくい)
デバイスエクスプローラでデバイス一覧を表示して、デバイスをクリックしてください。
そして、テンプレートの編集をクリックしてください。
新しい測定をクリックして、イベントを選択してください。
Display Nameにメッセージ、フィールド名にmessage、規定の重要度を情報にして、保存をクリック、最後にDoneをクリックしてください。
フィールド名は、必ずmessage
と入れてください。
イベントの欄に、メッセージが追加されていれば成功です。
接続情報を取得
後でReButtonに設定する、Azure IoT Central(のデバイス)への接続情報を取得します。
デバイスエクスプローラでデバイス一覧を表示して、デバイスをクリックしてください。
そして、右上の接続をクリックしてください。
表示されたデバイス接続情報のうち、
を、後で使うのでメモ帳などにコピーしてください。
ReButton
ReButtonをAccess Pointモードで起動して、パソコンからReButtonに接続、WebページでWi-FiアクセスポイントとAzure IoT Centralの接続情報を設定します。
ReButtonをAccess Pointモードで起動
ボタンを押し続けてください。10秒以上。 この間、LEDが青色→黄色→水色→白色と変化します。白色になったら、ボタンを離してください。
すると、ボタンがAccess Pointモードで起動して、LEDが白色の点滅になります。
ReButtonのアクセスポイントに接続
AZB-xxxxxxxxという名前のアクセスポイントがReButtonです。
パソコンからこのアクセスポイントに接続してください。
接続操作すると、接続試行中で時間がかかりますが、接続試行中表示のまま、次の作業に進んでください。
Wi-FiとAzure IoT Centralの接続を設定する
任意のブラウザで、http://192.168.0.1/ にアクセスしてください。
Wi-Fiをクリックして、SSIDとパスフレーズを入力、Saveをクリックしてください。
Homeをクリック、Azure IoT Centralをクリックしてから、
を入力して、Saveをクリックしてください。
最後に、Shutdownをクリックしてください。
ボタン通知
ボタンをクリックすると、、、
Azure IoT Centralにメッセージが通知され、Webで確認することができます!
Azure SphereのOSアップデートの挙動を調べた
以前から、OSアップデートするときにアプリケーションはどうなるのか気になっていた、、、
- OSのダウンロード中にアプリは停止するのか?
- アプリの停止は事前に通知されるのか?
- アプリの停止時間は?
のですが、1/10にAzure Sphere OS 18.11.2のOSアップデートがOTA配信開始したので、挙動を調べることに。
挙動を調べるためのコード
アプリが再起動するため、Visual Studio(やgdb)でLog_Debugを見て確認することができません。 そこで、UARTに連続してデータを出力して、それをロジックアナライザでキャプチャすることにしました。
アプリは、起動時に"STX\n"を送信した後、0x00~0xffを連続して送信し続けます。SIGTERMを受けたら、"ETX\n"を送信して終了。
int main(int argc, char *argv[]) { Log_Debug("Application starting.\n"); // Register a SIGTERM handler for termination requests struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); action.sa_handler = TerminationHandler; sigaction(SIGTERM, &action, NULL); UART_Config config; UART_InitConfig(&config); config.baudRate = 115200; config.flowControl = UART_FlowControl_None; int uartFd = UART_Open(MT3620_UART_ISU3, &config); assert(uartFd); write(uartFd, "STX\n", 4); char data = 0; while (!terminationRequired) { int ret = write(uartFd, &data, 1); if (ret == 1) data++; } wait_ms(100); // easyio write(uartFd, "ETX\n", 4); wait_ms(100); // easyio close(uartFd); Log_Debug("Application exiting.\n"); return 0; }
実行手順
色々と試しましたが、、、この流れがベストのようです。
azsphere device recover
でOSを18.11にする。azsphere device prep-debug
。- VSからアプリを実行して、停止。(Flashにアプリを入れる)
- ロジックアナライザを接続。
- resetボタンをクリック。
- ロジックアナライザがキャプチャできていることを確認。
azsphere device wifi add
して、azsphere device wifi list
でconnectedになることを確認、すぐにresetボタンをクリック。←この操作は短時間に!- 10分くらいキャプチャし続ける。
実行結果
- アプリが起動してから(OSアップデートで)停止するまで、約377秒(約6分)
- (OSアップデートで)アプリ停止時間、約83秒(約1分)
- OSのダウンロードがアプリ稼働中か停止中かは、判断つかなかった。
- アプリ停止直前は、SIGTERMシグナルが来ていた。
まとめ
実運用では、OSアップデートで1分くらい停止しても大丈夫なように、全体設計しておく必要がありそうです。
Azure Sphereの18.11がマイナーアップデート
Azure Sphere 18.11がマイナーアップデートされました。
リリースノートから、どんな変更点があったのか?確認したいと思います。
18.11,18.11.1,18.11.2リリースノート
リリースノートはこちらです。
18.11リリースノートを変更して、18.11.1と18.11.2が追加されています。
18.11.1と18.11.2が同時リリースってちょっとおかしくない?という感じですが、
ということで、OSの18.11.1は存在しないようです。
SDK 18.11.1 リリース
Private Ethernetの機能が追加されました。
これだけなので、この機能を使わないなら、SDKをアップデート不要です。
なお、SDK 18.11から18.11.1へアップデートは自動ではありません。SDK18.11.1をダウンロード、インストール操作してください。
OS 18.11.2 リリース
Azure SphereデバイスがWi-Fiに接続できない問題が解決されました。
OS 18.11から18.11.2はOTAで自動的にアップデートされます。更新は10分以内です。
18.11.2になると、azsphere device image list-installed --full
を実行して表示されるNW KernelのImage IDが44ed692e-ce49-4425-9aa6-952b84ce7b32
になります。
感想
C#コードでMT3620を動かしてみた
Seeed UG Advent Calendar 2018の23日目に誰をも寄せ付けないクレイジーな面白そうな記事が投稿されました。
MT3620セットアップに始まり、Cサンプルコードの解説、C#で開発するためのビルド環境の整備、C#からCのInterop、疑似イベント駆動と、すげー長いので、、、
「とりあえず、ビルドして動かしてみたい」
というライトなユーザー向けに、ブログを書いておこうと思いました。
MT3620でC#を動かすテクノロジー「IL2C」
現在、MT3620の開発言語はC言語だけです。
じゃあ、どうやってC#を動かすのか?ですが、C#コードをビルドした結果のMSILを、IL2C.Coreを使ってCコードを生成して、そのCコードをCコンパイラでビルドして、実行のバイナリイメージを作成、MT3620で実行します。(下図の右側)
C#コード
-> ビルド -> MSIL
-> IL2C.Core-> Cコード
-> ビルド -> バイナリイメージ
IL2C.Coreが生成したCコードは、それ単独をビルド、実行することができません。IL2C.CoreでCコードを生成するときに、IL2C.Runtimeを呼び出すCコードを出力しているからです。そのため、Cコードのビルド時にIL2C.Runtimeも加える必要があります。(下図の左側)
大きく、
- IL2C.Core
- IL2C.Runtime
の2つが重要!
IL2C.CoreとIL2C.Rumtimeがどこから来るのかというと、、、kekyoさんが鋭意開発していて、全ソースが彼のgithubに上がっています。
あと、上図の「IL2C」はIL2C.Buildという名前でnugetに上がっているので、実際に必要になるものは、
- IL2C.Build (IL2C.Coreが含まれている)
- IL2C.Runtime
ってことになります。
MT3620のサンプルコードを動かす
それでは、用意されているサンプルコードを動かしてみましょう。
MT3620の開発に必要な、ボード購入やらAzureSphereSDKインストール、デバイスのクレームなどは省略で。ググってください。Visual Studioを使って、(C言語で)MT3620を開発、実行ができている前提で。
必要なファイルをコピー
kekyo/IL2CリポジトリにIL2C.Runtimeライブラリとサンプルコードが含まれています。ローカルにクローンしてください。
git clone https://github.com/kekyo/IL2C.git
サンプルコードのソリューションを開く
Visual Studioで、samples/AzureSphere/AzureSphere.sln
を開いてください。
3つのプロジェクトが含まれているはずです。
デフォルトでスタートアッププロジェクトが不適切なので、、、
Mt3620App
プロジェクトを右クリックして、スタートアッププロジェクトに設定
を選択してください。Mt3620App
が太字で表示されればOKです。
ビルド&実行
PCにMT3620を接続して、デバッグ実行してください。
すると、自動的にnugetからIL2C.Buildをダウンロードしてきて、あれやこれやをやった後に、MT3620へデプロイ、プログラムが実行されます。
おまけ
C#コードでブレークポイントやステップ実行ができるぅ!!!
謎技術。
(さすがに、変数ウォッチはできません。)
<kekyoコメント>
デバッグ時の変数の参照は、プリミティブ型であれば見えると思う。オブジェクト参照は、frame__の下に入ってるけど、コードが抽象型で書かれていて、実際のインスタンスが具象型の場合は正しく見えない可能性がある あとラムダ式で変数キャプチャすると、クロージャ型の中を見ないと見えないけど、ローカルスタックフレームのどれがそのクロージャ型のインスタンスなのかを特定するには、いくつかツリーを開いて中身確認してみないとわからないかも知れない
今回、MT3620視点で書いていますが、、、 サンプルコードに、AzureSphere以外のmicro:bitやWio LTE、M5Stackもあるので、今後が楽しみですね。
ChibiOSを調べる
nanoFrameworkの土台がChibiOSなので、ChibiOSを調査します。
ドキュメントはこちら。 ChibiOS free embedded RTOS - ChibiOS Homepage
Product Information
- ライセンスは、GPL3 or Apache 2.0。
- ChibiOSは4つのプロダクトで構成されている。
ChibiOS/RT 3.0 The Ultimate Guide
ChibiOS General Archietcture
- ChibiOS/RT ... the RTOS scheduler.
- ChibiOS/HAL ... the Hardware Abstraction Layer enclosing abstract drivers for most common peripherals.
The Big Picture
- Startup Code
./os/common.ports
... The code executed after the reset. - Application ... the user code. main()
- ChibiOS/RT
ChibiOS/HAL
RT does not need HAL
- HAL uses RT's services through the OSAL
ChibiOS products directory organization
***************************************************************************** *** ChibiOS products directory organization *** ***************************************************************************** --{root} - Distribution directory. +--os/ - ChibiOS products, this directory. | +--rt/ - ChibiOS/RT product. | | +--include/ - RT kernel headers. | | +--src/ - RT kernel sources. | | +--templates/ - RT kernel port template files. | | +--ports/ - RT kernel port files. | | +--osal/ - RT kernel OSAL module for HAL interface. | +--nil/ - ChibiOS/NIL product. | | +--include/ - Nil kernel headers. | | +--src/ - Nil kernel sources. | | +--templates/ - Nil kernel port template files. | | +--ports/ - Nil kernel port files. | | +--osal/ - Nil kernel OSAL module for HAL interface. | +--hal/ - ChibiOS/HAL product. | | +--include/ - HAL high level headers. | | +--src/ - HAL high level sources. | | +--templates/ - HAL port template files. | | +--ports/ - HAL port files (low level drivers implementations). | | +--boards/ - HAL board files. | +--common/ - Files used by multiple ChibiOS products. | | +--ports - Common port files for various architectures and | | compilers. | +--various/ - Various portable support files. | +--ext/ - Vendor files used by ChibiOS products.
Azure Sphere MCUのセキュア構造
12/20にPlutonの構造、機能に関するブログがポストされました。
全文を訳すのは自信が無いので、、、気になるポイントだけ箇条書きにしました。
Pluton Key management
- Plutonは(シリコン)製造段階で自らのキーペアを生成しています。
- これらのキーはe-fusesに入っていて永続的に保持します。
- プライベートキーはソフトウェアで読み出すことはできません。(認められたファームウェアでも不可)
- Plutonは2つのECCキーペアを生成しており、1つはリモート認証用、もう1つは汎用暗号化用です。
- シリコン製造会社はマイクロソフトへパブリックキーを送付します。そうすることで、マイクロソフトは全てのAzure Sphere MCUを信頼します。
Pluton’s random number generator
- Plutonは真の乱数ジェネレータを実装しています。(環境情報を使っている?)
- Plutonの乱数ジェネレータはエントロピーを測定して、基準に満たない場合は乱数を配布しません。
Pluton’s cryptographic helpers
- 暗号化のタスクを(ハードウェアで実装することで?)高速化しています。
- Hashing(via SHA2), ECC, AES
The benefits of secure boot
Leveraging remote attestation
- Plutonは、測定されたブートとリモートアテステーションのサポートをシリコンで実装しています。
手順が書かれているが、、、よくわからんorz
デバイスがAS3をサーバー認証するだけでなく、AS3がデバイスを認証する、、、あたりの動きかな?
デバイスが不健全なときは、AS3しか接続できない。(ソフトウェアの更新で回復)
A future blog post will provide a more thorough deep dive on this topic
Silicon security beyond Pluton
mbed-os-example-wifiを動かしてみた
MbedでAZ3166をやってみる記事を書きましたが、、、
ここで使った、mbed-wifi-example、、、 というか、これの内部で使っているmbed-emw10xx-driverは、もう古いモノでしたorz
いまは、Officialのmbed-osにMTB_MXCHIP_EMW3166
としてマージされています。
ネットワークの部分は、WICEDがコンパイル済みの状態で同梱されていました。
mbed-os/targets/TARGET_WICED at master · ARMmbed/mbed-os · GitHub
で、動かし方ですが、、、
mbed import https://github.com/ARMmbed/mbed-os-example-wifi
して、mbed_app.jsonをこんな感じにして、
{ "config": { "wifi-ssid": { "help": "WiFi SSID", "value": "\"aterm-3b8988-g\"" }, "wifi-password": { "help": "WiFi Password", "value": "\"P@ssw0rd\"" } }, "target_overrides": { "*": { "platform.stdio-convert-newlines": true, "target.stdio_uart_tx": "PA_11", "target.stdio_uart_rx": "PA_12", "platform.stdio-baud-rate": 115200 } } }
コンパイルすればOK。
ざっくり調べた感じだと、邪魔だったbootloaderやMiCOが入っていないようで、スッキリとしています。
ちょっと注意が必要なのが、