Note: EMG click is a prototyping tool, not a medical-grade device. Do not use it to diagnose patients.
Electromyography or EMG is a diagnostic technique for measuring the electrical activity of muscles. It is often used to diagnose the health of these muscles, and the neurons that control them. These neurons are called motor neurons. They transmit electrical signals, and the muscles contract when this happens.
An EMG collects these signals and translates them into a graphical representation.
The onboard 3.5mm audio jack is used to connect cables/electrodes to the click board. The electrode collects voltage from the skin (few millivolts). And the signal from the jack is amplified and filtered. Therefore, EMG click can be divided into seven blocks.
To record an EMG, you will need the following things:
For optimal results place the first DRL electrode on the wrist of the hand. Place the second and third electrode on the muscle you want to measure. See the image above.
MikroPlot is a free data visualization tool (Windows) that can be used to generate an EMG graph. It’s a simple tool to help you visualize sensor data recorded over time.
The graph is generated from data sent from the microcontroller. A UART-USB connection is required.
The MCP606/7/8/9 family of operational amplifiers (op amps) from Microchip Technology Inc. are unity-gain stable with low offset voltage (250 µV, maximum). Performance characteristics include rail-to-rail output swing capability and low input bias current (80 pA at +85°C, maximum).
The MAX6106 is a low-cost, low-dropout (LDO), micropower voltage reference. This three-terminal reference is available with output voltage options of 1.25V, 1.8V, 2.048V, 2.5V, 3V, 4.096V, 4.5V, and 5V. For this click, we used the 2.048V.
Type | Biomedical |
Applications | Measuring the electrical activity produced by skeletal muscles. |
On-board modules | MAX6106 voltage reference, 3.5mm audio jack |
Key Features | ESD protection, Overvoltage protection, High-pass filter |
Interface | Analog |
Input Voltage | 5V |
Compatibility | mikroBUS |
Click board size | L (57.15 x 25.4 mm) |
This table shows how the pinout on EMG click corresponds to the pinout on the mikroBUS™ socket (the latter shown in the two middle columns).
Designator | Name | Default Position | Default Option | Description |
---|---|---|---|---|
JP1 | ADC ref. | Left | 2.048 | Output voltage range, left position 0-2.048V, right position 0-4.096V. |
There is one SMD (0805) jumper that determines the output voltage range. When you connect all three electrodes to each other, the output should be constant voltage (1.024V or 2.048V depending on the jumper position). That constant voltage is zero-voltage on graphic, so the positive part of EMG waveform will go above zero and negative part of the EMG waveform will go below zero. There is also trimmer potentiometer which adjust the gain. So, if we set jumper to 2.048 position (zero is now 1.024V) that means that the gain should be set so that the EMG waveform is in the range of 0-2.048V. If we set jumper to 4.096 position (zero is now 2.048V) gain should be set so that the EMG waveform is in the range of 0-4.096V. So, jumper and trimmer potentiometer are used to make output voltage level from EMG click accommodate to the input voltage level of ADC which will be used.
Designator | Name | Type | Description |
---|---|---|---|
LD1 | PWR | LED | Power Supply Indication LED |
Code examples for EMG click, written for MikroElektronika hardware and compilers are available on Libstock.
The following code snippet shows the state of waiting for a button press event by the user, in order to start the measuring of data. Data is sampled from ADC module every 3.3 ms and sent to mikroPlot, all in an endless loop.
01 while(1) 02 { 03 // If button PD10 is pressed, the measuring begins 04 if (Button( &GPIOD_IDR, 10, 10, 1 )) 05 { 06 UART1_Write_Text( "STARTrn" ); 07 InitTimer2(); 08 EnableInterrupts(); 09 delay_ms( 500 ); 10 } 11 12 // Every 3.3 ms measure data and send them to mikroPlot 13 if ( read_flag == true ) 14 { 15 read_flag = false; 16 DisableInterrupts(); 17 18 temp_adc_read = ADC1_Get_Sample( 4 ); 19 if (temp_adc_read > LIMIT_TOP ) 20 { 21 temp_adc_read = LIMIT_TOP; 22 } 23 if (temp_adc_read < LIMIT_BOTTOM ) 24 { 25 temp_adc_read = LIMIT_BOTTOM; 26 } 27 temp_timer_read = interrupt_ctr * 2; 28 IntToStr(temp_adc_read, final_string); 29 sprintf(timer_read_string,"%.2f", temp_timer_read); 30 strcat(final_string, ","); 31 strcat(final_string, timer_read_string); 32 Ltrim(final_string); 33 UART1_Write_Text(final_string); 34 UART1_Write_Text("rn"); 35 36 EnableInterrupts(); 37 } 38 }