第1回:ラズパイ・ゼロとローム・センサメダルで健康管理をサポートするデバイスを作ろう!
第2回:センサの値から歩数、距離、カロリーを計算して、LINEに送信!
こんにちは、ヨシケンです!
運動不足解消のための健康管理デバイスを作る企画の第3回。今回はパルスセンサを使い、心拍数を測って健康管理に役立てるようにします。
生体情報を意外なほど簡単に測れるので、色々なことに応用できそうです。

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

ハートレートセンサ

NeoPixel LEDテープ

今回の記事の流れ
1. パルスセンサとその使い方
今回運動中の心拍数を計測するに当たって、パルスセンサを使うことにします。パルスセンサとは、心臓が鼓動し血液が送り込まれる際、血管の体積が大きくなったり小さくなったりする変化を測定するものです。このセンサにはLEDと受信ICが付いており、指先などにLEDを当てて、血管から返ってくる光を検知するようになっています。

まず、パルスセンサとラズパイ・ゼロを用意します。

このパルスセンサはラズパイなどにつなぐ端子がGrove端子(4つの接続子が1つにまとまったもの)になっています。ケーブルの色に合わせてラズパイのGND(黒)、3.3V電源(赤)につなぎます。GPIOとしては黄色の端子部分をGPIO12につないでいます。

それではこのパルスセンサを動かすプログラムを書きます。heart.pyとして以下のように20秒間心拍を取得することができたら、それを計測し始めるようになっています。
pi@raspizero:~/Programs $ sudo vi heart.py
---
#!/usr/bin/env python
import time
from collections import deque
import RPi.GPIO as GPIO
class HeartRateMonitor:
INTERRUPT_PIN = 12
MAX_DETECTED_TIMES_COUNT = 20
MAX_PULSE_INTERVAL = 2.0
def __init__(self):
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.INTERRUPT_PIN, GPIO.IN)
self._init_array()
def _init_array(self):
self.detected_times = deque([])
def _calc_heart_rate(self):
return 1200.0 / (self.detected_times[-1] - self.detected_times[0])
def _interrupt(self):
self.detected_times.append(time.time())
if(len(self.detected_times) == 1):
return
interval = self.detected_times[-1] - self.detected_times[-2]
heart_rate = -1
if interval > self.MAX_PULSE_INTERVAL:
print('Heart rate measure error. Monitoring will restart!')
self._init_array()
return
if(len(self.detected_times) >= self.MAX_DETECTED_TIMES_COUNT):
heart_rate = self._calc_heart_rate()
self.detected_times.popleft()
print("HeartRate: {heart_rate}, Interval: {interval}".format(heart_rate = heart_rate, interval = interval))
def execute(self):
print('Please ready your heart rate monitor.')
time.sleep(3)
while True:
GPIO.wait_for_edge(self.INTERRUPT_PIN, GPIO.RISING)
self._interrupt()
if __name__ == '__main__':
monitor = HeartRateMonitor()
monitor.execute()
それではクリップに指を入れて心拍を測ってみましょう。

プログラムを流して、20秒ほど計測ができるか確かめたあと、59 BPS (毎秒の心拍数)や60 BPSなどと表示されました。

2. 心拍数や活動量に応じたLED点灯
心拍数が測れたところで、LEDをつないで、それに応じた結果を光で表してみることにします。あまり心拍が高くなりすぎると、アラートをあげるなどもアリかもしれません。
今回はNeoPixelというマルチカラーLEDを使います。これは、LEDがいくつも連なってテープ状になっているもので、それを好きな大きさに切って使うことができます。今回はラズパイ・ゼロの大きさに合わせて3つのLEDにしました。

このテープ状のLEDには+5V、Din、GNDという端子が付いています。
それぞれラズパイの5V、GPIO21、GNDとつなぎます。

NeoPixelの使い方は、こちらのAdafruitのページが詳しく、そこから以下のライブラリとサンプルプログラムを入手します。
サンプルプログラム中で、GPIO21につないでいて「pixel_pin = board.D21」とLEDの数は3つなので「num_pixels = 3」とするようにしておいてください。
pi@raspizero:~/ $ sudo pip3 install adafruit-circuitpython-neopixel pi@raspizero:~/ $ sudo wget https://learn.adafruit.com/pages/10683/elements/3005652/download -O neopixels.py pi@raspizero:~/ $ sudo python3 neopixels.py
このサンプルプログラムを流してみると、LEDが七色に光り出しました。

心拍数とLEDを連動させるために先ほどのheartpyプログラムに以下記述を追加したheart_pixels.pyプログラムを作ります。以下の黄色部分が元のheart.pyプログラムからNeoPixelのコードを追加した部分です。
#!/usr/bin/env python
#coding: utf-8
import board
import neopixel
pixel_pin = board.D21
num_pixels = 3
ORDER = neopixel.GRB
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.2, auto_write=False,
pixel_order=ORDER)
normal_rate= 60
high_rate = 100
import time
from collections import deque
…
print("HeartRate: {heart_rate}, Interval: {interval}".format(heart_rate = heart_rate, interval = interval))
if heart_rate > high_rate:
pixels.fill((255,0,0))
pixels.show()
time.sleep(0.1)
elif heart_rate > normal_rate:
pixels.fill((0,255,0))
pixels.show()
time.sleep(0.5)
elif heart_rate > 0:
pixels.fill((0,0,255))
pixels.show()
time.sleep(0.5)
else:
pixels.fill((255,255,255))
pixels.show()
pixels.fill((0,0,0))
pixels.show()
def execute(self):
...
このプログラムheart_pixels.pyを流すと、最初に白くLEDが点滅し、ある一定以上の心拍数になると(この時は100としました)赤色に光ってアラートを出してくれます。

心拍数が60以上100以下なら緑のハートビートを打ちます。100以上だと赤く光ってアラートを出します。
3. センサメダルも一緒に実行
それでは、センサメダルも一緒に使用できるように並列実行しましょう。
それには以下のようなシェルスクリプト(ble_steps_heart.sh)を作ります。nohupと&
で囲った部分はバックグラウンドで動くようになります。
#!/bin/bash nohup sudo python3 /home/pi/Programs/heart_pixels.py & sudo python3 /home/pi/Programs/ble_steps_line.py
ではこれを「. ble_steps_heart.sh」のように実行すると、両方の数値を測ることができます。

心拍数に応じて光り、センサメダルの数値もLINEなどに上げてくれます。

腕時計型にして指にパルスセンサをセットして、センサメダルを持って一日の健康管理に役立てるかもしれません。

4. まとめ
今回はパルスセンサを使って、日常生活の脈や心拍数を計測してみました。ラズパイで簡単に生体情報を取得し、それを見ることができるのが分かってもらえたと思います。
また、センサメダルの計測結果も併せて、並列起動できるようにしました。歩いた歩数と心拍数が測れて健康管理っぽくなってきましたね。
次回はこれまでの歩数計や心拍計を組み合わせて、よりウェアラブルなものを作りたいと思います。
お楽しみに!
今回の連載の流れ
第1回:ラズパイ・ゼロとローム・センサメダルで健康管理をサポートするデバイスを作ろう!
第2回:センサの値から歩数、距離、カロリーを計算して、LINEに送信!
第3回:ラズパイとセンサで作る小型健康管理ウェアラブルデバイス!(今回)
第4回:ディスプレイを付けて、ウェアラブル健康機器に仕上げる

