安いエアロバイクをハックする　調査編2 エアロバイクの消費カロリー計算


この記事の続きです
https://qiita.com/bohemian916/items/39beb2b97b59610788d9

前回、エアロバイクの回転数(ケイデンス)を計測するセンサーをハックして
M5Atom S3というマイコンで受け取ることができるようになりました。

ここからアプリ等を作り、データを表示しようと思いましたが、
現状では回転数だけしかわかりません。
元々ついているディスプレイでは、走行距離、消費カロリーが表示されていましたが
どのような計算で表示しているのかを突き止める必要があります。

この記事では、このALINCOの走行距離やカロリー計算式をハックして求めるとともに
エアロバイクの負荷や自分の体重を元にMetsを算出して、より正確な値を表示できるようにする方法を書きます。

忙しい人のために
色々調べた結果、本記事の成果として、負荷ワット数を元に消費カロリー計算ができるページを作成しました。

https://bohemian916.github.io/aerobike_calories/

## センサーのダミーを作る
前回の記事で、回転数のセンサーは、1回転ごとに１回だけ通電する仕組みであることがわかりました。
したがって、元々ある表示板から出ている2線を一定の間隔で電気的に繋げてあげれば、常に一定の速度で走っている状態をエミュレートできるはずです。

前回に引き続き、M5Atom S3 Liteを使い、ここにリレーを接続して、２線をスイッチングさせます
このリレーを使いました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/813ed6fb-9b87-b886-fa93-53ffd90a660d.png)

https://www.switch-science.com/products/807

Grove端子にそのまま繋いて、リレーの端子には元々ある表示板のセンサーが接続されていた線を接続します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/055cfd60-0f06-961e-4060-937084fd30a2.png)


そしてArduino IDEで下記のコードを書き込みます

```c
#include <M5AtomS3.h> 

#define OUT_PIN 1

bool output0 = LOW;
int span=1000;
int time_limit = 60000;
int high_time =100;

void setup() {
  M5.begin(false, true, true, true);
  pinMode(OUT_PIN, OUTPUT); 
}

void loop() {

  if(time_limit >0) {
    delay(span-high_time);
    output0 = HIGH;
    digitalWrite(OUT_PIN, output0);
    delay(high_time);
    output0 = LOW;
    digitalWrite(OUT_PIN, output0);
    time_limit -= span;
  }
}
```

上記のコードは、1秒(1000ms)ごとに0.1秒だけリレーを閉める(回路を接続させる)コードです。
60秒間だけ動作し、動作中に速度を確認し、動作終了後に1分間分の消費カロリー、走行距離を確認します。

`int span=1000;`
を変更することで、回路を繋げる間隔を変更することができ
500~1500まで、回転数でいうと、40~120RPMまで計測を行いました。


|信号間隔(ms)	|理論回転数(RPM)	|1分での表示走行距離(m)	|表示消費カロリー(kcal)|
|--|--|--|--|
|1500	|40.0	|170	|2.5|
|1400	|42.9	|180	|2.8|
|1300	|46.2	|200	|3|
|1200	|50.0	|210	|3.2|
|1100	|54.5	|240	|3.6|
|1000	|60.0	|260	|3.9|
|900	|66.7	|290	|4.4|
|800	|75.0	|330	|4.9|
|700	|85.7	|370	|5.6|
|600	|100.0	|440	|6.6|
|500	|120.0	|530	|7.9|

基本的には、回転数に比例して、走行距離と消費カロリーが増加しているように見えます。
一応、各回転数ごとに、回転数ごとの距離、距離ごとの消費カロリー、１回転毎のカロリーを計算してみましたが、
ほぼ同じ値で、綺麗な比例関係にありました

| 理論RPM | 1回転ごとの距離(m/R) | 距離ごとの消費カロリー(kcal/km) | 1回転ごとのカロリー(kcal/R) |
| ----- | ------------- | -------------------- | ------------------ |
| 40.0  | 4.458         | 14.019               | 0.063              |
| 42.9  | 4.472         | 14.609               | 0.065              |
| 46.2  | 4.478         | 14.516               | 0.065              |
| 50.0  | 4.467         | 14.328               | 0.064              |
| 54.5  | 4.461         | 14.795               | 0.066              |
| 60.0  | 4.472         | 14.534               | 0.065              |
| 66.7  | 4.475         | 14.749               | 0.066              |
| 75.0  | 4.489         | 14.554               | 0.065              |
| 85.7  | 4.433         | 14.737               | 0.065              |
| 100.0 | 4.450         | 14.831               | 0.066              |
| 120.0 | 4.458         | 14.766               | 0.066              |


