心拍センサーを使って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回の予定となっています。
まだまだいろんなネタが出てきますのでお楽しみに!