4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

U-Tokyo mech (東京大学機械系)Advent Calendar 2018

Day 7

Raspberry Piで心拍センサの値を読み取る

Last updated at Posted at 2018-12-06

初投稿です. 今日からスマブラspが始まるのでこれが最後の投稿になります.
ラズパイで心拍センサの情報を読み取ります.

###準備するもの

  • Rapberry Pi 3 Model B
  • 心拍センサ
  • MCP3008(ADコンバータ)
  • ブレッドボード
    ジャンパワイヤ

###配線
このサイトをそのまま使用.

肝心の心拍センサが映ってなくてすいません...

###SPI
このサイトの通りpy-spidevをインストールする(ラズパイ上でSPI driverを有効にしておく必要あり).

$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install

###サンプルプログラム
以下のPythonファイルを作成.

pulse.py
#!/usr/bin/python
#coding: utf-8
import spidev
import time
import sys

Vref = 3.3
Criteria = 530 

#spiパスへのアクセスを開く
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz =  1350000

adc_channel = 0
delay = 0.01

f = open('pulse.dat', 'w')
pulse = 0
digital = 0.0
index = 0

#ADコンバータからSPIデータの読み込み
def ReadChannel(channel):
    adc = spi.xfer2([1, (8+channel)<<4, 0])
    data = ((adc[1]&3)<<8) + adc[2]
    return data

try:
    while True:
        #心拍センサの値読み取り
        analog_level = ReadChannel(adc_channel)
        
        #値がいったん基準を超え、次に基準を下回った瞬間に"pulse"を出力
        if(analog_level == 0):
            time.sleep(delay)
            continue

        if((analog_level < Criteria) and (pulse == 1)):
            print("Pulse")
           
        if (analog_level < Criteria):
            pulse = 0
        else:
            pulse = 1

        #値を電圧[V]に変換
        digital = analog_level * Vref / float(1023)
        
        data = "{} {} {} \n".format(index, analog_level, digital)
        f.write(data)
        time.sleep(delay)
        index += 1

except KeyboardInterrupt:
    print("Exit")
    f.close()

コマンドプロンプトで実行. 拍動に合わせて"Pulse"と出力されれば成功です.
datファイルに書き込んでいますが今回は使用していません.

$ python pulse.py
ちょうど緑の丸のタイミングで"Pulse"と出力されるイメージです ※この写真はイメージであり今回ラズパイを使って出したグラフではありません(別のタイミングでArduinoでとったデータから作成したグラフです)

###補足
先ほどのpulse.pyで書いた以下の文

spi.max_speed_hz =  1350000

最初はこれを書かずに実行するとMCP3008から値が読み取れませんでした. こちらのサイトを読み上の文を付け加えると上手く値を読み取ることができましたが, 読み取れなかった原因は不明です.

data = ((adc[1]&3)<<8) + adc[2]

この謎の文の意味についてはこちらのサイトに詳しく書かれています. ADコンバータを用いる際に頻繁に出てくるコードなので勉強になりました.

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?