Getting Started

Getting Started with the Protocentral ADS1293 3-Channel ECG Breakout Board

Last updated Oct 28, 2026

Getting Started with the Protocentral ADS1293 3-Channel ECG Breakout Board

Introduction

The Protocentral ADS1293 breakout board is a 3-channel, 24-bit electrocardiogram (ECG) analog front-end based on the Texas Instruments ADS1293. It records up to three ECG channels simultaneously, which covers standard 3-lead and 5-lead ECG. It suits portable health monitoring, sports and fitness projects, and research-grade biopotential measurement.

Each channel has its own instrumentation amplifier and 24-bit sigma-delta ADC, with output data rates from 25 to 1600 samples per second. The chip also has a built-in Right Leg Drive (RLD) amplifier for common-mode noise rejection and a Wilson Central Terminal for the precordial (chest) lead. The board connects to an Arduino, ESP32 or any other microcontroller over SPI, and ships with electrode cables and disposable electrodes, so you can record your first ECG straight out of the box.

Safety: not a medical device. This board is for research and education only. It is not FDA, CE or FCC approved for consumer or medical use, and it has no patient isolation. Whenever electrodes are on a person, power the host from a battery. Never connect electrodes while the host is plugged into mains-powered USB, a mains-powered computer or test equipment.

Key Features

  • 3 simultaneous ECG channels: 24-bit sigma-delta ADCs with independent input routing
  • 3-lead and 5-lead ECG: Einthoven limb leads plus the V1 precordial lead
  • 25 to 1600 samples per second: 15 data-rate presets in the Arduino library, default 200 SPS
  • Built-in Right Leg Drive (RLD): active common-mode noise cancellation
  • Wilson Central Terminal: reference for the precordial lead in 5-lead ECG
  • Lead-off detection: DC and AC, reporting which electrode is off
  • Ultra-low power: 0.3 mW per channel
  • SPI interface with an onboard level shifter, so header logic follows VCC (3.3 V or 5 V)
  • On-board 4.096 MHz crystal, or clock the board externally through the CLK OUT/IN pad
  • On-board 3.3 V regulator for the ADS1293
  • Cables and electrodes included

What’s in the Box

  • 1× Protocentral ADS1293 breakout board (v2)
  • 2× 3-lead snap electrode cables with 3.5 mm plugs
  • 10× disposable stick-on ECG electrodes
  • 1× 10-pin 0.1″ header strip (unsoldered)

You will also need an Arduino Uno, an ESP32 board or another microcontroller, jumper wires, and a USB cable.

Specifications

Parameter Value
ECG AFE IC Texas Instruments ADS1293
ADC Resolution 24-bit per channel
Number of Channels 3 simultaneous ECG + 1 pace channel
Output Data Rate 25 to 1600 SPS (library default 200 SPS)
Differential Input Range ±400 mV
Interface SPI
Power per Channel 0.3 mW
Clock 4.096 MHz crystal on board (409.6 kHz chip clock); external clock via CLK OUT/IN pad
Supply Voltage (VCC) 3.3 V to 5 V
Logic Level Equal to VCC. Power the board from your microcontroller’s I/O voltage
ECG Inputs IN1–IN6 (RA, LA, LL, RL, V1, IN6)

Header Pinout (v2 board)

Pin Name Function
1 DRDY Data ready output, active low
2 MOSI SPI data in
3 MISO SPI data out
4 SCK SPI clock
5 CSB SPI chip select, active low
6 RST Reset, active low. Connect to your microcontroller
7 SYNC Filter synchronisation. Connect to your microcontroller
8 ALARM Alarm output, open drain, active low (optional)
9 VCC Power in, 3.3 V to 5 V. Also sets the logic level of pins 1–8
10 GND Ground

Notes on the header:

  • Pins 1–8 pass through a TXB0108 auto-direction level shifter that runs at VCC. Power the board from the same voltage as your microcontroller’s I/O: 5 V for an Arduino Uno, 3.3 V for ESP32, nRF52 and RP2040.
  • Do not add pull-up or pull-down resistors on pins 1–8. The level shifter cannot drive them.
  • RST and SYNC must be wired to your microcontroller. The chip’s pull-ups on these lines are on the chip side of the level shifter, so the header pins have no defined level of their own. Left unconnected, they can hold the chip in reset or keep restarting its filters. Wire both to microcontroller pins and pass them to the library; the library holds them in a defined state.
  • CLK is on the CLK OUT/IN pad next to the level shifter, not on the header. It is not level-shifted: 3.3 V signals only.

