Getting Started with the ProtoCentral tinyGSR (GSR / EDA · Qwiic / STEMMA QT)
Introduction
The ProtoCentral tinyGSR is a small, ready-to-use Galvanic Skin Response (GSR) / Electrodermal Activity (EDA) breakout that lets you measure the electrical conductance of the skin in real time. GSR / EDA is widely used as a proxy for sympathetic nervous-system arousal — it tracks emotional response, stress, attention and cognitive load by detecting tiny changes in sweat-gland activity that show up as variations in skin resistance.
The board pairs Texas Instruments’ LM324P quad op-amps (front-end signal conditioning) with the TLA2022 12-bit Δ-Σ ADC over an I2C bus. The host MCU just reads the converted skin-conductance value — no analog tuning, no calibration sketches. A Qwiic / STEMMA QT connector lets you plug it straight into any Qwiic-compatible host (Arduino Uno R4, ESP32 dev boards with Qwiic, RP2040 boards) without jumper wires, and a parallel set of 2.54 mm header pads is provided for breadboard wiring.
Note: This board is intended for research and development purposes only. It is not FDA, CE, or FCC approved for consumer or medical use.
Key Features
- TI TLA2022 12-bit Δ-Σ ADC — clean digital output over I2C
- TI LM324P quad op-amps — analog front-end conditioning
- Qwiic / STEMMA QT connector — plug-and-play I2C, no soldering
- Standard 2.54 mm headers — also breadboard-compatible
- Two snap electrode leads (E1, E2) for the dry-skin contacts
- 3-way I2C address jumper — run multiple tinyGSR sensors on one bus
- Programmable data rate — up to 3.3 kSPS
- Ultra-low power — 150 µA typical
- Compact — 20 × 20 mm
What’s in the Box
- 1× ProtoCentral tinyGSR breakout board
- 2× Snap electrode leads (for E1 and E2)
- A small set of disposable Ag/AgCl snap electrodes for first-light testing
You will also need an Arduino Uno (or compatible board) and a Qwiic / STEMMA QT cable, or four jumper wires for header-pin connection.
Specifications
| Parameter | Value |
|---|---|
| ADC | TI TLA2022 12-bit Δ-Σ |
| Front-End | TI LM324P quad op-amp |
| Programmable Data Rate | Up to 3.3 kSPS |
| Programmable Gain | ±256 mV to ±6.144 V |
| Supply Current | 150 µA (typ.) |
| Supply Voltage | 2 V – 5.5 V |
| Interface | I2C (Qwiic + 4-pin breakout header) |
| Default I2C Address | 0x49 (configurable via 3-way jumper) |
| Connectors | Qwiic JST SH · 2.54 mm header · 2× snap electrode leads |
| Dimensions | 20 × 20 mm |
Hardware Setup
Wiring Diagram
The tinyGSR talks to the host over I2C. There are two equally valid ways to connect it:
Option A — Qwiic / STEMMA QT (no jumper wires). Plug a 4-pin Qwiic cable from the tinyGSR’s onboard JST connector to any Qwiic-equipped host. The Arduino Uno R4 (Minima or WiFi) has a built-in Qwiic socket; for a classic Uno, add a SparkFun Qwiic Shield. Other compatible hosts include any ESP32 / RP2040 dev board with a Qwiic or STEMMA QT socket.
Option B — Standard breadboard headers. Solder header pins to the 4-pin breakout footprint and wire to the Arduino:
| tinyGSR Pin | Arduino Uno Pin | Function |
|---|---|---|
| SDA | A4 | I2C data |
| SCL | A5 | I2C clock |
| VIN | 5 V | Power |
| GND | GND | Ground |
Tip: Both Qwiic and the breadboard header tie into the same I2C bus. You can use whichever is mechanically convenient — the library and code are identical.
Electrode Connections
The two solder pads labelled E1 and E2 on the tinyGSR break out the differential skin-contact inputs. The kit ships with two snap leads — push one onto each pad and attach the other end to your Ag/AgCl electrodes.
Electrode Placement on the Body
GSR is measured between two skin-contact electrodes. The recommended placement for the tinyGSR is on the thenar and hypothenar eminences of the palm of the non-dominant hand — these are the two fleshy mounds at the base of the thumb (thenar) and below the pinky finger (hypothenar). Both sites have a very high density of eccrine sweat glands, giving a clean and stable conductance signal. Wash and dry the hand before applying electrodes; the gel pads need a clean dry surface to adhere.
| Electrode | Snap Lead | Placement on Body | Role |
|---|---|---|---|
| A | Connects to E1 on tinyGSR | Thenar eminence — fleshy mound at the base of the thumb, palmar side, non-dominant hand | One side of the skin-conductance bridge |
| B | Connects to E2 on tinyGSR | Hypothenar eminence — heel of the palm below the pinky finger, non-dominant hand | Other side of the bridge |
Tip for clean signals: GSR is sensitive to motion artefact, ambient temperature, and posture. For first-light testing, sit still in a chair, rest the hand palm-up, and wait 5 – 10 seconds for the baseline to stabilise. Cold hands or excessive sweating both shift the baseline; record any obvious physical changes alongside your data.
Alternate placements
For research workflows that prefer the classic Boucsein convention, you can place electrodes on the distal phalanges of the index and middle fingers (the palmar pads of the fingertips) instead. The signal is slightly larger there but harder to keep still during recording. For wearable / long-recording applications, the inner wrist also works — the signal is smaller but the form factor is easier to stabilise on a strap or watch band.
Installing the Arduino Library
The tinyGSR library depends on two other Arduino libraries — install all three from the Library Manager:
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Install “ProtoCentral TLA20xx” (the underlying ADC driver)
- Install “FIR Filter” by Leeman Geophysical LLC (smoothing filter for the GSR signal)
- Install “ProtoCentral tinyGSR” (or download from github.com/Protocentral/protocentral_tinygsr)
Note: The FIR Filter library is required — without it the ProtoCentral tinyGSR sketch will not compile.
Your First GSR Reading
Open the example sketch: File → Examples → ProtoCentral tinyGSR → gsr_basic
Or create a new sketch with the following code, which streams the raw GSR sample at ~10 Hz:
#include
#include "protocentral_tinygsr.h"
TinyGSR tinygsr;
void setup() {
Serial.begin(115200);
Wire.begin();
if (!tinygsr.begin()) {
Serial.println("tinyGSR not found — check wiring / Qwiic connection");
while (1);
}
tinygsr.setSampleRate(TinyGSR::SPS_128);
}
void loop() {
if (tinygsr.readSample()) {
Serial.println(tinygsr.gsr); // FIR-filtered GSR value
}
delay(100);
}
What This Code Does
- Includes the libraries —
Wire.hfor I2C andprotocentral_tinygsr.hfor the sensor - Initialises the chip —
begin()performs the I2C handshake; if the sensor isn’t found you’ll see a diagnostic in the Serial Monitor - Sets the sample rate — 128 SPS is a sensible default for visualising slow GSR changes
- Reads a sample —
readSample()pulls the latest reading and runs it through the FIR smoothing filter;gsris the float result in conductance units - Prints once every 100 ms — open the Serial Plotter at 115200 baud for a live trace
Using the Arduino Serial Plotter
- Upload the sketch
- Snap one electrode each onto the index and middle fingerpads of your non-dominant hand
- Open Tools → Serial Plotter at 115200 baud
- After ~5 seconds the baseline should settle. Try taking a deep breath, doing a quick mental-arithmetic problem, or recalling a stressful memory — you should see the trace rise (skin-conductance response) and slowly recover.
Visualizing with OpenView
For richer visualisation with built-in event markers, use the ProtoCentral OpenView application:
- Download OpenView 2 from GitHub
- Upload the OpenView example sketch from the library examples
- Open OpenView 2, select “tinyGSR” from the Board dropdown
- Select the correct serial port and click Start
- You’ll see the live GSR trace with a moving baseline and event-marker overlay
Troubleshooting
Sensor not found / begin() returns false
- Check the Qwiic cable is fully seated in both connectors — partial seat is the most common cause of I2C failures
- For breadboard wiring: verify SDA→A4 and SCL→A5 on Arduino Uno; VIN→5 V; solid GND
- Run an I2C scanner sketch (the standard
i2c_scannerexample) to confirm the device responds at 0x49 (or your jumper-selected address) - If you have multiple Qwiic devices on the bus and one is at 0x49, use the on-board ADDR jumper to move the tinyGSR to a different address
Flat / unchanging GSR signal
- Re-check both electrodes are firmly snapped onto fresh gel pads
- Make sure the gel side of the pad is in direct contact with skin — not over hair or callus
- Wait 30 – 60 seconds after applying electrodes for skin contact to stabilise
- Try the alternate palm or wrist placement if fingertip skin is too dry to conduct
Very noisy / jumpy signal
- Hold still during measurement — motion of the wrist / hand introduces large artefacts
- Rest the hand palm-up on a flat surface; tendon contraction in a clenched fist also moves the baseline
- Keep the host MCU and any USB cables away from the electrode leads to reduce mains-frequency pickup
- Replace electrodes if the gel has dried out
Signal saturates at the top or bottom of range
- The tinyGSR’s gain is programmable — call
setGain()to drop it one step if your skin conductance is unusually high - Conversely, very dry skin produces tiny readings; raise the gain for better resolution
Library compile errors
- Confirm both ProtoCentral TLA20xx and FIR Filter libraries are installed alongside the tinyGSR library — the tinyGSR sketch depends on both
Resources
- Arduino Library: github.com/Protocentral/protocentral_tinygsr
- TLA20xx Library: github.com/Protocentral/Protocentral_TLA20xx (dependency)
- FIR Filter Library: Search “FIR Filter” by Leeman Geophysical LLC in the Arduino Library Manager (dependency)
- TLA2022 Datasheet: TI TLA2022 Datasheet (PDF)
- OpenView 2: github.com/Protocentral/protocentral_openview2
- Background reading on EDA: Wikipedia — Electrodermal activity
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License