ですので、
走行距離は回転数*4.45(m)
速度は、回転速度(/min) * 4.45(m) * 60
消費カロリーは、回転数 * 0.65
で計算すれば、このエアロバイクが表示してくれるデータと同じものを表示できそうなことがわかりました。


## この値は正しいのか

ここまで調べて、ある疑問は浮かびます。

「この計算式は正しいのか？」

例えば、消費カロリーの計算には、その人の体重や運動負荷が大きく関係してきますが、
このモニターでは回転数でのみ消費カロリーが計算できてしまいます。

このエアロバイクには、ペダルの負荷を変更できるダイアルがついています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/4f93485b-c55c-5da6-7ff7-eee700eb946b.png)

この負荷を変えても、表示される消費カロリーや走行距離は変わりません。

フィットネスジムに行ってマシンを使って運動しても、大体のカロリーは表示されますが、正確なカロリー表示はされないと思います。おそらく、平均的な体重や体格を想定して、平均的な値を出しているのだと思われます。

もう少し高いエアロバイクを買えば、体重を入力し、負荷状況を考慮した消費カロリーが表示できるとは思いますが
安いエアロバイクなのでそんな機能はついていません。

なので、平均的ではなく、本当の消費カロリーを計算したいと思います。

## エアロバイクの負荷計算

色々調べてみたのですが、このページがとても参考になりました。

理学療法士・作業療法士のためのスキルアップノート

https://ptotskillupnote.com/2018/10/06/%E3%81%BE%E3%81%95%E3%81%8B%E8%87%AA%E8%BB%A2%E8%BB%8A%E3%82%A8%E3%83%AB%E3%82%B4%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E3%83%AF%E3%83%83%E3%83%88%E6%95%B0%E3%82%92%E3%83%86%E3%82%AD%E3%83%88/


まずそのエアロバイクの負荷にはワット数という概念があります
ペダルの重さと回転速度で決まる値で、私の持っているエアロバイクでは、8段階のペダル負荷が設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/831d3f06-fa2f-f511-3abf-278c072d5554.png)

いずれも60rpmの時のワット数ですので、これだけだと、運動している時の回転速度と違ってくると、本当のワット数が分かりません。

ワット数は下記の式で計算することができます

仕事率(W) = トルク (N・m) * 2π/60 * 回転数(rpm)

ワット数を計算するのに必要なトルクが分からないのですが、これは先ほど画像から、60rpmでのワット数が分かっているので、逆算することができます。

例えば一番重い８段階目の95.4Wの時のトルクは

トルク = 95.4 / 2π * 60 / 60 =  15.18(N・m)
と計算できます。

トルクがわかれば、先ほどの式に代入すれば、ワット数が求まります。


### 蛇足
ワット数は仕事率の単位であり、W = J(ジュール)/sです。
ジュール(J)はエネルギーの単位であり、1ジュールは1kgの物質を1m動かすのに必要なエネルギー量です。
同じくカロリー(cal)もエネルギーの単位であり、1calは1gの水を1度あげるのに必要なエネルギー量です。

2つの値は変換が可能で、1J = 0.24cal、となります。
ですので、60Wの運動を1時間続けた場合の投下されたカロリーを計算すると
60(W) * 3600 * 0.24(cal/J) = 51600 (cal) = 51.6(kcal)
と計算できます。

しかしこれはあくまでエアロバイクを動かした時に必要なエネルギー量であり、体が消費したカロリーの量ではありません。1Wの仕事を人間の体が行うときには、1W以上のエネルギーを消費します。
人の体の運動で消費されるカロリー量を計算する方法を次に説明します。



## 酸素摂取量VO２を求める

ワット数が分かったら、METsという数値を求めます

>メッツとは運動や身体活動の強度の単位です。
>安静時（静かに座っている状態）を1とした時と比較して何倍のエネルギーを消費するかで活動の強度を示します。
>歩く・軽い筋トレをする・掃除機をかける・洗車する・子どもと遊ぶなどは3メッツ程度、やや速歩・ゴルフ（ラウンド）・通勤で自転車に乗る・階段をゆっくり上るなどは4メッツ程度、ゆっくりとしたジョギングなどは6メッツ、エアロビクスなどは7メッツ、ランニング・クロールで泳ぐ・重い荷物を運搬するなどは8メッツ程度といったように、様々な活動の強度が明らかになっています。
厚生労働省　e-ヘルスネットより
https://www.e-healthnet.mhlw.go.jp/information/dictionary/exercise/ys-004.html

METs（メッツ）は、運動強度の単位で、安静時の酸素摂取量を1METとして、その運動で何倍のエネルギーを消費できたかで運動強度を示します。1METは3.5mL/kg/分の酸素摂取量と定義されています。

<b>つまり人間の消費カロリーは、運動でどのくらい酸素を使ったかがわかれば、計算できるということです。

