組み込み初心者が Azure Sphere のLEDをいっぱいチカチカしてみた

#はじめに
2018年にMicrosoftからLinux OSが出るということで話題になったIoTデバイス「Azure Sphere」ですが、興味本位で購入して数か月積みガジェットとなっていました。組み込み系はarduinoなどを趣味でかじったことがある程度。C++初心者ですが初期セットアップとチュートリアル+αを完了させたので記録しておきます。

#Azure Sphereって何？
Azure Sphereとは、IoTセキュリティを主眼としてMicrosoftが2018年4月16日に発表したIoTソリューション。ハードウェア（MCU：Micro Controller Unit）、OS(Sphere OS)、クラウド（Azure Sphere Security Service）の3つの観点でセキュリティを高めるよう設計されている。
デバイスにはMicrosoft謹製のPlutonセキュリティモジュールを内蔵したハードウェアが組み込まれており、セキュリティ確保を目的として設計されたカスタムLinux　Kernelを採用、Azure Sphere Security Serviceと呼ばれるクラウドサービスによりOSの自動更新やソフトウェア更新を配布するアーキテクチャになっています。
[![ビデオが開けなかった場合に表示されるテキスト](https://img.youtube.com/vi/iiDF26HNh-Y/0.jpg)](https://youtu.be/iiDF26HNh-Y)

#作業
Let's start Lチカ！

##環境
Azure Sphereを扱うのに最低限必要な環境です。下記の環境は事前に作業端末にセットアップをしておきます。

・[Azure Sphere MT3620 Deployment Kit](https://www.seeedstudio.com/Azure-Sphere-MT3620-Development-Kit-US-Version-p-3052.html)
・Windows 10 Anniversary Update以降のWindows PC
・Visual Studio 2017 Enterprise、Professional、または Community バージョン 15.7 以降
・[Azure Sphere SDK for Visual Studio Preview.](http://aka.ms/AzureSphereSDKDownload)
・Azure Subscription

## 0. Azure Sphereを入手する
私は　[Seeed](https://www.seeedstudio.com/Azure-Sphere-MT3620-Development-Kit-US-Version-p-3052.html)で購入しました。ただ、後で気づいたのですが、[秋月電子](http://akizukidenshi.com/catalog/g/gM-13677/)などでも購入できるようです。Azure Sphereの本体MT3620だけで10,000円弱で、センサーなどが組み合わさったStater Kitも販売されているようです。センサー類もおいおい欲しくなると思いましたが、わざわざ公式製品でなくても良いかなと思い今回は見送りました。
実物はこんな感じで、本体とUSBケーブルが保存されてます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/192113/e3e64f7a-6721-25be-c86e-848cbd0a8a90.jpeg" width=50%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/192113/dbc27288-bae1-817b-0b67-f41135c978b3.jpeg" width=50%>

##デバイスの接続
Azure Sphere本体と作業PCを付属のUSBケーブルで接続します。PC側でデバイスマネージャー（Windowsキー押してデバイスマネージャー検索）で確認するとCOMポートにデバイスが新たに認識されます。

![Sphereデバイス接続.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/08296336-5a62-f7e4-93c7-81fa86291d7d.png)

##Azure Active Directory の準備
Azure Sphereのデバイスを管理するために、[Azure AD](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview)のディレクトリ内に組織アカウントを作成します。

![AAD.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/3d98c32c-6b1e-2425-a75b-8ebf2ae62da9.png)

「+新しいユーザ」を選択し、ユーザを追加します。パスワードは後で使用するのでメモしておいてください。

![newuser.png](https://qiita-image-store.s3.amazonaws.com/0/192113/24df7337-cfe9-d422-9a54-e5241e7a19f4.png)

##Azure SphereとAzure ADを紐づける
ここからはAzure Sphere Developer Command Promptを起動します。（Azure Sphere SDK Preview for Visual Studioをインストールすることで使用できます）

![AzureSphereDeveloperCommand.png](https://qiita-image-store.s3.amazonaws.com/0/192113/10eeeb38-a312-d4bc-2e96-ac2353a9e750.png)

azsphere loginを実行してログイン画面を開きます。先に作成したAzure AD上のユーザアカウントIDとパスワードを入力しログインします。

```sh
azsphere login
```

Azure sphereテナントを作成します。作成したAzure Sphere テナントは、azsphere tenant listで確認が可能です。

```sh
azsphere tenant create --name "AzureSphereTenant"
```

```sh
azsphere tenant list
ID                                   Name
--                                   ----
xxxxxxx-xxxx-xxxx-xxxx-xxxxx AzureSphereTest

Command completed successfully in 00:00:07.0534058.
```

作成した Azure Sphere テナントにデバイスを登録するためにdevice claimを実行します。

```sh
azsphere device claim
```

##デバイスをWifiに接続する
この後、デバイスをWifiに接続しますが、[OSのリリースノート](https://docs.microsoft.com/ja-jp/azure-sphere/resources/release-notes-1811)を見ると古いバージョンでWifi接続できないバグがあったようです。最新版ではfixしているようなので次のコマンドでデバイスのOSを更新しておきます。

```sh
azsphere device recover
```

次の環境でWifiのSSIDとパスワードを指定してデバイスネットワークに接続します。

```sh
azsphere device wifi add --ssid <yourSSID> --key <yourNetworkKey>
```

成功すると次のようにconnectedと表示されます。
なお、Wifi接続はLチカのチュートリアルには必須ではないのでスキップしても大丈夫です。

```sh
C:\>azsphere device wifi show-status
SSID                : <yourSSID>
Configuration state : enabled
Connection state    : connected
Security state      : psk
Frequency           : 2462
Mode                : station
Key management      : WPA2-PSK
WPA State           : COMPLETED
IP Address          :
MAC Address         : xx:xx:xx:xx:xx:xx
```

##Lチカを実行する
Azure Sphere デバイスでサンプルアプリケーションなどを実行するにはデバッグを有効にする必要があります。次のコマンドを実行します。

```sh
azsphere device prep-debug
```

ここからはVisual Studioでの作業です。Visual Studio 2017を起動して、新規プロジェクトを作成します。
[Visual C++] > [クロスプラットフォーム] > [Azure Sphere]と選んでいき、Blink Sample for MT3620 RDBのテンプレートを選択して作成ます。

![VS.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/95c95e9b-e0d6-ef4e-7ddc-9a27f111cddf.png)

F5か「Remote GDB Debugger」をクリックするとサンプルアプリケーションが実行されます。
（azsphere device prep-debugを忘れているとこのタイミングで怒られるので注意してください）

![F5.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/72180987-c9b2-970b-c142-f6f14188ef4e.png)

すると下記の通り#1のLEDが赤色にチカチカしたら、チュートリアル完了です。

![download.gif](https://qiita-image-store.s3.amazonaws.com/0/192113/c3501229-11a4-0e95-c9c8-b5590c095070.gif)

##Lチカ+α
上記のテンプレートは何も変更していないので内容理解のため複数LEDの制御とLED の発光色の変更を試してみました。
LED3つを３色で発光させます。

![led.gif](https://qiita-image-store.s3.amazonaws.com/0/192113/477fce1e-4f11-7a35-b54a-5b21bf494f35.gif)

ソースは、[github](https://github.com/gutzeit1106/AzureSphere_LED)にアップロードしてありますが、テンプレートから変更したファイルは次の２つです。

・app_manifest.json
・main.c

app_manifest.jsonは、[アプリケーションマニフェスト](https://docs.microsoft.com/ja-jp/azure-sphere/app-development/app-manifest)と呼ばれるアプリケーションで必要なリソースを定義するファイルです。
使用するLEDはGPIOで定義されています。8,9,10がLEDで、12はButton Aを意味します。番号とリソースの対応は、mt3620_rdb.hを見るとわかると思います。

```
"Gpio": [ 8, 9, 10, 12 ],
```
新たにLEDを使用するため次のように定義を変更しています。

```
"Gpio": [ 8, 9, 10, 12, 15, 16, 17, 18, 19, 20 ],
```
あとは、主にmain.cのInitPeripheralsAndHandlersメソッドなどで、他のLEDに対する処理を追記しています。

#参考サイト
[Azure Sphere のドキュメント](https://docs.microsoft.com/ja-jp/azure-sphere/)