IoTアダプタ「Cactusphere」超入門体験ハンズオン

# IoTアダプタ「Cactusphere」超入門体験ハンズオン

## 背景・目的・読み手

　この書き物は備忘録としてハンズオンの内容についてまとめたもの。読み手は自分とこれからIoTについて調べようとしている層・Cactusphereに興味があるが全く知らない層など。

- Cactusphere概要
- ハンズオンまでの流れ


## Cactusphereとは？
　一言で言うと色々なセンサーに対応したDX向け後付アダプタ。

- 様々なセンサーに合わせたモデルが出ているため、後付で設置可能
- 1個から購入可能
- Azure Sphere対応チップ搭載でAzureとの親和性がある
- センサーの信号を有線・無線LAN経由でAzureに流してダッシュボードによる可視化・信号をトリガーにしたジョブ実行が可能
- ハンズオン時点では、以下モデルが販売中。
    - DI：接点入力モデル（人感センサー・スイッチなど）
    - Serial：RS485モデル（測定器など）
- 接点入力モデルでは、以下入力のデータ取得が可能
    - パルスカウント（接点の入力回数）
    - エッジ（ON/OFFの変化）
    - ポーリング（定期確認）

　1台から買えるのとAzure Sphereとの対応の良さから、PoCやり易そうなのが個人的には良いと感じている。


## Cactusphereセットアップの流れ

　以下のような流れになる（今回のハンズオンでは2のみ実施）

1. Azure Sphere Security Service (AS3)へデバイスの紐付け
2. ネットワーク設定
3. IoT Central設定
4. デバイスの登録
5. IoT Central接続情報入手
6. ファームウェア修正
7. AS3でファームウェアに署名
8. ファームウェアの書き込み


## ハンズオン環境事前準備

 以下をハンズオン前に事前に設定

- USBケーブル（タイプA）が接続可能なPC (Windows 10 Anniversary Update(ver.1607)以降)
    - 普段からiBookしか使っていないなどなければ、特に準備しなくても既にありそう
    - winverコマンドで念のため確認しておくとよい
- [FTDIドライバ] (https://www.ftdichip.com/Drivers/VCP.htm)
    - 上記リンクから導入。詳しい手順は[FTDIのUSBシリアル変換器のドライバのインストール法\(1\) \- しなぷすのハード製作記](https://synapse.kyoto/tips/FTDI_driver/page001.html)が分かりやすい
- [Azure Sphere SDK](https://aka.ms/AzureSphereSDKDownload)
    - ダウンロードして実行するだけなのでそこまで難しくない
    - インストール後、スタートメニューから「Azure Sphere Developer Command Prompt」が起動できることを確認
- 無線LAN(IEEE 802.11 b/g/n)でインターネットに接続可能な環境
    - Cactusphereの無線LAN設定にSSIDとWPA/WPA2キーを使用するため、事前にメモっておくとよい


## Cactusphereとセンサーの組み立て

　今回のハンズオンで一番手を動かした場所。いろいろ詰まったのでそのあたりも記載。

### センサーの取り付け

　どう取り付けるとOKなのか分からない状態だったので、説明聞きながら手探りで対応。
「取り付けて軽く引っ張っても抜けない状態」になればセンサーの信号を拾う模様。はんだ付けや、カチッと鳴るまで差し込むなどしなくても信号拾えるのは楽でいいかも。
 取り付け方は以下のような感じ。

１．初期状態
　以下のように金属板が上に上がった状態。この状態でケーブルを入れてねじを緩めるのではないことに注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/083d8d8b-e604-759b-b267-c1ccee786301.png)

２．ねじを緩め、できた上の隙間にセンサーのケーブルを突っ込む
　ねじを緩めると、１．で確認した金属板が徐々に降りてきて、上部に隙間ができる。この出来た隙間（赤枠で囲った個所）にケーブルを通す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/3f234292-1e40-c7d6-438f-023e4d75b240.png)


３．ねじを締める
　ゆっくりとねじを締め、手ごたえがあったあたりでやめる。軽く引っ張って取れなければOK

　注意事項としては、ねじを緩めすぎると金属板がストンと下に落ちてねじが取れてしまい、その状態からはいくら締めようとしても締められない。この場合はCactusphereを逆さにして金属板をねじで止められるようにしてからねじを締め始めるとよい。
　以下、緩めすぎた状態。ここからはねじを締めようとしても締まらなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/12045e75-366d-2b6c-4e9a-d13d8c5806ae.png)
　ハンズオン中は、ケーブルを突っ込んでから、ねじを緩めると金属板が下りてきてケーブルが固定されるものと思っていたので、思いっきりねじを緩めてしまい上記の状態に。結果上手くケーブルが固定できずD3を利用することになった。


