AiPE

[R&E] 3. 아두이노 심전도 측정 모듈(AD8232)에서 Windows로 데이터 전송 본문

[XiBBaL] Development Project/인터넷 강의 배속 시 집중력 곡선의 분석 및 해석

[R&E] 3. 아두이노 심전도 측정 모듈(AD8232)에서 Windows로 데이터 전송

Oshimaker XiBBaL 2023. 2. 8. 21:21
반응형

이번에는 심전도 측정 모듈(AD8232)에서 얻은 데이터를 Serial통신을 통해 PC의 USB-A포트로 받아오는 부분을 코딩할 것이다.

 

아두이노 문법에 맞춰서 심전도 모듈을 컨트롤하고, 데이터는 파이썬에서 처리할 예정이다.

 

아두이노 문법은 C++을 기반으로 하여 제작되었다. 물론 Standard C++과 완전히 동일하지는 않고 많은 공통점이 있는 정도라고 보면 된다. (티스토리 코드블럭이 C++이라고 인식하긴 하더라.)

 

 

1. 아두이노 심전도 측정 모듈의 하드웨어 구성

심전도 측정 모듈이란 심장에 흐르는 전기를 모듈에 달린 센서로 받아와 측정하는 장치를 말한다. 심전도 측정을 위한 패드를 몸에 부착하여 측정이 가능하며, 모듈에 LED표시등이 있어 심장 박동의 리듬을 따라 LED가 점멸한다.

 

아두이노 심전도 측정 모듈은 다음과 같은 구조로 이루어져 있다.

 

아두이노 심전도 모듈의 결선도.

 

아두이노의 메인보드에는 여러 종류가 있는데 기 중 가장 보편적으로 쓰이는 것이 "UNO보드"이다.

 

위의 모듈은 제어 및 처리 과정을 담당하는 UNO보드와 심전도를 실질적으로 측정하는 ECG측정 센서로 이루어져 있으며, 둘 중 푸른색이 UNO보드이다. 

UNO보드는 ECG측정센서의 기계적 제어와 Serial통신을 담당하고, ECG측정 센서는 UNO보드로 심전도 값을 전송하는 역할을 한다.

 

두 보드를 위/아래 결선도/표를 바탕으로 연결한 후 심전도 측정 패드를 단자에 연결하면 아두이노 심전도 모듈의 하드웨어 구성이 끝난다.

 

좌측은 UNO보드, 우측은 ECG심전도센서(AD8232)

 

 

심전도 측정 패드는 세 가지 색으로 되어 있다. 이 패드는 모두 피부에 직접 흡착시키는 방식이며, 접착 테이프로 고정한다. 색에 따른 센서 접착 위치는 아래 표와 같다.

센서 패드 색깔 붉은색 초록색 노란색
접착 위치 Right Arm Left Arm Right Leg

실험할 때 매번 이 색-위치가 헷갈려서 맨날 실험 계획서를 뒤져봤던 기억이 난다. 별로 외우고자 노력을 안 했다.

 

 

 

 

2. 아두이노 코드 작성

아두이노를 구동하기 위해서는 윈도우를 기반으로 한 PC에서 아두이노 스케치(IDE, 통합개발환경(..)이지만 매우 부실하다)를 이용해 소프트웨어를 구성해야 한다.

 

아래의 코드는 아두이노 심전도 모듈을 구동하고 측정된 값을 Excel파일에 저장하기 위한 코드이다.

 

int sensorA = A0;    
int sensorA_value = 0;

void setup() {
  Serial.begin(9600);
  pinMode(10, INPUT); // Setup for leads off detection LO +
  pinMode(11, INPUT); // Setup for leads off detection LO -

  Serial.println("LABEL,Time,SenserA");

}

void loop() {

  if ((digitalRead(10) == 1) || (digitalRead(11) == 1)) {
    Serial.println('!');
  }
  
  else {
    Serial.println(analogRead(A0));
  }
  
  delay(10);

   sensorA_value = analogRead(sensorA);

  Serial.print("DATA,TIME,");                          
  Serial.print(sensorA_value); 
  Serial.print(",");

  delay(200);
}

* 후에 통신을 파이썬으로 받기 위해 아두이노 코드를 간략화 및 최적화 한다. 이 때 코드가 훨씬 간단해지는데, 실제 AD8232센서에 업로드할 용도로 쓴다면 위의 코드 말고 올려둔 간략화된 코드를 이용하자.

[링크] : https://xibbal-lab.tistory.com/48

 

 

<1>

위 코드는 9600 비트레이트에서 값을 송출한다. 굳이 9600 비트레이트를 고른 이유는 아래 두 가지이다.

  1. AD8232 판매처에서 9600비트레이트로 짠 코드를 예시로 넣어두었기 때문에 9600이 안정된 값이라고 추측함.
  2. 추후 사용할 (사용하다가 실패할) PLX-DAQ에서 9600 비트레이트를 기본으로 쓰기 때문.

 

<2>

아까 결선도대로 PIN10번과 PIN11번을 입력으로 받는다.

 

<3>

데이터 값을 읽을 수 없으면 "!"을, 읽을 수 있으면 "데이터, 시간" "데이터 값"의 형태로 출력한다.

 

<4>

delay(200);은 200초가 아니라 200/1000초를 의미한다. 따라서 실제 시간은 0.2초가 되고 1초에 5번 코드가 반복된다.

사실 delay값을 줄여 더 빠르게 loop를 돌리고 싶었는데, AD8232센서의 성능 한계때문에 0.2초에서 타협했다. 0.1초로만 쪼여도 DATA값이 밀려쓰이거나 "!"이 섞여서 출력되는 현상이 발생했다.

 

<5>

아두이노의 작동 여부는 IDE에서 제공하는 기능 중 하나인 "시리얼 플로터"를 이용하여 그래프로 관찰했다. 극대값이 400~600사이이면서 아래와 비슷한 파형이 출력되면 정상작동으로 판별할 수 있다.

 

ECG 파형 예시. 사람마다 기계마다 파형이 다를 수 있다.

 

위 코드는 아래 첨부파일에 .ino형식(아두이노 언어 형식)으로 첨부해두었다.

개발일지 마지막 편에서 측정 관련 도구와 분석 관련 도구를 통합해 하나의 "패키지"로 만들 예정인데, 그 파일 내에도 첨부해 두겠다.

ArduinoECG.ino
0.00MB

 

 

 

 

 

다음 일지에서는 "PLX-DAQ"를 이용해 센서 측정 값을 엑셀로 받아 와 분석하고자 했던 과정을 써보겠다.

스포를 하자면, 존나 망해서 결국 중계 프로그램을 내가 직접 만들었다.

반응형