Documentation

ShillehTek EMG Muscle Signal Sensor Module Kit for Arduino, Raspberry Pi, Robotics | ShillehTek Product Manual
Documentation / ShillehTek EMG Muscle Signal Sensor Module Kit for Arduino, Raspberry Pi, Robotics | ShillehTek Product Manual

ShillehTek EMG Muscle Signal Sensor Module Kit for Arduino, Raspberry Pi, Robotics | ShillehTek Product Manual

manualshillehtek

Overview

The ShillehTek EMG Muscle Signal Sensor Module is a compact electromyography (EMG) front-end that detects the electrical activity of your muscles and converts it into a simple analog voltage you can read with any microcontroller. Put the three included electrode pads on a bicep, forearm, or calf — flex the muscle — and the module outputs a proportional analog signal that spikes as your muscle fires. It's a fantastic starting point for gesture-controlled robotics, bionic projects, prosthetics demos, and biofeedback experiments.

The module runs on 3.3V to 5V, which makes it friendly to Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi (with an external ADC). The output is an amplified, filtered, and rectified envelope of the raw EMG signal, so you don't need to do complex DSP — a simple analogRead() and threshold is enough to detect a flex.

This kit is designed for hobby, robotics, and STEM education use. It is not a medical device and should not be used for diagnostic purposes.

At a Glance

Operating Voltage
3.3V - 5V DC
Output
Analog (0 - Vcc)
Signal
Rectified EMG envelope
Electrodes
3 (Mid, End, Ref)
Header Pins
VCC, GND, SIG
Best For
Arduino, Pico, ESP32

Specifications

Parameter Value
Operating Voltage 3.3V - 5V DC
Operating Current ~10 mA typical
Output Type Amplified, filtered, rectified analog envelope
Output Range 0V (rest) to ~Vcc (maximum contraction)
Signal Bandwidth Roughly 20 - 500 Hz (muscle EMG band)
Electrode Connection 3-lead snap-on electrode cable
Electrode Type Disposable Ag/AgCl gel pads
Header Pins VCC, GND, SIG (2.54 mm)
Compatible Platforms Arduino, ESP32, Raspberry Pi (with ADC), Pico
Intended Use Maker, STEM, robotics, biofeedback — NOT medical

Pinout Diagram

ShillehTek EMG Muscle Signal Sensor Module pinout diagram showing VCC, GND, and SIG header pins, and the three electrode cable connections for Mid, End, and Reference pads

Wiring Guide

Arduino Wiring

Arduino is the easiest platform for this module — it has built-in 10-bit analog input and runs at 5V, which gives the module its full output range.

EMG Pin Arduino Pin
VCC 5V
GND GND
SIG A0 (analog input)

Electrode Placement

Connect the 3-lead cable to the module and snap one disposable gel electrode onto each clip. Place the pads on the muscle you want to monitor:

Lead Placement
Mid (middle of muscle) Belly of the target muscle (e.g. center of the forearm)
End (end of muscle) Near a tendon or the end of the same muscle
Ref (reference) A bony, electrically quiet spot (e.g. back of the wrist or elbow)
Tip: Clean the skin with alcohol or soap and water before sticking the pads. Skin oils give much noisier readings.

ESP32 Wiring

The ESP32 runs at 3.3V. Power the module from the 3V3 rail so the output range stays within the ESP32's ADC input range (0 - 3.3V). Do NOT power the module from 5V and feed SIG directly to a GPIO — you'll saturate the ADC at best and damage the pin at worst.

EMG Pin ESP32 Pin Details
VCC 3V3 Keep the module on the 3.3V rail
GND GND
SIG GPIO 34 (ADC1_CH6) Input-only pin; ideal for analog
Tip: Stick to ADC1 pins (GPIO 32-39) on the ESP32. ADC2 pins conflict with the WiFi radio and stop working once WiFi is active.
Warning: If you power the EMG module from 5V (VIN) on the ESP32, the SIG output can swing above 3.3V, which will exceed the ADC's safe input range. Always power the module from the same rail as your ADC.

Raspberry Pi Wiring

The Raspberry Pi has no built-in analog input, so you need an external ADC like the ADS1115 (I2C) to read the SIG line. Power the EMG module from the Pi's 3V3 rail and wire its SIG output to one of the ADS1115 channels.

EMG Pin Raspberry Pi Pin Details
VCC Pin 1 (3.3V)
GND Pin 6 (GND)
SIG ADS1115 A0 Via external I2C ADC

ADS1115 to Pi

ADS1115 Pin Raspberry Pi Pin
VDD 3.3V (Pin 1)
GND GND (Pin 6)
SDA GPIO 2 (Pin 3)
SCL GPIO 3 (Pin 5)
Info: Any I2C or SPI ADC works — ADS1115 is just the most common pick because it's cheap and has 16-bit resolution. Make sure I2C is enabled in raspi-config before running the code.

Raspberry Pi Pico Wiring

The Pico has three built-in 12-bit ADC channels (GP26, GP27, GP28). Power the EMG module from the 3V3 output so its SIG signal stays inside the Pico's safe 0 - 3.3V ADC input range.

EMG Pin Pico Pin Details
VCC 3V3 (OUT) Not VSYS/VBUS
GND GND
SIG GP26 (ADC0) 12-bit ADC channel
Warning: Pico GPIO is 3.3V only. Powering the EMG module from VBUS (5V) can push the SIG output over 3.3V during strong contractions and damage the ADC pin.

