Arduino MKR WiFi 1010 + MKR IoT CarrierでIoTをする

投稿者:
MKR WiFi 1010にIoT Carrierを搭載した様子
電池は18650電池の他1024mAh以上の容量を持つLiPo電池が対応している

Arduino MKR WiFi 1010はSAMD21の他にWi-Fiモジュールが搭載されたArduinoです。既存のSAMD21(Arduino Nanoなど)を採用したマイコンと同じように使用できます。Wi-Fiに接続できることによりAWSやAzure、Arduino Cloudなどへ単体で接続することができるようになりました。また本体にバッテリー充放電ICを搭載しているので、単体でLion電池を使用することができます。

バッテリーの充電には1C充電(一時間で完全充電できる電流)が必要ですので使用する際は容量が1024mAh以上のものを使用するようにしてください。

MKR IoT Carrierは各種センサー(IMU、タッチセンサ、気圧、湿度、温度、光、色、接近センサ、ジェスチャー)、駆動系(RGBディスプレイ、ブザー、リレー(2個)、RGB LED)が接続されているためセンサーを使ったプログラミング学習に最適です。そのほかに18650電池ホルダーとコネクタがあるためMKRボードのバッテリーコネクタに接続してバッテリー駆動させることができます。
18650電池の他、MKRボードに対応したLiPo電池を接続することでも使用できます。

さらに、MKR WiFi 1010などの外部ネットワークに接続することができるモジュールを使うことでセンサー情報をクラウドへ転送、そのまま機械学習にもデータサンプリングにも使用できます。

今回は簡単に Arduino MKR WiFi 1010 + MKR IoT Carrier + Arduino Cloudでクラウド上で遠隔地の温度、湿度を取得してみたいと思います。

使用するライブラリをインストールする。

今回使用するライブラリを一覧で以下に示します

以下のライブラリをインストールしておくことをお勧めします。

  • Arduino_MKRIoTCarrier
  • WiFiNINA
  • Adafruit GFX Library
  • Adafruit SleepyDog Library
  • Adafruit ST7735 and ST7789 Library
  • ArduinoCloudThing
  • ArduinoIoTCloud
  • ArduinoIoTCloudBearSSL
  • ArduinoMqttClient

MKR IoT Carrierで温度を取得する。

MKR IoT Carrierで温度情報を取得してみたいと思います。温度情報を取得するためには

#include <Arduino_MKRIoTCarrier.h>
MKRIoTCarrier carrier;

setup()
{
     //これがないとボード上の情報を取得できない。
     carrier.begin();
}

loop()
{
     //温度を取得する
     float temp = carrier.Env.readTemperature();
    //湿度を取得する
     float humi = carrier.Env.readHumidity();
}

以上のコードで温度、湿度を取得できます。その他のセンサー値やディスプレイの表示方法は付属のサンプルコードがあるので参考にして見てください。

MKR WiFi 1010をWi-FiにつないでArduino Cloudに接続させる。

Arduino Cloud IoTの下準備

まず下準備にArduino Cloudに登録します。(左上の"SIGN IN"からアカウントをサインイン or 登録)

その後、IoT Cloudに接続します。

左斜め上の"SIGN IN"を押してアカウント登録をする。
アカウントを登録したらその横の”ミートボール弁当メニュー”(メニューボタン)を押してIoT Cloudに接続します。

そしてIoT Cloudの画面から”Devices”タブから”ADD DEVICE”ボタンで接続するデバイスを追加します。

この時にArduino Create Agentがインストールされていないとデバイスが認識されないのでダウンロード、インストールします。

Create Angetはブラウザ上で書きコンパイルしたプログラムを自身の手元にあるArduinoに書きこむためのものです。

うまくいくとこのようにデバイスが表示される。

インストールとデバイスの接続が完了するとこのように表示されます。これで接続の下準備が終わりました。

ここからは送信する変数についての設定を行います。

先に温度を送信する設定を行います。その他湿度や電池電圧などの設定は割愛しますがやり方は同じです。

