본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 XD-58C 심박 Pulse 센서를 사용해서 심박수 BPM 확인해 보기

by 오마이엔지니어 2018. 5. 8.
반응형

Arduino Uno 로 XD-58C 심박 Pulse 센서를 사용해서 심장 박동수 (BPM) 와 심장 박동시간 (IBI) 그리고 신호 (SIG)
를 확인해 보는 프로젝트 입니다

심박 Pulse 센서란?
동물은 심장의 고동에 맞춰 혈액의 흐름이 강해졌다 약해졌다 변화합니다
펄스센서는 손가락끝, 귓볼 등의 미세혈관에 적외선을 보내고 반사되는 빛의 양을 감지해서
변화하는 혈액의 흐름에 따라서 변화하는 빛의 양을 측정하는 원리를 이용합니다
펄스센서 중앙부에 위치한 녹색 적외선 LED가 적외선을 방출하면 모세혈관에 의해 반사된 빛을
적외선 LED 아래 위치한 Detecter 가 측정합니다 

 

 

 

<XD-58C 심박 Pulse 센서 이미지>

 


<XD-58C 심박 Pulse 센서 핀맵>

테스트 에서는 위 이미지의 XD-58C 심박 Pulse 센서 호환 모듈 을 사용하였습니다

XD-58C 심박 Pulse 센서 호환 모듈은 저렴한 가격에 심박센서로만 구성되어 있습니다
벨크로 테입, 이어클립 등이 포함된 Sparkfun 정품 은 조금 더 편하게 테스트 가능합니다 정품의 구성품은 아래와 같습니다
손가락 끝이나 귓볼에 클립시키고 아두이노 등 마이크로 컨트롤 보드 3~5V 에 연결해서 간단하게 테스트 할 수 있습니다

문서자료

PulseSensor_Amped_Getting Started Guide.pdf

PulseSensorAmpd - Schematic.pdf


구성 배선도-BPM 확인해 보기

구성 배선도-BPM_IBI_SIG 확인해 보기

사용된 부품
아두이노 우노 (Italy)
XD-58C 심박 Pulse 센서

점퍼케이블
미니브래드 보드
막대저항 220 Ohm - 2개
5mm LED 적색, 녹색

사용된 예제파일

Getting_BPM_to_Monitor.ino
0.00MB
PulseSensor_BPM.ino
0.00MB

 

사용된 라이브러리

PulseSensorPlayground-master.zip

 


라이브러리 추가 방법은 Arduino IDE 설치하기 포스팅을 참조해 주세요

테스트방법
심박 Pulse 센서는 하트모양이 손가락이나 귓볼쪽으로 가게 부착해 줍니다

(테이프 등으로  박동수가 느껴질 만큼 적당한 압력이 생기게 고정해 줍니다)

위 첨부된 라이브러리를 설치해 줍니다
위 첨부된 ino 파일을 사용해도 되고 라이브러리 설치를 마쳤다면 아두이노 IDE 에서
파일--->예제--->PulseSensorPlayground-master--->examples--->Getting_BPM_to_Monitor
파일--->예제--->PulseSensorPlayground-master--->examples--->PulseSensor_BPM

순으로 클릭해서 테스트 해도 됩니다

첫번째 배선도의 BPM 만 확인해 보는 예제가 Getting_BPM_to_Monitor 입니다

두번째 배선도의 BPM_IBI_SIG 를 확인해 보는 예제가 PulseSensor_BPM 입니다

첫번째 Getting_BPM_to_Monitor 예제코드를 살펴보면
#include <PulseSensorPlayground.h> 라이브러리를 사용합니다
--------------------------------------------------------------------------------------------------------------------------------
//  Variables
const int PulseWire = 0;       // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13;          // The on-board Arduino LED, close to PIN 13.
int Threshold = 550;           // Determine which Signal to "count as a beat" and which to ignore.
                               // Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
                               // Otherwise leave the default "550" value.

--------------------------------------------------------------------------------------------------------------------------------
핀설정을 확인할 수 있습니다

--------------------------------------------------------------------------------------------------------------------------------
Serial.begin(9600);          // For Serial Monitor
--------------------------------------------------------------------------------------------------------------------------------
보드레이트 9600으로 테스트 합니다

--------------------------------------------------------------------------------------------------------------------------------
if (pulseSensor.sawStartOfBeat()) {            // Constantly test to see if "a beat happened".
 Serial.println("♥  A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
 Serial.print("BPM: ");                        // Print phrase "BPM: "
 Serial.println(myBPM);                        // Print the value inside of myBPM.
}

  delay(20);                    // considered best practice in a simple sketch.

 

}
--------------------------------------------------------------------------------------------------------------------------------
시리얼 모니터 출력부분과 딜레이 타임을 확인할 수 있습니다


