Seeed ReButtonを動かしてみる

マイクロソフトが開催している、IoT in Actionというイベントシリーズがあるのですが、

iotinactionevents.com

私たちはパートナー企業やお客様とともにあり、IoTの導入によって企業が驚くほど革新的に変わっていく様子を何度も目撃してきました。IoT in Action イベントシリーズは、マイクロソフトのお客様とパートナーエコシステムを活用して、世界を変える新しいIoTソリューションを構築・展開するためのコラボレーションの機会を提供します。

一部地域で開催されたイベントで、アンケートに答えると、なななんと!マイクロソフトとSeeedが一緒に作った、ReButton(非売品)が配られていたんです!!

そして、昨日東京で開催されたイベントでも、ReButtonの配布がありました。

f:id:matsujirushix:20190123142727p:plain

何ができるのか?をざっくり(一例?)書くと、

  • ボタンのクリック(5種類)をAzure IoT Centralに通知
  • Azure IoT Centralでクリックしたタイミングを可視化
  • Azure IoT Centralから外部サービスに連携(メール通知とか)

で、単四電池2本で動くWi-Fi接続型のボタンです。

詳細は公式ドキュメントを見ていただくとして、ここでは、ボタンをクリックしたらAzure IoT Centralに表示されるまでのセットアップ方法を書いておきます。

ハードウェア

電池を入れる

裏蓋を外して、単四電池2本を入れてください。
蓋はシリコン製なのでグンニャリします。隙間にツメを突っ込んで引っ張り上げれば簡単に外れると思います。

f:id:matsujirushix:20190123144404p:plain

電池を入れるとこんな感じになります。

f:id:matsujirushix:20190123144522p:plain

電池を入れたら、裏蓋は元の状態に戻してください。

ボタン操作を練習する

ReButtonは、最初のクリックの反応が遅いです。これは、ボタンを押したときに回路の電源スイッチがONして動き出そうとしている時間です。
そのため、最初のプッシュはちょっと長めに押し続ける必要があります。「強く押す」ではありません!「長く押す」です

コツとしては、、、LEDが青色に点灯するまで押して、青色になったら離す。ちょっとコツが必要ですw

ボタンの内部プログラムでは、

  1. 押す→LEDが青色に
  2. 離す→LEDは青色のまま
  3. 1秒間放置→シングルクリックと判断
  4. クラウドへ通知しようとしてエラー(LEDが赤色で3回点滅)

とクリックを判定しています。

まだWi-FiやAzure IoT Centralが設定されていないため、エラー(LEDが赤色)になります。

また、3.の1秒間放置のときに押すと、ダブルクリック、トリプルクリックと変化して、LED表示が変わります。

クリック種類 LED色
シングルクリック
ダブルクリック
トリプルクリック

何回か試してみて、クリックのコツを掴みましょうw

10秒長押しすると、LEDが消灯しなくなります。(白色の点滅) そうなったときは、一度電池を抜いて電源を断ってください。

Azure IoT Central

Azure IoT Centralを用意する

Azure IoT Centralにアクセスして、マイクロソフトアカウントでサインインしてください。アカウントを持っていない場合は、作成を選んで、アカウントを作ってください。

f:id:matsujirushix:20190123150822p:plain

Azure IoT Centralのアプリケーションマネージャーが表示されたら、新しいアプリケーションをクリックしてください。

f:id:matsujirushix:20190123151124p:plain

アプリケーションの作成に必要な情報を入力します。
Azureサブスクリプションを持っているなら、重量課金制を。持っていないorまずは動くのを見たいだけなら、評価版を選択してください。
アプリケーションテンプレートはカスタムアプリケーションを。
アプリケーション名とURLは任意なので分かりやすいものを入れてください。

f:id:matsujirushix:20190123151509p:plain

このように表示されれば成功です。

f:id:matsujirushix:20190123151722p:plain

これを、Azure IoT Centralのアプリケーションと言います。

Azure IoT Centralアプリケーションにテンプレートを追加する

アプリケーションビルダー画面を表示してください。
右側にある下から3つ目のアイコンをクリックすると表示されます。

f:id:matsujirushix:20190123152401p:plain

バイステンプレートの作成をクリックしてください。

f:id:matsujirushix:20190123152448p:plain

カスタムをクリックしてください。

f:id:matsujirushix:20190123152920p:plain

バイステンプレートの名前に分かりやすい文言を入れて、作成をクリックしてください。

f:id:matsujirushix:20190123153103p:plain

これで、テンプレートが追加され、そこにシミュレートのデバイスが1つ追加された状態になりました。

バイスエクスプローラを見ると、テンプレートとデバイスを確認することができます。

f:id:matsujirushix:20190123153740p:plain

自動的に作成されたシミュレートのデバイスは、削除しても問題ありません。

バイスを追加する

テンプレートを作成すると、デフォルトでシミュレートのデバイスが1つ追加されますが、これをそのまま物理デバイスに紐づけることはできません。
物理デバイスを追加する必要があります。