## Azure Sphere SDKを利用したデバイス接続設定

　CactusphereとPCをUSB接続した状態でAzure Sphere SDKを起動し、接続確認やAzure Shereとの連携を行う。

### デバイスの認識

　デバイスが正常に認識できていることを確認。次のようにコマンドが返ってくればOK。

```
> azsphere device show-attached
Device ID: 86369******************************************** 
IP address: 192.***.**.*
Connection path: 113
```

### テナントへのログイン

　コマンド入力後、**何かキー入力をしないとログイン画面が表示されないことに注意。**

```
> azsphere login
Press any key to log in with your Azure Sphere account.
If you are unable to login, you may need to register using 'azsphere login --newuser <Microsoft account ID>' even if you used a previous release of Azure Sphere. You can use any Microsoft personal account or work/school account.
>

※※※　ここでなにかキーを押すとログイン画面が別ウィンドウで表示。ログインできれば以下のようなメッセージが出力される 　※※※

Login successful as 'xxxxxxx@xxxxxxx.onmicrosoft.com'.
Selected Azure Sphere tenant is 'Azure Shereテナント名' (xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx).
```

### バージョン確認

```
> azsphere device show-os-version
Your device is running Azure Sphere OS version 20.09.　　　　　　←　Azure Sphere OSのバージョン

> azsphere show-version
20.07　　　　　←　SDKのバージョン
```

### 無線LAN接続

　近くのWifiの状況を確認し、接続するWifiの認証を実施。

```
※※※　近くのWifiを拾う　※※※
> azsphere device wifi scan
Scan results:

SSID                : xxxxxxxx
Security state      : psk
BSSID               : xxxxxxxx
Signal level        : -61
Frequency           : 5220

※※※　Wifi認証をする　※※※
> azsphere device wifi add --ssid <対象無線LANのSSID> --psk <対象無線LANのパスワード>
Add network succeeded:
ID                  : 0
SSID                : xxxxxxxx
Configuration state : enabled
Connection state    : unknown
Security state      : psk
Targeted scan       : False

※※※　接続確認　※※※
> azsphere device wifi show-status
SSID                : xxxxxxxx
Configuration state : enabled
Connection state    : connected　　　　　←ここがconnectedならOK
Security state      : psk
Frequency           : 2452
Mode                : station
Key management      : WPA2-PSK
WPA State           : COMPLETED
IP Address          : 192.xxx.x.xx
MAC Address         : xx:xx:xx:xx:xx:xx
```

　うまくデバイスがWifi接続できない場合は```azsphere device wifi add -t```すると良いようです。（ステルスのアクセスポイントに接続するためのオプションだが、これ付けると途中で切れるといった事象が改善されるときがある、とのこと）


　無事IoT Centralに接続できると緑のステータスLEDが点滅から点灯になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/5127090c-6a15-9821-75bf-75139bc50fde.png)

　Azure Shpereからもこのように接続が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/c54e8d47-d34a-b1e0-daf8-2dc302736205.png)

　OverViewを確認すると既に設定済のため、1秒毎にデータ送信されグラフ表示がされます。生データからも確認が可能です。
※今回のハンズオンではOverViewの調子が悪かったのですが、生データからを確認し、データが届いていることは確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/a465f5c4-619a-ee28-32ab-35f84a9a6daf.png)

　ここまで来ると、フットスイッチのオンオフを拾ったり、ドアスイッチの接触回数をトラッキングすることが可能になります。


## IoT Centralの設定・コマンド確認

