Jetson Nanoにファン追加

重いプログラムを走らせなくても、結構温度が上がるJetson Nano。

f:id:matsujirushix:20190818095757p:plain

チョー不安なので、ファンを追加することに。

どんなファンが取り付けできるの?

40mm角のファンが取り付けできるようですが、、、
ネットで検索すると、色々とハマりどころがあるらしい。

qiita.com

公式は、NF-A4x20を推奨しています。

noctua.at

12V品とか5V品とか、PWMとか。間違えやすいオプション設定があるので、購入時は注意しましょう。

  • NF-A4x20
  • 5V
  • PWM (4pin)

入手性が悪くて価格が高騰していたので、ネットを探し回って、送料込み2500円くらいで購入しました。

f:id:matsujirushix:20190818101134p:plain f:id:matsujirushix:20190818101225p:plain

ファンの取り付けネジ

ヒートシンクの穴に、3mmのネジが通らないorz
インチサイズなのかなこれ?

2.6mmのネジだと長いのが入手し辛いので、ヒートシンクの穴を(ダイソーの3mmピンバイスで)大きくしました。
アルミくずが基板に降りかかるといけないので、逆さに持って慎重に慎重に。

f:id:matsujirushix:20190818102052p:plain

ネジはこれらを用意。

  • ステンレス トラスねじ M3x25 4本
  • ステンレス ナット M3 4個

近所のロイヤルホームセンターで、計108円でした。

ファンの取り付け

ネジで止めて、ケーブル繋ぐだけ。

f:id:matsujirushix:20190818102513p:plain

ファンのON/OFF

ファンを取り付けただけでは回転しません。(--;)

sudo jetson_clocksコマンドで、ファンスピードが最大になります。

jetson_clocksについてはこちらが参考になります。 より詳しくしりたい人は、vi /usr/bin/jetson_clocks

結果

36℃くらいで安定になりました。(そもそも、部屋が暑い。)
ファンが分厚くて気に入らないので、もうちょっと薄いファンにしたい。

Jetson NanoでAzure IoT Edgeを動かす

Jetson Nanoで、Azure IoT Edgeが動くか確認します。

Jetson NanoにOSをセットアップ

こちらの手順に沿って、OSイメージをマイクロSDに書き込んでブートします。

developer.nvidia.com

現時点のOSイメージファイルはjetson-nano-sd-r32.2-2019-07-16.zipでした。

OSバージョンを確認

/etc/os-releaseuname -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 LTSaarch64でした。

Azure IoT Edgeのサポート状況

Azure IoT Edgeのサポート状況を確認すると、Ubuntu 18.04 ARM64はTier 1だがPublic preview

f:id:matsujirushix:20190812155313p:plain

Azure IoT Edgeをインストール

Azure IoT Edgeのインストール手順に従って、インストールします。

docs.microsoft.com

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にメッセージが送られてくるか確認。

f:id:matsujirushix:20190812165827p:plain

ちゃんと動いています。

Wio Nodeの測定データをAzure IoT Centralで表示する

Azure IoT Centralって、グラフ表示やメール通知がサクッとできて便利ですよね。
このAzure IoT Centralに、Wio Nodeの測定データを送ることができるか試してみました。

コンセプト

いたってシンプル。
タイマートリガーで10分間隔にAzure Functionsを起動して、Wio Nodeから温度・湿度を取得してAzure IoT Centralへメッセージ送信するというもの。

f:id:matsujirushix:20190721214747p:plain

Wio Node

Wio NodeにGrove-BME280を接続、専用アプリでセットアップします。
すると、SeeedのWio LinkサーバーへREST APIで温度・湿度を取得することができます。

www.seeedstudio.com

www.seeedstudio.com

f:id:matsujirushix:20190721215645p:plain

Azure IoT Central

アプリケーションを用意して、デバイステンプレートを追加、温度・湿度に対応する測定を追加します。

項目 フィールド名
温度 temperature
湿度 humidity

