아두이노2016. 6. 26. 14:23

아두이노의 센서 중에 심장박동을 측정할 수 있는 센서가 있습니다. 손가락 등 몸에 부착하면 심장박동과 심장박동수(Heart Rate, BPM - Beats Per Minute)를 측정할 수 있는 센서 입니다. 이 센서는 말 그대로 심장박동수를 관찰하는 기기를 만들 수 있으며 블루투스, 와이파이 모듈 등과 연동하면 스마트폰 등과 연동해서 건강관리 기능을 하는 앱을 만들 수도 있습니다. 심장박동으로는 심장의 이상, 부정맥 등의 질병을 진단할 수 있습니다. 아래 표는 위키피디아 에서 발췌한 자료로서 휴식기 기준 심박수 기준 데이터라고 합니다. 저도 한 번 측정해 봐야 겠네요.

 

남성나이
18–2526–3536–4546–5556–6565+
운동선수49–5549–5450–5650–5751–5650–55
뛰어남56–6155–6157–6258–6357–6156–61
좋음62–6562–6563–6664–6762–6762–65
평균 이상66–6966–7067–7068–7168–7166–69
평균70–7371–7471–7572–7672–7570–73
평균 이하74–8175–8176–8277–8376–8174–79
나쁨82+82+83+84+82+80+

여성나이
18–2524–3536–4546–5556–6565+
운동선수54–6054–5954–5954–6054–5954–59
뛰어남61–6560–6460–6461–6560–6460–64
좋음66–6965–6865–6966–6965–6865–68
평균 이상70–7369–7270–7370–7369–7369–72
평균74–7873–7674–7874–7774–7773–76
평균 이하79–8477–8279–8478–8378–8377–84
나쁨85+83+85+84+84+85+


위의 표를 보고 이 센서가 아니더라도 자신의 심박수를 체크할 수 있는 장치가 있다면 건강체크를 해 보는 것도 좋을 것 같습니다.

센서의 뒷면 입니다. 3개의 단자가 있으며 Signal, VCC (5V), GND 로 이루어져 있습니다. 연결선은 구입 시부터 납땜되어 붙어 있습니다. 아두이노에 바로 연결하면 됩니다.


심박 감지부 입니다. 가운데 LED 에서 밝은 녹색의 빛이 나오고 바로 아래 반사되는 빛을 감지하는 빛 감지 센서가 있습니다. 심장박동 시 혈류가 증가하면 반사되는 빛의 양이 줄어드는 점을 이용해서 심박을 측정 합니다. 자세한 원리는 [여기] 에 가보시면 설명이 되어 있습니다. 고로 손가락, 귀 등 심박에 따라 혈류의 변화가 잘 보이는 부위에서 더욱 잘 작동 합니다.


심박센서의 원리, 출처: http://www.raviyp.com/embedded/140-learn-how-a-heart-beat-sensor-works

 

이 센서는 특이하게도 별도의 웹사이트가 존재 합니다. http://pulsesensor.com/ 라는 사이트 인데요. 여기에서 센서의 정보 및 사용법에 대한 많은 정보를 얻을 수 있습니다. 이 사이트에 링크되어 있는 GitHub 의 예제를 실행해 보겠습니다.

■ 연결
연결은 간단 합니다. Signal 은 아날로그 Input 단자인 A0 에 연결하고 VCC 는 5V에 GND는 GND에 연결하면 됩니다. 그리고 심박의 관찰을 위해 D13에 LED를 하나 연결 합니다. 하지만 LED는 굳이 연결하지 않아도 됩니다. 아두이노 자체에 13번 LED가 달려 있으니까요. 그리고 소스를 보면 주석에 D5 에 LED를 하나 더 달아주라고 되어 있는데 무엇 때문인지 모르겠지만 저의 경우는 계속 켜져있기만 하고 제대로 작동하지 않네요.

 심장박동 센서

 아두이노 UNO

 Signal

 A0

 VCC

 5V

 GND

 GND


 