酸素摂取量VO2が3.5ml/kg/min上がる毎にMetsが1上がります。

METs = VO2 / 3.5 

何もしていない時の酸素摂取量VO2は、3.5ですので
定義からMETs=1になります。

なのでMETsを求めるために酸素摂取量VO2を計算します

### 一つ目のVO2の計算式
エアロバイクのVO2の求め方は、先ほどのページに計算式がありました
![スクリーンショット 2023-10-01 2.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/9bc900f2-f165-78d8-12df-df58a400e7d7.png)

エアロバイク運動時の酸素摂取量は、ワット数毎に12ml/min上がるという計算で
それに姿勢維持のための酸素摂取量3.5×体重を足しているという式です。

VO2 (ml/min) = 仕事率(W) × 12.0(ml/W/min) + 3.5(ml/kg/min) × 体重(kg)

上のサイトでは、3.5(ml/kg/min) × 体重(kg) を定数項として300を代入していますが
これは85kgの体重の人と同じ酸素摂取量なので、定数にはせずきちんと計算することにします


### もう一つのVO2計算式
また、ACSM（American College of Sports Medicine；アメリカスポーツ医学会）というところが出している
VO2の算出式がありました。

VO2(ml/kg/min) = 1.8*仕事率(kg・m/min)/体重(kg) +7

VO2の単位が少し違います(ml/kg/minとml/min)

https://summitmd.com/pdf/pdf/090626_aps09_970.pdf

仕事率の単位が異なるので、下記のように変換しますと

1(W) = 1(J/s) = 0.102(kg・m/s) = 60* 0.102(kg・m/min) 

VO2(ml/kg/min) = 11.0*仕事率(W)/体重(kg) +7

となり、もう一つのVO2の式と単位を合わせますと

VO2(ml/min) = 仕事率(W) * 11.0 + 7.0(ml/kg/min) × 体重(kg)

となります。

式を整理して２つ並べてみると、かなり似た式になっています

式1: VO2(ml/min) = 仕事率(W) × 12.0 +  体重(kg) × 3.5
式2: VO2(ml/min) = 仕事率(W) * 11.0 +  体重(kg) × 7.0 

仕事率の係数はかなり近い値が出ています。
体重の係数が大きく異なりますが、後者の式では、3.5を2回足して7としているのですが
この値は、何もしていない時の3.5と、姿勢維持の3.5を足し合わせているのだと思われます。
前者では、何もしていない時の3.5が加えていないため、この差が出ているのだと思われます。

どちらが正しいか素人には判断できないので、国の研究機関が発表している、エアロバイクのワット数とMETsの一般的なデータと比較してみたいと思います。

|ワット数|METs|
|-|-|
|30-50|3.5|
|51-89|4.8|
|90-100|6.8|
|101-160|8.8|
|161-200|11.0|
|200-270|14.0|

国立栄養研究所　改訂版　『身体活動のメッツ（METｓ）表』
https://www.nibiohn.go.jp/files/2011mets.pdf

各式の体重が60kgの時のMETsと、上のデータをプロットしてみました
![スクリーンショット 2023-10-02 21.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50474/40b1e1e1-4880-8e70-c2a9-e14b0a783cf2.png)

ワット数が小さい時に差が大きく、式2の方はMETsが大きく算出されています。
国のデータと比較すると、式1の方がより近似できているように見えます。

結論として、式1の
</b>VO2(ml/min) = 仕事率(W) * 12 +  体重(kg) × 3.5</b>
を使いたいと思います。


## 消費カロリー計算

VO2がわかればMETsがわかり、消費カロリーが分かります

消費カロリー(kcal) = METs×時間(h)×体重(kg)×1.05

今までの式をまとめると

仕事率(W) = トルク (N・m) × 2π/60 × 回転数(rpm)
VO2(ml/kg/min) = 仕事率(W) * 12.0 +  体重(kg) × 3.5
METs = VO2 / 3.5
消費カロリー(kcal) = METs×時間(h)×体重(kg)×1.05

となり、代入していくと消費カロリーを求める式はこうなります

<b>消費カロリー(kcal) = (トルク (N・m) × 2π/60 × 回転数(rpm) × 12.0+ 3.5 × 体重(kg))/3.5×時間(h)×1.05</b>

となります。

試しに、トルクを15.18, 回転数を60, 体重を70kgで1時間運動した時のカロリーを計算してみますと

消費カロリー(kcal) = (15.18 × 2π/60 * 60 × 12.0 + 3.5 × 70) /3.5 × 1 × 1.05
                =  430 (kcal)

となります。この時のMETsは5.8です。

負荷ワット数が分かっていれば、こうなります

<b>消費カロリー(kcal)= (負荷ワット数(W) × 12.0 + 3.5 × 体重(kg)) / 3.5 × 時間(h) × 1.05</b>

