Jetson NanoでAzure IoT Edgeを動かす
Jetson Nanoで、Azure IoT Edgeが動くか確認します。
Jetson NanoにOSをセットアップ
こちらの手順に沿って、OSイメージをマイクロSDに書き込んでブートします。
現時点のOSイメージファイルはjetson-nano-sd-r32.2-2019-07-16.zipでした。
OSバージョンを確認
/etc/os-release
とuname -a
で、OSバージョンを確認。
matsujirushi@jetsonnano:~$ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.2 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.2 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic matsujirushi@jetsonnano:~$ uname -a Linux jetsonnano 4.9.140-tegra #1 SMP PREEMPT Tue Jul 16 17:04:49 PDT 2019 aarch64 aarch64 aarch64 GNU/Linux matsujirushi@jetsonnano:~$
Ubuntu 18.04.2 LTSのaarch64でした。
Azure IoT Edgeのサポート状況
Azure IoT Edgeのサポート状況を確認すると、Ubuntu 18.04 ARM64はTier 1だがPublic preview。
Azure IoT Edgeをインストール
Azure IoT Edgeのインストール手順に従って、インストールします。
Jetson NanoのOSイメージにcurlが入っていなかったのでインストール。
sudo apt update sudo apt install curl
インストール手順を実施。
curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/ sudo apt-get update sudo apt-get install moby-engine
エラー発生。
moby-engine (3.0.6) を展開しています... dpkg: アーカイブ /var/cache/apt/archives/moby-engine_3.0.6_arm64.deb の処理中にエラーが発生しました (--unpack): '/usr/bin/docker-proxy' を上書きしようとしています。これはパッケージ docker.io 18.09.2-0ubuntu1~18.04.1 にも 存在します dpkg-deb: エラー: ペースト subprocess was killed by signal (Broken pipe) 処理中にエラーが発生しました: /var/cache/apt/archives/moby-engine_3.0.6_arm64.deb E: Sub-process /usr/bin/dpkg returned an error code (1)
あぁ、なるほど。Dockerが既に入っているので、moby-engineでエラーなのか。
mobyの部分はスルーして継続。(マイクロソフトはmoby-engineを推奨しているので、今回は推奨外の構成になります。)
sudo apt-get update sudo apt-get install iotedge sudo vi /etc/iotedge/config.yaml sudo systemctl restart iotedge
とりあえず、Runtimeは動いてる感じ。
サンプルのモジュールを動かす
Simulated Temperature Sensorをデプロイしてみて、Azure IoT Hubにメッセージが送られてくるか確認。
ちゃんと動いています。
Wio Nodeの測定データをAzure IoT Centralで表示する
Azure IoT Centralって、グラフ表示やメール通知がサクッとできて便利ですよね。
このAzure IoT Centralに、Wio Nodeの測定データを送ることができるか試してみました。
コンセプト
いたってシンプル。
タイマートリガーで10分間隔にAzure Functionsを起動して、Wio Nodeから温度・湿度を取得してAzure IoT Centralへメッセージ送信するというもの。
Wio Node
Wio NodeにGrove-BME280を接続、専用アプリでセットアップします。
すると、SeeedのWio LinkサーバーへREST APIで温度・湿度を取得することができます。
Azure IoT Central
アプリケーションを用意して、デバイステンプレートを追加、温度・湿度に対応する測定を追加します。
項目 | フィールド名 |
---|---|
温度 | temperature |
湿度 | humidity |
Azure Functions
これを放り込みます。
using Microsoft.Azure.Devices.Client; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using System; using System.Configuration; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace mjcradlefunc { public static class Function1 { [FunctionName("WioNodeToIoTCentral")] public static async Task Run([TimerTrigger("0 */10 * * * *")]TimerInfo myTimer, ILogger log) { var temperatureObject = await GetJObjectFromWioNode(GetEnvValue("WioNodeTempURI"), GetEnvValue("WioNodeToken"), log); double temperature = (double)temperatureObject["temperature"]; log.LogInformation($"temperature is {temperature}"); var humidityObject = await GetJObjectFromWioNode(GetEnvValue("WioNodeHumiURI"), GetEnvValue("WioNodeToken"), log); double humidity = (double)humidityObject["humidity"]; log.LogInformation($"humidity is {humidity}"); var msgObject = new JObject(); msgObject["temperature"] = temperature; msgObject["humidity"] = humidity; var deviceClient = DeviceClient.CreateFromConnectionString(GetEnvValue("DeviceOfIoTHub"), TransportType.Amqp); var eventMessage = new Message(Encoding.UTF8.GetBytes(msgObject.ToString())); await deviceClient.SendEventAsync(eventMessage); } private static async Task<JObject> GetJObjectFromWioNode(string uri, string token, ILogger log) { var httpClient = new HttpClient(); var jsonString = await httpClient.GetStringAsync($"{uri}?access_token={token}"); log.LogInformation($"Got json string is {jsonString}"); return JObject.Parse(jsonString); } private static string GetEnvValue(string name) { return Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process); } } }
そして、WioNodeToken
、WioNodeTempURI
、WioNodeHumiURI
、DeviceOfIoTHub
にWio NodeやAzure IoT Central(の中のAzure IoT Hub)の情報を、デバッグ時はlocal.settings.json
、実行時はapplication settingsに設定します。
local.settings.jsonの設定例
application settingsの設定例
DeviceOfIoTHub
に設定する、Azure IoT Centralの中のAzure IoT Hubのデバイス接続文字列は、dps_cstrコマンドで調べてください。
参考:デバイスからAzure IoT Centralに接続する方法 - matsujirushi’s blog
結果
でた。
費用
1日あたり、0.31円でした。
Maixduino ブロック図
タイトルのとおり。
回路図を見るついでに、ブロック図を書きました。
ブロック図
考察
- CH552Tは8051互換8bitマイコン。FTDIを模擬しているっぽい。
- M1とESP32の間はUART。で、CHT552Tも結線されている。
- M1が凄そう。
- Arduino Compatible Pin HeadersはM1とESP32に繋がっている。使い方ややこしそう。どこかに資料あるのかな?
- SPIがどういう感じなのか調べ切れていない。
- Speakerのコネクタが1.25mmピッチだった...orz
molex 51021が使えるのかな。
参考
Maixduino セットアップ手順メモ(MaixPy)
twitter見てて、なんとなーく面白そうだったので事前調査せずに買ってみました。
Maixduino。
販売ページ:Sipeed Maixduino Kit for RISC-V AI + IoT
RISC-Vにニューラルネットワークプロセッサ、Wi-FiにBluetooth、カメラにLCD。
まぁ、とにかくテンコ盛り製品w
開発環境は?
Arduino IDE or MaixPy(MicroPython)が用意されているようです。
ざっとググった感じだと、MaixPyのほうが手軽な感じ。
MaixPy
専用ファームウェアをMaixduinoに入れれば、シリアルコンソールやMaixPy IDEからPythonを実行できるというものです。
ドキュメントはココ。 maixpy.sipeed.com
現時点では、セットアップの方法がいまひとつ分からず、いくつかのサイトを徘徊して分かってきたので、メモすることにしました。
MaixPyのセットアップ
大まかには、次の作業になります。
1. 必要なファイルをダウンロード
これらのファイルが必要です。
- kflash_gui_vX.X.X_windows.7z ... ファームウェアを転送するのに使用
- maixpy_vX.X.X_full.bin ... MaixPyのファームウェア(詳しくはココ)
- maixpy-ide-windows-X.X.X.exe ... MaixPy IDE
1.はkflash_gui githubのReleasesページからダウンロードできます。
他は、MaixPy githubのReleasesページからダウンロードできます。
過去バージョンも載っているので、上の方にあるものをダウンロードしましょう。
2. Maixduinoを組み立て
Maixduinoの箱を開梱すると、本体とLCDが接続されていません。
慎重にLCDのフィルムケーブルをコネクタに取り付けます。
向きは、、、よく見ると、ケーブルと基板の双方に1番ピンのマーキングがあるので、それを参考にして接続します。
接続するとこんな感じ。
LCDがブラブラして、フィルムケーブルやコネクタが破損すると怖いので、わたしはLCDを両面テープで本体基板に貼り付けました。
3. MaixduinoをPCに接続
Type-C USBケーブルでPCに接続します。
(ケーブルは同封されていないので、、、メッチャ探した。)
シリアルポートが2個増えればOKです。
1つはRISC-Vモジュール、もう1つはESP32に繋がっています。
どっちがどっちか区別できませんが、、、わたしの場合は、小さい番号の方が、RISC-Vモジュールでした。
4. ファームウェアを転送
kflash_gui_vX.X.X_windows.7zを解凍して、中に入っているkflash_gui.exeを実行して、ファームウェアをMaixduinoへ転送します。
指定はこんな感じ。
Downloadをクリックすると、転送を開始します。
5. ファームウェア動作を確認
TeraTermなどで、RISC-Vモジュールのシリアルポートに115200,8,N,1で接続して、Ctrl+Dを押したときに、下記バナーが表示されれば正常です。
6. MaixPy IDEをインストール
maixpy-ide-windows-X.X.X.exeを実行して、MaixPy IDEをPCにインストールします。
MaixPy IDEを起動して、左下のチェーンみたいなアイコンをクリックすると、Maixduinoと接続します。
さらに、左下の再生アイコンをクリックして、フレームバッファにカメラの映像が表示されれば正常です。
Azure IoT Hubのツール
Azure IoT Hubに接続するデバイスを開発するときに、Azure IoT Hubに送られたD2Cメッセージをモニタリングしたいことがよくあります。そんなときは、わたしはいつもDevice Explorerを使っています。
さて、最近、SignalR Serviceを試しているのですが、こんなときはデバイスの代わりにD2Cメッセージを送信したい(様々なデータを送信して試したい)のですが、Deivce Explorerには、D2Cメッセージを送信する機能がありませんでした。
他に何か使えそうなツールが無いか調べてみたところ、、、Azure IoT Hubの開発に使えるツールがいくつかあったので、メモしておきます。
Device Explorer @WinForm
オープンソースのGUIツール。
WinFormで作られているので、Windowsでしか使えません。
https://aka.ms/aziotdevexpのリンク先から、最新のビルド済みインストーラ(SetupDeviceExplorer.msi)をダウンロードできます。
デバイス管理は、デバイスの作成、削除、接続文字列の取得と、接続状態、最終接続日時などを確認できます。
デバイス操作は、D2Cモニタリング、C2Dメッセージ、ダイレクトメソッド、デバイスツインの読み書きができます。
iothub-explorer @黒画面
後述の「az iotを推奨」ってことでメンテナンス継続しないアナウンスあり。
ってことで、リンクだけ置いておきます。
az iot @黒画面
オープンソースのコマンドラインツール。
正式名称はMicrosoft Azure IoT Extension for Azure CLI。
Azure CLIの拡張機能で、Pythonで作られています。
ちなみに、Azure CLIの正式名称はMicrosoft Azure Cross-platform Command Line Interface。
Azure CLIの拡張機能追加コマンドでインストールできます。 (インストール方法)
Azure IoT Hubのデバイス管理、デバイス操作など、様々なことが可能です。さらに、Azure IoT Hub Device Provisioning Serviceの操作もできます。
また、Azureポータルでは表示されていない内部の情報も取得することができます。
できることのバリエーションでいえば、これが最強。
ドキュメントはここですが、英語&もりだくさんなので辛し。
Azure IoT Hub Toolkit @VSCode
オープンソースのVisual Studio Code拡張。
Node.js向けAzure IoT SDKを使って作られています。←軽く見た感じだと
インストールは、VSCode拡張の追加で。
出来ることは、ここに詳しく書かれています。
機能は、ざっと見ると、Device Explorerの機能+D2Cメッセージ
送信(!)、カスタムエンドポイント関連、IoT Edge関連のようです。
Cloud Explorer @VisualStudio
ソースは非公開。VisualStudio拡張機能。
VisualStudioインストーラに統合されているので、VisualStudioに「Azureの開発」ワークロードを追加すると、デフォルトでインストールされます。
出来ることは、Azure IoT Hub Toolkitと同等のようです。
メニューが日本語化されていて、ちょっと嬉しい。
まとめ
ちょっとD2Cメッセージ見てみたいといったライトな使い方だと、
で、
D2Cメッセージを送りたいときは、
- Azure IoT Hub Toolkit もしくは Cloud Explorer
を使う。
Azure IoTの内部を掘り下げてやろう!という強者は、
- az iot
を使う。
Windows, Macのどちらにも対応したハンズオンでは、Azure IoT Hub Toolkit推しってことになります。
Azure SphereのCoreとApplicationの名称
以前と用語が変更になっているっぽいので、最新のドキュメントで確認、整理しました。
- Arm Cortex-A
- optimized for low power
- High-level application core
- Arm Cortex-A subsystem
- hardware-based compartmentalization of processes
- high-level applications, and services
- Arm Cortex-M(s)
- Build high-level applications ...
- Base APIs
- Applibs
- Application ... Communicates with and controls real-time capable applications
- GPIO
- I2C
- Log
- Networking
- RTC
- SPI
- Storage
- UART
- WiFiConfig
- Build real-time capable applications (RTApps) ...
For details about programming the M4 cores on the MT3620, request the MT3620 M4 Datasheet from Avnet
まとめ
Core | Core name | Application name | Application name(short) |
---|---|---|---|
Arm Cortex-A | High-level application core | High-level application | HighLevelApp |
Arm Cortex-M(s) | Real-time core(s) | Real-time capable application | RTApp |
HighLevelAppはAzure Sphereサンプルコードから持ってきました。
Azure Sphere Cortex-M4のサンプルプログラムを動かしてみた
ベータサポートではありますが、19.05からCortex-M4でプログラムが動かせるようになりました。
というわけで、マイクロソフトから提供されているサンプルプログラムを動かしてみたいと思います。
サンプルプログラム
Cortex-M4のサンプルプログラムは、azure-sphere-samplesでいくつか提供されています。
Cortex-A7で動かすプログラムはHighLevelApp、Cortex-M4で動かすのはRTAppという名称になっているようです。RTAppは、RealTime Appってことみたい。
ここでは、一番シンプルなGPIO_RTApp_MT3620_BareMetalを動かすことにしましょう。
手順は、readme.mdです。
前提条件(Prerequisites)
MT3620開発ボードなら大丈夫。
サンプルをビルドと実行
SDKとMCUが19.05になっていることを確認しておきます。
C:\>azsphere show-version 19.05 Command completed successfully in 00:00:00.2236452. C:\>azsphere device show-ota-status Your device is running Azure Sphere OS version 19.05. The Azure Sphere Security Service is targeting this device with Azure Sphere OS version 19.05. Your device has the expected version of the Azure Sphere OS: 19.05. Command completed successfully in 00:00:03.8632201. C:\>
そして、MT3620のRTCoreを有効にします。
C:\>azsphere dev prep-debug --EnableRTCoreDebugging Installing USB drivers to enable real-time core debugging. Drivers installed for all attached devices. Getting device capability configuration for application development. Downloading device capability configuration for device ID '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC'. Successfully downloaded device capability configuration. Successfully wrote device capability configuration file 'C:\Users\takashi\AppData\Local\Temp\tmpA059.tmp'. Setting device group ID 'cd037ae5-27ca-4a13-9e3b-2a9d87f9d7bd' for device with ID '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC'. Successfully disabled over-the-air updates. Enabling application development capability on attached device. Applying device capability configuration to device. Successfully applied device capability configuration to device. The device is rebooting. Installing debugging server to device. Deploying 'C:\Program Files (x86)\Microsoft Azure Sphere SDK\DebugTools\gdbserver.imagepackage' to the attached device. Image package 'C:\Program Files (x86)\Microsoft Azure Sphere SDK\DebugTools\gdbserver.imagepackage' has been deployed to the attached device. Application development capability enabled. Successfully set up device '961B0F3AF5C4EA9581512975F8E21A81DFED93BEF7A73854D802C8BDEFF7F5A8516639B653E6F082009F5C660C9B96BB1B16F49A56D7DE51A089AC01AE3376EC' for application development, and disabled over-the-air updates. Command completed successfully in 00:00:44.1955946. C:\>
ここでは、PCにCortex-M4デバッグ用のUSBドライバをインストールして、デバイスのcapabilityを変更、gdbserverをインストールしています。USBドライバはこれかなぁ?
次はビルド。Visual Studioを起動して、メニューのファイル>開く>CMakeで、GPIO_RTApp_MT3620_BareMetalフォルダにあるCMakeLists.txtを開きます。すると、自動的にCMakeが実行されて、outフォルダにいろいろと書き込まれます。
いよいよビルド。ソリューションエクスプローラーでCMakeLists.txtを右クリックして、コンテキストメニューのビルドを実行します。結果、イメージパッケージ(GPIO_RTApp_MT3620_BareMetal.imagepackage)が出来上がります。
最後に、スタートアップアイテムの選択でGDB Debugger(RTCore)を選んでF5で実行すれば、イメージパッケージがMT3620開発ボードに転送されて、プログラムが実行されます。
気になった点
ブレークポイントとか試しましたが止まりませんでした。まだ対応していないのか?それともやり方が悪いのか?
デバッグ機能が使えないのは辛し。
■2019/6/23追記
RTCoreMain()起動直後のコードだと止まらないみたい。
この2箇所を仕込んで実行すると、line121は止まらず、line132で止まった。