Pin Connections

Wiring Diagram

Wiring diagram: Protocentral ADS1293 breakout v2 to Arduino Uno, with RST to D5, SYNC to D6, CSB to D4, DRDY to D2, SPI on D11-D13, VCC to 5V

Pin Table

All examples in the library use these pins. SCK, MISO and MOSI are each board’s default SPI pins.

ADS1293 Pin Arduino Uno / Nano / R4 ESP32 DevKit ESP32-S3 DevKitC ESP32-C3
CSB D4 GPIO 5 (SS) GPIO 10 (SS) GPIO 7 (SS)
DRDY D2 GPIO 4 GPIO 4 GPIO 3
RST D5 GPIO 25 GPIO 5 GPIO 1
SYNC D6 GPIO 26 GPIO 6 GPIO 10
SCK D13 GPIO 18 GPIO 12 GPIO 4
MISO D12 GPIO 19 GPIO 13 GPIO 5
MOSI D11 GPIO 23 GPIO 11 GPIO 6
VCC 5V 3V3 3V3 3V3
GND GND GND GND GND

Never power the board from 5 V when it is connected to a 3.3 V microcontroller. The header logic level equals VCC, so 5 V on VCC puts 5 V signals on the ESP32’s pins.

  • ESP32-S2, S3 and C3: the classic ESP32 pins 18/19/23 are USB pins on these chips, or do not exist. Use the columns above.
  • Other boards: CSB, DRDY, RST and SYNC can be any digital pins; set them in the sketch. DRDY needs an interrupt-capable pin only for the interrupt-driven example (06.InterruptDriven).

Electrode Connections

The board has two 3.5 mm jacks, CON1 and CON2. Each carries three contacts (tip, ring and sleeve). The electrode names are printed on the board next to each jack. The board ships with two 3-lead snap cables, each with a 3.5 mm plug.

5-lead ECG electrode diagram for the ADS1293 breakout v2: CON1 cable to RA, LA and RL, CON2 cable to LL and V1, Mason-Likar torso placement

Electrode Jack Contact ADS1293 Input Used in
RA CON1 Ring IN1 3-lead and 5-lead
LA CON1 Tip IN2 3-lead and 5-lead
RL CON1 Sleeve IN4 (right-leg drive) 3-lead and 5-lead
LL CON2 Tip IN3 3-lead and 5-lead
V1 CON2 Sleeve IN5 5-lead only

Both cables are needed for 3-lead ECG as well as 5-lead, because LL is on CON2. In 3-lead mode, the V1 lead on the CON2 cable is simply left off the body.

Solder jumper CONN IN6 / WCT (JP2). By default it connects IN6 to the ring contact of CON2. The library’s 5-lead mode drives IN6 from the on-chip Wilson Central Terminal, so nothing should be connected to the ring of CON2 in 5-lead mode.

What each channel measures

Channel 3-lead 5-lead
CH1 Lead I = LA − RA Lead I = LA − RA
CH2 Lead II = LL − RA Lead II = LL − RA
CH3 off V1 − WCT (Wilson Central Terminal, built on-chip from RA, LA and LL)

Lead III is computed in software: Lead III = Lead II − Lead I. The RL electrode holds the body at mid-supply and cancels common-mode noise, so keep it attached in every configuration.

Electrode Placement Guide (Mason-Likar)

All electrodes go on the torso, not the limbs, following the Mason-Likar placement used in clinical monitoring:

Electrode Position on Body
RA Below the right collarbone, near the right shoulder
LA Below the left collarbone, near the left shoulder
RL Lower right abdomen
LL Lower left abdomen
V1 4th intercostal space, right sternal border (between the ribs, next to the sternum)

Tip: Use fresh gel electrodes on clean, dry skin. Wipe each site with an alcohol swab first for better adhesion and signal quality.

Installing the Arduino Library

This guide is for library version 2.0 or later. Version 2.0 is a rewrite and is not compatible with sketches written for 1.x (see Upgrading from library 1.x below).

