Getting Started with the ProtoCentral AFE4490 Pulse Oximeter Breakout
Introduction
The ProtoCentral AFE4490 Pulse Oximeter Breakout is a complete pulse-oximetry front-end based on the Texas Instruments AFE4490, a single-chip analog front-end designed specifically for transmissive pulse oximetry. The board pairs the AFE4490 IC with a standard Nellcor-compatible DB9 connector so you can plug in any off-the-shelf SpO2 finger-clip probe and start streaming photoplethysmography (PPG) data in minutes.
Pulse oximetry is an indirect, optical measurement of the oxygen saturation in arterial blood. The probe shines red (~660 nm) and infrared (~880 nm) light through a fingertip, ear lobe or other thin tissue, and a photodiode on the opposite side measures how much of each wavelength is absorbed. The ratio of red-to-IR absorption changes with the proportion of oxygenated to deoxygenated haemoglobin in the blood — the AFE4490 chip drives the LEDs and digitises the photodiode current, leaving the host MCU only the simple SpO2 ratio calculation. As a useful side effect, the same PPG waveform also carries a clear heart-rate signal — no chest electrodes required.
This getting-started guide covers both ProtoCentral AFE4490 SKUs:
- AFE4490 Pulse Oximeter Breakout Board Kit — standalone breakout that connects to any MCU via SPI plus a few GPIOs.
- AFE4490 Pulse Oximeter Shield for Arduino v2 — Arduino-form-factor shield that stacks directly on top of an Uno / Mega / Due / R4.
The pinout, library and example sketches are identical for both — the only difference is mechanical (shield vs. breakout).
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 AFE4490 single-chip pulse-oximetry front-end — drives RED + IR LEDs and digitises photodiode current
- Nellcor-compatible DB9 connector — works with any standard adult / paediatric SpO2 finger-clip probe
- 22-bit ambient-light-compensated ADC — clean PPG waveform even under indoor lighting
- Programmable LED current — adapts to skin tone, finger thickness and probe geometry for stable signals
- SPI interface — works with Arduino, ESP32 and any modern MCU
- 5 V tolerant I/O — direct connection to Arduino Uno / Mega / R4 without level shifters
- Two form factors — standalone breakout or Arduino-stacking shield, same library
What’s in the Box
Breakout Kit (8809):
- 1× ProtoCentral AFE4490 breakout board
- 1× Nellcor-compatible SpO2 finger-clip probe with DB9 connector
- Header pins (unsoldered)
Arduino Shield v2 (8810):
- 1× ProtoCentral AFE4490 Arduino shield (pre-assembled, stacks on Uno-style boards)
- 1× Nellcor-compatible SpO2 finger-clip probe with DB9 connector
You will also need an Arduino Uno (or compatible board) and a USB cable.
Specifications
| Parameter | Value |
|---|---|
| Pulse-Oximetry AFE IC | Texas Instruments AFE4490 |
| ADC | 22-bit, ambient-light-compensated transimpedance ADC |
| LED Wavelengths | RED ~660 nm + IR ~880 nm (driven by AFE4490) |
| LED Drive | Programmable current (typ. 0-50 mA per LED) |
| Probe Connector | DB9 (Nellcor-compatible pinout) |
| Interface | SPI (4-wire, mode 0) + DRDY interrupt + START / PWDN GPIO |
| Logic Levels | 5 V tolerant |
| Supply Voltage | 5 V |
| Form Factors | Breakout board (8809) · Arduino shield v2 (8810) |
Pin Connections
Wiring Diagram
AFE4490 Breakout to Arduino Uno (kit 8809)
| AFE4490 Pin | Arduino Uno Pin | Function |
|---|---|---|
| MISO | D12 | SPI data out (Slave → Master) |
| MOSI | D11 | SPI data in (Master → Slave) |
| SCK | D13 | SPI clock |
| CS0 | D7 | Chip select |
| DRDY | D2 | Data Ready / interrupt |
| START | D5 | Conversion-start GPIO |
| PWDN | D4 | Power-down / reset GPIO |
| Vcc | 5 V | Power |
| GND | GND | Ground |
| DIAG_END / LED_ALM / PD_ALM | – | Cable / sensor fault indicators (optional, leave open) |
Arduino Shield v2 (8810)
The shield is plug-and-play — stack it directly on an Arduino Uno, Mega, Due, R4 Minima or R4 WiFi using the standard Uno header layout. The shield routes SPI through the ICSP header, so it’s compatible with newer boards that don’t expose D11–D13 as the SPI pins. No jumper wires required.
Tip: If you’re stacking another shield on top of the AFE4490 shield, make sure that shield doesn’t also use D2, D4, D5 or D7 — those are the AFE4490’s interrupt and control pins.
AFE4490 Breakout to ESP32
| AFE4490 Pin | ESP32 Pin (VSPI) | Function |
|---|---|---|
| MISO | GPIO 19 | SPI data out |
| MOSI | GPIO 23 | SPI data in |
| SCK | GPIO 18 | SPI clock |
| CS0 | GPIO 5 | Chip select |
| DRDY | GPIO 4 | Data Ready / interrupt |
| START | GPIO 16 | Conversion start |
| PWDN | GPIO 17 | Power down / reset |
| Vcc | 5 V | Power |
| GND | GND | Ground |
Probe Placement
Plug the supplied SpO2 finger-clip probe into the DB9 socket on the breakout (or shield). Open the clip and insert your index or middle finger with the fingernail facing up — i.e. the LEDs (in the top of the clip) shine through the nail and the photodiode (in the bottom of the clip) is in contact with the fingertip pad. Push the finger past the distal joint until it stops against the back of the clip housing.
| Component | Location | Role |
|---|---|---|
| RED LED (~660 nm) | Top of clip, above the finger | Source for RED PPG channel |
| IR LED (~880 nm) | Top of clip, beside RED LED | Source for IR PPG channel |
| Photodiode (PD) | Bottom of clip, below the finger | Receives transmitted light through finger |
| Spring hinge | Side of clip | Provides constant clamping pressure |
| DB9 cable | Tail end of clip | Plugs into AFE4490 breakout |
Tip for clean signals: Cold fingers, nail polish (especially black, blue or brown), thick calluses, and excessive motion all degrade the SpO2 signal. For first-light testing, use a warm bare index finger of the non-dominant hand and stay still.
Installing the Arduino Library
Option 1: Arduino Library Manager (Recommended)
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Search for “Protocentral AFE4490”
- Find “ProtoCentral AFE4490 Pulse Oximeter Breakout Board” and click Install
Option 2: Manual Install from GitHub
- Go to github.com/Protocentral/protocentral-afe4490-arduino
- Click Code → Download ZIP
- In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
- Select the downloaded ZIP file
Your First PPG Reading (Arduino Plotter)
Open the example sketch: File → Examples → ProtoCentral AFE4490 → ppg_streaming
Or create a new sketch with the following code, which streams the IR-channel PPG samples that you can view in the Arduino Serial Plotter:
#include
#include "protocentral_afe4490.h"
#define AFE4490_CS_PIN 7
#define AFE4490_DRDY_PIN 2
#define AFE4490_START_PIN 5
#define AFE4490_PWDN_PIN 4
AFE4490 afe4490(AFE4490_CS_PIN, AFE4490_DRDY_PIN,
AFE4490_START_PIN, AFE4490_PWDN_PIN);
void setup() {
Serial.begin(57600);
SPI.begin();
if (!afe4490.begin()) {
Serial.println("AFE4490 not found — check wiring");
while (1);
}
}
void loop() {
if (afe4490.isDataReady()) {
afe4490.getPPGSamples();
// Print as two columns for the Arduino Serial Plotter
Serial.print(afe4490.red_data);
Serial.print(',');
Serial.println(afe4490.ir_data);
}
}
What This Code Does
- Includes the libraries —
protocentral_afe4490.hfor the pulse-ox front-end andSPI.hfor SPI bus communication - Creates the AFE4490 object — bound to the chip-select, DRDY, START and PWDN pins
- Initialises the chip —
begin()performs the SPI handshake, sets default LED currents and starts the conversion loop - Polls DRDY — when DRDY goes low, the chip has new RED + IR samples ready
- Reads and prints both channels —
red_dataandir_dataare 22-bit signed integers; the Arduino Serial Plotter displays them as two traces (RED on top, IR below)
Using the Arduino Serial Plotter
- Upload the sketch to your Arduino
- Plug the SpO2 probe into the breakout’s DB9 connector
- Place your index or middle finger inside the clip with the nail facing up
- Open Tools → Serial Plotter at 57600 baud
- You should see two pulsatile waveforms — the IR channel will typically be larger; both rise and fall with each heartbeat
Computing SpO2
Open the example sketch: File → Examples → ProtoCentral AFE4490 → spo2_compute
#include
#include "protocentral_afe4490.h"
#define AFE4490_CS_PIN 7
#define AFE4490_DRDY_PIN 2
#define AFE4490_START_PIN 5
#define AFE4490_PWDN_PIN 4
AFE4490 afe4490(AFE4490_CS_PIN, AFE4490_DRDY_PIN,
AFE4490_START_PIN, AFE4490_PWDN_PIN);
void setup() {
Serial.begin(115200);
SPI.begin();
afe4490.begin();
afe4490.enableSpO2Computation();
}
void loop() {
if (afe4490.isDataReady()) {
afe4490.getPPGSamples();
if (afe4490.spo2_valid) {
Serial.print("SpO2: ");
Serial.print(afe4490.spo2);
Serial.print(" % HR: ");
Serial.print(afe4490.heart_rate);
Serial.println(" BPM");
}
}
}
Open the Serial Monitor at 115200 baud — once the algorithm has ~5 seconds of clean data, you’ll see SpO2 (%) and heart rate (BPM) printed on each new beat.
Note: The library’s SpO2 algorithm uses the standard ratio-of-ratios approach with a calibration curve tuned for the supplied Nellcor-compatible probe. Different probes may need a different calibration curve.
Visualizing with OpenView
For a richer visualisation that shows both RED + IR PPG traces, computed SpO2, and heart rate together, use the ProtoCentral OpenView application:
- Download OpenView 2 from GitHub
- Upload the OpenView example sketch from the library examples
- Open OpenView 2, select “AFE4490 breakout” from the Board dropdown
- Select the correct serial port and click Start
- You’ll see live PPG waveforms with running SpO2 and heart-rate readouts
Troubleshooting
No PPG signal / flat line
- Check that the SpO2 probe is firmly plugged into the DB9 connector
- Verify SPI wiring — MISO, MOSI, SCK, CS0, DRDY, START and PWDN must all be correctly connected
- Ensure DRDY is on an interrupt-capable pin (D2 on Arduino Uno)
- Make sure your finger is inserted past the distal joint and the clip is fully closed
Very noisy or jumpy PPG
- Cold fingers reduce blood flow at the fingertip — warm your hand for ~30 seconds before testing
- Remove nail polish (especially black, blue or brown shades) — it absorbs RED/IR strongly
- Hold still during measurement; the AFE4490 has good ambient-light compensation but motion artefact is much harder to filter
- Try a different finger — the index or middle finger of the non-dominant hand usually gives the cleanest signal
SpO2 reads strange values (e.g. 100% always or fluctuating wildly)
- The algorithm needs ~5 seconds of clean PPG data to lock on; sit still and wait
- Excessive ambient light through a translucent probe housing can saturate the photodiode — use the supplied opaque clip
- Verify both RED and IR channels show a clean pulsatile waveform in the Serial Plotter before relying on the SpO2 number
- Very low perfusion (cold fingers) gives unreliable readings — warm the hand and re-test
SPI communication errors / AFE4490 not found
- Verify CS0 pin in the constructor matches your physical wiring (D7 on Arduino Uno)
- For the Arduino shield v2, double-check the shield is fully seated on the headers
- If using long jumper wires with the breakout, try reducing SPI clock speed
- Make sure no other shield / SPI device is conflicting on the bus
Resources
- Arduino Library: github.com/Protocentral/protocentral-afe4490-arduino
- Hardware Design Files: GitHub repository — schematic, layout and KiCad source under
/hardware/ - AFE4490 Datasheet: TI AFE4490 Datasheet (PDF)
- OpenView 2: github.com/Protocentral/protocentral_openview2
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License


