見出し画像

M5Stack+Ambientで懸垂回数を記録するIoTデバイスを作ってみよう

テレワークを開始してから約2ヶ月が経ちました。通勤時は自転車通勤のおかげで1日14kmほどサイクリングをできていましたが、在宅勤務の今は運動があまりできていません。
ということでメルカリで買ったのが懸垂バーです。ドアのツッパリに引っ掛けるタイプなので部屋のスペースを使わない優れものです。

画像2

使っていると、何回懸垂できているのかを計測したくなってきました。レコーディングダイエットというものが一時期流行った通り、計ることは継続につながります。ということで「懸垂自動計測機」を作ってみました。

システム構成

今回使用したデバイスは2つです。

画像3

仕組みとしては、まずは超音波センサで懸垂した時の距離を計測します。懸垂できている距離に入っていれば、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データの可視化サービスを利用します。以下は公式サイトからの引用です。

画像1

使ってみるとメールアドレスの登録だけで簡単にデータをクラウドに送信・保存・可視化までができました。かなり有能です。

配線

それでは作っていきましょう。配線はとっても簡単です。

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"部分は微調整が必要かもしれません。

設置

今回一番苦労したのが設置です。壁に機器を取り付ける方法が思いつかず、奥さんの助けを受けて以下の写真のようになりました。

画像4

デモ

電源が入るとまずは「Start画面」が表示されます。

画像5

懸垂すると「UP」が表示されます。

画像6

下に降りると「DOWN」が表示されます。

画像7

Ambientを確認すると懸垂回数が可視化されています。

画像8

こんな感じで懸垂してます。

画像9

感想

今回初めてM5StackとAmbientを使ってみました。M5StackはArduinoと同じ感覚でありながらインターネットに容易に接続できるステキなデバイスだと感じました。アイデア次第で色々拡張していけそうです。
Ambientも非常に簡単なセットアップとプログラミングでデータを可視化でき、とても有能でした。Firebaseを使おうとした際はかなり苦労した記憶があります。機能が制約されている分、使いやすくていいですね。

課題としては壁設置とバッテリーです。これらは「実験はできても実地は難しい」と実感します。3Dプリンタで壁掛けしている人もいるみたいです。ただうちの壁はホチキスが通らないんですよね。

バッテリーについてはどれくらい課題になるかよくわかっていません。勉強あるのみです。

この記事が気に入ったらサポートをしてみませんか?