Option 1: Arduino Library Manager (Recommended)

  1. Open the Arduino IDE
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for “Protocentral ADS1293”
  4. Find “Protocentral ADS1293 ECG Library”, check the version is 2.0.0 or later, and click Install

If Library Manager only offers 1.x versions, install 2.0 from GitHub with Option 2 below.

Option 2: Manual Install from GitHub

  1. Go to github.com/Protocentral/protocentral-ads1293-arduino
  2. Click Code → Download ZIP
  3. In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
  4. Select the downloaded ZIP file

Your First ECG Reading (3-Lead)

Open the bundled example: File → Examples → Protocentral ADS1293 ECG Library → 01.ThreeLeadSerialPlotter. It already contains the pin settings for Arduino Uno, ESP32, ESP32-S3 and ESP32-C3.

The core of a sketch looks like this (Arduino Uno pins):

#include <SPI.h>
#include "Protocentral_ADS1293.h"

// CS, DRDY, RST, SYNC
Protocentral_ADS1293 ads(4, 2, 5, 6);

void setup() {
    Serial.begin(115200);
    if (!ads.begin()) {                        // 3-lead ECG at 200 SPS
        Serial.print("ADS1293 begin() failed, error ");
        Serial.println((int)ads.lastError());  // run 10.Diagnostics for details
        while (1);
    }
}

void loop() {
    ADS1293_Sample s;
    if (ads.available() && ads.read(s)) {
        Serial.print(ads.countsToMicrovolts(s.ecg[0]));                          // Lead I, µV
        Serial.print(' ');
        Serial.println(ads.countsToMicrovolts(s.ecg[1], ADS1293_Channel::CH2));  // Lead II, µV
    }
}

What This Code Does

  1. Creates the driver with chip select on D4, data ready on D2, and RST and SYNC on D5 and D6. The library drives RST and SYNC for you.
  2. begin() resets the chip, checks it responds, and configures 3-lead ECG at 200 SPS with right-leg drive and DC lead-off detection. It returns false and sets lastError() if anything fails.
  3. available() and read() fetch each new sample.
  4. countsToMicrovolts() converts the raw counts to microvolts at the electrodes.

The bundled 01.ThreeLeadSerialPlotter example also removes the electrode offset and prints Leads I, II and III, which gives cleaner traces in the plotter.

Using the Arduino Serial Plotter

  1. Upload 01.ThreeLeadSerialPlotter
  2. Attach the RA, LA, LL and RL electrodes (see Electrode Connections above), with the host running on battery power
  3. Open Tools → Serial Plotter at 115200 baud
  4. You should see live ECG waveforms with the characteristic PQRST complex of your heartbeat

Tip: Place electrodes on smooth skin with minimal hair, and sit still while recording.

More examples

Example What it does
01.ThreeLeadSerialPlotter Leads I, II and III in µV in the Serial Plotter
02.FiveLeadSerialPlotter Leads I, II and V1 (5-lead)
03.OpenView Streams three leads to OpenView
04.LeadOffDetection Reports which electrode is off
05.SelfTest Test signals and noise floor, no electrodes needed
06.InterruptDriven 400 SPS with a DRDY interrupt
07.PaceDetection Pacemaker-pulse detection
08.SupplyAndAlarms Supply voltage and error registers
09.MultiBoardClockSync Two boards sampling in step
10.Diagnostics Step-by-step hardware check. Run this first if something is wrong

Changing the configuration

begin() with no arguments gives 3-lead ECG at 200 SPS. For 5-lead ECG or another data rate, pass a configuration:

ADS1293_Config cfg;
cfg.leadSet  = ADS1293_LeadSet::FiveLead;    // ThreeLead, FiveLead or Custom
cfg.dataRate = ADS1293_DataRate::SPS_400;    // SPS_25 ... SPS_1600
ads.begin(cfg);

ESP32 Setup

The bundled examples pick the right pins automatically for ESP32, ESP32-S3 and ESP32-C3. To use your own SPI pins on an ESP32, pass them to begin():

// CS, DRDY, RST, SYNC
Protocentral_ADS1293 ads(5, 4, 25, 26);

ads.begin(18, 19, 23);   // SCK, MISO, MOSI

