第1回:ラズパイ・ゼロとローム・センサメダルで健康管理をサポートするデバイスを作ろう!
センサの値から歩数、距離、カロリーを計算して、LINEに送信!
こんにちは、ヨシケンです!
今回は早速、運動不足解消のための健康管理デバイスを作り始めます。まず、ローム・センサメダルを使って、歩数、移動距離、消費カロリーなどを計測、計算してみることにしましょう。
また、家の中などで歩いた結果をLINEに送るなどして、モチベーションアップにつなげてみませんか?家の中でも意外と移動していることが分かったり、使い方次第でダイエットにも役立つかもしれませんよ!

今回の記事で必要な物一覧
Raspberry Pi Zero WH

ローム・センサメダル(SensorMedal-EVK-002)

今回の記事の流れ
- 移動距離やカロリー量を計算
- 歩いた歩数をLINEに通知
- まとめ
1. 移動距離やカロリー量を計算
ここでは、ロームのセンサメダル(SensorMedal-EVK-002)を使用して、歩いた歩数や距離を計測します。前回、センサメダルをBluetooth経由でラズパイにつなぐために、bluepyというライブラリをラズパイ・ゼロにインストールしました。また、こちらのGithubの便利なプログラムを使用して以下のように数値を取ることができました。
pi@raspizero:~/SensorMedal2 $ sudo python3 ble_logger_SensorMedal2.py
...
Device c5:xx:yy:zz::d0 (random), RSSI=-65 dB
Short Local Name = ROHMMedal2_0107_01.00
Flags = 06
Incomplete 16b Services = 0000180a-0000
Manufacturer = 0100c86abcdef
ID = 0x1
SEQ = 188
Temperature = 27.99 ℃
Humidity = 71.52 %
Pressure = 998.578 hPa
Illuminance = 93.3 lx
Accelerometer = 1.453 g ( 0.062 0.844 1.181 g)
Geomagnetic = 92.6 uT ( -15.8 -58.0 -70.4 uT)
Magnetic = 0x3
Steps = 8 歩
Battery Level = 90 %
RSSI = -65 dB
センサメダルから取得できる計測値:
- Temperature: 温度(℃)
- Humidity: 湿度(%)
- Pressure: 気圧(hPa)
- Illuminance: 明るさ(lx)
- Accelerometer: 加速度(x軸、y軸、z軸)(g)
- Geomagnetic: ジャイロセンサ値(x軸、y軸、z軸)(uT)
- Magnetic: ホールセンサ値(もし磁石が近くを通ったら1、そうでない場合0)
- Steps: 歩数(歩)
- Battery Level: バッテリの残量
この中でStepsは、加速度センサから歩く歩数を取得しています。まず、その歩数から移動距離を出したいと思います。それには1歩当りの歩幅を出す必要がありますが、それは身長により身長/2〜身長×1.2くらいまでと異なります。ここでは簡単に1歩当たりの歩幅=0.5mとしておきます。
まずは、家の中で動いた(歩いた)事によるカロリーを計算してみましょう。例えば健康な男性が1日10,000歩ほど歩くと350kcalくらい(ご飯お茶碗一杯くらい)の消費になるという計測値がありますので、1歩当たりの係数として350/10,000 = 0.035を使います。
まとめると以下のような表の計算になります。
| 番号 | 出力値 | 計算方法 |
| 1 | Steps 歩数 (歩) | 加速度センサから歩数を取得 |
| 2 | Distance 移動距離(m) | Steps × 1歩当りの距離(ここでは簡単に1歩当り0.5mとします) |
| 3 | Calorie カロリー(kcal) | Steps × 1歩当りのカロリー量(ここではカロリー係数 0.035 を使います) |
それではこれをプログラムとして記述してみます。
pi@raspizero:~/SensorMedal2 $ sudo cp ble_logger_SensorMedal2.py ~/Programs/ble_steps.py
pi@raspizero:~/ $ sudo vi ~/Programs/ble_steps.py
(元のble_logger_SensorMedal2.pyプログラムに9〜29行目の部分を追記しています)
---
sensors['Magnetic'] = hex(payval(27))
sensors['Steps'] = payval(28,2)
step_cnt = sensors['Steps']
if SEQ in [0,1] and step_cnt == 0:
start_seq+= 1
start_time= datetime.now()
print(start_time.strftime('%H:%M:%S')+"にスタート!")
else:
last_time= start_time
last_cnt = step_cnt
cur_time= datetime.now()
time_text= cur_time.strftime('%Y/%m/%d(%a) %H:%M:%S')
print(time_text)
if start_seq >= 1:
dur_time= cur_time - start_time
cur_cnt = step_cnt
cur_mv = round(cur_cnt*0.5,1)
cur_cal = round(cur_cnt*0.035,1)
dur_seconds = dur_time.seconds
dur_seconds = 1 if dur_seconds==0 else dur_seconds
step_text= str(dur_seconds)+"s "+str(cur_cnt)+"Steps "+str(cur_mv)+"m "+str(cur_cal)+"Cal"
print(step_text)
sensors['Battery Level'] = payval(30)
sensors['RSSI'] = dev.rssi
---
ではこのプログラムble_steps.pyを流してみましょう。このプログラムを起動した後に、センサメダルのボタンを押して、一度リセットするとそこから歩数、時間を計測し始めます。
pi@raspizero:~/Programs $ sudo python3 ble_steps.py

