AiPE

[R&E] 4. Serial 통신으로 받은 값 PLX-DAQ로 엑셀에 저장 본문

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

[R&E] 4. Serial 통신으로 받은 값 PLX-DAQ로 엑셀에 저장

Oshimaker XiBBaL 2023. 2. 8. 22:11
반응형

대망의 PLX-DAQ 편이다.

 

결론부터 말하자면 대차게 망했는데, 어떻게 디버그 하려고 노력했으며 왜 PLX-DAQ를 경유한 방식을 버렸는지에 초점을 맞추고 작성해보겠다.

 

미리 말하지만 PLX-DAQ 프로그램이 안좋거나 쓰레기라서 버린 게 아니고 우리가 하려는 작업이 PLX-DAQ와 잘 맞지 않아서 포기한거다.

 

 

 

1. PLX-DAQ 소개 및 사용법

계속 말하지만 UNO보드가 전송해 PC로 들어오는 값은 Serial 통신의 형태이다.

 

모듈의 측정 결과는 Microsoft Excel을 이용해 (이하 엑셀) 표 및 그래프로 정리한다.

 

아두이노와 엑셀은 기본적으로 호환이 되지 않는다. 즉, 아두이노에서 산출된 정보를 직접 엑셀 파일에 적을 수 없다. 따라서 아두이노 산출값을 PC에서 인식할 수 있는 데이터 형태로 바꾸어주는 중계자가 필요하다. 이 역할을 하는 것이 PLX-DAQ라는 프로그램이다.

 

PLX-DAQ는 "Parallax"라는 회사에서 무료로 제공하는 아두이노ㅡ엑셀 연동 프로그램이다. 아래는 PLX-DAQ를 실행했을때 화면의 예시자료이다.

 

PLX-DAQ 실행 화면 예시

 
기본적으로 엑셀 매크로 문서(*.xlsm)에 기생하듯이 쓰이도록 설계되었다. 따라서 PLX-DAQ가 탑재된 엑셀 매크로 문서를 열면 위와 같은 Control Panel이 나오게 된다. 여기서 PLX-DAQ를 조작할 수 있다.
 

PLX-DAQ 컨트롤 패널 예시 (v2.0b 기준)

 
PLX-DAQ 공식 버전은 아래 링크에서 다운로드 할 수 있다.
(내가 굳이 공식 버전이라고 언급한 이유는 글을 끝까지 읽으면 나온다.)
 
 

PLX-DAQ - Parallax

Parallax Data Acquisition tool (PLX-DAQ) software add-in for Microsoft Excel acquires up to 26 channels of data from any Parallax microcontrollers and drops

www.parallax.com

 
컨트롤 패널 조작에 대해 살짝 요약해보자면 아래와 같다. 더 정확한 사용법은 위 링크에서 공식 문서를 참고하자.
https://www.parallax.com/package/plx-daq/

 

 

[Settings 메뉴]

 

  1. Port : 포트 번호를 설정한다. 아두이노 보드가 연결된 포트 번호를 확인한 후 동일하게 입력해줘야 한다. 포트 번호는 그때그때 부여되는거라 따로 고정해두지 않으면 아두이노 보드를 연결할때마다 바뀐다. 포트 번호는 <장치 관리자>에서 확인할 수 있다.
  2. Baud : 전 편에 언급했던 비트레이트를 입력해야 한다. 전 편에 설명한 이유들로 인해 9600으로 하는 것이 안정적이라고 생각한다.
  3. Connect/Disconnect : Port와 Baud를 올바르게 입력한 후 Connect를 누르면 그 때부터 아두이노와 연동이 시작된다. 1초 정도의 딜레이 이후에 엑셀에 값 작성이 시작된다. Disconnect를 누르면 즉시 연결 및 작성이 끊긴다.
  4. Reset on Connect : 연결할 때 마다 연결 정보를 초기화 하는 것  같다. 어차피 Port와 Baud를 매번 다시 설정해줘야 해서 Reset을 켠 상태로 두었다.

 

 

