心拍センサーを使って kintone Hospital

著者名:菊地 宏司

目次

さて IoT 企画の第 2 弾ということで、今回も「Raspberry Pi」を使った連携サンプルを紹介したいと思います。

はじめに

面倒で健康診断を放置して、年を過ごしてしまうことがよくあります。
もっと気楽に病院での検診ができれば…。
あ!病院に行かなくてもクラウドでできたらいいな!という妄想を今回は小さく形にしてみました。

今回のテーマは、kintone Hospital。
なんか大風呂敷を広げている感がありますが、kintone × 医療のキッカケになればと思います。
さて、今回は以下のようなイメージで作成していきます。

  1. センサーを使って Raspberry Pi で心拍数を取得する。
  2. 1 分間あたりの心拍数を測定する。
  3. kintone へ登録する。

環境準備

Raspberry Pi

Raspberry Pi Model B Revision 2

心拍センサー

心拍を取得するための パルスセンサー (External link) です。
通電するとハートの中に埋め込まれた LED が光っていい感じ。
ちなみに、今回はこのまま使っていますが、基盤部分が汗でショートすることもあるためラバーなどを被せて保護したほうがいいです。

アナログデジタルコンバータ(MCP3002)

Raspberry Pi がデジタル入力のみ対応のためアナログ出力の心拍センサーを取得するための変換機として間につなぎます。

kintone アプリ

計測結果を登録するためのアプリを用意します。

フィールド名 フィールドコード フィールドタイプ
測定日時 createdate 日時 (作成日時)
心拍 pulse 数値

Raspberry Piの配線を組んでみる

配線図はこんな感じにしてみました。
ハートマークからでている紫の線がセンサーで、この出力データが AD コンバータを通して Raspberry Pi に送られます。

実際に配線を組んだものがこちらになります。

プログラムを組んでみる

測定のプログラムは Python で作成します。
今回 Raspberry Pi から kintone に登録するのに kintone SDK for Python (External link) を使用しました。
なんと 5 行あれば kintone に POST、PUT、GET ができる超便利 SDK です。
シンプル操作でお手軽に利用できるのでおすすめです。

ソースコード

pulse.py のファイル名で以下コードを保存します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# kintone x Raspberry Pi Sample program
# Copyright (c) 2022 Cybozu
# Licensed under the MIT License
# https://opensource.org/license/mit/

import sys
from kintone_sdk4python import Kintone

import spidev
import time

# kintone connect settings
kintone = Kintone()
kintone.set_domain('{subdomain}.cybozu.com')
kintone.set_token_auth('token1234')
kintone_appid = 1234

spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz=1000000
spi.bits_per_word=8

print('start... 30sec left')

def measure():
    dummy = 0xff
    start = 0x47
    sgl = 0x20
    msbf = 0x08
    ch = 0x10
    ad = spi.xfer2([( start + sgl + ch + msbf ), dummy])
    val = (((( ad[0] & 0x03) << 8) + ad[1]) * 3.3 ) / 1023
    return val

# start pulse check of 30sec
pulsecount = 0
prevpulse = 0
for i in range(300):
    mes_ch = measure()
    print 'ch = %2.2f' % mes_ch,'[V]'

    if (i == 100):
        print('******************* 20sec left')
    if (i == 200):
        print('******************* 10sec left')
    if (i == 250):
        print('******************* 5sec left')
    # pulse count
    if (float(prevpulse) < 2.8 and float(mes_ch) >= 2.8):
        pulsecount = pulsecount + 1
        print('******************* pulsecount = %d' % pulsecount)

    prevpulse = mes_ch
   # sleep 0.1sec
    time.sleep(0.1)

# create kitnone request body
request_body = {
    "pulse": {
        "value": pulsecount * 2
    }
}

# post kintone request
post_record_resp = kintone.post_record(kintone_appid, request_body)

print('finish')
spi.close()

処理の流れはこちら。

  1. kintone の接続処理をする。
  2. センサーデータ入出力用の SPI モジュールを準備する。
  3. 1 秒ごとにセンサーからの情報を取得し、これをループ処理で 300 回行う。
    計測時間は 0.1 秒 × 300 回で 30 秒とする。
  4. 測定値が 8 V 以上の値をカウントする。
    だいたい脈ありのときに 2.8 V 以上になったのでそれを基準値としています。
    また、センサーのしくみ上連続して 2.8 V を超える時があるのでそのような時はカウントせずにスキップしています。
  5. 計測処理が完了したらカウントした心拍数を kintone に登録する。
    計測時間は 30 秒なので kintone に登録する際は 2 倍して 1 分間の心拍数とする。

動作確認

実際に動作させてみるとコンソールにログが出力され、0.1 秒ごとの計測値と心拍カウントが確認できます。

実行コマンド

1
python pulse.py

アプリ側には以下のように測定結果が表示されます。

あとはこんな感じに月や週ごとの集計グラフ作ったりしてもいいですね。

おわりに

IoT 企画第 2 弾お楽しみいただけたでしょうか。
本当は脈拍だけではなく血圧も測りたいなーと思っていたのですが、ハードウェア的な問題で今回は見送らせていただきました(涙)
また機会があれば挑戦したいと思います。

ちなみに私は普段コードばかり書いているのですが、今回の企画ではメンバの皆でワイワイと夏休みの工作をしている感じで楽しく作業させていただきました。
興味がある方はぜひ息抜きにやってみるといいかなと思います!

さて、このシリーズは全 6 回の予定となっています。
まだまだいろんなネタが出てきますのでお楽しみに!