この計算式を反映した消費カロリー計算ができるページを作成しました。
ご活用ください

https://bohemian916.github.io/aerobike_calories/

ちなみに、同じようなサイトが一つあります。

https://exrx.net/Calculators/CycleMETs

こちらは、おそらくACSMの計算式(式2)を用いていると考えられます。
消費カロリーが少し高めに出ます


## 負荷ワットとMETsの関係性

エアロバイクの負荷のワット数と体重からMETsが算出できますので、表を置いておきます

METs 縦:体重(kg), 横：負荷ワット数(W)

負荷10~100Wまで
| 体重(kg) / 負荷(W) | 10   | 20   | 30   | 40   | 50   | 60   | 70   | 80   | 90   | 100  |
| -------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 40             | 1.86 | 2.71 | 3.57 | 4.43 | 5.29 | 6.14 | 7.00 | 7.86 | 8.71 | 9.57 |
| 45             | 1.76 | 2.52 | 3.29 | 4.05 | 4.81 | 5.57 | 6.33 | 7.10 | 7.86 | 8.62 |
| 50             | 1.69 | 2.37 | 3.06 | 3.74 | 4.43 | 5.11 | 5.80 | 6.49 | 7.17 | 7.86 |
| 55             | 1.62 | 2.25 | 2.87 | 3.49 | 4.12 | 4.74 | 5.36 | 5.99 | 6.61 | 7.23 |
| 60             | 1.57 | 2.14 | 2.71 | 3.29 | 3.86 | 4.43 | 5.00 | 5.57 | 6.14 | 6.71 |
| 65             | 1.53 | 2.05 | 2.58 | 3.11 | 3.64 | 4.16 | 4.69 | 5.22 | 5.75 | 6.27 |
| 70             | 1.49 | 1.98 | 2.47 | 2.96 | 3.45 | 3.94 | 4.43 | 4.92 | 5.41 | 5.90 |
| 75             | 1.46 | 1.91 | 2.37 | 2.83 | 3.29 | 3.74 | 4.20 | 4.66 | 5.11 | 5.57 |
| 80             | 1.43 | 1.86 | 2.29 | 2.71 | 3.14 | 3.57 | 4.00 | 4.43 | 4.86 | 5.29 |
| 85             | 1.40 | 1.81 | 2.21 | 2.61 | 3.02 | 3.42 | 3.82 | 4.23 | 4.63 | 5.03 |

負荷110~200Wまで
| 体重(kg) / 負荷(W) | 110   | 120   | 130   | 140   | 150   | 160   | 170   | 180   | 190   | 200   |
| -------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 40             | 10.43 | 11.29 | 12.14 | 13.00 | 13.86 | 14.71 | 15.57 | 16.43 | 17.29 | 18.14 |
| 45             | 9.38  | 10.14 | 10.90 | 11.67 | 12.43 | 13.19 | 13.95 | 14.71 | 15.48 | 16.24 |
| 50             | 8.54  | 9.23  | 9.91  | 10.60 | 11.29 | 11.97 | 12.66 | 13.34 | 14.03 | 14.71 |
| 55             | 7.86  | 8.48  | 9.10  | 9.73  | 10.35 | 10.97 | 11.60 | 12.22 | 12.84 | 13.47 |
| 60             | 7.29  | 7.86  | 8.43  | 9.00  | 9.57  | 10.14 | 10.71 | 11.29 | 11.86 | 12.43 |
| 65             | 6.80  | 7.33  | 7.86  | 8.38  | 8.91  | 9.44  | 9.97  | 10.49 | 11.02 | 11.55 |
| 70             | 6.39  | 6.88  | 7.37  | 7.86  | 8.35  | 8.84  | 9.33  | 9.82  | 10.31 | 10.80 |
| 75             | 6.03  | 6.49  | 6.94  | 7.40  | 7.86  | 8.31  | 8.77  | 9.23  | 9.69  | 10.14 |
| 80             | 5.71  | 6.14  | 6.57  | 7.00  | 7.43  | 7.86  | 8.29  | 8.71  | 9.14  | 9.57  |
| 85             | 5.44  | 5.84  | 6.24  | 6.65  | 7.05  | 7.45  | 7.86  | 8.26  | 8.66  | 9.07  |

## 終わりに
私は専門家ではありませんので、このデータの正確性には責任を取れません。
しかし、世の中に目安として書いてある消費カロリーのデータとある程度あっているので、誤差はあれども私は使えると思っています。
もし詳しいかたがいらっしゃいましたら、ご指摘等お願いします。


## 次の記事

次は正確な速度の計算方法について調査しました

https://qiita.com/bohemian916/items/de40b6db26ddcb74bb4c