f:id:matsujirushix:20190721220019p:plain

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

そして、WioNodeTokenWioNodeTempURIWioNodeHumiURIDeviceOfIoTHubにWio NodeやAzure IoT Central(の中のAzure IoT Hub)の情報を、デバッグ時はlocal.settings.json、実行時はapplication settingsに設定します。

local.settings.jsonの設定例
f:id:matsujirushix:20190721221032p:plain

application settingsの設定例
f:id:matsujirushix:20190721221205p:plain

DeviceOfIoTHubに設定する、Azure IoT Centralの中のAzure IoT Hubのデバイス接続文字列は、dps_cstrコマンドで調べてください。
参考:デバイスからAzure IoT Centralに接続する方法 - matsujirushi’s blog

結果

でた。

f:id:matsujirushix:20190721221644p:plain

費用

1日あたり、0.31円でした。

f:id:matsujirushix:20190721221924p:plain

Maixduino ブロック図

タイトルのとおり。

回路図を見るついでに、ブロック図を書きました。

ブロック図

f:id:matsujirushix:20190714131931p:plain

考察

  • 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。

f:id:matsujirushix:20190712222542p:plain

販売ページ:Sipeed Maixduino Kit for RISC-V AI + IoT

RISC-Vにニューラルネットワークプロセッサ、Wi-FiBluetooth、カメラにLCD
まぁ、とにかくテンコ盛り製品w

開発環境は?

Arduino IDE or MaixPy(MicroPython)が用意されているようです。

ざっとググった感じだと、MaixPyのほうが手軽な感じ。

MaixPy

専用ファームウェアをMaixduinoに入れれば、シリアルコンソールやMaixPy IDEからPythonを実行できるというものです。

ドキュメントはココ。 maixpy.sipeed.com

現時点では、セットアップの方法がいまひとつ分からず、いくつかのサイトを徘徊して分かってきたので、メモすることにしました。

MaixPyのセットアップ

大まかには、次の作業になります。

  1. 必要なファイルをダウンロード
  2. Maixduinoを組み立て
  3. MaixduinoをPCに接続
  4. ファームウェアを転送
  5. ファームウェア動作を確認
  6. MaixPy IDEをインストール

1. 必要なファイルをダウンロード

