見出し画像

400メートル走計測用 Lap/Splitカウンタを作ってみた。kintone x M5StickC Plus

私は、陸上短距離種目の400メートル走に挑戦しています。

無酸素運動の限界を超える競技。なんでこんなしんどい事にハマるのかと自分でも思うのですが、まあ特訓とか鍛錬とか修行とかそいういうのが好きな性格なので。

京都マスターズに出場

京都マスターズ陸上競技選手権大会に出場しました。難しい状況の中、色々な対策を施して開催いただいたスタッフの皆様には感謝しかありません。

で、1分を切るべく挑戦した400メートル走の結果は。。。

画像3

1分00秒87。またもや1分の壁は破れませんでした。
ちなみにこの日、100メートルも走ってて、タイムは12秒79(+0.1)でした。なんとか12秒台。

400メートル走用のデジタルギアがほしい

走る競技といえばマラソンですよね。毎朝たくさんの方がランニングされています。私はマラソンも大好きです。

マラソンは、競技人口も多くGPSウォッチをはじめ豊富なデジタルガジェットがありますが、比べて短距離走は競技人口が少なく、中でも大人になってから趣味で400メートルを走ろうなんて人は自分でいうのもなんですが、まあほとんどいませんね。^^;

お洒落な400メートル走用ウォッチなんてものは発売されることはまずないでしょう。それならということで作ってしまおうと思ったわけです。

400メートル走の我流トレーニング方法

えっと、私の我流な練習方法ですが、近くの公園に400メートルトラックの代わりになるようなコースがあって、だいたい1~2日おきに300メートルのスプリントを行っています。400ではなく300しか走らないのは「負担が大きい」からです。^^;

「400メートルで1分を切る」のが当面の目標ですので、単純計算で、100メートル15秒ペースで走ればよいことになります。100メートルなら12秒台で走れますので、100メートルだけなら15秒は難しくないタイムです。ただこれが400メートルになると。。。全力で走れば最後もたないし、あまりセーブしてもタイムが伸びない。自分にとっての最適なペース配分を知ることが必要です。

私の今の実力的には、300メートル45秒をたまーに切るくらい。ほとんどが48秒前後で日によってまだまだ安定しません。果たして44秒台で走れた時と48秒かかった時の違いってなんだろう。

実際はスタートからゴールまで同じペースではないでしょうし、300メートルのタイムだけをみて一喜一憂してても発展性がありません。

まずは100メートルごとのラップタイムを継続的に記録して自分のペースを知ることからはじめて、300メートルを45秒以内でコンスタントに走れるようになるペース配分を探る作戦でいこうと思います。

そこで、kintone と M5StickC Plusを使って、100メートルごとのラップを毎回計測して分析できるようなしくみを作ることにしました。

簡単な仕様

1)100メートルごとにラップが取得できる
Aボタンを押すたびに、4回タイムを記録
0m(スタート)→100m→200m→300m→400m(ゴール)
の想定。以降は記録しない。

2)記録データーをkintoneに送信できる
Aボタンを長押しすることで、kintoneにデーターを送信する。

3)リセット
Bボタンを押すとリセットされる

4)単位はミリセック

以上です。^^;。

kintoneアプリ

kintoeアプリについては、前回作ったライフログアプリを手直しする事にしました。

あらたに追加したフィールドは、カウント、Lap、Split

フィールド名:カウント4
数値
フィールドコード:カウント4
以下 カウント3~カウント0まで添え字以外同じ

フィールド名:Lap4
計算式:(カウント4-カウント3)/1000
数値 小数点以下の表示桁数 3
単位:sec ◎後ろに付ける(例:100km)
フィールドコード Lap4

以下 Lap3~Lap0までの式
Lap3:(カウント3-カウント2)/1000
Lap2:(カウント2-カウント1)/1000
Lap1:(カウント1-カウント0)/1000
Lap0:(カウント0-カウント0)/1000

フィールド名:Split4
(カウント4-カウント0)/1000
計算式:(カウント4-カウント3)/1000
数値 小数点以下の表示桁数 3
単位:sec ◎後ろに付ける(例:100km)
フィールドコード Split4

以下 Split3~Split0までの式
Split3:(カウント3-カウント0)/1000
Split2:(カウント2-カウント0)/1000
Split1:(カウント1-カウント0)/1000
Split0:(カウント0-カウント0)/1000

実際のレコード詳細画面はこんな感じです。

画像2

一覧はこんな感じ

画像2

まあ、みたままです。^^;
標準機能のみでたいしたことはしていません。

スケッチ

環境に応じてサブドメイン、アプリID、APIトークン、それと、SSIDとPASSWORDの変更をしてください。

