EMG 센서는 근육의 움직임으로 인한 미세한 전기신호를 감지하는 센서입니다.

EMG 센서는 근육의 미세한 전기 신호를 감지한 뒤 이를 증폭하고 필터로 처리해줍니다. 이렇게 처리된 신호는 아두이노 등에서 받아서 사용할 수 있습니다.

EMG 센서도 테스트용 장비부터 의학용까지 스펙트럼이 다양합니다. 아래 링크를 보시면 테스트 용으로 사용할만한 센서킷을 보실 수 있습니다.(의학용 아님!!)

http://www.seeedstudio.com/depot/Grove-EMG-Detector-p-1737.html

많은 다른 센서와 유사하게 측정값을 Analog 핀으로 읽을 수 있습니다. VOUT 핀을 아두이노의 아날로그 핀으로 연결해 준 뒤 전압값을 읽으면 됩니다.

아두이노 –> EMG 센서

  • 5V –> VCC
  • GND –> GND
  • A0 –> VOUT

101020058 1_02

아래 예제코드를 원하는 형태로 응용해서 사용하세요.

// Grove - EMG Sensor demo code
// Grove - EMG Sensor connect to A0
// note: it'll take about serval seconds to detect static analog value
// when you should hold your muscle static. You will see led bar from level 10 turn to 
// level 0, it means static analog value get ok

int max_analog_dta      = 300;              // max analog data
int min_analog_dta      = 100;              // min analog data
int static_analog_dta   = 0;                // static analog data

// get analog value
int getAnalog(int pin)
{
    long sum = 0;
    
    for(int i=0; i<32; i++)
    {
        sum += analogRead(pin);
    }
    
    int dta = sum>>5;
    
    max_analog_dta = dta>max_analog_dta ? dta : max_analog_dta;         // if max data
    min_analog_dta = min_analog_dta>dta ? dta : min_analog_dta;         // if min data
    
    return sum>>5;
}

void setup()
{
    Serial.begin(9600);
    
    long sum = 0;

	// Calibration. Do not move your arm.
    for(int i=0; i<=10; i++)
    {
        for(int j=0; j<100; j++)
        {
            sum += getAnalog(A0);
            delay(1);
        }
        
        Serial.println(10-i);
    }
    
    sum /= 1100;
    
    static_analog_dta = sum;

    Serial.print("static_analog_dta = ");
    Serial.println(static_analog_dta);
}

int level       = 5;
int level_buf   = 5;

void loop()
{

    int val = getAnalog(A0);                    // get Analog value
    
    int level2;
    
    if(val>static_analog_dta)                   // larger than static_analog_dta
    {
        level2 = 5 + map(val, static_analog_dta, max_analog_dta, 0, 5);
    }
    else 
    {
        level2 = 5 - map(val, min_analog_dta, static_analog_dta, 0, 5);
    }
    
    // to smooth the change of led bar
    if(level2 > level)
    {
        level++;
    }
    else if(level2 < level)
    {
        level--;
    }

    if(level != level_buf)
    {
        level_buf = level;
        Serial.println(level);
    }
    
    delay(10);
}

참고자료 :