Skip to the content
4 layers31.8 × 15.3 mmTracker PCB, the printed circuit board in 3D

A low-profile wrist wearable that measures motion, optical heart rate and SpO2 and streams them over Bluetooth LE to a PC visualizer.

Size
31.8 × 15.3 mm
Copper layers
4
Thickness
0.8 mm
Parts
64
Nets
94
Pads
287
Tracks, vias
520, 234
Pours
17
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
16 Oct 2026
Updated
16 Oct 2026

Overview

Tracker PCB is an open-source printed circuit board by NicholasKorth, from the NicholasKorth/Slim-Sleep-Tracker repository on GitHub. It is a 4-layer board of 31.8 × 15.3 mm with 64 parts on 94 nets, routed with 520 tracks and 234 vias.

It is built around the NRF52840-QIAA-R, MAX30208CLB+T and MAXM86161EFD+T, with the BQ25120AYFPR, GT-USB-7010ASV and LSM6DSV16XTR among its other parts. Its parts include 30 capacitors, 11 resistors, 7 ICs, 3 inductors and 2 switches. It belongs with the nRF52 and nRF5x boards of this library.

Main components

12

README

README.md

Slim Sleep Tracker

A low-profile wrist wearable that measures motion, optical heart rate and SpO2 and streams them over Bluetooth LE to a PC visualizer.

Slim Sleep Tracker board, 3D renders of the top side (left) and the skin side (right)

3D renders from the board file: top side on the left, bottom (skin) side on the right. The optical sensor U1 has no 3D model and shows as bare pads.

What it is

The tracker is a 31.75 x 15.25 mm board worn on the inner wrist. The motion sensor, the optical heart-rate and SpO2 sensor and the skin temperature sensor sit on the bottom side, against the skin. The top side carries the nRF52840 microcontroller and radio, the USB-C charging port, the charger, two side buttons and a chip antenna. The firmware streams sensor packets over Bluetooth LE, and a Python visualizer on a PC shows orientation, the optical (PPG) signal, heart rate, SpO2 and battery level.

It is part of a sleep project and pairs with my Dual-Zone Bed Climate System, BedCooler. The link between the two is not part of this firmware.

This is not a medical device. The heart-rate and SpO2 values are experimental and have not been validated against a reference.

System block diagram

Block diagram as SVG. More views: one-page overview, angled render, top render, bottom render, signal map, functional layout, and the full schematic as PDF.

Key specifications

Values come from the design files (schematic, board and firmware), not from measurements.

Microcontroller and radioNordic nRF52840 (Cortex-M4F, 1 MB flash, 256 KB RAM), Bluetooth LE at +8 dBm, chip antenna
MotionST LSM6DSV16X accelerometer and gyroscope on SPI (up to 8 MHz)
OpticalMaxim MAXM86161 heart-rate and SpO2 module on I2C (green LED for heart rate, red and infrared for SpO2)
Skin temperatureMaxim MAX30208 on I2C (fitted, no firmware driver yet)
PowerUSB-C 5 V input; TI BQ25120A charger with buck output; single-cell lithium battery (off the board)
Board31.75 x 15.25 mm, 0.8 mm thick, 4 copper layers (both inner layers ground); 60 parts on both sides
FirmwareZephyr on nRF Connect SDK 3.2.1, MCUboot bootloader, firmware updates over Bluetooth
Data linkNordic UART Service; 32-byte sensor packets at about 12.5 per second; text commands

Repository layout

text
hardware/          KiCad 9 project: schematic (4 sheets), routed board, project-local
                   symbol/footprint/3D-model library (libs/), board STEP model
hardware/production/  Gerbers and drill files (Tracker_PCB.zip), IPC netlist, BOM, placement
firmware/          Zephyr application for the nRF52840 (see firmware/README.md)
firmware/prototype/   earlier bring-up firmware and test scripts, kept for reference
tools/visualizer/  Python Bluetooth LE visualizer
docs/              schematic PDF, block diagram, firmware diagram and board renders

