아두이노2016. 6. 26. 16:53

병원이 나오는 드라마나 영화를 보면 입원실 또는 수술실 환자의 심박수를 측정하고 모니터링 하는 장비가 있습니다. 심장박동이 그래프로 나타나기도 하고 BPM을 보여주기도 합니다. 그러다가 심박수가 떨어지거나 멈추면 경고음을 내거나 하는 경우도 있죠. 이런 비슷한 장치를 아두이노와 심박센서(Pulse Sensor)를 이용해서 만들 수 있습니다. 


이미지 출처: http://www.medicalpointindia.com/cariac-5paramonitor.htm

바로 이런 장치인데 심장박동뿐 아니라 혈압, 체온 등 여러가지 바이탈 사인(Vital Sign)을 보여주는 장치 입니다. 이런 비슷한 화면을 PC로 출력해 보는 것입니다.


'심장박동 센서의 사용 1편' 글에서는 시리얼 모니터에 데이터를 나타냈지만 이 데이터를 Processing 이라는 소프트웨어를 통해서 시각화 해서 보여주는 것입니다. 프로세싱(Processing)에 대해서는 예전에 한 번 저의 블로그에서 다룬 적이 있습니다. 바로 6축 자이로 센서의 사용 이라는 글에서 프로세싱에 대해서 상세하게 알아 보았었습니다. 그러므로 이 글에서는 심박센서와 프로세싱에 대해서는 자세히 다루지는 않겠습니다. 대신 아래의 링크를 먼저 참고 하시면 더욱 이해하기가 쉬울 것 입니다.



■ 연결 및 준비

아두이노와 심박센서의 연결은 1편에서 연결한 것과 같습니다. 아래와 같이 연결하면 됩니다.


 심장박동 센서

 아두이노 UNO

 Signal

 A0

 VCC

 5V

 GND

 GND



심박 데이터를 비주얼화 시켜줄 프로세싱 프로그램을 다운로드 받아서 설치해야 합니다.


Processing 다운로드 페이지의 모습입니다. 윈도우, 맥, 리눅스 모두 지원이 되니 자신의 OS에 맞는 소프트웨어를 다운로드 받으면 됩니다.  https://processing.org/download/?processing 이동해서 다운로드 받습니다. 


윈도우의 경우 별도의 설치과정은 없으며 압축을 풀고 폴더를 적절한 위치로 이동한 후  Processing.exe 를 실행하면 됩니다.


 


■ 소스

소스는 1편에서 아두이노에 업로드 했던 소스와 같습니다. 다만 시리얼 모니터에서 심박수를 제대로 보기 위해서 원래의 소스에서 변경했던 부분을 다운로드 당시의 소스로 원복해야 합니다.


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
 
/*  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 = false;   // 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(20);                             //  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

위와 같이 원복해 주었습니다. 28행의 serialVisual 값을 false 로 바꾸어 주었고, 57행의 delay 값을 20으로 변경해 주었습니다. 소스를 새로 다운 받으신 분은 그냥 아무 수정 없이 아두이노에 업로드 하면 됩니다.


소스의 다운로드는 아래의 URL 에서 다운로드 받으면 됩니다. 소스를 받아서 압축을 풀고 아두이노 IDE 에서 파일 -> 열기를 눌러서 'PulseSensorAmped_Arduino_1dot4.ino' 파일을 열어서 아두이노에 업로드 하면 됩니다.


https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino

PulseSensor_Amped_Arduino-master.zip



이제 프로세싱의 소스를 다운로드 받아야 합니다.


아래의 URL에 들어가서 Pulse Sensor Visualizer 라는 프로그램을 다운로드 받습니다.

https://github.com/WorldFamousElectronics/PulseSensor_Amped_Processing_Visualizer

PulseSensor_Amped_Processing_Visualizer-master.zip



Download ZIP 을 눌러서 소스를 다운로드 받아 줍니다.


다운 받은 파일을 문서 -> Processing 폴더에 넣어 주었습니다. 아무 위치나 상관없지만 구분을 위해서 이렇게 해 주었습니다.


압축을 풀어 주었습니다.


프로세싱을 실행하고 파일 -> 열기를 하고 좀 전에 프로그램을 복사했던 위치로 들어가면 위와 같이 4개의 PDE 파일이 있습니다. 이 중에서 'PulseSensorAmpd_Processing_1dot1.pde' 를 열어 줍니다.


'PulseSensorAmpd_Processing_1dot1.pde' 소스 입니다. Java 로 짜여져 있습니다.


실행버튼 (▶ 모양) 을 눌러서 실행해 봅니다. 당연한 이야기지만 소스가 업로드된 심박센서를 연결한 아두이노가 PC에 연결되어 있어야 합니다. 그런데 위와 같이 소스에서 에러가 나고 동작이 되지 않습니다. 시리얼 포트를 찾는 부분에서 Array Index out of bounds 에러가 나네요. 잘 될 수도 있으나 저와 같이 에러가 나는 분들은 아래의 사항을 따라하면 됩니다.


에러가 발생한 코드 입니다. 59행 입니다. 'Serial.list()[9]' 을 'Serial.list()[0]' 으로 수정해 줍니다.


위와 같이 에러가 난 코드를 수정 하고 저장 후 다시 실행 버튼을 눌러 봅니다. 


시리얼 포트를 잘 찾고 잘 되네요. 왼쪽에 그래프로 심박수의 변화를 볼 수 있으며 하트 표시로 심박수가 BPM 으로 표시가 됩니다.


프로세싱에 비주얼하게 표시되는 저의 심박수의 변화를 동영상으로 캡쳐해 봤습니다. 



이상으로 프로세싱(Processing)을 이용해서 심장박동 센서의 값을 비주얼하게 표시해 보았습니다. 심장 건강을 위해서 운동 열심히 해야 겠네요. ^^



반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. z5412x

    안녕하세요!아두이노와 프로세싱에 대해 질문이있습니다 위에 올려주신대로 했는데 연동이 잘되지않습니다
    Firmata로 연동을 했는데 전혀 변화가 없습니다. 심장박동 센서의 사용 #1 은 제대로 실행이되었는데
    연동에 대해 ㅜㅜ 설명을 해주시면 감사하겠습니다. 연동하는 과정에서 뭘 더 추가하신것이 있나요 ?
    연동할때의 코드를 보여주시거나 ㅜㅜ알려주시면 꼭좀 감사하겠습니다. ㅜㅜㅜㅜ

    2016.12.14 11:56 [ ADDR : EDIT/ DEL : REPLY ]
  2. z5412x

    아 그리고 한가지 더 여쭤보고 싶은게 있는데 Firmata 예제 파일과 연동을 시켜야 하나요? StandardFirmata예제를 업로드했는데도 오류가 납니다 ㅜㅜ 이예제를 활용하는것이 맞는지도 궁금하고 오류는 disableI2CPins(); 이부분에서 나는데 ..

    이 심장박동 센서만 연동시키면 됩니다 ㅠㅠㅠ 위의 동영상처럼 하고 싶은데 전혀 되질 않고있습니다 ㅠㅠ

    아두이노를 시작한지 얼마안된 대학생입니다 ㅠㅠㅠㅠㅠ도와주시면 감사하겠습니다 ㅠㅠ

    2016.12.14 12:04 [ ADDR : EDIT/ DEL : REPLY ]
    • 우선 firmata, 저는 아직 안해봤습니다. 그래서 모릅니다. 위의 과정에서 더 추가한것은 없습니다.

      2016.12.14 20:22 신고 [ ADDR : EDIT/ DEL ]