歩数から計算される移動距離やカロリーなどが表示されましたので、センサメダルをポケットなどに入れ、ラズパイゼロの方は電源につないで部屋に置いておきます。これで、センサメダルを万歩計的な使い方をすることができました。

2. 歩いた歩数をLINEに通知
次に、歩いた歩数がある程度になったら、それをLINEに送付して確認できるようにしましょう。例えば〇〇歩、歩くごとにLINEに「〇〇歩歩いたね!」などと送って、モチベーションを高めることができるかもしれません。
まずは、LINEを使うために、LINE Notifyというページで登録をおこないます。
https://notify-bot.line.me/ja/

右上のログインのところから、LINE Developerアカウントでログインします(ない方は取得しておいてください)。ログイン後のマイページからLINEにメッセージ送付するためのアクセストークンを発行します。

ここで適当なトークン名を付け、LINE内のトークルームを選んで、発行します。

そうすると、LINE Notifyを送るためのトークンが表示されますので、これをコピーしておきます。このトークンは画面を閉じると再発行が必要になってしまうので、ここで確実にコピーしておいてくださいね。

このトークンを使って、ラズパイにプログラムを追加します。ここでは先述のble_steps.pyに追記して、ble_steps_line.pyとしています。下記コードの11行目、xxxになっているところにコピーしたトークンを貼り付けます。
pi@raspizero:~/Programs $ sudo cp ble_steps.py ble_steps_line.py
pi@raspizero:~/Programs $ sudo vi ble_steps_line.py
(元のble_steps.pyプログラムに8〜17行目、24〜27行目を追記しています)
---
scanner = btle.Scanner()
import requests
def line_message(text):
url = "https://notify-api.line.me/api/notify"
token = "xxx"
headers= {"Authorization":"Bearer "+token,
"Content-Type":"application/x-www-form-urlencoded"}
payload = {"message":text,
"stickerPackageId":2,
"stickerId":513}
r = requests.post(url ,headers = headers ,params=payload)
while True:
---
print(step_text)
if cur_cnt > 10:
comp_text = str(cur_cnt)+"歩あるいたよ!"
if cur_cnt%20 == 0:
line_message(comp_text)
sensors['Battery Level'] = payval(30)
---
今回はテストのために20歩ごとにテキストを送るようにしています。それではこのプログラムをsudo python3 ble_steps_line.pyのように流して、歩いたり、メダルを振ったりして10歩以上計測されるようにしてみましょう。

LINEの指定したグループトークにこのようにテキストが送られるのではないかと思います(スタンプも併せて送っていますが、それは好みに応じて追加してください)。

3. まとめ
第2回となる今回は、運動不足解消のための健康管理デバイス作りを始めました。センサメダル中の加速度センサからとても簡単に歩数が取れるので、一般的な数値を使って、移動距離やカロリーを計算、表示させてみました。また、その結果をLINEに送って、モチベーションアップにもつなげています。
ポケットなどにこのセンサメダルを入れて、家の中にいてもちょっと意識して動いてみるのはいかがでしょうか?
次回は脈波センサを使って、普段の生活や運動時の心拍数も測ってみたいと思います。
今回の連載の流れ
第1回:ラズパイ・ゼロとローム・センサメダルで健康管理をサポートするデバイスを作ろう!
第2回:センサの値から歩数、距離、カロリーを計算して、LINEに送信!(今回)
第3回:ラズパイとセンサで作る小型健康管理ウェアラブルデバイス!
第4回:ディスプレイを付けて、ウェアラブル健康機器に仕上げる