Hardware

Open hardware/Tracker_PCB.kicad_pro in KiCad 9. The parts library is inside the project (hardware/libs/easyeda2kicad), so no global library setup is needed. The 0402 resistors and capacitors use KiCad's own 3D models.

SheetContents
Tracker_PCB.kicad_schRoot: system overview and the connections between sheets
power.kicad_schUSB-C input with ESD protection, BQ25120A charger and buck, battery, reset/wake button
mcu.kicad_schnRF52840, 32 MHz and 32.768 kHz crystals, DC/DC inductors, antenna match, side buttons, Tag-Connect debug port, I2C pull-ups
sensors.kicad_schMAXM86161 optical sensor, MAX30208 skin temperature sensor, LSM6DSV16X motion sensor

The schematic here is a redrawn copy of my original five-sheet design with the same parts, values, footprints and connections. SDA and SCL are drawn as two separate nets, as on the fabricated board; my last save of the original schematic had joined them into one net by mistake.

The board file was routed against that original schematic. Its copper matches the Gerbers, but SDA and SCL still carry one shared net name there (/MCU NRF52840/P0.26), and its footprints point at the original sheets. Before editing the board, run Tools > Update PCB from Schematic with "Re-link footprints to schematic symbols based on their reference designators" turned on.

Bus and pin assignments:

  • I2C on P0.26 (SDA) and P0.27 (SCL), 4.7 kohm pull-ups: MAXM86161 at 0x62, MAX30208 at 0x50, BQ25120A at 0x6A.
  • SPI to the LSM6DSV16X: SCK P0.29, MOSI P0.30, MISO P0.31, CS P0.28, INT1 P0.03.
  • MAXM86161 LDO enable P1.03 and interrupt P1.10; charger disable P0.12 and interrupt P0.20; side buttons P0.02 and P0.17.
  • Programming and debug through a Tag-Connect TC2030-NL footprint (J1): SWDIO, SWDCLK, reset (P0.18).

The Gerbers in hardware/production/Tracker_PCB.zip (2025-12-26) are the set the board was ordered from, and their copper matches the board file. bom.csv and positions.csv are in the JLCPCB format from the KiCad fabrication toolkit. The battery BT1 is a schematic symbol only and has no footprint.

Firmware

firmware/ is a Zephyr application that started from Nordic's Peripheral UART sample. Build and flash steps are in firmware/README.md.

  • Bluetooth LE peripheral with the Nordic UART Service, bonding and one connection; advertises as nrf.
  • Register-level I2C drivers for the MAXM86161 (FIFO, LED sequencing, green heart-rate mode, red and infrared SpO2 mode, 100 samples/s with 4x averaging) and the BQ25120A (charge settings, status, faults, battery level). The LSM6DSV16X runs through Zephyr's sensor driver on SPI.
  • A 32-byte binary packet (sync bytes 0xAA 0x55): accelerometer and gyroscope, raw PPG, battery percent, charge status, timestamp, SpO2 estimate, signal quality, temperature, mode flags and a checksum. Heart rate is computed in the visualizer, not on the board.
  • Text commands over the UART service: START, STOP, STATUS, HR_ON, HR_OFF, SPO2_ON, SPO2_OFF, TEMP, HELP, and the experimental IMU_MODE / HEALTH_MODE pair (a 100 Hz motion-only packet).
  • Holding both side buttons puts the board to sleep.
  • MCUboot with firmware updates over Bluetooth (MCUmgr); logging over Segger RTT.

Firmware architecture

The firmware diagram also shows the golf-swing tools I used with IMU_MODE; they are experimental and not included in this repository.

Visualizer

tools/visualizer/ble_visualizer.py connects to the tracker, sends HEALTH_MODE and START, and plots live data: 3D orientation (Madgwick filter), the PPG signal with heart-rate detection, SpO2 and battery level. On-screen buttons switch the heart-rate and SpO2 modes.