バイスエクスプローラのデバイス一覧の上にあるプラスマークをクリックして、実際(英語だとReal)を選択してください。

f:id:matsujirushix:20190123155526p:plain

バイスを分かりやすい文言に変更して、作成をクリックしてください。

f:id:matsujirushix:20190123155706p:plain

このように表示されれば成功です。

f:id:matsujirushix:20190123160120p:plain

イベントにメッセージの項目を追加する

ボタンから送られてくるメッセージを、テンプレートに追加します。
テンプレートに追加ですが、、、実際の操作は、デバイスを選んでから、テンプレートの編集という流れになります。(ちょっと分かりにくい)

バイスエクスプローラでデバイス一覧を表示して、デバイスをクリックしてください。
そして、テンプレートの編集をクリックしてください。

f:id:matsujirushix:20190123160257p:plain

新しい測定をクリックして、イベントを選択してください。

f:id:matsujirushix:20190123160432p:plain

Display Nameにメッセージ、フィールド名にmessage、規定の重要度を情報にして、保存をクリック、最後にDoneをクリックしてください。
フィールド名は、必ずmessageと入れてください。

f:id:matsujirushix:20190123160701p:plain

イベントの欄に、メッセージが追加されていれば成功です。

f:id:matsujirushix:20190123160929p:plain

接続情報を取得

後でReButtonに設定する、Azure IoT Central(のデバイス)への接続情報を取得します。

バイスエクスプローラでデバイス一覧を表示して、デバイスをクリックしてください。
そして、右上の接続をクリックしてください。

f:id:matsujirushix:20190123161153p:plain

表示されたデバイス接続情報のうち、

を、後で使うのでメモ帳などにコピーしてください。

f:id:matsujirushix:20190123161258p:plain

ReButton

ReButtonをAccess Pointモードで起動して、パソコンからReButtonに接続、WebページでWi-FiアクセスポイントとAzure IoT Centralの接続情報を設定します。

ReButtonをAccess Pointモードで起動

ボタンを押し続けてください。10秒以上。 この間、LEDが青色→黄色→水色→白色と変化します。白色になったら、ボタンを離してください。

すると、ボタンがAccess Pointモードで起動して、LEDが白色の点滅になります。

ReButtonのアクセスポイントに接続

AZB-xxxxxxxxという名前のアクセスポイントがReButtonです。
パソコンからこのアクセスポイントに接続してください。

f:id:matsujirushix:20190123162130p:plain

接続操作すると、接続試行中で時間がかかりますが、接続試行中表示のまま、次の作業に進んでください。

Wi-FiとAzure IoT Centralの接続を設定する

任意のブラウザで、http://192.168.0.1/ にアクセスしてください。

f:id:matsujirushix:20190123162616p:plain

Wi-Fiをクリックして、SSIDパスフレーズを入力、Saveをクリックしてください。

f:id:matsujirushix:20190123163102p:plain

Homeをクリック、Azure IoT Centralをクリックしてから、

を入力して、Saveをクリックしてください。

f:id:matsujirushix:20190123163321p:plain

最後に、Shutdownをクリックしてください。

ボタン通知

ボタンをクリックすると、、、
Azure IoT Centralにメッセージが通知され、Webで確認することができます!

f:id:matsujirushix:20190123170510p:plain

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;
}

実行手順

色々と試しましたが、、、この流れがベストのようです。

  1. azsphere device recoverでOSを18.11にする。
  2. azsphere device prep-debug
  3. VSからアプリを実行して、停止。(Flashにアプリを入れる)
  4. ロジックアナライザを接続。
  5. resetボタンをクリック。
  6. ロジックアナライザがキャプチャできていることを確認。
  7. azsphere device wifi addして、azsphere device wifi listでconnectedになることを確認、すぐにresetボタンをクリック。←この操作は短時間に!
  8. 10分くらいキャプチャし続ける。

実行結果

  • アプリが起動してから(OSアップデートで)停止するまで、約377秒(約6分)
  • (OSアップデートで)アプリ停止時間、約83秒(約1分)
  • OSのダウンロードがアプリ稼働中か停止中かは、判断つかなかった。

f:id:matsujirushix:20190114102756p:plain

  • アプリ停止直前は、SIGTERMシグナルが来ていた。

f:id:matsujirushix:20190114103803p:plain

まとめ

実運用では、OSアップデートで1分くらい停止しても大丈夫なように、全体設計しておく必要がありそうです。

Azure Sphereの18.11がマイナーアップデート

Azure Sphere 18.11がマイナーアップデートされました。

azure.microsoft.com

リリースノートから、どんな変更点があったのか?確認したいと思います。

18.11,18.11.1,18.11.2リリースノート

リリースノートはこちらです。

docs.microsoft.com

18.11リリースノートを変更して、18.11.1と18.11.2が追加されています。

18.11.1と18.11.2が同時リリースってちょっとおかしくない?という感じですが、

  • SDKが、18.11 -> 18.11.1
  • (デバイスの)OSが、18.11 -> 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になります。