　Settingタブから接続されているデバイスから受ける信号の設定が可能です。この図ではDI1 PulseConter（ドアセンサー）の設定がされていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/8e16cb26-86bf-51bf-8708-e2696b51a716.png)

　コマンドタブより、カウント値のリセットも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/2e15b160-5c72-8f02-dfe3-e0d330128e15.png)
　上記コマンド発行後、カウントがリセットされていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/003ce6e6-5f6f-bc6b-e4e4-00d154d27681.png)


## 個人用ダッシュボードの作成

　こちらの手順で個人用ダッシュボードを作成することが可能です。
[Azure IoT Central の個人用ダッシュボードの作成 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-central/core/howto-create-personal-dashboards)


## デバイスからWifi設定を消す方法について

　使わなくなったCactusphereからはWifi情報を削除しておきましょう。
　```azsphere device wifi forget -i <WifiのID>``` で設定したWifi情報をリセット可能です。
　ここで入力するIDはSSIDのことではないので注意

```
※※※　対象WifiのIDを確認　※※※
> azsphere device wifi list
Network list:

ID                  : 0　　　　　　　　　　　　←　このIDをオプションの引数として利用
SSID                : xxxxxxxxxxxx
Configuration state : enabled
Connection state    : connected
Security state      : psk
Targeted scan       : False

※※※　デバイスからワイヤレス ネットワークに関する情報を削除します。　※※※
> azsphere device wifi forget -i 0
Successfully forgotten network.

※※※　削除されたことを確認　※※※
> azsphere device wifi list
No networks found.
```




## Q&A

Q：RSSI(Received Signal Strength Indicator)取れますか？
A：```azsphere device wifi scan```で確認可能

```
> azsphere device wifi scan
Scan results:

SSID                : xxxxxxxx
Security state      : psk
BSSID               : xxxxxxxx
Signal level        : -61　　　　　　　←ここ
Frequency           : 5220
```

Q：Azure Sphere<->IoT Hub双方向通信は可能？
A：可能

Q：接点入力モデルに適した、照度センサーは？
A：[M5Stack用光センサユニット](https://www.switch-science.com/catalog/4051/)というものがある。あるいは、アナログ入力を使ったほうが良いかも（今後アナログ入力対応モデルも発売予定）

Q：有線だとPoE可能だが、無線の場合の給電方法は？
A：端子台にVIN(電源入力端子)があるのでそこから入力していただくのがベーシックな使い方。USB給電は開発用途。

Q：OSやアプリのアップデートコントロールについて
A：遅延させることが可能。[SysEvent\_DeferEvent関数\-AzureSphere \| Microsoft Docs](https://docs.microsoft.com/en-us/azure-sphere/reference/applibs-reference/applibs-sysevent/function-sysevent-deferevent)など参照



## やってみたかったこと

　規則設定でパルスカウント数に応じてメールを飛ばすなど出来るみたいなので、それは試してみたかった。（お借りしたアカウントは色々と機能制限があるようで、規則の作成ができなかった）

　セットアップの今回やらなかったところも、じっくりやってみたい気はしますね。センサーの信号を拾って可視化する敷居がだいぶ下がったことはよくわかったのですが、端折られた部分がどのぐらい大変なのかも気になるところです。


## 参考URL
- [ビールおつまみ付！実機貸出【オンライン】IoTアダプタ「Cactusphere」超入門体験ハンズオン \- connpass](https://algyan.connpass.com/event/191601/#_=_)
- [価格 \- Azure Sphere \| Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/details/azure-sphere/)
- [FTDIのUSBシリアル変換器のドライバのインストール法\(1\) \- しなぷすのハード製作記](https://synapse.kyoto/tips/FTDI_driver/page001.html)
- [SysEvent\_DeferEvent関数\-AzureSphere \| Microsoft Docs](https://docs.microsoft.com/en-us/azure-sphere/reference/applibs-reference/applibs-sysevent/function-sysevent-deferevent)
- [azure\-sphere\-samples/Samples/DeferredUpdate at master · Azure/azure\-sphere\-samples · GitHub](https://github.com/Azure/azure-sphere-samples/tree/master/Samples/DeferredUpdate)
- [はじめてのAzure Sphere](https://www.slideshare.net/tkizawa/azure-sphere-128488038)