■ 소스
소스는 아래의 사이트에서 다운로드 받을 수 있습니다. Download ZIP 을 클릭해서 다운로드 받습니다.

PulseSensor_Amped_Arduino-master.zip



압축을 풀면 위와 같이 4개의 소스가 나오는데 라이브러리화가 되어 있지 않아서 PulseSensorAmped_Arduino_1dot4.ino 이외에는 참조파일들 입니다. 즉, 4개의 소스가 하나의 폴더에 있어야 작동이 됩니다.


파일 -> 열기를 눌러서 PulseSensorAmped_Arduino_1dot4.ino 를 열어 줍니다. 


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
 
/*  Pulse Sensor Amped 1.4    by Joel Murphy and Yury Gitman   http://www.pulsesensor.com
----------------------  Notes ----------------------  ---------------------- 
This code:
1) Blinks an LED to User's Live Heartbeat   PIN 13
2) Fades an LED to User's Live HeartBeat
3) Determines BPM
4) Prints All of the Above to Serial
Read Me:
https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino/blob/master/README.md   
 ----------------------       ----------------------  ----------------------
*/
 
//  Variables
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin
 
// Volatile Variables, used in the interrupt service routine!
volatile int BPM;                   // int that holds raw Analog in 0. updated every 2mS
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // int that holds the time interval between beats! Must be seeded! 
volatile boolean Pulse = false;     // "True" when User's live heartbeat is detected. "False" when not a "live beat". 
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.
 
// Regards Serial OutPut  -- Set This Up to your needs
static boolean serialVisual = true;   // Set to 'false' by Default.  Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse 
 
 
void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS 
   // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE, 
   // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
//   analogReference(EXTERNAL);   
}
 
 
//  Where the Magic Happens
void loop(){
  
    serialOutput() ;       
    
  if (QS == true){     // A Heartbeat Was Found
                       // BPM and IBI have been Determined
                       // Quantified Self "QS" true when arduino finds a heartbeat
        fadeRate = 255;         // Makes the LED Fade Effect Happen
                                // Set 'fadeRate' Variable to 255 to fade LED with pulse
        serialOutputWhenBeatHappens();   // A Beat Happened, Output that to serial.     
        QS = false;                      // reset the Quantified Self flag for next time    
  }
     
  ledFadeToBeat();                      // Makes the LED Fade Effect Happen 
  delay(1000);                             //  take a break
}
 
void ledFadeToBeat(){
    fadeRate -= 15;                         //  set LED fade value
    fadeRate = constrain(fadeRate,0,255);   //  keep LED fade value from going into negative numbers!
    analogWrite(fadePin,fadeRate);          //  fade LED
  }
cs

위와 같이 소스가 나오는데 원래 소스에서 수정해준 부분은 29행의 static boolean serialVisual = true; 부분 입니다. Default 는 false 로 되어 있습니다.  그리고 측정 속도가 너무 빨라서 58행의 delay 값을 200 에서 1000으로 높여 주었습니다. 이렇게 설정해주면 자신의 심박수를 시리얼 모니터를 통해서 볼 수 있습니다.

저의 심박수를 측정한 결과 입니다. 대략 80 정도를 유지하고 있네요. 위의 정상 심박수 결과와 비교해보니 평균 이하의 값 입니다. 운동을 열심히 해야 겠네요. ㅠㅠ 측정 결과값은 1분 정도는 지나야 제대로 나오는 것 같습니다. 처음에는 심박수가 너무 높게 나오는 경향이 있네요.


이 동영상은 심장박동에 따라서 LED까 깜빡이는 모습 입니다. D5 에 연결된 LED 는 작동하지 않네요. 원인은 모르겠습니다. 소스를 좀 더 들여다봐야 할 듯 합니다.


원래는 이렇게 작동되어야 합니다.



이상으로 심장박동 센서(심박센서)의 기본적인 원리와 활용에 대해서 알아보았습니다. 다음 글에서는 이 센서를 활용해서 좀 더 비주얼하게 심장박동을 보여주는 방법을 알아보려고 합니다.




