M5Stack+Ambientで懸垂回数を記録するIoTデバイスを作ってみよう
テレワークを開始してから約2ヶ月が経ちました。通勤時は自転車通勤のおかげで1日14kmほどサイクリングをできていましたが、在宅勤務の今は運動があまりできていません。
ということでメルカリで買ったのが懸垂バーです。ドアのツッパリに引っ掛けるタイプなので部屋のスペースを使わない優れものです。
使っていると、何回懸垂できているのかを計測したくなってきました。レコーディングダイエットというものが一時期流行った通り、計ることは継続につながります。ということで「懸垂自動計測機」を作ってみました。
システム構成
今回使用したデバイスは2つです。
仕組みとしては、まずは超音波センサで懸垂した時の距離を計測します。懸垂できている距離に入っていれば、1回カウントとしてM5Stack経由でクラウドに"1"を送信します。
デバイスで取得したデータはAmbientというデータの可視化クラウドに送信することにしました。
使用した2つのデバイスとAmbientについて簡単に紹介します。
M5Stack(低コストWi-Fi付マイコン)
まずはM5Stack。ESP32というカテゴリの製品で、Wi-Fi搭載・低消費電力・低コストのマイコンです。Arduinoの開発環境でプログラミングできます。値段は3575円です。
もともとはArduinoにWi-Fiモジュールを外付けして作ろうと思っていましたが、この製品を見つけて作り方を変えました。使ってみると、とっても簡単にインターネットにつながることができてステキでした。
HC-SR04(超音波センサ)
もう一つはHC-SR04。眼鏡みたいな形をした超音波センサです。距離を計測することができます。450円です。
今回は懸垂で身体をUPできているかどうかを計測します。
Ambient
データはAmbientというIoTデータの可視化サービスを利用します。以下は公式サイトからの引用です。
使ってみるとメールアドレスの登録だけで簡単にデータをクラウドに送信・保存・可視化までができました。かなり有能です。
配線
それでは作っていきましょう。配線はとっても簡単です。
M5Stack(5V)->HC-SR04(Vcc)
M5Stack(GND)->HC-SR04(GND)
M5Stack(21)->HC-SR04(Echo)
M5Stack(22)->HC-SR04(Trig)
プログラム
お次はプログラムです。まずは開発環境を準備します。今回はM5Stackへのプログラム書き込みをArduino IDEで行います。以下ページを参考にIDEをセットアップします。
次にAmbientをセットアップします。以下ページの「Ambientライブラリーのインストール」辺りを参考に行いました。
それではソースコードです。コピペした後に自分の環境に合わせて編集するパラメータが4つあるので後述します。
//********************************************************************
//*超音波センサを使って懸垂回数を数えるプログラム
//********************************************************************
#include <M5Stack.h>
#include "Ambient.h"
#define echoPin 21 // Echo Pin
#define trigPin 22 // Trigger Pin
int ChinUpCount = 0; // 懸垂回数
bool ChinUpCounted = false; // 懸垂回数を計測済みか否か
WiFiClient client;
Ambient ambient;
// WiFi
const char* ssid = "Your SSID";
const char* password = "Your SSID Password";
// Ambient
unsigned int channelId = Your Channel ID;
const char* writeKey = "Your Channel ID WriteKey";
void setup() {
Serial.begin( 9600 );
pinMode( echoPin, INPUT );
pinMode( trigPin, OUTPUT );
M5.begin();
M5.Lcd.setTextSize(20);
M5.Power.begin();
M5.Lcd.drawString("START", 0, 0);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
ambient.begin(channelId, writeKey, &client);
}
void loop() {
int curDistance = GetDistance();
if (curDistance == 0) {
// 不定値のときは何もしない。
} else if (curDistance < 15 and ChinUpCounted == false) {
// 懸垂距離が近づいた際にカウントアップしてカウント済みとする。
ChinUpCount += 1;
ChinUpCounted = true;
M5.Lcd.clear();
M5.Lcd.drawString("UP", 0, 0);
ambient.set(1, 1);
ambient.send();
} else if (curDistance > 20 and ChinUpCounted == true) {
// 懸垂距離が遠くなった際はカウント済みをリセットする。
ChinUpCounted = false;
M5.Lcd.clear();
M5.Lcd.drawString("DOWN", 0, 0);
}
delay(1000);
}
//* 超音波センサの距離を取得する。
int GetDistance(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite( trigPin, HIGH ); //超音波を出力
delayMicroseconds( 10 ); //
digitalWrite( trigPin, LOW );
double duration = 0; // 受信した間隔
duration = pulseIn( echoPin, HIGH ); //センサからの入力
if (duration > 0) {
double distance = 0; // 距離
duration = duration/2; //往復距離を半分にする
distance = duration*340*100/1000000; // 音速を340m/sに設定
Serial.println("Distance:" + String(distance) + " cm");
return distance;
} else {
return 0; //Todo:不定値を返す
}
}
プログラムをコピペした後、以下の箇所を自分の環境に合わせて編集します。
// WiFi
const char* ssid = "Your SSID";
const char* password = "Your SSID Password";
// Ambient
unsigned int channelId = Your Channel ID;
const char* writeKey = "Your Channel ID WriteKey";
デバイスを取り付ける箇所によって"curDistance < 15", "curDistance > 20"部分は微調整が必要かもしれません。
設置
今回一番苦労したのが設置です。壁に機器を取り付ける方法が思いつかず、奥さんの助けを受けて以下の写真のようになりました。
デモ
電源が入るとまずは「Start画面」が表示されます。
懸垂すると「UP」が表示されます。
下に降りると「DOWN」が表示されます。
Ambientを確認すると懸垂回数が可視化されています。
こんな感じで懸垂してます。
感想
今回初めてM5StackとAmbientを使ってみました。M5StackはArduinoと同じ感覚でありながらインターネットに容易に接続できるステキなデバイスだと感じました。アイデア次第で色々拡張していけそうです。
Ambientも非常に簡単なセットアップとプログラミングでデータを可視化でき、とても有能でした。Firebaseを使おうとした際はかなり苦労した記憶があります。機能が制約されている分、使いやすくていいですね。
課題としては壁設置とバッテリーです。これらは「実験はできても実地は難しい」と実感します。3Dプリンタで壁掛けしている人もいるみたいです。ただうちの壁はホチキスが通らないんですよね。
バッテリーについてはどれくらい課題になるかよくわかっていません。勉強あるのみです。
この記事が気に入ったらサポートをしてみませんか?