1. Heart-beat pulse sensor 심박 센서

적외선 LED와 수신부를 이용한 간단한 구조의 심박센서입니다. Emitter와 Receiver를 이용해서 직접 간단한 회로를 만들 수도 있고, KY-039와 같이 이미 모듈로 만들어진 제품을 적당히 변형해서 이용해도 됩니다. 가격도 무척 저렴합니다. 대신 측정 결과가 그닥 좋지는 않습니다. 가급적 비용이 더 들더라도 좋은 모듈을 사용하는 것이 심박을 측정하는데 더 유리합니다.

원리는, 적외선 LED에서 방출하는 적외선이 혈관 압력이 변화함에 따라 수신부에서는 미세하게 변화하게 됩니다. 이 차이를 가지고 심박을 추출할 수 있습니다.

약한 적외선을 방출해서 수신하는 회로이므로 외부 빛에 의해 노이즈가 생길 수 있습니다. 특히 실내 조명에 의해 간섭이 많이 발생한다고 하니 커버를 적절히 만들어줘야 하겠습니다.

  • Model: KY-039
  • Color: Black + White
  • Material: PCB + Brass
  • Features: Use IR LED and optical transistor to detect pulsation in fingers
  • Specification Working voltage: 5V
  • Application: Synthesized Teaching Experiment
  • Dimensions: 25 x 22 x 17 mm / 0.98 x 0.87 x 0.67 inch
  • Weight: 2 g / 0.07 oz

2. 연결 방법

  • + : 아두이노 5V
  • – : 아두이노 GND
  • S : 아두이노 Analog pin

3. 소스 코드

// Pulse Monitor Test Script
int sensorPin = 0;
double alpha = 0.75;
int period = 20;

void setup ()
{
  Serial.begin (115200);
}

void loop ()
{
    static double oldValue = 0;
    static double oldChange = 0;
    int rawValue = analogRead (sensorPin);
    double value = alpha * oldValue + (1 - alpha) * rawValue;

    Serial.print (rawValue);
    Serial.print (",");
    Serial.println (value);
    oldValue = value;
    delay (period);
}

소스 코드는 단순히 AnalogPin을 통해 읽은 값을 이전 값과 합쳐 하나의 값으로 만듭니다. 이 변화량을 적절히 파악해서 심박을 추출하는 코드를 더하면 됩니다.

이 소스코드는 단순히 센서를 통해 읽은 적외선 측정값을 출력하는 정도입니다. 그리고 측정되는 값을 보면 경우에 따라 심박값을 분리해 낼 만큼 값이 적절하게 변하지 않는 경우도 많습니다. 이럴때는 센서를 좀 더 좋은 것으로 업그레이드 하는 것이 좋습니다. 어차피 사용 방법은 거의 동일합니다.

센서 업그레이드

아래와 같은 센서가 주로 많이 사용되는 심박 센서 중 하나입니다. 국내외에서 쉽게 구할 수 있습니다. [제품링크]

Pulse-Sensor-Heart-Rate-Sensor-with-Cable-for-Arduino-Compatible.jpg_220x220

3가닥의 선이 있고 사용/연결 방법은 앞서 소개한 방법과 같습니다. 이 센서를 이용해서 심박 센서의 값을 실시간으로 PC로 모니터링 하는 코드부터 살펴보도록 하겠습니다.

아두이노, PC에서 사용할 코드는 아래와 같습니다.

아두이노 코드는 비교적 단순해서, 센서의 값을 측정한 뒤 적절한 범위의 값으로(PC에서 출력하기 좋은 범위로) 변환해서 Serial로 전송해줍니다.

코드에서 아래 부분을 유의해서 보시면 됩니다.

    data[0] = analogRead(0);//now write the next analog value to data[0]
    
    mapped = map(data[0], 0, 1023, 0, 600);
    Serial.println(mapped);