[Control 메뉴]

 

  1. Download Data : 뭘 다운로드 하겠다는건지 모르겠다.. 아는 사람 있으면 알려주기 바란다. 몰라서 그냥 꺼뒀다,
  2. Clear Stored Data : 이미 엑셀 파일에 뭔가가 써있으면 그 내용을 초기화하고나서 작성을 시작한다. 저거 켜두면 실수로 측정한 정보를 다 날려버릴 수도 있으니 주의. 물론 안의 내용을 날리고 싶으면 체크한 후 Connect를 누르면 된다. 나같은 경우는 매 측정 후 내용이 쓰인 엑셀파일을 <다른 이름으로 저장>해서 다른 곳으로 백업해둔 후 PLX-DAQ가 탑재된 엑셀 파일은 Clear Stored Data로 초기화했다. 측정은 한 파일에서 하고 저장만 다른 파일로 하는 방식.
  3. User1/User2 : 뭔지 모르겠다.
  4. Reset Timer : 타이머를 리셋한다. 어차피 나는 아두이노 자체적으로 DATE와 TIME을 출력하게 코딩해서 타이머를 쓸 일이 없기 때문에 필요 없는 옵션이다.
  5. Clear Columns : 쓰인 정보를 초기화한다. Clear Stored Data의 즉시시전 버전이라고 생각하면 된다.

 

 

 

 

2. 아두이노 심전도 모듈 측정값을 엑셀에 기록 (PLX-DAQ 이용)

이제 PLX-DAQ로 아두이노의 정보를 엑셀에 순차 기록해보겠다.

PLX-DAQ가 시리얼 통신을 받기 위해서는 일정한 규격을 맞춰주어야 하는데, 이로 인해 아두이노에 업로드 할 코드를 다음과 같이 수정했다.

 

Build Info

Excel 365 Enterprize 2019
PLX-DAQ Release 2.0b
Arduino version 1.8.16
Windowns 10 and Windows 11 (컴퓨터 여러 대 사용)
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(10);
}

ECG Checker for PLXDAQ.ino
0.00MB

 

이 코드대로 하면 엑셀의 가장 첫 행에는 변수의 이름이 나타나며, 2행부터 데이터가 실시간으로 기록된다.

프로그램 동작 중인 상태에서 PLX-DAQ 컨트롤 패널의 [Display Direct Debug]를 누르면 어떠한 값이 언제 얼마나 들어왔는지 로그(log)를 볼 수 있다. 

 

 

 

본 연구에서는 분당 심전도 값을 실시간으로 측정하는 기능이 탑재되어야 하기 때문에 PLX-DAQ가 탑재된 Excel 파일에 대한 수정이 필요하다. 이하에서 X열의 Y행에 해당하는 셀의 값은 \(X_Y\)의 꼴로 표기하겠다. 

 

PLX-DAQ가 적용된 Excel 문서는 아래와 같이 수정한다.

 

1. \(A\)열과 \(B\)열은 비워둔다. PLX-DAQ가 자동으로 시간과 심전도 값을 쓰는 공간으로, 자동화 영역에 해당하므로 임의의 조작은 금한다.
 
2. \(G\)열은 \(B\)열에 나온 심전도 값을 연산하는 부분이다. \(G_i\)셀은 의 \(B_i - B_{i+1} \)값을 연산하여 표시한다.
 
3. \(F_2\)셀은 “\(R\) Count”가 표시된다. \(R\)값은 심전도에서 좌심실이 수축하는 ?? 모르겠다 시발 알아서 고쳐줘라 (이 글이 들어있던 문서가 원래 생명과학 담당하는 친구들에게 코드 설명하려고 쓴 문서입니다. 제가 모르는 내용은 알아서 수정해달라고 부탁한 겁니다..)

4. \(F_2\)셀은 \(G\)열에서 일정 수준 이상 일정 수준 이하의 \(G_i\)셀 개수를 연산해 실시간으로 표시한다.

 

그냥 대충 새로운 셀이 작성될때마다 이전 셀과의 차이를 계산해서 일정 값 이상이면 새로 쓰여진 값을 극댓값으로 판별하고, 이 개수를 계산해 다른 셀에 숫자로 표시하겠다는 말이다.

 

 

 

아래는 위 규칙의 PLX-DAQ가 적용된 엑셀 파일이다. 실제 테스트에 사용했다. (그리고 버그가 생겼다)

기존 PLX-DAQ문서를 Arduino ECG 센서 (AD8232)에 적합하게 좀 수정해보았다.

 

ECGMacro.xlsm
1.43MB

 

 

 

 

 

 

3. 디버그

여러 차례 자체 실측정 테스트를 진행한 결과 PLX-DAQ방식의 한계와 버그가 발견되었다. 해당 내용은 아래와 같다.

 