■ 추가사항 (2016년 11월 5일) : 위의 글에 보면 D5에 연결된 LED 가 제대로 동작하지 않는다는 언급이 있다. 이에 대해 어느 분이 댓글을 달아주셨는데 delay(1000) 으로 임의로 변경한 부분을 delay(20)으로 변경하면 정상적으로 작동이 된다고 한다. 현재 직접 연결해서 테스트는 못 해 본 상태.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 아두이노:1.6.11 (Windows 10), 보드:"Arduino/Genuino Uno"

    C:\Users\諛⑹뵪\Documents\Arduino\PulseSensorAmped_Arduino_1dot4\PulseSensorAmped_Arduino_1dot4.ino: In function 'void setup()':

    PulseSensorAmped_Arduino_1dot4:37: error: 'interruptSetup' was not declared in this scope

    C:\Users\諛⑹뵪\Documents\Arduino\PulseSensorAmped_Arduino_1dot4\PulseSensorAmped_Arduino_1dot4.ino: In function 'void loop()':

    PulseSensorAmped_Arduino_1dot4:47: error: 'serialOutput' was not declared in this scope

    PulseSensorAmped_Arduino_1dot4:54: error: 'serialOutputWhenBeatHappens' was not declared in this scope

    PulseSensorAmped_Arduino_1dot4:58: error: 'ledFadeToBeat' was not declared in this scope

    C:\Users\諛⑹뵪\Documents\Arduino\PulseSensorAmped_Arduino_1dot4\AllSerialHandling.ino: In function 'void serialOutput()':

    AllSerialHandling:10: error: 'arduinoSerialMonitorVisual' was not declared in this scope

    AllSerialHandling:12: error: 'sendDataToSerial' was not declared in this scope

    C:\Users\諛⑹뵪\Documents\Arduino\PulseSensorAmped_Arduino_1dot4\AllSerialHandling.ino: In function 'void serialOutputWhenBeatHappens()':

    AllSerialHandling:25: error: 'sendDataToSerial' was not declared in this scope

    exit status 1
    'interruptSetup' was not declared in this scope

    이 리포트는 파일 -> 환경설정에 "컴파일중 자세한 출력보이기"를
    활성화하여 더 많은 정보를
    보이게 할 수 있습니다.

    똑같이 했는데 오류가뜨네요.... 왜이러는걸까요

    2016.10.15 15:34 [ ADDR : EDIT/ DEL : REPLY ]
    • 모든소스가 한 폴더에 있는지
      소스의 경로에 한글폴더명이 있는지 확인해 보세요. 위에 보니까 경로명에 이상한 문자가 있네요

      2016.10.15 15:48 신고 [ ADDR : EDIT/ DEL ]
  3. 안녕하세요

    심박수 정보만 실시간으로 빼서 다른 함수에 사용하고싶은데 어떻게하면 될까요?

    2016.10.15 16:07 [ ADDR : EDIT/ DEL : REPLY ]
  4. 그리고 소스를 보면 주석에 D5 에 LED를 하나 더 달아주라고 되어 있는데 무엇 때문인지 모르겠지만 저의 경우는 계속 켜져있기만 하고 제대로 작동하지 않네요.->그리고 측정 속도가 너무 빨라서 58행의 delay 값을 20 에서 1000으로 높여 주었습니다. 이렇게 설정해주면 자신의 심박수를 시리얼 모니터를 통해서 볼 수 있습니다. => delay값을 처음의 20으로 두면 LED가 영상처럼 작동합니다!

    2016.11.04 21:20 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 헉 그랬었군요. 감사합니다. 참고하겠습니다.

      2016.11.05 13:56 신고 [ ADDR : EDIT/ DEL ]
    • delay가 측정되는것을 보여주는 것만 해당하는건줄 알았는데(저는) 측정을 1초 단위로 하는 명령이라 led에 명령이 안먹은건가요?

      2016.11.14 03:12 신고 [ ADDR : EDIT/ DEL ]
  5. 비밀댓글입니다

    2016.11.04 23:16 [ ADDR : EDIT/ DEL : REPLY ]
  6. 검색글

    안녕하세요 요번에 학교에서 아두이노 아이디어로 심박센서를 준비하려는 학생입니다.

    제가 구상한 아이디어로는 무선 블루투스로 심박센서를 이용해서 브로치를 만드려구 하는데요

    브로치에 심장박동 bpm 기본 수치를 적용시킨뒤 기본수치에서 많이 벗어날 경우에 벨이 울리는 방식으로 만드려고 하는데, 블루투스는 이 브로치를 착용하고 있는 사람의 심장박동수를 관찰하는 역할로 하구요

    현재 저는 아두이노를 처음시작하는 아두이노의 아자도 모르는 초보입니다.

    이 홈페이지에서 정말 많은 도움을 얻고싶은데 조언좀 해주시면 감사하겠습니다!

    1~2주만에 간단하게 만들수 있는지도 알려주시면 감사하겠습니다!

    2016.12.01 18:33 [ ADDR : EDIT/ DEL : REPLY ]
    • 아두이노의 '아'자도 모르는데 어떻게 프로젝트를 진행하려 하시나요? 아두이노 책을 한 권 사거나 도서관에서 빌려서 기초를 먼저 배우시길 바랍니다. 말씀하신 기능은 그닥 어렵지 않게 구현이 가능할수도 있을것 같네요

      2016.12.01 18:50 신고 [ ADDR : EDIT/ DEL ]
  7. 스피드쿠퍼

    안녕하세요 아두이노 개발중인 대학생입니다
    펄스센서를 사용해서 시리얼모니터와 프로세싱으로 그래프 파형이 동시에 보이게 할수는 없나요?
    시리얼모니터를 보기위해 여기 올려주신 코딩 사용해서 그래프 파형을 보려하면 프로세싱 프로그램이 작동을 않하네요;;;

    2016.12.03 19:07 [ ADDR : EDIT/ DEL : REPLY ]
    • 시리얼 통신은 하나의 커넥션만 가능한걸로 압니다. 그래서 프로세싱에 데이터를 보내면 시리얼모니터는 사용이 안될겁니다. 프로세싱에서 해결하는 방법으로 수정해 보세요.

      2016.12.05 00:47 신고 [ ADDR : EDIT/ DEL ]
  8. khk414

    블루노 나노와 심박센서를 연결해서 손목으로 측정하는데 값이 너무 튀는데요 이거 해결할수 있는 방법 없을까요?

    웨어러블로 전원공급은 베터리팩을 사용하고 바로 GND와 A0에 연결시켯는데 손목에 착용시키니까 값이 너무 정신없이 튀네요

    이 페이지에서 나온 모습으로 측정할땐 크게 값이 안튀는데 손목에 착용하는 밴드형태로 만드니까 심박 값이 너무 튀는데 방법없을까요?

    2017.02.13 22:49 [ ADDR : EDIT/ DEL : REPLY ]
    • 저도 위의것만 해봐서 뭐라 말하기 어렵지만 센서의 고정이 중요하지 않을까 싶네요.

      2017.02.14 09:02 신고 [ ADDR : EDIT/ DEL ]
  9. 질문있습니다

    라즈베리파이에서도 다 작동가능한가요??

    2017.06.06 23:54 [ ADDR : EDIT/ DEL : REPLY ]
  10. 비밀댓글입니다

    2017.07.09 18:21 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 전 알리익스프레스에서 구입했습니다.
      그런데 찾아보면 국내 쇼핑몰에도 있을 겁니다

      2017.07.09 18:30 신고 [ ADDR : EDIT/ DEL ]
  11. 미소천사

    전 아두이노를 학교에서 배우고 있는 학생입니다. 저는 이 센서를 사용하여 맥박 수치가 평균 이상이거나 이하일 경우 블루투스를 이용해 핸드폰으로 전송되는 프로그램을 만들고 싶은데 어떻게 하면될까요??

    2017.08.09 19:50 [ ADDR : EDIT/ DEL : REPLY ]
    • 맥박수치를 블루투스로 핸드폰 전송하는 프로그램을 만들면 됩니다. ^^;;

      2017.08.09 21:32 신고 [ ADDR : EDIT/ DEL ]
  12. 비밀댓글입니다

    2017.11.30 14:28 [ ADDR : EDIT/ DEL : REPLY ]
  13. 비밀댓글입니다

    2018.05.15 02:54 [ ADDR : EDIT/ DEL : REPLY ]
    • 소스코드는 없습니다 다만 저의 블로그에서 블루투스 모듈 HC-06 검색하시면 쉽게 데이터 연동이 가능 합니다. 어렵지 않아요...

      2018.05.15 11:09 신고 [ ADDR : EDIT/ DEL ]
  14. 대학생

    이 센서는 릴리패드에서도 작동이 가능한가요..?
    만약 가능하다면 SIGNAL, VCC, GND는 어디에 릴리패드의 어느부분에 연결해야 할까요? ㅜㅜ

    2018.06.14 18:09 [ ADDR : EDIT/ DEL : REPLY ]
  15. cmc

    위의 과정대로 심박센서를 검지손끝이나 귓볼 등 다양한 부위에서 수행해봤는데 값이 점차올라가다가 235-237사이의 값만 출력됩니다
    절연테이프로 다른 빛을 차단하고 했는데도 235-237사이의 값만출력되는데 혹시 저랑 같은 경험을 하신적이 있나요???

    2018.12.18 21:04 [ ADDR : EDIT/ DEL : REPLY ]
  16. 비밀댓글입니다

    2019.05.16 07:26 [ ADDR : EDIT/ DEL : REPLY ]
  17. 비밀댓글입니다

    2019.09.20 17:45 [ ADDR : EDIT/ DEL : REPLY ]
  18. 비밀댓글입니다

    2019.09.20 19:23 [ ADDR : EDIT/ DEL : REPLY ]
    • esp32 자체가 인터넷이나 블루투스 통신이 가능하므로 이를 응용하면 가능할 겁니다. 물론 인터넷에서 전화, 문자 등과 연동하는건 고민해 보셔야죠.

      2019.09.20 20:09 신고 [ ADDR : EDIT/ DEL ]
  19. 비밀댓글입니다

    2019.11.25 15:52 [ ADDR : EDIT/ DEL : REPLY ]
    • 윗 글과 같이 빛이 새어나가지 않게 검은 테이프로 감아준다거나 하면 좀 나아질겁니다

      2019.11.25 16:09 신고 [ ADDR : EDIT/ DEL ]
  20. 졸업시켜주세요교수님

    안녕하세요,혹시 한가지 질문드려도 될까요?
    저희도 지금 심박수를 측정해서 이 수치들을 모으고자 하는데,
    만약에 이 아두이노 기기를 웨어러블 형태로 차고 밖에 있는 상태에서
    값을 알고 싶다면 와이파이쪽 관련 ESP8266칩셋 이런쪽을 추가로 넣어야하나요?
    아니면 말씀하신 기존 센서만으로도 할 수 있나요?
    아두이노 관련 제작은 처음이라 막막해서 도움얻고자 댓글달아봅니다...ㅠㅠ

    2021.04.06 23:08 [ ADDR : EDIT/ DEL : REPLY ]
    • esp8266을 쓴다면 아두이노는 필요 없습니다. 심박센서를 바로 esp8266에 연결하고 와이파이 연결을 통해 수치를 전송하면 되니까요.

      2021.04.07 07:03 신고 [ ADDR : EDIT/ DEL ]
  21. yh

    안녕하세요 질문드립니다. led는 달지 않았는데 다른건 똑같이하고 실행을 하면 처음엔 50정도롤 나오다가 몇초지나면 200정도로 오르더니 수치가 계속 정상화가 안되네요 무슨 문제일까요?

    2021.07.10 12:16 [ ADDR : EDIT/ DEL : REPLY ]