これらのファイルが必要です。

  1. kflash_gui_vX.X.X_windows.7z ... ファームウェアを転送するのに使用
  2. maixpy_vX.X.X_full.bin ... MaixPyのファームウェア(詳しくはココ
  3. maixpy-ide-windows-X.X.X.exe ... MaixPy IDE

1.はkflash_gui githubReleasesページからダウンロードできます。
他は、MaixPy githubReleasesページからダウンロードできます。
過去バージョンも載っているので、上の方にあるものをダウンロードしましょう。

2. Maixduinoを組み立て

Maixduinoの箱を開梱すると、本体とLCDが接続されていません。

f:id:matsujirushix:20190713145812p:plain

慎重にLCDのフィルムケーブルをコネクタに取り付けます。

向きは、、、よく見ると、ケーブルと基板の双方に1番ピンのマーキングがあるので、それを参考にして接続します。

f:id:matsujirushix:20190713150357p:plain f:id:matsujirushix:20190713150305p:plain

接続するとこんな感じ。

f:id:matsujirushix:20190713150647p:plain

LCDがブラブラして、フィルムケーブルやコネクタが破損すると怖いので、わたしはLCDを両面テープで本体基板に貼り付けました。

3. MaixduinoをPCに接続

Type-C USBケーブルでPCに接続します。
(ケーブルは同封されていないので、、、メッチャ探した。)

シリアルポートが2個増えればOKです。

f:id:matsujirushix:20190712230811p:plain

1つはRISC-Vモジュール、もう1つはESP32に繋がっています。
どっちがどっちか区別できませんが、、、わたしの場合は、小さい番号の方が、RISC-Vモジュールでした。

4. ファームウェアを転送

kflash_gui_vX.X.X_windows.7zを解凍して、中に入っているkflash_gui.exeを実行して、ファームウェアをMaixduinoへ転送します。

指定はこんな感じ。
Downloadをクリックすると、転送を開始します。

f:id:matsujirushix:20190713151852p:plain

5. ファームウェア動作を確認

TeraTermなどで、RISC-Vモジュールのシリアルポートに115200,8,N,1で接続して、Ctrl+Dを押したときに、下記バナーが表示されれば正常です。

f:id:matsujirushix:20190713152251p:plain

6. MaixPy IDEをインストール

maixpy-ide-windows-X.X.X.exeを実行して、MaixPy IDEをPCにインストールします。

MaixPy IDEを起動して、左下のチェーンみたいなアイコンをクリックすると、Maixduinoと接続します。
さらに、左下の再生アイコンをクリックして、フレームバッファにカメラの映像が表示されれば正常です。

f:id:matsujirushix:20190713152604p:plain

Azure IoT Hubのツール

Azure IoT Hubに接続するデバイスを開発するときに、Azure IoT Hubに送られたD2Cメッセージをモニタリングしたいことがよくあります。そんなときは、わたしはいつもDevice Explorerを使っています。

さて、最近、SignalR Serviceを試しているのですが、こんなときはデバイスの代わりにD2Cメッセージを送信したい(様々なデータを送信して試したい)のですが、Deivce Explorerには、D2Cメッセージを送信する機能がありませんでした。

他に何か使えそうなツールが無いか調べてみたところ、、、Azure IoT Hubの開発に使えるツールがいくつかあったので、メモしておきます。

Device Explorer @WinForm

f:id:matsujirushix:20190707095836p:plain

オープンソースGUIツール。
WinFormで作られているので、Windowsでしか使えません。

https://aka.ms/aziotdevexpのリンク先から、最新のビルド済みインストーラ(SetupDeviceExplorer.msi)をダウンロードできます。

バイス管理は、デバイスの作成、削除、接続文字列の取得と、接続状態、最終接続日時などを確認できます。
バイス操作は、D2Cモニタリング、C2Dメッセージ、ダイレクトメソッド、デバイスツインの読み書きができます。

iothub-explorer @黒画面

後述の「az iotを推奨」ってことでメンテナンス継続しないアナウンスあり。
ってことで、リンクだけ置いておきます。

az iot @黒画面

f:id:matsujirushix:20190707101949p:plain

オープンソースコマンドラインツール。
正式名称は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

f:id:matsujirushix:20190707104620p:plain

オープンソースVisual Studio Code拡張。
Node.js向けAzure IoT SDKを使って作られています。←軽く見た感じだと

インストールは、VSCode拡張の追加で。

出来ることは、ここに詳しく書かれています。
機能は、ざっと見ると、Device Explorerの機能+D2Cメッセージ 送信(!)、カスタムエンドポイント関連、IoT Edge関連のようです。

Cloud Explorer @VisualStudio

f:id:matsujirushix:20190707105234p:plain

ソースは非公開。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の名称

以前と用語が変更になっているっぽいので、最新のドキュメントで確認、整理しました。

docs.microsoft.com

f:id:matsujirushix:20190623200435p:plain

  • 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)
    • for real-time processing
    • Real-time core(s)
    • Arm Cortex-M I/O subsystem
    • real-time capable applications
    • bare-metal code or a RTOS
    • cannot access the internet directly

docs.microsoft.com

  • Build high-level applications ...

docs.microsoft.com

  • Base APIs
    • C standard library ... POSIX-based C development library
    • curl library
    • Azure IoT C SDK library
  • Applibs
    • Application ... Communicates with and controls real-time capable applications
    • GPIO
    • I2C
    • Log
    • Networking
    • RTC
    • SPI
    • Storage
    • UART
    • WiFiConfig

docs.microsoft.com

  • 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

HighLevelAppAzure Sphereサンプルコードから持ってきました。