Getting Started with the ProtoCentral tinyGSR (EDA / GSR · Qwiic / STEMMA QT)
Introduction
The ProtoCentral tinyGSR is a two-electrode electrodermal activity (EDA / galvanic skin response) sensor that reports absolute skin conductance in microsiemens (µS) over I2C. EDA tracks the activity of the eccrine sweat glands, which is driven directly by the sympathetic nervous system — making it one of the most direct physiological measures of arousal, stress, attention and cognitive load available.
What separates this board from a typical GSR module is that the number it gives you is a real physical quantity, not an arbitrary index. One electrode sits at ground; the other is held at V_exc ≈ 0.5 V by a zero-drift TI OPA2333 in a transimpedance loop. The skin draws I = V_exc × G_skin, and a precision 39.2 kΩ (0.1 %) feedback resistor converts that current into a voltage which the TI TLA2022 12-bit ADC reads differentially (AIN0 = V_out, AIN1 = V_exc). The 0.5 V pedestal cancels in hardware, leaving only the conductance term:
G[µS] = V_diff / (V_exc × R_f) × 1e6
Because both V_exc (an LM4040-2.0 reference through a 0.1 % divider) and R_f are known precision quantities, ADC counts map to microsiemens deterministically — two boards agree with each other, and a recording made today is comparable with one made next month.
Note: This board is intended for research, education and evaluation only. It is not FDA, CE or FCC approved for consumer or clinical use.
Key Features
- Absolute skin conductance in microsiemens — no per-unit trimming, no arbitrary units
- 0.5 V constant-voltage transimpedance front-end built on the TI OPA2333 zero-drift op-amp
- TI TLA2022 12-bit Δ-Σ ADC, differential AIN0–AIN1 measurement over I2C
- On-board calibration resistor — 100 kΩ 0.1 % (exactly 10.00 µS) behind the SHORT FOR CAL jumper
- 3.3 V – 5 V supply and IO, with level translation on board
- Two Qwiic / STEMMA QT connectors for solder-free daisy-chaining, plus a 0.1″ breakout header
- Selectable I2C address — 0x48 default, 0x49 via the ADDR jumper
- 3.5 mm jack for the supplied snap electrode cable, with E1 / E2 pads broken out
- 35 × 25 mm, four M2.5 mounting holes
- Open-source hardware (CERN-OHL-P v2) with an MIT-licensed Arduino library
What’s in the Box
- 1× ProtoCentral tinyGSR breakout board
- 1× 3.5 mm two-lead snap electrode cable
- 10× Disposable Ag/AgCl snap electrodes
- 1× 0.1″ header strip (unsoldered)
You will also need an I2C host — an Arduino Uno R4, an ESP32 or RP2040 board, or a Raspberry Pi — and a Qwiic / STEMMA QT cable if you would rather not solder the header.
Ag/AgCl electrodes are not optional. They are non-polarizable, which is what makes a stable DC baseline possible. Dry metal or stainless-steel contacts drift steadily and will not give a usable absolute reading.
Specifications
| Parameter | Value |
|---|---|
| Measurement | Absolute skin conductance (µS) and resistance (kΩ) |
| Front-End | TI OPA2333 zero-drift transimpedance, V_exc ≈ 0.5 V, R_f = 39.2 kΩ 0.1 % |
| ADC | TI TLA2022, 12-bit Δ-Σ, differential AIN0–AIN1 |
| Effective Resolution | ~0.006 µS per LSB (oversampled) |
| Calibration Reference | On-board R_cal = 100 kΩ 0.1 % = 10.00 µS |
| Interface | I2C — 2× Qwiic / STEMMA QT + 0.1″ 4-pin header |
| Default I2C Address | 0x48 (ADDR → GND); 0x49 via the ADDR jumper |
| Supply Voltage | 3.3 V – 5 V (VCC and IO) |
| Front-End Bandwidth | DC – ~18 Hz (phasic EDA activity is ~0.05 – 1 Hz) |
| Current into Skin | ≤ 50 µA at 0.5 V |
| Electrode Connection | 3.5 mm jack + E1 / E2 pads |
| Dimensions | 35 × 25 mm, 2-layer |
Hardware Setup
Wiring Diagram
The tinyGSR talks to the host over I2C, and there are two equally valid ways to connect it.
Option A — Qwiic / STEMMA QT (Recommended, solder-free)
Plug a 4-pin Qwiic cable from either of the board’s two JST-SH connectors into any Qwiic-equipped host. The Arduino Uno R4 (Minima or WiFi) has a built-in Qwiic socket; for a classic Uno R3, use a SparkFun Qwiic Shield. Any ESP32 or RP2040 board with a Qwiic / STEMMA QT socket works the same way. The second connector lets you daisy-chain the next device on the bus.
Option B — 0.1″ Header to a Breadboard
Solder the included header strip to the 4-pin footprint and wire four lines:
| tinyGSR Pin | Arduino Uno | ESP32 (default I2C) | Function |
|---|---|---|---|
| VCC | 3.3 V or 5 V | 3.3 V | Power |
| GND | GND | GND | Ground |
| SDA | A4 | GPIO21 | I2C data |
| SCL | A5 | GPIO22 | I2C clock |
Tip: Both the Qwiic connectors and the breakout header land on the same I2C bus — use whichever is mechanically convenient, the code is identical. I2C pull-ups are already on the board, so no external resistors are needed.
Setting the I2C Address
The board answers at 0x48 by default. If another device on your bus already occupies that address, move the ADDR jumper on the underside of the board to select 0x49. Two tinyGSR boards can therefore share one bus.
Electrode Connections
Plug the supplied two-lead snap cable into the 3.5 mm jack on the edge of the board. Its two snap contacts — red and green — connect to the board’s E1 and E2 nodes, which are also broken out as solder pads if you would rather fit your own leads.
Electrode Placement on the Palm
EDA is measured between two skin-contact electrodes. The recommended placement for the tinyGSR is the thenar and hypothenar eminences of the palm of the non-dominant hand — the fleshy mound at the base of the thumb, and the heel of the palm below the little finger. Both sites carry a very high density of eccrine sweat glands, which gives a clean, stable conductance signal, and using the non-dominant hand leaves the other hand free during a recording.
| Electrode | Snap Lead | Placement on Body | Function |
|---|---|---|---|
| A | Connects to E1 | Thenar eminence — fleshy mound at the base of the thumb, palmar side, non-dominant hand | One side of the conductance path |
| B | Connects to E2 | Hypothenar eminence — heel of the palm below the little finger, same hand | Other side of the conductance path |
Wash and dry the hand before applying the electrodes — the gel pads need a clean, dry surface to adhere, and hand lotion will ruin the contact.
Tip for clean signals: EDA is sensitive to motion artefact, ambient temperature and posture. For first-light testing, sit still, rest the hand palm-up on a flat surface, and give the baseline 5 – 10 seconds to settle. Cold hands and heavy sweating both shift the baseline, so note any obvious physical changes alongside your data.
Alternate Placements
For the classic Boucsein research convention, place the electrodes on the palmar pads of the distal phalanges of the index and middle fingers of the same hand. The signal is slightly larger there, but it is harder to keep still during a recording.
For wearable or long-duration recordings, the inner wrist also works. The signal is smaller because the sweat-gland density is lower, but the form factor is far easier to stabilise on a strap or watch band.
Installing the Arduino Library
The tinyGSR library is standalone — it drives the on-board TLA2022 ADC directly, so there is nothing else to install.
Option 1: Arduino Library Manager (Recommended)
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Search for “ProtoCentral tinyGSR”
- Click Install
Option 2: Manual Install from GitHub
- Download or clone github.com/Protocentral/protocentral_tinygsr_arduino
- Copy the folder into your Arduino libraries directory (
~/Documents/Arduino/libraries/) - Restart the Arduino IDE
Upgrading from an older tinyGSR? The v1 board used a relative-output front-end and a library that depended on the TLA20xx and FIR Filter libraries. This library replaces both, returns absolute microsiemens instead of an index, and defaults to address 0x48 rather than 0x49. Sketches written for the v1 board will need updating.
Your First Skin-Conductance Reading
Open the example sketch: File → Examples → ProtoCentral tinyGSR → 01-Basic-Conductance-Read
Or create a new sketch with the following code:
#include <Wire.h>
#include "protocentral_TinyGSR.h"
TinyGSR gsr;
void setup() {
Serial.begin(115200);
Wire.begin();
if (!gsr.begin()) {
Serial.println("tinyGSR not found - check wiring / Qwiic connection");
while (1);
}
}
void loop() {
Serial.print(gsr.readFiltered(), 3); // smoothed conductance, microsiemens
Serial.print(" uSt");
Serial.print(gsr.readResistance() / 1000.0, 2);
Serial.println(" kOhm");
delay(100);
}
What This Code Does
- Includes the libraries —
Wire.hfor I2C andprotocentral_TinyGSR.hfor the sensor - Initialises the board —
begin()configures the ADC for a differential ±2.048 V continuous conversion and returnsfalseif the device does not acknowledge on the bus - Reads conductance —
readFiltered()returns an 8-tap moving average in microsiemens;readConductance()gives you the unfiltered value - Reads resistance —
readResistance()returns the reciprocal in ohms, printed here in kΩ - Prints once every 100 ms — a 10 Hz update rate is plenty for a signal whose interesting content sits below 1 Hz
Using the Arduino Serial Plotter
- Upload the sketch
- Attach the electrodes to the palm as described above
- Open Tools → Serial Plotter at 115200 baud
- Wait about 10 seconds for the baseline to settle. A relaxed tonic level typically sits between 1 and 20 µS
- Take a deep breath, work through a piece of mental arithmetic, or have someone clap unexpectedly — a phasic skin-conductance response (SCR) should rise within one to three seconds and decay slowly over the following five to ten
The API You Will Actually Use
| Method | Returns | Description |
|---|---|---|
begin() |
bool |
Configure the ADC; false if the board does not respond |
isConnected() |
bool |
The ADC acknowledges on the I2C bus |
readConductance() |
float |
Absolute skin conductance, µS |
readFiltered() |
float |
8-tap moving-average conductance, µS |
readResistance() |
float |
Skin resistance, ohms (INFINITY when the circuit is open) |
readVoltage() |
float |
Raw differential front-end voltage, V |
isContact() |
bool |
The electrodes appear to be connected to skin |
isOverRange() |
bool |
The reading is saturating near full scale |
calibrate(known_us) |
void |
One-point calibration against the on-board R_cal |
Self-Check and Calibration
Every board carries a precision 100 kΩ 0.1 % resistor — exactly 10.00 µS — behind the jumper marked SHORT FOR CAL. It lets you prove the entire signal chain works without a subject attached, and folds the tolerances of R_f, V_exc and the ADC gain into a single stored scale factor.
- Remove the electrodes from the subject and close the SHORT FOR CAL jumper
- Run File → Examples → ProtoCentral tinyGSR → 02-Self-Check-Calibration. The reading should be 10.00 µS, and the example stores the resulting scale factor
- Open the jumper again before measuring anyone — left closed, it shunts the input and the board will read 10 µS no matter what the skin is doing
Tip: Run the self-check first whenever a reading looks wrong. If the board reports 10.00 µS with the jumper closed, the front-end and the ADC are working correctly and the problem is in the electrodes, the placement or the skin contact — which is where almost all real-world EDA trouble lives.
Visualizing with OpenView
For a richer view than the Serial Plotter — a scrolling trace, event markers and session recording — use the ProtoCentral OpenView application:
- Install OpenView — the setup guide covers downloads and first run on Windows, Linux, macOS and Android
- Upload the OpenView example sketch from the library examples
- Open OpenView and select “tinyGSR Breakout” from the Board dropdown
- Select the serial port your host board enumerated on and click Start
- You will see the live skin-conductance trace, which you can annotate with event markers and export for offline analysis
Note: The OpenView sketch streams over USB serial at 57600 baud, which is set by the example — this is deliberately different from the 115200 baud used by the Serial Plotter examples. If OpenView shows no trace, check the baud rate first.
Troubleshooting
Sensor not found / begin() returns false
- Reseat the Qwiic cable at both ends — a partially seated connector is by far the most common cause of I2C failures
- For breadboard wiring, verify SDA → A4 and SCL → A5 on an Arduino Uno, VCC connected, and a solid common ground
- Run the standard
i2c_scannerexample and confirm a device responds at 0x48 (or 0x49 if you moved the ADDR jumper) - If another Qwiic device on the bus already sits at 0x48, move the tinyGSR with the ADDR jumper
The reading sits at exactly 10 µS and never moves
The SHORT FOR CAL jumper is still closed. Open it — the on-board calibration resistor is shunting the input.
Flat or unchanging signal
- Check both electrodes are snapped firmly onto fresh gel pads, gel side against the skin, away from hair and callus
- Give the contact 30 – 60 seconds after application for the skin interface to stabilise
- Call
isContact()— it reports whether the electrodes look connected at all - Try the alternate finger or wrist placement if the palm skin is unusually dry
Very noisy or jumpy signal
- Hold still — hand and wrist motion produces artefacts far larger than the signal you are looking for
- Rest the hand palm-up on a flat surface; a clenched fist moves the baseline through tendon contraction
- Keep the host board and USB cables away from the electrode leads to reduce mains-frequency pickup
- Replace electrodes whose gel has dried out
Readings are plausible but disagree with another instrument
Run the self-check above. If the board reads 10.00 µS with the jumper closed, the front-end and ADC are correct, and the difference comes from electrode type, placement or contact area — the three factors that dominate real-world EDA accuracy.
Resources
- Arduino Library: github.com/Protocentral/protocentral_tinygsr_arduino
- Hardware Design Files: github.com/Protocentral/protocentral_tinygsr_hardware
- MicroPython Driver: github.com/Protocentral/protocentral-micropython-tinygsr
- TLA2022 Datasheet: TI TLA2022 Datasheet (PDF)
- OPA2333 Datasheet: TI OPA2333 Datasheet (PDF)
- OpenView: setup guide · source on GitHub
- Background reading on EDA: Wikipedia — Electrodermal activity
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License