"ADD VARIABLE"から、変数名を”temperature”へ

アップデートポリシーを”一定期間(Periodically)”に変更し、SAVEを押して変更を保存します。

Arduino MKR WiFi 1010にWi-Fiの設定をする。

"SET UP"タブから”Network”タブからネットワークに接続します。 ネットワークにはSSIDとパスワードを使用して接続します。

これで一連の設定が終わりました。これからコードを書きましょう

Arduino MKR WiFi 1010のファームウェア更新を行う。

MKR WiFi 1010ではNINA WiFiモジュールが使われており、このモジュールの更新を行う必要があります。

「ファイル」>「スケッチ例」>「WiFiNINA」>「Tools」>「CheckFirmwareVersion」を書き込み、シリアルモニタでバージョンを確認します。(執筆段階(21/9/15)では1.4.8)

最新でない場合は更新をするために

「ファイル」>「スケッチ例」>「WiFiNINA」>「Tools」>「FirmwareUpdater」 を書き込み、その後「ツール」>「WiFi101/WiFiNINA Firmware Updater」を起動してファームウェアを更新します。

実際にプログラムを書いてみる。

現在はweb上でプログラムを書き、Create Agent経由でボードにアップロードする流れがあります。筆者の環境ではWiFiNINAのバージョンが低いと言われアップロードできなかったためクライアント版のArduinoIDEで書きこみます。

クライアント版のIDEで書きこむ都合上、スケッチをダウンロードする必要があります。そこで、

「Open full editor」でweb版のエディタを呼び出してスケッチをダウンロードします。

スケッチをダウンロード

その後ダウンロードしたスケッチを「ArduinoIDE」で開きます。

これで大方準備は完了です。実際にコードを書いてみましょう

以下はプログラム例です。温度の他にバッテリー電圧とバッテリー残量を送信しています。

#include "arduino_secrets.h"
#include "thingProperties.h"
#include <Arduino_MKRIoTCarrier.h>
MKRIoTCarrier carrier;

void setup() {
  Serial.begin(9600);
  initProperties();
  //ArduinoCloudへ接続
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  //ログレベルの設定(最大4)
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  //キャリアボードへの接続
  carrier.begin();
}

void loop() {
  //バッテリ電圧の取得
  batteryVoltage = analogRead(ADC_BATTERY) * 3.3f / 1023.0f / 1.2f * (1.2f+0.33f);
  //バッテリ容量の計算
  battery = (batteryVoltage - 2.8f) / (4.208f - 2.8f) * 100; //for battery available in %
  // 温度取得
  temperature = carrier.Env.readTemperature();
  //湿度取得
  float hum = carrier.Env.readHumidity();
  //デバック用出力
  Serial.print("temperature} = ");
  Serial.print(temperature);
  Serial.print(",   Battery Voltage = ");
  Serial.print(batteryVoltage);
  Serial.print(",   battery = ");
  Serial.println(battery);
  //値の更新
  ArduinoCloud.update();
  delay(500);
}

これで値の送信が行えるようになりました。ただ送信を行えるだけでは面白くないのでweb画面で表示させてみましょう

IoT Cloudの画面から「DashBoards」でダッシュボード画面を出します

また、「BUILD DASHBOARD」を押して新規ダッシュボードを追加します

その後編集モードへ移行し、「ADD」ボタンを押して「Gauge」ウィジェットを追加します。

表示名は「温度」として「LINK Variable」で変数を紐づけます

名前を変更して使用するThingsの変数を紐づける

紐づけが成功したら下に示す画像のように温度が随時更新されていることがわかるかと思います。

温度が更新されて表示されている。そのほかにもLiPo電池電圧と、簡易だが容量を示せるようしてみた

温度湿度、電池残量の設定だけでしたがIoT Carrierのセンサーにはほかに色センサ、照度センサ、IMUなどが搭載されているためいろいろな環境上情報を取得したり、クラウド上から搭載されているLEDを操ったりすることができます。