IoTシステムの概要を知り、実際にデバイスを動かしてみよう

プログラムのコンパイル
今回、M5Stackに書き込むプログラム(M5Stack-PIR Motion Sensor読み取りプログラム)をこちらにアップロードしましたので、ダウンロードしてください。
ダウンロードが完了したらZipファイルを解凍し、M5StackCheckPoint.inoをArduino IDEで起動してください。
Arduino IDEが起動したら、一度プログラムを検証してみましょう。画面左上の「検証」をクリックします。
M5Stackにプログラムを書き込む
M5Stackにプログラムを書き込むため、M5StackとPCをUSBケーブルで接続します。次に「マイコンボードに書き込む」をクリックして、プログラムをM5Stackに書き込みます。
もし、書き込み時にエラーが表示される場合は、以下をご確認ください。
- USBケーブルはしっかり接続できているか
- 「ツール」→「シリアルポート」で選択されているシリアルポートはM5Stackと接続しているポートか
- 「ツール」→「ボード」で「M5Stack-Core-ESP32」を選択しているか
- 「ツール」→「Upload Speed」で「921600」を選択しているか
動作確認
書き込みが完了したら、M5Stackの電源をONします。USB type-cケーブルを接続すると自動的に電源がONになります。電源がONにならない場合は電源ボタンを1回押してみてください。人感センサーの目の前で人が動くと、LCDディスプレイに「Hello!」と表示されるはずです。
プログラムの解説
今回準備したプログラムは2つのソースコードから構成されています。言語はArduino言語と呼ばれる、C/C++と類似した言語を使用します。C/C++と聞くと身構える人が多いかも知れませんが、Arduinoの各種ライブラリを活用することで、そこまで難しいコーディングをする必要がないことがわかると思います。
M5StackCheckPoint.ino
Arduino言語で書かれたソースコードのうち、setup()とloop()は特殊な関数です。setup()は電源ON後に1度だけ呼ばれる、その名の通りセットアップ用の関数です。この関数でLCD初期化(setupLcd())を呼び出しています。
loop()はsetup()完了後に電源ONしている間繰り返し呼ばれる関数です。人感センサーの値を読み出し、前回から値が変化した場合のみLCDの表示を切り替えています。
現時点では、Wi-Fi接続(setupWifi())やMQTT接続(setupMqtt())、人感センサーの値送信(sendDetected())はコメントアウトしています。クラウドアプリケーションの構築が完了したら有効化します(次回で解説します)。
#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "Free_Fonts.h"
#include "secret.h"
#define PIR_MOTION_SENSOR 36
#define CLIENT_ID "1"
static WiFiClientSecure httpsClient;
static PubSubClient mqttClient(httpsClient);
static int detected = 0;
// Wi-Fi接続する
void setupWifi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
M5.Lcd.print(".");
delay(1000);
}
}
// MQTT接続する
void setupMqtt() {
httpsClient.setCACert(ROOT_CA);
httpsClient.setCertificate(CERTIFICATE);
httpsClient.setPrivateKey(PRIVATE_KEY);
mqttClient.setServer(CLOUD_ENDPOINT, CLOUD_PORT);
while (!mqttClient.connected()) {
if (!(mqttClient.connect(CLIENT_ID))) {
delay(1000);
}
}
}
// LCDを初期化する
void setupLcd() {
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.setTextDatum(MC_DATUM);
M5.Lcd.setFreeFont(FF44);
}
// 検知状態を送信する
void sendDetected(int detected) {
// 検知状態をJSON化する
char message[64] = {0};
sprintf(message, "{\"detected\": %d}", detected);
// JSONを送信する
while(!(mqttClient.publish(CLOUD_TOPIC, message))) {
// 送信失敗した場合は再接続してリトライする
mqttClient.disconnect();
while (!mqttClient.connected()) {
if (!(mqttClient.connect(CLIENT_ID))) {
M5.Lcd.print("#");
delay(1000);
}
}
}
}
void setup() {
M5.begin();
M5.Power.begin();
// setupWifi(); TODO: Secret.hを編集する必要がある
// setupMqtt(); TODO: Secret.hを編集する必要がある
setupLcd();
pinMode(PIR_MOTION_SENSOR, INPUT);
}
void loop() {
// 検知状態を読み出し
int ret = digitalRead(PIR_MOTION_SENSOR);
if (ret != detected) {
// 検知状態が変化した場合
detected = ret;
if (detected) {
// 検知したとき: Hello!と表示しクラウドへ送信
M5.Lcd.fillScreen(TFT_BLUE);
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLUE);
M5.Lcd.drawString("Hello!", 160, 120, GFXFF);
} else {
// 検知していないとき
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
M5.Lcd.drawString("....", 160, 120, GFXFF);
}
// sendDetected(detected); TODO: Secret.hを編集する必要がある
delay(1000);
}
}
Secret.h
Wi-Fi、MQTT接続に関連する秘匿情報をまとめたヘッダファイルです。次回のクラウドアプリケーションを構築後にデータ送信を有効化するタイミングで、各項目を記載ください。
// WiFiのSSID, PASSWORDを入力 #define WIFI_SSID "xxxxxxxx" #define WIFI_PASSWORD "xxxxxxxx" // AWS IoT Coreのエンドポイントを確認し入力 #define CLOUD_ENDPOINT "xxxxxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com" #define CLOUD_PORT 8883 #define CLOUD_TOPIC "/check_point" // AWS IoT Coreで発行した証明書の内容を入力 #define ROOT_CA "-----BEGIN CERTIFICATE-----\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "-----END CERTIFICATE-----\n" #define CERTIFICATE "-----BEGIN CERTIFICATE-----\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "-----END CERTIFICATE-----\n" #define PRIVATE_KEY "-----BEGIN RSA PRIVATE KEY-----\n"\ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"\ "-----END RSA PRIVATE KEY-----\n"\
おわりに
今回は、IoTシステムの概要および、M5Stackとセンサーの接続、M5Stackへのプログラムの書き込み手順を解説しました。無事にデバイスが動作すると、開発へのモチベーションも高まったのではないでしょうか。
しかし、これだけではまだ「IoT」とは呼べません。モノ(M5Stack)がインターネットに繋がっていないためです。次回はクラウド上にアプリケーションを構築した上で、M5Stackからデータを送信できるようプログラムを修正していきます。
次回もお楽しみに!