Remember to power the board from 3V3, not 5V.

Upgrading from library 1.x

Library 2.0 changes the API: the header is now Protocentral_ADS1293.h, the constructor takes (CS, DRDY, RST, SYNC) in that order, and begin() replaces the ten configure…() calls. Sample rates are now named by their real values (the 1.x SPS_128 setting actually ran at 320 SPS). The full mapping is in the migration table in the library README.

Visualizing with OpenView

For a richer view, use the Protocentral OpenView application:

  1. Install OpenView 2. The setup guide covers downloads and first run on Windows, Linux, iOS and Android
  2. Upload the 03.OpenView example (115200 baud, 200 samples per second, three channels). For 5-lead, set FIVE_LEAD to 1 at the top of the sketch
  3. Open OpenView 2 and select “ADS1293 Breakout” from the board list
  4. Select the serial port and click Connect to see real-time ECG waveforms

The OpenView sketch sends only data packets; don’t add Serial.print calls to it, or the stream will be corrupted.

Troubleshooting

Run 10.Diagnostics first. It checks SPI, the clock, the data path, DRDY and the test signal separately, and tells you which stage fails.

begin() fails, or no conversions (NoClock), or data comes and goes between resets

  • Check that RST and SYNC are wired to the microcontroller pins passed to the constructor. An unconnected RST or SYNC pin is the most common cause.
  • Power-cycle the board itself, not only the microcontroller.

begin() fails with SpiError

  • Check the CSB, SCK, MOSI and MISO wiring, VCC and GND.
  • Check that VCC matches your microcontroller’s I/O voltage (3V3 for ESP32).
  • On ESP32-S2, S3 and C3, don’t use pins 18/19/23. Use the pins in the table above.

begin() fails with VerifyFailed

  • Registers are not reading back correctly. Shorten the jumper wires, or add #define ADS1293_SPI_CLOCK 500000 before the #include.

DRDY stuck low, or at an in-between voltage

  • Remove any pull-up or pull-down resistor from DRDY.
  • Check that VCC matches your microcontroller’s I/O voltage.
  • The data still works: the library notices a DRDY pin that does not follow the chip and polls the chip instead. ads.dataReadyPinFault() returns true when this happens, and 10.Diagnostics reports it.

All electrodes report lead-off

  • The RL electrode is missing or loose. Without it the lead-off current has no return path, so every electrode looks disconnected.

Flat line or very noisy signal

  • Run 05.SelfTest. If the board passes, the problem is electrode contact or placement.
  • Use fresh electrodes (the gel dries out), clean the skin, and keep the cables still.
  • Make sure the RL electrode is attached.

Mains hum (50/60 Hz)

  • Power the host from a battery and move away from mains cables, chargers and motors.
  • Keep the RL electrode attached.

Hardware Revisions

The same library and examples run on both board revisions.

v2 (current) v1
Header 10-pin: DRDY, MOSI, MISO, SCK, CSB, RST, SYNC, ALARM, VCC, GND 12-pin: 5V, GND, ALARM, RST, OE, CS, MOSI, SCK, MISO, DRDY, CLK, GND
SYNC On the header Not brought out. Pass -1 for SYNC
CLK CLK OUT/IN pad Header pin
Logic level Equal to VCC Set by solder jumper SJ1 (VIN or 3.3 V)
IN6 jumper JP2 JMP1

The v2 header is not pin-compatible with the v1 header, so re-check your wiring when moving from v1 to v2.

Board Limitations

Feature On this board
Goldberger terminals The chip connects them to IN4–IN6, and IN4 is the RL electrode. Disable the right-leg drive before using them, or compute aVR, aVL and aVF in software
Analog pace output to RLDIN RLDIN is tied to RLDREF on the board. Route the analog pace output to WCT instead (via JP2)
CLK Not level-shifted: 3.3 V signals only
SYNC on v1 Not on the v1 header, so v1 boards sharing a clock are not phase-aligned

Using Several Boards Together

Two or more boards can sample in step from one clock (example 09.MultiBoardClockSync):

  • Connect the master’s CLK OUT/IN pad to each slave’s CLK OUT/IN pad (3.3 V only)
  • Connect SYNC board to board, and share RST
  • Give each board its own CSB line

Resources

Licenses

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