サブドメイン:piyo
アプリID:1234
APIトークン:ABCdefgHijklMnOpqrstuVwxYzAbcdefgHiJkLmN
#include <M5StickCPlus.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Ticker.h>
Ticker ticker;
//カウンタ
unsigned long counter  = 0;
//ミリ秒計算用
unsigned long startmsec = 0;
unsigned long nowmsec = 0;
unsigned long oldmsec = 0;
//ミリ秒保管
char millisChr[5][24] = {0};
//LapとSplit表示用
char LapSplit[24] = {0};
// Wifi の設定(利用可能なSSIDとPASSWORDを設定してください)
const char* ssid       = "wifiのSSID";
const char* password   = "wifiのPASSWORD";
// kintoneデータ更新用設定
char macAdr[24] = {0};
char activChr[24] = {0};
char json[4096];
HTTPClient http;
//10msごとに画面に経過時間を表示
void printMillis(){
 M5.Lcd.setCursor(10, 0);
 M5.Lcd.println(millis());
}
void setup() {
 M5.begin();
 //初期画面
 M5.Lcd.setRotation(3);
 M5.Lcd.setTextSize(2);
 //100msごとに画面に経過時間を表示
 ticker.attach_ms(100, printMillis);
}
void loop() {
 if(M5.BtnB.wasReleased()){
   //リセット
   esp_restart();
 }
 if(M5.BtnA.wasReleased()){
   //処理は4回まで
   if (counter <= 4) {
     M5.Lcd.setCursor(10, counter*16+16);
     M5.Lcd.setTextSize(2);
     if (counter == 0) {
       //0回(スタート)
       nowmsec = millis();
       startmsec = nowmsec;
       sprintf(activChr, "%s" , "6.Sprint");
       M5.Lcd.println(activChr);
     } else { 
       //1~4回(100,200,300,400のラップとスプリット)
       oldmsec = nowmsec;
       nowmsec = millis();
       //Lap:Split
       sprintf(LapSplit, "%d:%d", nowmsec - oldmsec, nowmsec - startmsec);
       M5.Lcd.println(LapSplit);
     }
     //kintoneデーター転送用
     sprintf(millisChr[counter], "%d", nowmsec);
     counter++;
   }
 }
 //kintoneへデーター送信
 if(M5.BtnA.wasReleasefor(3000)){
   // Wifi AP に接続
   WiFi.begin(ssid, password);
   Serial.print("connecting");
   while (WiFi.status() != WL_CONNECTED) {
     Serial.print(".");
     delay(500);
   }
   Serial.println();
   //WiFi Connected
   Serial.println("\nWiFi Connected.");
   Serial.println(WiFi.localIP());
   //MACアドレス
   byte mac[6];
   WiFi.macAddress(mac);
   sprintf(macAdr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
   Serial.println(macAdr);
   M5.Lcd.setCursor(10, 16*6);
   M5.Lcd.setTextSize(2);
   M5.Lcd.println(macAdr);
   sprintf(json,"{\"app\":\"1234\",\"record\":{\"活動\":{\"value\":\"%s\"},\"カウント0\":{\"value\":\"%s\"},\"カウント1\":{\"value\":\"%s\"},\"カウント2\":{\"value\":\"%s\"},\"カウント3\":{\"value\":\"%s\"},\"カウント4\":{\"value\":\"%s\"},\"MACアドレス\":{\"value\":\"%s\"}}}",activChr,millisChr[0],millisChr[1],millisChr[2],millisChr[3],millisChr[4],macAdr);
   int httpResponseCode = 0;
   http.begin("https://piyo.cybozu.com/k/v1/record.json");
   http.addHeader(F("X-Cybozu-API-Token"), F("ABCdefgHijklMnOpqrstuVwxYzAbcdefgHiJkLmN")); // <= kintoneアプリのAPI-Tokenを設定
   http.addHeader(F("Content-type"), F("application/json"));
   httpResponseCode = http.POST(json);
   Serial.printf("httpResponseCode = %d \n", httpResponseCode);
   Serial.println(http.getString());
   
   M5.Lcd.setCursor(10, 16*7);
   M5.Lcd.setTextSize(2);
   M5.Lcd.println("Send!");
 }    
 M5.update();
}

今回も先人の皆様の記事をたくさん参考にしています。ありがとうございます。

@exabugsさん。定期的な処理をメインループの外でやってくれる Ticker というクラスの使い方の参考にさせていただきました。ありがとうございます。

@komugikoさん。Arduinoが起動してからの経過時間(ミリ秒)をunsigned long型でカウントし続けてくれる関数。millis()の使い方を参考にさせていただきました。ありがとうございます。

@komugikoさん。esp_restart()。Bボタンのリセットの参考にさせていただきました。ありがとうごいます。

実際に測ってみよう!

実際に公園にいって実測しました。最初ですので、がんばって400メートルを走ってみようと挑戦!

最初の100、200は抑えて力まず、300はその速度をキープ。いつもの300まではまあ順調。が、やっぱり300からの残り100がしんどい。。。も、うだめだーと思いながらもなんとか400走り切りました。

で、M5StickC Plusをみると、

おおーっ!ちゃんと4回ラップがとれてるやった!!と思った瞬間。

真っ黒。

「バ・バッテリー切れ?!」

。。。400メートルを1日2回走る体力はありません。仕方ないのでイメージ写真。

画像4

あー、これくらいのタイムがコンスタントにでるといいなー。^^;

ラップ計測はM5StickC Plus単体で可能。kintoneへデーターアップロード時点でネットワークに接続にいきます。通信環境がない場合や不安定な場合もありますしね。今回の経験を踏まえ、当面4回ラップとった時点でスマホで写真を撮るなどして控えるようにします。

あと、何回かやってみると、Aボタンがうまく反応しないときなどもありました。合わせてこのへんも様子をみていこうと思います。

これを使って念願の400メートルを1分切る練習に励みます!!

Twitterに動画アップしました。


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