Analog 0번 핀에서 센서의 값을 읽어 들입니다. 이 값은 0~1023 범위의 값이기 때문에 map() 함수를 이용해서 0~600 범위의 값으로 변환해 줍니다. 만약 PC에서 출력되는 값의 변화량이 너무 작게 보인다면 0~1023 범위를 조절해주면 됩니다. 예를들어 센서가 항상 800~1023 까지의 값만 읽는다면 map(data[0], 800, 1023, 0, 600) 으로 바꿔주면 됩니다.

아두이노 준비는 끝났으니 PC에서 모니터링용으로 쓸 프로세싱 코드도 실행합니다. 이걸 위해서는 프로세싱 개발환경이 PC에 설치되어 있어야 합니다. 프로세싱 개발환경이 없다면 [링크]에서 다운로드 받아 설치하세요.

프로세싱 코드에서 아두이노가 연결된 COM 포트를 선택하는 부분은 수정을 미리 해줘야 합니다. 아래 소스코드입니다.

String portName = Serial.list()[4];//Set the Serial port COM or dev/tty.blah blah

Serial.list()[4] 로 되어있는 부분을 자신의 아두이노 COM 포트 순서에 맞게 변경해줘야 합니다. 예를들어 PC에서 인식된 COM 포트가 아두이노 1개 뿐이라면 Serial.list()[0] 으로 바꿔주면 됩니다.

아니면 그냥 아두이노 COM 포트 넘버를 미리 확인해두고 String portName = “COM31”; 로 바꿔줘도 됩니다.

이제 아두이노가 연결된 상태에서 왼쪽 상단의 Play[>] 버튼을 누르면 앱이 실행됩니다. 미리 지정해둔 COM 포트(아두이노)가 연결되면서 아두이노가 보내준 데이터가 PC에서 출력될 것입니다.

심박 값 측정하기

앞선 방법들은 센서의 값을 PC로 보내 모니터링 하는 기능만 구현된 소스코드입니다. 우리가 원하는 심박 값을 계산하기 위해서는 다른 소스코드를 사용해야 합니다.

오픈소스로 공개된 소스코드 중 심박값을 측정하는 코드를 소개합니다. 아래 두 개의 소스코드를 다운로드 받으세요.

먼저 아두이노 스케치를 아두이노에 올리세요. 간혹 컴파일 에러가 나는 경우도 있는데… 아두이노 주석부분을 제대로 인식하지 못해 발생한 에러입니다. Timer_Interrupt_Notes.ino 파일에 주석으로 처리된 내용들을 모두 지우고 다시 컴파일하면 별 문제 없을겁니다.

프로세싱 모니터링 코드에서 아래 부분을 수정해주세요. COM 포트 인식하는 부분입니다.

port = new Serial(this, Serial.list()[0], 115200);  // make sure Arduino is talking serial at this baud rate

앞선 예제처럼 Serial.list()[0] 로 바꾸거나 “COM31” 처럼 현재 인식된 아두이노 COM 포트 이름을 문자열로 지정해주면 됩니다.

모든것이 정상적으로 동작한다면 PC에서 아래와 같은 화면을 보실 수 있습니다.

하단의 Pulse Window Scale 빨간콩을 움직이면 그래프 크기가 확대/축소 됩니다.

정밀한 측정을 원할 때

보다 정밀한 심박 측정값을 원한다면 AD8232 모듈을 사용해보는 것도 좋습니다. 3개의 electronode 패드를 팔과 다리에 부착한 뒤 운동에 의한 심박 변화를 정밀하게 측정하는데 적합한 센서입니다.

Ecg-measurement-AD8232-heart-pulse-electrocardiogram-suite-FREE-SHIPPING.jpg_220x220

앞선 예제들과 유사하게 아두이노와 프로세싱을 이용해서 모니터링을 할 수 있으며, 관련 코드가 공개되어 있습니다. 아래 링크에서 예제 파일들을 받아 테스트 할 수 있습니다.

제품은 해외 사이트에서 구매하실 수 있습니다.

주의하실점은 모듈이 3.3V 에서 동작합니다. 따라서 아두이노 Pro/Pro mini 보드를 사용하거나 Level shift 모듈을 이용해야 합니다.