ラズパイその他工作

ラズパイとセンサで作る小型健康管理ウェアラブルデバイス!第3回

こんにちは、ヨシケンです!

運動不足解消のための健康管理デバイスを作る企画の第3回。今回はパルスセンサを使い、心拍数を測って健康管理に役立てるようにします。

生体情報を意外なほど簡単に測れるので、色々なことに応用できそうです。

raspberrypi-wearable-healthcare-device-03_01

 

今回の記事で必要な物一覧

Raspberry Pi Zero W

raspberrypi-wearable-healthcare-device-03_02

 

ハートレートセンサ

raspberrypi-wearable-healthcare-device-03_03

 

NeoPixel LEDテープ

raspberrypi-wearable-healthcare-device-03_04

 

今回の記事の流れ

  1. パルスセンサとその使い方
  2. 心拍数や活動量に応じたLED点灯
  3. センサメダルも一緒に実行
  4. まとめ

 

1. パルスセンサとその使い方

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

raspberrypi-wearable-healthcare-device-03_05

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

raspberrypi-wearable-healthcare-device-03_06

 

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

raspberrypi-wearable-healthcare-device-03_07

 

それではこのパルスセンサを動かすプログラムを書きます。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()

 

それではクリップに指を入れて心拍を測ってみましょう。

raspberrypi-wearable-healthcare-device-03_08

 

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

raspberrypi-wearable-healthcare-device-03_09

 

2. 心拍数や活動量に応じたLED点灯

心拍数が測れたところで、LEDをつないで、それに応じた結果を光で表してみることにします。あまり心拍が高くなりすぎると、アラートをあげるなどもアリかもしれません。

今回はNeoPixelというマルチカラーLEDを使います。これは、LEDがいくつも連なってテープ状になっているもので、それを好きな大きさに切って使うことができます。今回はラズパイ・ゼロの大きさに合わせて3つのLEDにしました。

raspberrypi-wearable-healthcare-device-03_10

 

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

raspberrypi-wearable-healthcare-device-03_11

 

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が七色に光り出しました。

raspberrypi-wearable-healthcare-device-03_12

 

心拍数と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としました)赤色に光ってアラートを出してくれます。

raspberrypi-wearable-healthcare-device-03_13

心拍数が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」のように実行すると、両方の数値を測ることができます。

raspberrypi-wearable-healthcare-device-03_15

 

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

raspberrypi-wearable-healthcare-device-03_16

 

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

raspberrypi-wearable-healthcare-device-03_17

 

4. まとめ

今回はパルスセンサを使って、日常生活の脈や心拍数を計測してみました。ラズパイで簡単に生体情報を取得し、それを見ることができるのが分かってもらえたと思います。

また、センサメダルの計測結果も併せて、並列起動できるようにしました。歩いた歩数と心拍数が測れて健康管理っぽくなってきましたね。

次回はこれまでの歩数計や心拍計を組み合わせて、よりウェアラブルなものを作りたいと思います。

お楽しみに!

AIロボット2018
ヨシケン(吉田 顕一)

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net