以前作成したmicro:bitをインターネットに接続する方法は、PCを介したものでした。この方法ですと、常にPCでプログラムを稼働させておく必要があります。micro:bitを直接Wifiにつなぐための方法を探りましたが、すでに販売していない部品を取り扱ったりするものの紹介が多かったので、今回はPCをM5stampというマイコンに置き換えて、IoTゲートウエイを作ることに挑戦します。イメージは図の通りです。
M5Stampとは
M5Stampは、2.4GHzのWi-Fiを搭載した切手サイズの小さなコンピュータです。今回はスイッチサイエンスさんから入手しました。M5Stampといっても、PICO・C3U・C3というラインナップがあり、今回はPICOを使いました。最も安く小型だったからです。開発は、パソコンでプログラミングを行い、そのプログラムをM5Stampに流し込むという手順をとるのですが、このPICOは最小限の構成のため、パソコンとつなげるUSBポートがついていません。そこで、プログラムを書き込むためには別途、ダウンローダーが必要です。M5Stamp Pico DIY Kitという製品を購入するとダウンローダがついています。私も初めはこれを購入し、その後の開発はPICOだけを購入するという形をとりました。
M5Stampのプログラミング環境を整える
M5Stampのプログラミングは、UIFlowを使ったグラフィカルプログラミングのほか、Arduino、MicroPython、ESP32-IDFが可能です。ジャンパワイヤーとを接続したプログラミング作例があったArduinoを採用することにします。まず、ArduinoIDEのインストールを行います。(ArduinoIDEのインストールは多くのサイトで紹介されているので、そちらをご覧ください。)
ArduinoIDEのインストールが終わると、ArduinoIDEでM5Stampがプログラミングできる環境を作ります。File→Preferences→Additional boards manager URLsまで進み、「https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json」を追加します。
Tools→Boards managerでm5stackを検索しましょう。「M5Stack by M5 Stack official」を選択します。versionは2.0.2程度を選択 あまり新しすぎるとインストールできないことがあるので注意です。
Library manager でSTAMP-PICOを検索し 「STAMP-PICO by M5Stack」を選択します。こちらも、あまり新しすぎるとインストールできないことがあるので、versionは0.0.1を選択しました。
Tools→board から「STAMP-PICO」を選択します。
portは「COM●」を選択します。●の部分の調べ方は依然ご紹介しましたのでこちらを参考にして下さい。
M5Stampとmcro:bitの接続
ジャンパーワイヤーで次のように接続しました。
micro:bit側 | m5stamp側 |
12 | 21 |
8 | 22 |
m5Stamp側は将来の拡張性を考えて小型のブレッドボードを使いました。micro:bit側は拡張ボードを使ってジャンパーワイヤーでつなぎました。
micro:bitには、ワニグチクリップを使って、外部のセンサーなどと接続することができますが、それも幅の広い 0・1・2・3V・GND だけです。しかし、拡張ボードを使うと他の端子を使うことができます。拡張ボードは様々なものが販売されていますので、Amazonなどで購入することができます。
プログラミング
環境が整ったら、実際にプログラミングです。以下のようにプログラミングしてみました。
micro:bit
micro:bit側では、ボタンAが押されたときに、気温と明るさを取得し、コンマで区切ってシリアル通信で送信することにしました。最初だけのブロックでシリアル通信の初期設定を明示しています。
M5Stamp
M5Stamp側では、Wifiに接続し、シリアル通信から信号が送られてきたときに、送られてきたデータをパラメータとして加えて、あらかじめ指定したURLにアクセスします。動作確認としてサーバからのステータス番号をArduinoIDEのコンソール画面に表示させてみました。ちなみにシリアル通信受け取るデータは、コンマ区切りの2件のデータ(気温と明るさ)で、サーバ側では、PHPでデータを記録するプログラムを準備しました。サーバ側で用意するPHPプログラムは依然こちらの記事で紹介してます。
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#define USE_SERIAL Serial
WiFiMulti wifiMulti;
void setup() {
USE_SERIAL.begin(115200);
Serial2.begin(115200, SERIAL_8N1, 22, 21);
USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();
for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
USE_SERIAL.flush();
delay(1000);
}
wifiMulti.addAP("ルータのSSID", "Wifiルータのパスワード");
}
void loop() {
// wait for WiFi connection
if((wifiMulti.run() == WL_CONNECTED)) {
if(Serial2.available()) {
String values = Serial2.readStringUntil('\n');
values.trim();//空白文字を消す
int pos1 = values.indexOf(',');
int pos2 = values.indexOf('\n');
String value0 = values.substring(0, pos1);
String value1 = values.substring(pos1+1, pos2-(pos1+1));
int device = value0.toInt();
int level = value1.toInt();
USE_SERIAL.print(values + "\n");
USE_SERIAL.print(pos1 + "\n");
HTTPClient http;
USE_SERIAL.print("[HTTP] begin...\n");
http.begin("http://自分のWebサーバ/ファイル名.php?d=" + values); //HTTP
USE_SERIAL.print("http://自分のWebサーバ/ファイル名.php?d=" + values);
USE_SERIAL.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if(httpCode > 0) {
// HTTP header has been send and Server response header has been handled
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if(httpCode == HTTP_CODE_OK) {
String payload = http.getString();
USE_SERIAL.println(payload);
}
} else {
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
}
delay(1000);
}
micro:bit専用M5StampIoTゲートウエイの完成
ダイソーで3個100円のタッパーを購入し、IoTゲートウエイとして仕上げました。白いアクリルボードを基盤として、ねじ穴をあけてブレッドボードとmicro:bitを固定し、配置ています。電源は、5V1AのUSBアダプターが転がっていたので、それを利用しました。