Code Examples

Arduino

emg_arduino.ino
// ShillehTek EMG Sensor - Arduino Example
// Reads the analog signal from the EMG module on A0, prints
// raw value + a simple "flex detected" flag based on a threshold.

const int EMG_PIN = A0;
const int FLEX_THRESHOLD = 400;   // tune this by watching your resting value

void setup() {
  Serial.begin(9600);
  pinMode(EMG_PIN, INPUT);
}

void loop() {
  int raw = analogRead(EMG_PIN);

  Serial.print("EMG: ");
  Serial.print(raw);
  if (raw > FLEX_THRESHOLD) {
    Serial.println("  FLEX!");
  } else {
    Serial.println("");
  }

  delay(20);  // ~50 Hz sample rate
}

Raspberry Pi (Python with ADS1115)

emg_rpi.py
#!/usr/bin/env python3
# ShillehTek EMG Sensor - Raspberry Pi Example
# Reads the EMG module via an ADS1115 I2C ADC on channel A0.
# Install: pip3 install adafruit-circuitpython-ads1x15

import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c)
ads.gain = 1  # +/- 4.096V range
chan = AnalogIn(ads, ADS.P0)

FLEX_THRESHOLD_V = 1.2  # tune this to your resting baseline

try:
    while True:
        voltage = chan.voltage
        label = "FLEX!" if voltage > FLEX_THRESHOLD_V else ""
        print("EMG: {:.3f} V  {}".format(voltage, label))
        time.sleep(0.02)
except KeyboardInterrupt:
    print("Stopped")

Raspberry Pi Pico (MicroPython)

emg_pico.py
# ShillehTek EMG Sensor - Pico MicroPython Example
# Reads the EMG SIG line on GP26 (ADC0).
# The Pico ADC is 12-bit but read_u16() scales it to 0..65535.

from machine import ADC, Pin
import time

emg = ADC(Pin(26))       # GP26 = ADC0
FLEX_THRESHOLD = 40000   # tune by watching your rest reading

while True:
    raw = emg.read_u16()
    voltage = raw * 3.3 / 65535
    label = "FLEX!" if raw > FLEX_THRESHOLD else ""
    print("EMG: {:5d}  ({:.2f} V)  {}".format(raw, voltage, label))
    time.sleep(0.02)

Arduino — Moving Average Smoothing

emg_smoothed.ino
// ShillehTek EMG Sensor - Smoothed reading with a moving average.
// Averaging over N samples makes flex detection much more reliable.

const int EMG_PIN = A0;
const int N = 16;               // window size
int buf[N];
int idx = 0;
long sum = 0;

const int FLEX_THRESHOLD = 380;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < N; i++) buf[i] = 0;
}

void loop() {
  int raw = analogRead(EMG_PIN);
  sum -= buf[idx];
  buf[idx] = raw;
  sum += raw;
  idx = (idx + 1) % N;
  int avg = sum / N;

  Serial.print("raw:");
  Serial.print(raw);
  Serial.print("  avg:");
  Serial.print(avg);
  Serial.println(avg > FLEX_THRESHOLD ? "  FLEX!" : "");

  delay(20);
}

Frequently Asked Questions

How do I place the electrodes on my arm?
Clean the skin with alcohol, then stick two pads along the muscle you want to monitor (one on the belly of the muscle, one near a tendon) and the third "reference" pad on a bony spot like the back of your wrist or elbow. Flex the target muscle — the reading on SIG should jump noticeably.
Can I use this with a Raspberry Pi?
Yes, but the Pi has no built-in analog input, so you need an external ADC such as the ADS1115 (I2C) to read the SIG line. Any ADC with at least 10-bit resolution will work. Our ADS1115 breakout is a popular pairing for exactly this kind of project.
Why is the signal so noisy?
EMG is inherently noisy because it's a tiny biological signal. The module amplifies and filters it, but skin prep, electrode quality, and electrical noise in the environment all matter. Clean the skin, make sure the pads are stuck firmly, move away from strong AC sources (big monitors, motors, fluorescent lights), and apply a moving-average or low-pass filter in software.
Is this a medical-grade sensor?
No. This kit is designed for hobby, education, robotics, and STEM projects. It is NOT a medical device and should not be used for diagnosis, treatment, or any clinical purpose.
Can I run it at 3.3V?
Yes. The module runs on anything from 3.3V to 5V. For 3.3V microcontrollers like the ESP32, Pico, and Raspberry Pi, powering the module from the board's 3V3 rail keeps SIG safely inside the ADC's input range.
What threshold should I use to detect a flex?
Thresholds are personal and depend on electrode placement, skin contact, and the muscle you're targeting. The usual approach is to print the resting value, note where it sits, relax and flex a few times to see the peak, and set the threshold about halfway between. Start with ~1/3 of full scale (around 340 out of 1023 on Arduino) and adjust from there.
Can I detect individual finger movements?
Not reliably with a single EMG channel. Fine finger motions produce overlapping signals in the forearm, so you'd need multiple modules (one per muscle group) plus a classifier to tell them apart. For on/off style detection ("clenched fist vs relaxed") a single channel works great.

Related Tutorials