EMG Sensor

EMG Sensor란?

근육의 수축 이완을 전압으로 나타냄

  • 노이즈가 많음
  • 매우 신화가 작아 증폭효과를 가지고 있음(계기증폭기)
  • 신호를 반전시켜줘야함
  • Signal processing(Low-pass filter)
  • 신호가 매우 작으므로 gel type의 전극을 붙임

회로도
아두이노 연결


오실로스코프로 EMG Sensor값 읽기


아두이노로 EMG Sensor값 읽어보기

  • 0~1023(5V) -> (val*5/1023-offset)*1000(mV변환)
1
2
3
4
5
6
7
8
9
10
void setup() {
Serial.begin(9600);
}

void loop() {
float val = analogRead(A0);
val = (val*5/1023)*1000-2420;
Serial.println(val);
delay(100);
}

신호 반전

1
2
3
4
5
6
7
8
9
10
11
void setup() {
Serial.begin(9600);
}

void loop() {
float val = analogRead(A0);
val = (val*5/1023)*1000-2420;
val = abs(val);
Serial.println(val);
delay(100);
}

결과 그래프


Serial 통신

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
#include "stdio.h"
#include "Modules/SerialComm.h"

void main()
{
CSerialComm SerialComm;

if (SerialComm.connect("COM9"))
printf("Serial port is connected!!\n");
else
printf("Sercial connection fail!!\n");

while (1)
{
char data[64];
SerialComm.readCommand(data);
int i = 0;
while (1)
{
printf("%c", data[i]);
if (data[i] == '\n')
break;
i++;
}
}
}

Low-pass filter

Moving Average function 사용

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
#define WinSize 100
float data[WinSize];
int i = 0;

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

void loop() {
int a = 0;
float sol = 0;
float val = analogRead(A0);
val = (val*5/1023)*1000-2420;
val = abs(val);
a = i % WinSize;
data[a] = val;
if(i > WinSize ){
for(int j = 0; j < WinSize ; j++){
sol = sol + data[j] / WinSize;
}
}
Serial.println(sol);
delay(10);
i++;
}

결과 그래프1
결과 그래프2