感想

  • 通常、SDKのアップデートは不要でしょう。
  • OSのアップデートは、、、不要であっても、インターネットに接続していると勝手に更新しますねこれ。Wi-Fi接続できないのは稀にあったので大変嬉しい。
  • マイナーアップデートが出たことで、OSのアップデートの挙動を調べることが出来そう。後日、調べようと思う。

C#コードでMT3620を動かしてみた

Seeed UG Advent Calendar 2018の23日目に誰をも寄せ付けないクレイジー面白そうな記事が投稿されました。

www.kekyo.net

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つが重要!

f:id:matsujirushix:20181229155302p:plain

IL2C.CoreIL2C.Rumtimeがどこから来るのかというと、、、kekyoさんが鋭意開発していて、全ソースが彼のgithubに上がっています。

github.com

あと、上図の「IL2C」はIL2C.Buildという名前でnugetに上がっているので、実際に必要になるものは、

  • IL2C.BuildIL2C.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つのプロジェクトが含まれているはずです。 f:id:matsujirushix:20181229171806p:plain

デフォルトでスタートアッププロジェクトが不適切なので、、、
Mt3620Appプロジェクトを右クリックして、スタートアッププロジェクトに設定を選択してください。Mt3620Appが太字で表示されればOKです。

ビルド&実行

PCにMT3620を接続して、デバッグ実行してください。

すると、自動的にnugetからIL2C.Buildをダウンロードしてきて、あれやこれやをやった後に、MT3620へデプロイ、プログラムが実行されます。

おまけ

C#コードでブレークポイントやステップ実行ができるぅ!!!
謎技術。 (さすがに、変数ウォッチはできません。) f:id:matsujirushix:20181229173449p:plain

<kekyoコメント>
デバッグ時の変数の参照は、プリミティブ型であれば見えると思う。オブジェクト参照は、frame__の下に入ってるけど、コードが抽象型で書かれていて、実際のインスタンスが具象型の場合は正しく見えない可能性がある あとラムダ式で変数キャプチャすると、クロージャ型の中を見ないと見えないけど、ローカルスタックフレームのどれがそのクロージャ型のインスタンスなのかを特定するには、いくつかツリーを開いて中身確認してみないとわからないかも知れない

今回、MT3620視点で書いていますが、、、 サンプルコードに、AzureSphere以外のmicro:bitやWio LTE、M5Stackもあるので、今後が楽しみですね。

ChibiOSを調べる

nanoFrameworkの土台がChibiOSなので、ChibiOSを調査します。

ドキュメントはこちら。 ChibiOS free embedded RTOS - ChibiOS Homepage

ソースはこちら。 GitHub - ChibiOS/ChibiOS: Read only mirror of SVN ChibiOS repository. Official forum http://forum.chibios.org Bugtracker http://sourceforge.net/projects/chibios

Product Information

  • ライセンスは、GPL3 or Apache 2.0。
  • ChibiOSは4つのプロダクトで構成されている。
    • RT ... fastest RTOS
    • NIL ... smallest RTOS
    • HAL ... set of abstract device drivers
    • ChibiStudio ... development environment

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

f:id:matsujirushix:20181225221606p:plain

  • Startup Code ./os/common.ports ... The code executed after the reset.
  • Application ... the user code. main()
  • ChibiOS/RT
    • RT Portable Kernel ./os/rt ... the RTOS kernel which is architecture and compiler independent.
    • RT Port Layer ./os/rt/ports ... the RTOS kernel specific. ←./os/common/portsを使ってる??
  • ChibiOS/HAL

    • HAL API Layer ./os/hal ... The HAL portable code.
    • HAL Port Layer ./os/hal/ports ... the device driver implementations for a specific MCU.
    • HAL Board Layer ./os/hal/boards ... all details of a specific board.
    • HAL OSAL Layer ./os/hal/osal ... the Operating System Abstraction Layer.
  • 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の構造、機能に関するブログがポストされました。

azure.microsoft.com

全文を訳すのは自信が無いので、、、気になるポイントだけ箇条書きにしました。

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

  • ECDSA(ECCキーペアを使用してデジタル署名をチェックするためのアルゴリズム)でチェックしている?
  • 全てのソフトウェア(ピース)はMicrosoftの署名が必要です。

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

  • セキュリティは、Plutonを構成するシリコン実装にとどまらない。
  • 5コアによる多層防御。
  • A7コアはArmのTrust Zoneテクノロジーを利用している。
  • ファイアウォール、全てのリソースはSecure Worldにマップされている。
  • 一度設定されたマップはロックされます。

mbed-os-example-wifiを動かしてみた

MbedでAZ3166をやってみる記事を書きましたが、、、

matsujirushi.hatenablog.jp

ここで使った、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が入っていないようで、スッキリとしています。

ちょっと注意が必要なのが、

  • MbedオンラインコンパイラMTB_MXCHIP_EMW3166は指定できません。mbed-cliを使います。
  • MTB_MXCHIP_EMW3166はEMW3166用なので、AZ3166のときは適切にピンを変更します。(先のstdio\uart_xxがソレ)