PLX-DAQ 방식 Bug Report
영역 내용
통신 1. PLX-DAQ를 통해 기록된 정보 정렬이 제대로 이루어지지 않음.

2. 적은 확률로 문자열이 숫자열과 섞여서 출력됨. → 나중에 저장된 자료를 필터링할 때 잘못된 문자열로 인한 버그 발생. (int로 받을 때 string이 들어오게 되면서 프로그램이 꺼져버림)
프로그램 유지 1. 일부 컴퓨터에서 PLX-DAQ의 리소스 사용량과 관련 없이 PLX-DAQ가 계속해서 강제종료되는 현상 발견.

 

(1) PLX-DAQ를 통해 기록된 정보 정렬이 제대로 이루어지지 않음

<문제>

원래대로라면 실행 후 시간이 A열에, 그 때의 심전도 값이 B열에 작성되어야 한다. 초당 여러 번 빠른 속도로 작성해서 그런진 몰라도 열이 자기 멋대로 흐트러지는 경우가 잦았다. A열의 내용이 B열에, B열의 내용이 C열에 쓰이는 경우가 가장 많았고, 아예 이상한 곳에 쓰는 경우도 빈번했다. 이 버그는 일정한 규칙 없이 시도때도 없이 나타났다.

 

<디버그>

그 때 당시에는 우리가 초당 5번~10번씩 빠른 속도로 정보를 쓰다 보니까 생긴 오류라고 생각했는데, 지금 다시 생각해봐도 원인을 잘 모르겠다.

애초에 PLX-DAQ자체가 빠른 속도로 정보를 처리하기에 적합하지 않은가 싶기도 하다.

 

→ 디버그 실패

 

 

 

(2) 적은 확률로 문자열이 숫자와 섞여서 출력됨

<문제>

원래대로라면 DATA출력부에는 float값만 나와야 한다. 근데 어떤 오류인지 몰라도 가끔 영문자가 섞여서 나오는 경우가 있다. 영문자도 어떠한 단어나 메세지가 출력되는 것이 아니라 랜덤한 영문자가 출력된다. 물론 엄청 자주 발생하는 버그는 아니지만 나중에 자료를 필터링 할 때 float값이 아닌 string값이 있으면 필터링 도구에서 오류가 발생하게 된다. 이때마다 하나씩 string을 지워주어야 해서 상당히 불편하다.

 

<디버그>

일단 아두이노 출력 터미널에서는 "!"이외의 문자열은 출력된 적이 없다. 따라서 아두이노는 정상적인 float값을 뿌리고 있는 것이다. 분명히 PLX-DAQ쪽에서 문제가 있는 것인데 왜 이런 버그가 등장하는지도 몰라서 디버그도 못 했다.

 

→ 디버그 실패

 

 

 

(3) 일부 컴퓨터에서 PLX-DAQ의 리소스 사용량과 관련 없이 PLX-DAQ가 계속해서 강제종료되는 현상

<문제> 

PLX-DAQ 컨트롤 패널의 "Connect"를 누르면 DATA값이 작성되다가 랜덤한 시간 후에 엑셀이 꺼져버린다.

꺼지기까지의 시간은 "Connect"후 1초부터 20000행을 작성할때까지로 매우 다양해서 규칙성을 찾을 수 없었다.

 

<디버그>

윗 항과 아랫 항의 차를 연산하는 기능이 1초에 몇번씩 이루어져야 하므로 부담이 될 수 있겠다 싶어서 이 기능을 끈 채로 테스트해보았다. 결과는 똑같이 강제종료가 계속되었다.

 

또, 최대한 엑셀 프로그램을 간략화해보고 PLX-DAQ가 탑재된 엑셀과 아두이노 빼고 다른 모든 서비스를 종료한 후 테스트해보았는데, 결과는 똑같았다.

 

지금 생각해보면 PLX-DAQ가 꺼지는 현상은 PLX-DAQ의 문제라기보다는 엑셀의 문제였을 수도 있겠다. 0.2초마다 한 번씩 반복적으로 작성해야 하는 것이 부담이었을 수도 있겠다. 


 

 

결국 원인을 찾지 못한채 문제를 해결하기 위해 Windows 재설치 및 Office 프로그램 재설치, PLX-DAQ 재설치, VSCode재설치 등 사용 환경을 초기화했으나 위 3가지 문제가 계속 발생했고, 문제를 고치는데 실패했다.

 