text
cd tools/visualizer
python -m venv .venv
.venv\Scripts\activate          (Linux or macOS: source .venv/bin/activate)
pip install -r requirements.txt
python ble_visualizer.py

It needs Python 3.9 or later and a Bluetooth LE adapter on the PC, and it looks for a device whose name contains nrf. ble_scan.py lists nearby Bluetooth LE devices if the tracker is not found.

Project status

This is the first board revision and the project is partly unfinished. The firmware reads the motion sensor's ID over SPI and finds the optical sensor on I2C. The skin temperature sensor is fitted but not yet supported in firmware; the temperature field in the packet is currently the optical module's die temperature. There is no battery-life, current or accuracy measurement yet.

Open items for the next revision

From a review of the rev 1 design files against the data sheets:

  1. Skin temperature sensor U6: SDA and SCL appear swapped at pins 8 and 9 (from the data sheet pinout; not confirmed on the bench).
  2. Board file: SDA and SCL carry one merged net name (see Hardware); update the board from the corrected schematic.
  3. Charger settings: the firmware's register values give an 18 mA fast charge and a 1.75 V buck output by the data sheet, while the code comments say 100 mA and 1.9 V. Confirm the intended values.
  4. Board checks: two small clearances (D1 ground pad to a D- via, 0.087 mm; TP1 to a ground pour, 0.061 mm) and silkscreen overlaps; the battery BT1 has no footprint.
  5. The firmware builds for the nRF21540 development-kit target. A board definition for this board would keep the kit's front-end driver off P0.17 and P0.20 (not tested).

License

