Getting Started

Getting Started with the ProtoCentral tinyGSR (GSR / EDA · Qwiic / STEMMA QT)

Last updated May 8, 2026

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

tinyGSR Qwiic wiring to Arduino Uno R4

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.

tinyGSR two-electrode skin conductance placement on the thenar and hypothenar of the palm

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:

  1. Open the Arduino IDE
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Install “ProtoCentral TLA20xx” (the underlying ADC driver)
  4. Install “FIR Filter” by Leeman Geophysical LLC (smoothing filter for the GSR signal)
  5. 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

  1. Includes the librariesWire.h for I2C and protocentral_tinygsr.h for the sensor
  2. Initialises the chipbegin() performs the I2C handshake; if the sensor isn’t found you’ll see a diagnostic in the Serial Monitor
  3. Sets the sample rate — 128 SPS is a sensible default for visualising slow GSR changes
  4. Reads a samplereadSample() pulls the latest reading and runs it through the FIR smoothing filter; gsr is the float result in conductance units
  5. Prints once every 100 ms — open the Serial Plotter at 115200 baud for a live trace

Using the Arduino Serial Plotter

  1. Upload the sketch
  2. Snap one electrode each onto the index and middle fingerpads of your non-dominant hand
  3. Open Tools → Serial Plotter at 115200 baud
  4. 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:

  1. Download OpenView 2 from GitHub
  2. Upload the OpenView example sketch from the library examples
  3. Open OpenView 2, select “tinyGSR” from the Board dropdown
  4. Select the correct serial port and click Start
  5. 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_scanner example) 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

Licenses

  • Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
  • Software: MIT License