어쩌면 계속 알아보다 보면 해결 방법을 찾을 수도 있었겠지만, 연구 마감 기한이 다가와서 시간이 얼마나 걸릴지 모르는 디버그를 계속 할 수 없었다.

 

게다가 PLX-DAQ가 딱히 오류 코드나 메세지를 뱉는 것도 아니고, 소스코드 또한 구할 수 없어 디버그를 하겠다는 생각이 들지를 않았다. 정확히 어떠한 부분에서 오류가 발생했는지 크래시 로그라도 있으면 도전해봤을텐데 아쉽다.

 

결국, 위 3가지 버그를 껴안고 피실험자를 대상으로 실험을 진행할 수 없다고 자체적으로 판단하여 팀원에게 알린 후 Python으로 PLX-DAQ를 대체할 소프트웨어를 개발하기로 했다. PLX-DAQ 대체품 제작에는 3일이 주어졌다(...)

 

 

 

아래는 PLX-DAQ를 사용하면서 알게 된 소소한 팁인데, 만약 PLX-DAQ를 이용할 사람들이 있다면 참고하면 도움이 될 듯 하다.

 

[PLX-DAQ 관련 팁]

 

1.

이래도 진짜 PLX-DAQ를 써야겠다고 생각하면, PLX-DAQ 민간인 버전을 이용해보자.

PLX-DAQ는 공식적인 개발이 종료(중지)되었다. 따라서 더 이상 업데이트를 지원하지 않기 때문에 최신 버전의 엑셀 프로그램을 이용하는 경우 호환이 안 될 수 있다. 이를 해결하기 위해 민간인 개발자들이 여러가지 변형 버전을 내놓았는데, 이 중 쓰고 있는 엑셀 버전을 지원하는 버전을 다운받아 사용해보자.

https://forum.arduino.cc/t/plx-daq-version-2-now-with-64-bit-support-and-further-new-features/420628

 

PLX-DAQ version 2 - now with 64 bit support! (and further new features)

============================================================= Most recent version 2.11 to be found here: PLX-DAQ version 2 - now with 64 bit support! (and further new features) - #72 by NetDevil - Interfacing w/ Software on the Computer - Arduino Forum ===

forum.arduino.cc

 

 

2.

엑셀 파일은 꼭 엑셀 매크로 파일 (*.xlsm)으로 해 두어야 한다. 엑셀 자체에서 자꾸 매크로 기능을 차단해서 온갖 버그가 발생하는 것 같다. <매크로 허용> 버튼을 눌러놓아도 뭔가 제대로 작동이 안 된다. 확장자가 .xlsm인 엑셀 매크로 파일을 이용하니 일부 문제가 해결되었다.

 

 

 

 

4. 결론

앞서 말했듯이 PLX-DAQ를 버리기로 했다.

기존 PLX-DAQ가 수행하던 기능을 좀 더 단순화하고 최적화해 Python으로 동일한 기능을 직접 만들어서 쓰기로 했다.

 

 

연구 보고서에도 들어있는 내용인데, 아래는 내가 많은 언어 중 굳이 Python을 선택한 이유이다.

[코딩 중간 보고서 중 발췌]

파이썬은 C언어에 비해 처리 과정이 느리기 때문에 속도를 중요시하는 우리 연구에는 적합하지 않다고 생각할 수 있다. 또한 Python 정책에 따라 Multi-Threading을 지원하지 않기 때문에 병렬구조의 작업을 한꺼번에 처리하기에는 적합하지 않다.

본 연구에서는 일정 수준 이상의 데이터 처리 능력과 속도를 필요로 하지만, 라이브러리의 지원 가능성과 코드 수정의 간편함이라는 장점을 누리기 위해 Python을 메인 언어로 사용하기로 결정했다.

보고서에 들어갈거라 말은 거창하게 했지만 사실 내가 파이썬을 제일 잘 다뤄서 파이썬을 골랐다.

 

 

그러면 다음 편에는 파이썬으로 PLX-DAQ를 대체하는 코드를 짜는 과정을 소개하겠다.

소스코드도 공유할 것이니까 나와 비슷한 상황에서 PLX-DAQ의 대체제를 찾는 사람은 한 번 이용해보기 바란다.

반응형