CC BY-NC-SA 4.0: Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International. You may share and adapt this work for non-commercial purposes with attribution, under the same license. Firmware files that carry a Nordic Semiconductor copyright header (they started from Nordic's sample code) keep Nordic's 5-Clause license.

Parts

64
QtyValueFootprintReferences
5100nFCapacitor_SMD:C_0402_1005MetricC8, C14, C15, C16, C19
410uFCapacitor_SMD:C_0402_1005MetricC2, C3, C28, C31
412pFCapacitor_SMD:C_0402_1005MetricC6, C7, C20, C21
31uFCapacitor_SMD:C_0402_1005MetricC1, C26, C27
34.7µFCapacitor_SMD:C_0402_1005MetricC5, C9, C11
3N.C.Capacitor_SMD:C_0402_1005MetricC23, C25, C34
2.1uFCapacitor_SMD:C_0402_1005MetricC29, C30
21.0µFCapacitor_SMD:C_0402_1005MetricC10, C12
2100kResistor_SMD:R_0402_1005MetricR7, R8
24.7kResistor_SMD:R_0402_1005MetricR9, R10
25.1kResistor_SMD:R_0402_1005MetricR5, R6
2GT-TC172A-H035-L1easyeda2kicad:SW-SMD_GT-TC172A-H035-L1SW1, SW2
2TestPointTestPoint:TestPoint_Pad_2.0x2.0mmTP1, TP3
1
10Resistor_SMD:R_0402_1005MetricR13
11.33kResistor_SMD:R_0402_1005MetricR1
1100pFCapacitor_SMD:C_0402_1005MetricC22
110kResistor_SMD:R_0402_1005MetricR3
13.3kResistor_SMD:R_0402_1005MetricR4
14.7uFCapacitor_SMD:C_0402_1005MetricC4
147nFCapacitor_SMD:C_0402_1005MetricC13
1523Resistor_SMD:R_0402_1005MetricR2
1820pFCapacitor_SMD:C_0402_1005MetricC18
1AMCA31-2R450G-S1F-T3easyeda2kicad:ANT-SMD_L3.2-W1.6_AMCA31ANT1
1BQ25120AYFPReasyeda2kicad:DSBGA-25_L2.5-W2.6-R5-C5-P0.40-BLU3
1CMI160808J100KTeasyeda2kicad:L0603L2
1Conn_ARM_SWD_TagConnect_TC2030-NLConnector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_VerticalJ1
1ESD122DMXReasyeda2kicad:X2SON-3_L1.0-W0.6-LD1
1GT-USB-7010ASVeasyeda2kicad:USB-C-SMD_G-SWITCH_GT-USB-7010ASVU2
1LSM6DSV16XTReasyeda2kicad:LGA-14_L3.0-W2.5-P0.50-BRU5
1MAX30208CLB+Teasyeda2kicad:LGA-10_L2.0-W2.0_MAX30208CLBU6
1MAXM86161EFD+Teasyeda2kicad:OLGA-14_L4.3-W2.9-P0.60-TLU1
1MLP2012S2R2MT0S1easyeda2kicad:L0805L1
1NRF52840-QIAA-Reasyeda2kicad:AQFN-73_L7.0-W7.0-P0.50-BL-EP4.8U7
1TS2306A 240GF MSM 9_C2976675easyeda2kicad:SW-SMD_4P-L3.0-W2.0-P0.85-LS3.5U4
1VHF100505H15NKTeasyeda2kicad:L0402-RDL3
1XKWEL89CLI-112YLC-32.768Keasyeda2kicad:OSC-SMD_2P-L1.6-W1.0X1
1XL4EL89CKI-111YLC-32Measyeda2kicad:CRYSTAL-SMD_4P-L1.6-W1.2-BLX3

The 61 most common of 64 parts.

Similar boards

  • 4 layers15 × 29.2 mmFuimini V2, the printed circuit board in 3D

    Fuimini V2

    Zipra1/Fuimini-V2

    nRF flavoured SlimeVR-compatible trackers. Now with higher volume production in mind!

    62 parts3CERN-OHL-S-2.0
  • 4 layers35 × 42.5 mmBluetooth Channel Sounding Tag, the printed circuit board in 3D

    Bluetooth Channel Sounding Tag

    JaphD/Phasetag

    Compact nRF54L15 Bluetooth Channel Sounding tag with dual PCB antennas, motion sensing, and rechargeable power management. Designed in KiCad 10.

    71 parts
  • 6 layers64.8 × 69.9 mmEzDV, the printed circuit board in 3D

    EzDV

    tmiw/ezDV

    A FreeDV device based on the ESP32.

    130 parts114
  • 2 layers58.9 × 25.7 mmLoTiBloxy, the printed circuit board in 3D

    LoTiBloxy

    GiovaSanta/PulseOxyemeter-LotiBloxy

    a bluetooth pulse oxymeter Printed Circuit Board Design Project. PCB is meant to take spo2 measurements and sends results to an application via Bluetooth

    51 parts
  • 2 layers63.5 × 76.2 mmRemigochi pcb, the printed circuit board in 3D

    Remigochi pcb

    thetaspirit/remigochi-pcb

    For 18-500 capstone

    67 parts
  • 6 layers63.7 × 24 mmPocketssd-21, the printed circuit board in 3D

    Pocketssd-21

    tracelabs-pcb/pocketssd-21

    Compact USB 3.2 Gen2 to NVMe M.2 bridge PCB — JMS583, 6-layer

    85 parts
  • 2 layers10 × 31.6 mmHr brkt, the printed circuit board in 3D

    Hr brkt

    cruzsbrian/smartwatch

    5 parts1

Questions

How big is the Tracker PCB PCB?

It measures 31.8 × 15.3 mm and has 4 copper layers, 0.8 mm thick.

What parts does the Tracker PCB use?

64 parts, built around the NRF52840-QIAA-R, MAX30208CLB+T, MAXM86161EFD+T and BQ25120AYFPR. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Tracker PCB KiCad files?

From the NicholasKorth/Slim-Sleep-Tracker repository on GitHub, at the commit this page was made from: the board is hardware/Tracker_PCB.kicad_pcb and its schematic hardware/Tracker_PCB.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Tracker PCB design in my own project?

Its repository states no licence, so its author keeps all rights: ask NicholasKorth before reusing the design.