두번째 PulseSensor_BPM 예제코드를 살펴보면
마찬가지로 #include <PulseSensorPlayground.h> 라이브러리를 사용합니다
--------------------------------------------------------------------------------------------------------------------------------
const int PIN_INPUT = A0;
const int PIN_BLINK = 13;    // Pin 13 is the on-board LED
const int PIN_FADE = 5;
const int THRESHOLD = 550;   // Adjust this number to avoid noise when idle
--------------------------------------------------------------------------------------------------------------------------------
핀설정을 확인할 수 있습니다

--------------------------------------------------------------------------------------------------------------------------------
Serial.begin(115200);
--------------------------------------------------------------------------------------------------------------------------------
첫번째 예제와는 통신 속도설정이 틀립니다, 두번째 PulseSensor_BPM 예제는 보드레이트 115200으로 테스트 해야 합니다

 

첫번째 예제로 심장 박동수 (BPM) 을 확인해 보았더니 휴식시 78 정도가 나왔습니다



두번째 예제로 휴식시 심장 박동수(BPM)_심장 박동시간(IBI) _ 신호(SIG) 를 확인해 보았습니다

위키백과의 휴식시 심박수 표를 참고해 보면 대략 평균, 평균이하 인것을 알 수 있네요 ㅜㅜ
저가형 센서라서 아주 정확하지는 않지만 이렇게 간단하게 아두이노 XD-58C 심박센서를 사용해서 

(BPM) 와 심장 박동시간 (IBI) 그리고 신호 (SIG) 를 측정해 볼수 있습니다

프로젝트 동영상-
BPM 확인해 보기



프로젝트 동영상-BPM_IBI_SIG 확인해 보기

 

위 예제 말고도 PulseSensorPlayground 에서 다양한 예제를 제공하고 업데이트도 하고 있는것 같습니다
https://github.com/WorldFamousElectronics/PulseSensorPlayground


이어서 추가로 0.96 I2C OLED 에 BPM (심장박동수) 을 출력해 보고 BPM 에 맞춰 부저를 올려보는 프로젝트입니다

구성 배선도-0.96 I2C OLED에 BPM 출력해 보기

사용된 라이브러리

Adafruit_BusIO-master.zip
0.02MB
Adafruit_SSD1306-master.zip
0.04MB
Adafruit-GFX-Library-master.zip
0.33MB

위 3가지 라이브러리 필수로 설치가 필요합니다
기존의 Adafruit 라이브러리가 설치되어 있다면 삭제하고 위 첨부된 라이브러리를 다운로드해서
테스트할 것을 권장합니다
(라이브러리는 여러가지 버전이 있기 때문에 정상적으로 컴파일 되지 않을수 있으며
폰트도 추가로 포함되어 있기 때문입니다)
특히 Adafruit_SSD1306 라이브러리중 Adafruit_SSD1306.h 을 열어서 

#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16  ///< DEPRECATED: old way to specify 96x16 screen

위 부분 꼭 128_64 로 위 처럼 세팅 되어있는지 확인해 주어야 합니다 (위 첨부파일은 수정해 놓았습니다)
기본 SSD1306 라이브러리는 128_32 로 세팅 되어 있습니다

사용된 예제파일

Pulse_128x64 OLED.txt
0.00MB

예제코드를 살펴보면
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306.h 라이브러리를 사용합니다
#define OLED_Address 0x3C
0.96 I2C OLED 기본 디폴트 I2C 주소는 0x3C 입니다
Adafruit_SSD1306 oled(128, 64); 
128x64 해상도 세팅입니다

void loop()
{
if(a>127)
{
oled.clearDisplay();
a=0;
lasta=a;
}
 
ThisTime=millis();
int value=analogRead(0);
oled.setTextColor(WHITE);
int b=60-(value/16);
oled.writeLine(lasta,lastb,a,b,WHITE);
lastb=b;
lasta=a;
A0 아날로그 센서 값을 읽어와서 OLED에 출력해 줍니다

BPM=ThisTime-LastTime;
BPM=int(60/(float(BPM)/1000));
BPMTiming=false;
BeatComplete=false;
tone(8,1000,250);
BPM에 맞춰서 부저도 출력 됩니다

프로젝트 동영상-0.96 I2C OLED에 BPM 출력해 보기

PulseSensor_Amped_Getting Started Guide.pdf
3.19MB
Getting_BPM_to_Monitor.ino
0.0MB
PulseSensorAmpd - Schematic.pdf
0.02MB
PulseSensorPlayground-master.zip
1.44MB
PulseSensor_BPM.ino
0.0MB
반응형

댓글