반응형

병원이 나오는 드라마나 영화를 보면 입원실 또는 수술실 환자의 심박수를 측정하고 모니터링 하는 장비가 있습니다. 심장박동이 그래프로 나타나기도 하고 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)을 이용해서 심장박동 센서의 값을 비주얼하게 표시해 보았습니다. 심장 건강을 위해서 운동 열심히 해야 겠네요. ^^



반응형
반응형

MPU-6050 은 6축 (X,Y,Z축 자이로스코프-기울기 + 3축 가속도) 를 측정해 주는 센서 입니다.  여러곳에 사용이 되지만 요즘은 드론의 자세 제어용으로 많이 사용이 됩니다. 통신은 I2C 통신을 지원합니다. 스마트폰에도 이런 자이로 센서가 들어있어서 폰을 세로로 들거나 가로로 들게되면 자이로 센서가 그것을 감지해서 화면의 표시 방법을 다르게 합니다. 또 게임 같은데도 이용이 되는데 스마트폰으로 레이싱 게임을 할 때 스마트폰을 기울이면 자동차가 커브를 도는 것도 이런 센서를 이용하는 것입니다.  전자식 자이로 센서는 코리올리 힘을 측정하여 전기신호로 변환하고 힘에 대한 각속도를 계산한다고 합니다.  이 각속도의 변화를 이용하여 기울기를 측정하게 된다고 하는데... 이 코리올리의 힘이 궁금한 분은 밑줄 친 부분을 클릭해 보시면 됩니다. 조금 읽어봤는데 저는 어려워서 잘 모르겠습니다. ^^;  가속도는 중력가속도의 변화를 이용하여 측정 합니다.


MPU-6050 칩의 핀배열 및 자이로 및 가속도 센서 작동 원리 입니다. 이런류의 센서를 MEMS 센서라고 부릅니다. MEMS 는 Micro Electro Mechanical Systems 의 약자 입니다. 말 그대로 미세전자기계시스템으로서 전자와 기계가 결합한 센서라고 할 수 있겠습니다. 초고밀도 집적회로와 미세기계, 마이크로 크기의 모터와 미세기어 등도 MEMS에 해당 됩니다.


▲ 자이로 센서와 MEMS 에 대한 동영상 입니다. 가로 세로 5mm 크기의 MPU-6050 칩을 뜯어보면 위와 같은 초미세 기계장치가 들어 있을 것입니다.


■ MPU-6050 데이터시트

MPU-6050_DataSheet_V3 4.pdf


MPU-6050 모듈은 위와 같이 생겼습니다. 모듈의 가운데 가로세로 5mm 정도 되는 MPU-6050 칩이 붙어 있습니다. 모듈은 구입 시 직선형, ㄱ자형의 2가지 커넥터를 제공합니다. 커넥터 핀의 납땜은 자신이 해야 합니다. 간격이 좁으므로 옆의 단자와 합선되지 않도록 조심해서 납땜해 줍니다.


아두이노 우노와 연결한 모습 입니다. 연결은 다음과 같이 하였습니다. 참고로 모듈은 3.3V 나 5V 어디에 연결해도 상관이 없습니다. 


 MPU-6050 모듈

아두이노 우노 

 VCC

5V 

 GND

 GND

 SCL

 A5

 SDA

 A4

 INT

 D2








위와 같이 연결을 하고 MPU6050 라이브러리와 I2C 통신을 위한 라이브러리를 아두이노 라이브러리 폴더에 복사해서 설치 합니다. 


■ MPU-6050 라이브러리

MPU6050.zip


■ I2C Dev 라이브러리

I2Cdev.zip



라이브러리를 설치하면 위와 같이 MPU6050_DMP6 라는 예제가 나옵니다. 예제를 열어서 업로드 해 봅니다. DMP 는 Digital Motion Processing 의 약자 입니다.


소스를 실행하고 시리얼모니터를 연 다음 전송값에 아무것이나 입력하고 전송버튼을 누르면 실행이 됩니다.  그러면 위와 같이 X,Y,Z 축에 대한 기울기 값이 센서에서 쏟아져 나옵니다. 너무 빨리 값이 나와서 하나 하나 보기는 힘들지만 센서를 움직이면 값이 변한다! 는 사실은 알게 되었습니다.


그런데 위와 같이 쏟아져 나오는 값들을 비주얼하게 보여줄 수 있는 툴이 있습니다. 바로 Processing 이라는 툴인데 이런 데이터들을 간편하게 비주얼화 해주는 것이라고 보면 되겠습니다. 아래와 같이 IDE 가 따로 있어서 설치해 주고 사용하면 됩니다. 



▲ Processing 소개 동영상



그래서 이번에는 MPU-6050 의 데이터를 Processing 을 이용해서 비주얼하게 표시해 보도록 하겠습니다.


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


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


먼저 Processing 라이브러리를 하나 설치해야 합니다. toxi 라이브러리를 아래에서 다운로드 받거나 다운로드 URL 에서 다운로드 받습니다.


■ toxi 라이브러리 다운로드

toxiclibs-complete-0020.zip


■ toxi 라이브러리 다운로드 URL : https://bitbucket.org/postspectacular/toxiclibs/downloads/toxiclibs-complete-0020.zip


다운로드 받은 라이브러리의 압축을 풀면 'toxiclibs-complete-0020' 라는 이름의 폴더가 나옵니다. 이것을 위의 그림과 같이 Processing 의 기본 라이브러리 폴더인 '내문서 -> Processing -> Libraries' 에 복사해 넣으면 됩니다. 그러면 일단 Processing 에서 라이브러리 설치는 끝난 것입니다.


그리고 위에서 실행했었던 예제 MPU6050_DMP6 를 아두이노 IDE 로 다시 열어서 다음의 그림과 같이 주석을 고쳐 줍니다.


위와 같이 #define OUTPUT_READABLE_YAWPITCHROLL 이라는 부분을 주석처리 합니다.


그리고 #define OUTPUT_TEAPOT 이라는 부분의 주석을 해제 합니다. 수정 후 아두이노에 업로드를 합니다.


이번에는 Processing 에서 다음의 파일을 엽니다. 파일 -> 열기를 눌러서 MPU6050 라이브러리를 설치한 폴더를 찾아서 MPUTeapot.pde 라는 파일을 엽니다.  저의 경우는 아두이노 설치폴더 하위의 Libraries 폴더에 라이브러리를 설치 했습니다.  상세한 MPUTeapot.pde 의 위치는 C:\Program Files (x86)\Arduino\libraries\MPU6050\Examples\MPU6050_DMP6\Processing\MPUTeapot\ 입니다.


위의 그림과 같이 MPUTeapot.pde 소스에서 아두이노가 작동되고 있는 포트를 수정해 줍니다. 윈도우의 경우에는 위의 그림과 같이 String portName... 부분을 주석처리 하면 되고 리눅스나 맥의 경우에는 반대로 주석처리를 하고 포트를 적어주면 됩니다.


모든 준비가 끝났으면 Processing 에서 ▶ 모양의 실행 버튼을 클릭하면 다음과 같이 MPU-6050 센서에서 보내주는 정보를 3D 비행기 모양을 이용해서 비주얼하게 볼 수 있습니다.



이상으로 6축 자이로 및 가속도 센서인 MPU-6050 에 대해서 알아보았습니다.

반응형

+ Recent posts