Arduino MKR WiFi 1010 と Arduino IoT Cloudを使ってAlexa対応デバイスをつくる

#はじめに
日本でもArduino MKR WiFi 1010を購入することができるようになったので早速購入してみました。
このデバイスの特徴はArduino IoT Cloudとの親和性が高いこと。
そしてこのArduino Cloudが最近機能updateをして色々できるようになりました。

参考：[Arduino、クラウド開発環境「Arduino Cloud」の機能や特徴を紹介](https://fabcross.jp/news/2021/20210714_arduino_cloud.html)
この記事にもあるように、Alexa連携ができるようになりました。

デバイスも買ったし、これは試してみたい!
ということで試してみました
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Arduino MKR WiFi 1010を使ってAlexa連携をやってみました！<br><br>公式にサポートされたArduino cloud IoTを使ったら簡単に実現できました😊<br><br>調査必須ですが、Arduinoデバイスをセンサーとして認識させることもできるようなので、オリジナルセンサーによる定型アクションも実現できそう👍 <a href="https://t.co/XKnrBFVeaR">pic.twitter.com/XKnrBFVeaR</a></p>&mdash; norippy@車 x IoT研究中 (@Norio_Delux) <a href="https://twitter.com/Norio_Delux/status/1426589942805712901?ref_src=twsrc%5Etfw">August 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この記事では、Arduino IoT Cloudを使ってArduino MKR WiFi 1010をAlexa対応したモーションセンサーや照明にする手順を紹介します。


#Alexa連携でできること
少し余談ですがこのIoT Cloudを使えばArduinoデバイスを

- フルカラー照明
- 単色照明 (明るさ調整可能)
- ON/OFF 照明
- スマートプラグ
- モーションセンサー
- ドアセンサー
- テレビ
- 温度計

といったデバイスとしてAlexaに認識させることができるようになります。
二年ほど前にEspalexaというArduinoライブラリを使い、[ESP32をAlexa連携デバイスにする](https://qiita.com/norippy_i/items/d8456e3c84432e279754)ということをやってみましたが、その時よりもできることが多いです。特に**センサーとして認識させることができる**事は大きいです。それでは、実際にやってみましょう。

#1.Arduino Cloudにデバイスを登録
このAlexa連携をするにはArduino Cloudに登録をする必要があります。
そしてこのArduino Cloudで自身のデバイスを登録することで自分のAlexaとArduinoを連携させます。
簡単ではありますが、手順をまとめます

## 1-1. Arduino Cloudのアカウントを作成
まずは[Arduino Cloud](https://store.arduino.cc/digital/create)でアカウントを作ります。
スクロールしていくと、Planの選択があるので、**Free**で GET STARTEDしましょう。
このAlexa連携はフリープランでもできます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/87236657-e5ed-0e41-e0a5-ca95dbde770c.png)

諸々の登録が完了するとサインインができるようになります
![スクリーンショット 2021-08-15 17.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/5ccd518a-c0e1-55b6-7bbb-32404ea8def2.png)

## 1-2. Arduinoデバイスを登録
Arduino MKR WiFI 1010をUSBを介してPCと接続します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/2c0d06d4-a582-c98a-4b27-7a6ce5afb24e.jpeg" width="500">

USBで接続をしたとき、5Vのピンソケット横のLEDがオレンジに点灯（もわもわしながら）していることを確認してください。
これが点灯していないと、USBとして認識されませんでした。
もし点灯していない場合は**RSTスイッチを2回押してください**
ダブルクリックする感じです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/9f9d96b3-71f5-c57b-845f-46b25b03cef4.jpeg" width="400">

デバイスの準備ができたらArduino Cloudに移ります。
[Arduino Cloud Thingsのセットアップページ](https://create.arduino.cc/iot/things)
既にデバイス登録がされている場合であればデバイスリストが表示されますが、何も登録されていなければこの画面が表示されます。
先ずはDevieの項目の赤丸で囲ったボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/b0d28e90-0225-42f1-7f8e-231019646cad.png" width="600">

次にデバイスの種類を選びます。今回はArduinoデバイスを登録するので、左側を選択します。ちなみに3rd Party deviceはどういったものがあるかというと、ESP32などがこちらにあたります。試してないのでDevkitを接続したらできるのかどうかは不明です。
![スクリーンショット 2021-08-15 17.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/611083a0-af2c-079f-e2d8-e6b73400fd5d.png)

するとブラウザからデバイスを探しに行きます。デバイスが見つかれば自動的に登録プロセスが進みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/f232a6f9-7dc0-a70f-4fd6-cf98c86b201b.png" width="300"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/894f2fc8-7e27-afcb-5c42-d1cecb84ff50.png" width="300">

画像はありませんが、途中でデバイスが見つかると名前を決めるように言われます。正直alexa連携には関係ないので、お好きな名前をつけて登録を行ってください。
デバイス登録が完了すると、こんな感じでデバイスが見えるようになります。
また、その下にあるNetworkの項目から自宅のWiFiの設定を入力してください。一応2.4GHz帯で登録しました。
![スクリーンショット 2021-08-15 18.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/3b3d4413-eb5a-8fac-e0dc-69d934c6afdc.png)

# 2. Alexa連携の準備
デバイスの登録ができたらAlexa連携を行なっていきます。ここでは、フルカラー照明、モーションセンサーの２種類のデバイスの実現方法を紹介します。

## 2-1. Variablesを追加する
デバイスが登録できたら、Variablesを追加します。
![スクリーンショット 2021-08-15 18.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/18d5a0e9-36b1-7553-cbcc-101206e714e8.png)
Variablesは何かというと、**このデバイスをどんなデバイスとして扱うか** を明示する設定のようです。
たとえば、ON/OFF照明として振る舞うように設定したら、クラウド経由でON,OFFが取れるようになるというわけです。
細かいことは分かりませんが、この設定をすることでAlexa側にもArduinoがどんなデバイスとして見えるかの設定をしているものと思われます。

早速"ADD VARIABLE"をクリックしてみましょう。

クリックすると、早速設定ウインドウが表示されます。ここでは、

1. Nameの入力
2. variable typeの選択

を行います。Nameはプログラム上でハンドラーの名前や、Alexaから見えるデバイスの名称になるため、わかりやすい名前にしましょう。
そしてvariable typeを選択するときに、Alexa compatibleのフィルタにチェックを入れてください。フィルタをかけた後に見つかる"Colored Light"を選択します。


 ![スクリーンショット 2021-08-15 18.22.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/17fbf395-48d5-7b7b-5469-2f0cfcd00dd0.png)![スクリーンショット 2021-08-15 18.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/256a2b2b-bf02-3316-5dcc-d8970c83cc99.png)

ちなみにVariablesは一つである必要はありません。複数も可能です。
続けてモーションセンサーを登録しましょう。

![スクリーンショット 2021-08-15 18.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/d0e7e4db-393f-dc83-8aa2-bf7e19b8c3b7.png)

モーションセンサーにおけるNameですが、Alexaから見えるデバイス名というだけではなく、実はこのNameが変数としてArduino上で扱われます。センサーであればこのNameと同じ名称の変数にパラメータを追加することで、Alexa側がそのパラメータを読むことができるようになります。

ちなみに、variable permissionの項目はどういう意味かというと、Alexaなどの外部デバイスから見た時のRead,Writeという意味で項目が書かれているようです。
そのため、Readというのは外部から変数が読めるという意味になり、Writeはデバイスに対して変数の書き換えが行える事を意味しています。

## 2-2. コードを書く
Alexaから命令が来たら、Arduino MKR WiFi 1010に実装されているフルカラーLEDが点灯する、そしてタクトスイッチを押すとAlexaアプリでセンサーが検知できるようにします。

IoT Cloudのページを見るとSetupタブを選択し、設定をしてきたとがわかると思います。
そして、Setupの隣にSketchタブが。ここを選択してコードを書き換えてもOKですが、**今まで設定してきたことがどのようにスケッチに反映されているか実はわかりません。**

![スクリーンショット 2021-08-15 18.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/8f789378-3aa5-5bf0-9fc1-1d816352298f.png)

そこで、プログラムを理解するために、Web Editorに切り替えます。
右上のアカウントの隣にあるメニューからWeb Editorを選択します。
![スクリーンショット 2021-08-15 18.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/d7e2c425-94dc-10bf-d4dd-22ec1f0d9910.png)

web editorに移ったら、variablesの設定が反映されていることを確認しましょう。
タブに**"thingProperties.h"**というファイルがあると思います。
こちらを選択します。すると、以下のようなソースコードになっているはずです。
解説はソースコードのコメントをご覧ください

```thingsProperties.h
// Code generated by Arduino IoT Cloud, DO NOT EDIT.

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>


const char THING_ID[] = "********-****-****-****-************"; //自動的に発行されるthingsID。デバイスごとに異なる。

const char SSID[]     = SECRET_SSID;    // Network SSID (name) これはsetupで記載されたSSID
const char PASS[]     = SECRET_PASS;    // Network password (use for WPA, or use as key for WEP)setupで記載されたPASS
//ちなみに、web editorで見ると、Secretの項目が存在するので、ここから書き換えてもOK

void onColorLightChange();

CloudMotionSensor motionSensor; //先程設定したnameでCloudMotionSensorのClassが作られている
CloudColoredLight colorLight; //先程設定したnameでCloudColoredLightのClassが作られている

//メインのinoファイルにあるinitPropertiesの中身
void initProperties(){

  ArduinoCloud.setThingId(THING_ID);//このIDで管理されたデバイスと通信することを明示
  ArduinoCloud.addProperty(motionSensor, READ, ON_CHANGE, NULL);
//motionSensorという名前のclassを使い、READしかしない。値に変更があったときに情報が送られる。そのときに呼ばれるハンドラーは設定しない
  ArduinoCloud.addProperty(colorLight, READWRITE, ON_CHANGE, onColorLightChange);
//colorLightというclassを使い、READ,WRITEする。変更があったときに動き、ハンドラーとしてonColorLightChangeが呼ばれる。
}

WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);
```

先程の設定が選択するだけでスケッチに自動的に反映されていることがわかります。とても楽ですね。

それでは実際にフルカラーLEDを動かす、センサーとして動かすコードを書きます。
公式のサンプルでは別売のLEDハットを光らせるというのをやっていたのですが、[Arduinoに実装されているLEDを光らせる](https://docs.arduino.cc/tutorials/mkr-wifi-1010/built-in-rgb)事にしました
説明はソースコードのコメントを確認ください。コードは端折っていないので、このままコピペしてもらえれば動きます。

```control_sample.c
#include "thingProperties.h"
#include <WiFiNINA.h>  //Arduinoに実装されているLEDを光らせるために必要なライブラリ
#include <utility/wifi_drv.h>

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);

  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();

  //ピン設定
  WiFiDrv::pinMode(25, OUTPUT);//フルカラーLEDのR
  WiFiDrv::pinMode(26, OUTPUT);//フルカラーLEDのG
  WiFiDrv::pinMode(27, OUTPUT);//フルカラーLEDのB
  
  pinMode(10,INPUT_PULLUP);//今回は別でON,OFFスイッチを用意。
  

}

void loop() {
  ArduinoCloud.update();//メインループでcloudが更新される
  // Your code here

  //センサーの値を入力する
  motionSensor = !digitalRead(10); //pull upしているので、反転した値を書き込む
  //変化があったとき、自動的にCloudに送られる
}


//Alexaから色を変更する情報が送られてきたときに呼ばれる
void onColorLightChange() {
  uint8_t r, g, b;
  colorLight.getValue().getRGB(r, g, b);//alexaから送られてきた変数を読み込む。
  //公式サンプルをそのまま利用しているので確認はできていないが、別でbrightnessだけを取得することもできるはずです

  if (colorLight.getSwitch()) {//照明がONなら呼ばれる
    Serial.println("R:" + String(r) + " G:" + String(g) + " B:" + String(b));
    Serial.println("Brightness: " + String(colorLight.getBrightness())); //参考までに明るさも取得。値はfloat型
    WiFiDrv::analogWrite(25, r);
    WiFiDrv::analogWrite(26, g);
    WiFiDrv::analogWrite(27, b);
  }else{//照明がOFFなら呼ばれる
    WiFiDrv::analogWrite(25, 0);
    WiFiDrv::analogWrite(26, 0);
    WiFiDrv::analogWrite(27, 0);
  }
}
```

ソースコードはこれだけです。結構簡単ですね。モーションセンサーは特にシンプルですね。メインループで一行書くだけでOKです。

## 2-3. デバイスに書き込む
コードが書けたら書き込みをします。これでArduinoデバイスがAlexaから見えるようになります。Arduino側の設定はこれで完了。
![スクリーンショット 2021-08-15 19.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/b596137f-b217-e98b-66b9-a0b4ad706f4b.png)

モーションセンサーの代わりになるスイッチもこんな感じで実装しました
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/35619944-7edd-e9a4-f117-e0848b473b61.jpeg" width="500">

#3. AlexaアプリでArduinoデバイスを検出する
Arduino側の設定は終わったので、Alexa側の設定を行います。今回はAlexaアプリを利用して登録作業を行いました。

## 3-1. Alexaスキル"Arduino"を有効にする
Alexaスキルのストアで"Arduino"と入力すると、Arduinoスキルが出てきます。このスキルを有効にします。
有効にするとアカウントリンクのページが表示されるので、Arduio Cloudの自身のアカウントを入力してください。
入力が完了したら終わりです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/45988a85-75ac-9e63-79c7-e8db297b0fa1.png" width="300"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/d4ba05a6-2eac-f6ed-1cf7-2f14aa700139.png" width="300">

## 3-2. デバイスの検出をする
有効にすると、引き続きデバイスの検出がおこわなれます。既にArduinoが起動していればこの検出でデバイスが見つかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/86ced841-7efa-878c-3553-5d768302b02c.png" width="300"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/9c20e07d-6cf8-5fed-1f2c-71fbeb7cf985.png" width="300"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/a9cb8db2-b4eb-210b-244b-e64911473bfd.png" width="300">

## 3-3. AlexaアプリやAlexaデバイスでArduinoを動かしてみる。
Alexaアプリで照明を操作すると、Arduinoのシリアル通信でも変化を確認、またLEDの色が変わることを確認できると思います。
ちなみに、このデバイスの名前はAlexaアプリ上で変更ができます。変更しないと音声で命令を送れないので、"アルディーノ"などの名前に変更することをお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/d301127c-347c-a057-efdc-7a393a05d086.png)
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324560/ebd59a40-8b7a-1e22-3049-6e681b36bf69.jpeg" width="200">


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Arduino MKR WiFi のArduino IoT Cloudを使ったAlexa連携ですが、ArduinoデバイスをAlexaにセンサーとして認識させる事ができました👍<br><br>モーションセンサーと言いながらタクトスイッチのON/OFFで動いています。<br><br>ちなみに、定型アクションには非対応…アップデート期待です！ <a href="https://t.co/cI512FMpWz">pic.twitter.com/cI512FMpWz</a></p>&mdash; norippy@車 x IoT研究中 (@Norio_Delux) <a href="https://twitter.com/Norio_Delux/status/1426812951118241797?ref_src=twsrc%5Etfw">August 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


もちろんセンサーもこんな感じで動きます。
アプリは少し表示の更新が遅いようです(表示だけの問題で、反応自体はすごく早いはず)。
ただ、残念な事に**まだ定型アクションとして利用できません！！**そのため、センサーデバイスにしても今のところ活躍の場はなさそうです・・・

#まとめ
Arduino MKR WIFI 1010とArduino Cloudを使ってAlexa連携デバイスを作ってみました。
正直驚くほど簡単に実装ができました。まだコードはどんな関数があるのかドキュメントがないため、ヘッダファイルを読む形になるので少しハードルは高いかもしれませんが、今回紹介したコードでもいろいろ出来るかと思います。
Arduino MKRを購入したら、Alexa連携ぜひトライしてみてください！