安いエアロバイクをハックする　〜可視化編〜

机のついた安いエアロバイクを買って、ハックをしてきました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/ce985367-0ec0-9349-5679-84c99535f033.png)

[この記事](https://qiita.com/bohemian916/items/39beb2b97b59610788d9)から始まっています


https://qiita.com/bohemian916/items/39beb2b97b59610788d9


前回までで、正確なカロリー消費量や速度、距離などの計算式が分かったので
これをGrafanaを使ってリアルタイムで可視化してみました

こんな感じに表示されます
![スクリーンショット 2024-04-07 23.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/7f156625-42c8-ddee-c2ea-2b72073b651a.png)

推しポイントは、GithubのActivityの可視化のように
直近1ヶ月の運動履歴が見られるところです
![スクリーンショット 2024-04-08 0.05.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/d0660c8f-f6b2-543f-ec1b-11a133434591.png)

机がついているので、運動中は机にPCを乗せて、このようにいつでも確認することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/49a96223-236e-6abe-f0b7-36ae203ddbc3.png)

ずっとPCでGrafanaを開いているわけでもないので、
M5atomに接続された7segで運動時間を表示するようにしています


# 構成

構成はこのようになっています
![スクリーンショット 2024-04-08 0.04.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/5838ba44-db5b-4ebe-716d-e180776361ba.png)

M5AtomS3Liteでエアロバイクの運動情報を読み取り
ここで消費カロリー、速度、継続時間、走行距離などを計算します
この情報は7Segで見られます

BLEでM5AtomS3Liteとラズパイを接続し、各種データをラズパイに送信します
ラズパイでは、受け取ったデータをサーバーで動いているInfluxDBとMySQLに格納します

DBに格納されたデータをGrafanaで可視化して、リアルタイムでPCで見られるようになっています


# プログラムについて

## M5AtomS3Lite側
M5AtomS3Liteには、このスケッチを書き込んでいます

https://github.com/bohemian916/aerobike_metor_ble/blob/main/m5atoms3_alter_aerobike_meter_ble.ino

行っていることは、
1, エアロバイクのセンサの読み取り
2, 各種データの計算
3, 7segでデータを表示(ボタンで表示切り替え)
4, BLE経由でラズパイにリアルタイムでデータ送信
です

電源を入れると、BLEのペリフェラルとして起動します。
ラズパイはセントラルとして動き、あらかじめ決めておいたUUIDのペリフェラルに接続を試みます
BLEがconnectしていないときはM5AtomS3LiteのLEDは赤色で点灯し
connectしている時は緑色のLEDが点灯します
起動してからしばらくは、BLEが安定せず、disconnectとconnectを繰り返しますが
しばらくすると安定するようです

connectしている時には、ラズパイにデータを送信します

エアロバイクを漕ぐのをやめると、3分間そのまま放置しておくとM5AtomS3Liteは自動的にスリープに入ります


## ラズパイ側
データを受け取ってDBにインサートするラズパイ側のプログラムはこちらです

https://github.com/bohemian916/aerobike_metor_ble/tree/main/raspberryPi

sysytemdで常時動かしておく想定で作っています

基本的には、
M5AtomS3Liteからリアルタイムで送られてくるデータをInfluxDBに書き込むだけですが
今までの累計時間や距離、各回の運動記録を残すために、運動終了時にMySQLに書き込んでいます
書き込むのは、30分以上運動した場合に、M5AtomS3Liteとの接続が切れた5分後です

このプログラムを使う際には、各種DBの情報やサーバーのipなどを書き換えてください

# 工夫した点

## 毎回の準備作業を最小化した
毎回機材をペアリングしたり、いろいろ電源をつける必要があったりすると
毎日の繰り返される運動の前の準備が面倒になり、使わなくなってしまいます

元々ついていた簡易メーターでは、本当に何も準備がいらず
エアロバイクを漕ぎ始めたら自動でメーターがONになり、漕ぐのをやめてしばらくすると自動でOFFになります

このレベルを目指したかったのですが、電源の関係で流石に難しかったので
このシステムでは、モバイルバッテリーでM5AtomS3Liteを稼働させていますが
モバイルバッテリーの電源ボタンを1回押すだけで準備完了、というようにしました
運動終了時は、自動でスリープするので、OFFにする必要はありません
(私の持っているモバイルバッテリーは、消費電力が小さいと自動でOFFになってくれる機能がついているため)


## どのデバイスでも見られる
可視化にGrafanaを使ったので、ブラウザが使えるデバイスなら何でも良いわけです
私はPCのブラウザにGrafanaのタブを作りっぱなしにしています


# 可視化の効果はあったのか？
可視化およびトレーニングデータの記録をする前は
どれくらい運動したのかが不明瞭でしたが
記録が残る状態になると、モチベーションが上がったと思います
後から振り返って、今週は頑張ったな、とか、サボったな、ということが分かるので
その分の食事量を考えることができるようになりました。

やはりおすすめは、Github風の可視化ですね。エンジニアにとって親近感がありますよね
![スクリーンショット 2024-04-08 0.05.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/d0660c8f-f6b2-543f-ec1b-11a133434591.png)

草を生やすために、毎日2~3時間を目標に頑張れています。
おかげで体重もどんどん減ってきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/913cc0e6-85a1-d3a2-9650-40ffe332b77f.png)


# 最後に
可視化の効果もありますが、やはり机付きのエアロバイクはおすすめです。

私は100均で買ったタブレットスタンドを追加して、
iPadでVtuberの配信を流しつつ、PCで作業して、スマホでゲームするという
３画面でエアロバイクを漕いでいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/901234e4-5e70-6a7b-a402-6b579acf6051.png)

テレワークの仕事中にもできて、疲れない負荷と速度で運動すれば、作業しながらだと時間もあっという間に過ぎるので本当におすすめです

https://www.amazon.co.jp/ALINCO-%E3%82%A2%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%B3-%E3%83%95%E3%82%A3%E3%83%83%E3%83%88%E3%83%8D%E3%82%B9%E3%83%90%E3%82%A4%E3%82%AF-%E3%81%AA%E3%81%8C%E3%82%89%E3%83%90%E3%82%A4%E3%82%AF4518-AFB4518/dp/B077JPJZ3Y/ref=sr_1_6?dib=eyJ2IjoiMSJ9.0RKUeL9N1h8Ud0LcRe55ZOTi_YQVWcMG4arQQ4Yu-knwa7-_egTem7RYysBhy5X2uhEjjjfIFl2e7Hkri2F_7cOQsZMPl52AGDUZgqW83AzKUoIP1TViFspY-W6T3virijxwYVRCOOJrOOaJEdB5kqg4p2hc5qwqkUD5BpDFt9FcDRRbaQ-9eAaJFnLfw-kFNbp4t_aiJyD2xsN_5ei4NDKFLiijBLPsRBinzp4P6vuiOtB44EOzgfLjy9Ym5PUGky4vgl9lXonmuObrVZtYM1exuEnT7uvBi2yK4anUyvc.Pb0ydrvvhuxCsZjWNfCyadkxskDU14a5PnL4j5vj7CQ&dib_tag=se&keywords=%E3%82%A8%E3%82%A2%E3%83%AD%E3%83%90%E3%82%A4%E3%82%AF%2B%E6%9C%BA%E4%BB%98%E3%81%8D&qid=1712506951&sr=8-6&th=1