Skip to the content
8 layers38 × 38 mmRidge3-lite, the printed circuit board in 3D

Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

Size
38 × 38 mm
Copper layers
8
Thickness
1.6 mm
Parts
260
Nets
188
Pads
1,231
Tracks, vias
2,510, 777
Pours
48
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
26 Aug 2026
Updated
6 Nov 2026

Overview

Ridge3-lite is an open-source printed circuit board by offgridevices, from the offgridevices/offgrid-hardware repository on GitHub, published under the CERN-OHL-S-2.0 licence. It is an 8-layer board of 38 × 38 mm with 260 parts on 188 nets, routed with 2,510 tracks and 777 vias.

It is built around the STM32G071GBU6, STM32G473CEU6 and DRV8300DRGER-MS, with the TPN2R304PL,L1Q, TLV76733DGN and AO3400A among its other parts. Its parts include 96 resistors, 71 capacitors, 24 transistors and 1 crystal. It belongs with the STM32 boards of this library.

Main components

11

README

products/canary/README.md

Canary — first-vent detector for lithium batteries

Canary v1

Status: designed and verified in simulation, not yet built. Every gate below passes on this revision; no board has been assembled or powered yet.

Revisions

This folder always holds the latest revision; an ordered revision stays at its order tag (docs/versioning.md).

RevisionWhat changedStatusOrder tag
1.0first design: SGP40 + SCD41 + SHT40 + NTC tab, ATmega328P, 100 dB sounder, 60 × 40 mm, 2 layersdesigned and simulation-verified, not yet built—

What it is

A 60 × 40 mm board you put next to (or on) an e-bike or scooter battery while it charges. It watches for the first vent — the moment a failing cell boils off electrolyte as solvent vapour and CO₂ — which comes before self-heating, thermal runaway and smoke. A smoke alarm reacts at the end of that chain; Canary is built to react near its start.

Grid storage and EV packs already carry off-gas detectors (Honeywell BES, Li-ion Tamer). The battery charging in a hallway has nothing. Canary is that detector as an open, cheap, USB-powered board you can order fully assembled.

It fuses three kinds of evidence and needs two at once to alarm:

EvidenceSensorFires onAlone it means
GasSensirion SGP40 MOX (on the isolated sensor head)raw signal ≥ 700 ticks below its learned clean-air baseline (strong ≥ 2500)WARN (cleaning spray, solvents)
CO₂Sensirion SCD41 photoacousticrise ≥ 250 ppm/min or ≥ 1500 ppm over baseline (strong ≥ 1200 ppm/min or ≥ 4000 ppm)WARN (someone breathing on it)
HeatNTC on the thermal tab (or remote probe)≥ 50 °C, or ≥ 1 °C/min above 35 °C (strong: ≥ 65 °C, or ≥ 3 °C/min above 30 °C)WARN; strong heat alone → ALARM

ALARM = gas and CO₂ (one strong), or heat and any gas evidence, or strong heat alone; held 3 s before it sounds, latched for at least 60 s. Outputs: green breathing (watching), amber (one kind of evidence), red flashing + 100 dB 4 kHz sounder in the smoke-alarm T3 pattern. The button self-tests in normal state and hushes for 2 minutes in alarm — the hush ends early if the evidence gets worse.

Product video: a narrated 4-minute explainer, built by video/ and published rather than committed (video/README.md).

The real firmware, on a simulated ATmega328P with virtual sensors, catching a vent at 400 s (alarm 7.6 s later) — sim/hil/:

vent scenario

Requirements, and whether they are met

RequirementHow it is checkedMet?
Order from PCBWay, arrive assembled and workingGerbers + PCBWay BOM + CPL + firmware HEX in production/; all parts on top; every part has an MPNYes (files); hardware not yet built
Parts in production todayDistributor check 2026-10-14, docs/sourcing-2026-10-14.mdYes — one NRND part replaced (NTC)
Latest KiCadKiCad 10.0.6 (kicad/kicad:10.0.6-full), current stableYes
Schematic cleankicad-cli sch erc: 0 violationsYes
Board clean, fab's limitskicad-cli pcb drc --schematic-parity --severity-all: 0 errors, 0 warnings, 0 unconnected against PCBWay 2-layer limits (with margin)Yes
Clean copper, wide enough for its currentcheck_geometry.py: no corner sharper than 45° (the router's six right angles mitered by miter.py); every power track ≥ 2.4× its IPC-2221 width at a 10 °C riseYes
Schematic = circuit = board = firmwarecheck_netlist.py (27 nets, 0 mismatches), DRC parity, check_pins.py (11 pins, 0 mismatches)Yes
Detects a vent within seconds, ignores single-cause eventsHIL simulation of the real firmware: vent → ALARM in 7.6 s; spray, breath → no alarm; still detecting after 100 min of charging; 65/65 checks across 9 scenariosYes, in simulation
Sounder driver safengspice: drain clamped at 5.4 V on 5 V, clamp diode ≤ 0.34 A, VBUS dip ≥ 4.95 V, for 0.5–4 mH coilsYes
Pack temperature good enough at the thresholdsTolerance stack-up: ≤ 1.24 °C worst case at 65 °C; rate quantum 0.2 °C/minYes
Runs from any USB charger23.5 mA watching, ~520 mA worst-case peak in alarmYes (≤ 900 mA)

How to order (PCBWay, fully assembled)

  1. PCB: upload production/canary-gerbers.zip.
    • 2 layers, FR-4, 1.6 mm, 60 × 40 mm, 1 design
    • Min track/spacing 6/6 mil (the design's tightest gap is 0.2 mm), min hole 0.3 mm
    • Solder mask yellow, silkscreen black (white is fine if black is not offered on yellow)
    • Surface finish ENIG (fine-pitch DFN sensors)
    • The board has three internal routed slots (1.0 mm wide): they are intended, not errors.
  2. Assembly: turnkey, top side only, 43 placements / 27 unique parts.
    • BOM: production/canary-bom-pcbway.csv (MPN, maker, LCSC # for reference, notes)
    • Centroid: production/canary-cpl.csv; drawing: production/canary-assembly.pdf
    • J1 (USB-C) has four plated shell slots — pin-in-paste/hand-solder as PCBWay prefers.
    • Sensirion parts (U3 SGP40, U4 SHT40, U5 SCD41): no washing, no conformal coating.
  3. Programming (PCBWay offers it; ask in the order notes): flash production/canary.hex to U2 (ATmega328P) through the Tag-Connect TC2030 pads (J2, standard 6-pin AVR ISP pinout), with fuses lfuse 0xE2, hfuse 0xD9, efuse 0xFD (internal 8 MHz, no clock divider, brown-out 2.7 V). To do it yourself: a USBasp + TC2030-IDC-NL cable, then make -C firmware flash.

Case

enclosure/print/canary-v1-bumper.stl is an optional printed frame (PLA/PETG, no supports, 64 × 44 × 5 mm). The board presses in from below; its underside stays flush with the frame's so the thermal tab still lies on the pack, and the USB-C, probe connector and the sensor head's air path stay open.

bumper

Bring-up

  1. Plug a USB-C cable from any phone charger. Green blinks for 90 s (gas sensor warm-up), then breathes slowly.
  2. Press TEST/HUSH: green, amber, red sweep, a short beep, and the SGP40 self-test runs. A fault shows as an amber double blink with a chirp every minute.
  3. Telemetry: TXD pad, 3.3 V, 38400 8N1, one line a second (t= st= tp= ... sraw= co2= rate= dtdt= e= f=).
  4. Use: lay the board on the pack with the thermal tab touching it (or plug a 10 kΩ B3950 NTC probe into the JST-PH and tape it to the pack), the sensor head ("AIR IN") facing the air above the pack.

Limits — read these

  • Not a certified safety device. Keep your smoke alarm.
  • The thresholds are not yet validated against a real venting cell. The simulated worlds use stated assumptions (SGP40 drop of thousands of ticks, CO₂ rising by thousands of ppm within a minute, accelerating self-heating), based on how first vent is described for commercial off-gas detectors. A real abuse test (a cell vented beside the board, in a safe facility) is the next step, and the thresholds in firmware/src/detect.h may move.
  • No battery backup: if the outlet loses power, Canary is off.
  • Placement matters: the gas and CO₂ sensors need the vent plume to reach them; inside a closed bag or a frame with no airflow, use the probe and expect slower gas detection.
  • The ATmega328P has no USB: firmware updates need an ISP programmer.
  • 3D models for SGP40, SHT40, SCD41, the sounder and the JST connector are simple dimensioned boxes made by src/models3d.py (KiCad 10.0.6 ships none).

Files

PathWhat
production/Gerber zip, PCBWay BOM, CPL, netlist, assembly + schematic PDFs, firmware HEX
canary.kicad_sch, canary.kicad_pcb, canary.kicad_proKiCad 10 design (generated)
src/the design source: circuit.py (every part and net), schematic.py, board.py, miter.py, finish.py, fab.py, checks
firmware/AVR C firmware (detect.c is the detector logic)
sim/hil/simavr hardware-in-the-loop harness + scenarios
sim/spice/, sim/analysis/sounder driver SPICE, NTC/power/I²C analyses
video/the scripts that build the narrated product video (the MP4 is published, not committed)
web/the interactive bench page (build_page.py → one HTML file); its detector is a port of detect.c checked equal to the firmware second by second
mechanical/STEP model (zipped)
enclosure/3D-printable bumper: bumper.scad, and print/canary-v1-bumper.stl
TESTS.md, docs/decisions.mdevery test with results; the trade-offs

How to build

Needs docker (kicad/kicad:10.0.6-full), Java + xvfb (Freerouting 1.9.0 at /opt/fr/freerouting-1.9.0.jar or FREEROUTING_JAR), avr-gcc, Python 3.

sh
python3 src/make.py                 # schematic, ERC, netlist gate, place, route, DRC gate, fab
python3 src/make.py sch finish fab  # without re-routing (the routed board in out/ is reused)
make -C firmware                    # firmware only
cd sim/hil && gcc -O2 -I<simavr>/simavr/sim ... && python3 scenarios.py   # see sim/hil/README.md

Routing is done by Freerouting and is not bit-for-bit repeatable, so the committed canary.kicad_pcb is the design of record: CI rebuilds the fab outputs from it and checks they match what is committed.

Parts

260
QtyValueFootprintReferences
26100nFC_0201_0603Metric_LC13, C14, C15, C16, C17, C18, C19, C22, C101, C109, C110, C111, C201, C209, C210, C211 +10
24TPN2R304PLTSON-8_L3.1-W3.1-P0.65-LS3.3-BL-EPQ1AH, Q1AL, Q1BH, Q1BL, Q1CH, Q1CL, Q2AH, Q2AL, Q2BH, Q2BL, Q2CH, Q2CL, Q3AH, Q3AL, Q3BH, Q3BL +8
2310kR_0201_0603Metric_LR16, R105, R110, R115, R118, R120, R205, R210, R215, R218, R220, R305, R310, R315, R318, R320 +7
164.7uFC_0805_2012MetricC1, C8, C10, C11, C104, C106, C108, C204, C206, C208, C304, C306, C308, C404, C406, C408
151uFC_0402_1005Metric_LC4, C7, C9, C103, C105, C107, C203, C205, C207, C303, C305, C307, C403, C405, C407
1310RR_0201_0603Metric_LR10, R102, R107, R112, R202, R207, R212, R302, R307, R312, R402, R407, R412
1310kR_0402_1005Metric_LR6, R103, R108, R113, R203, R208, R213, R303, R308, R313, R403, R408, R413
122.2kR_0201_0603Metric_LR104, R109, R114, R204, R209, R214, R304, R309, R314, R404, R409, R414
1222RR_0201_0603Metric_LR101, R106, R111, R201, R206, R211, R301, R306, R311, R401, R406, R411
12PAD_MOTORPAD_MOTORP_M1A, P_M1B, P_M1C, P_M2A, P_M2B, P_M2C, P_M3A, P_M3B, P_M3C, P_M4A, P_M4B, P_M4C
10PAD_TPPAD_TPTP_3V3, TP_C1, TP_C2, TP_C3, TP_C4, TP_D1, TP_D2, TP_D3, TP_D4, TP_GND
9PAD_SIGPAD_SIGP_5V, P_BZ-, P_BZ+, P_G, P_LED, P_R1, P_R2, P_T1, P_T2
61kR_0201_0603Metric_LR7, R13, R117, R217, R317, R417
5100kR_0402_1005Metric_LR1, R119, R219, R319, R419
510uFC_0603_1608Metric_LC12, C102, C202, C302, C402
40.5mOhmRES-SMD_1206_HCS1206R_S1, R_S2, R_S3, R_S4
41.5kR_0201_0603Metric_LR116, R216, R316, R416
4DRV8300DRGERVQFN-24_L4.0-W4.0-P0.50-TL-EP2.5U_D1, U_D2, U_D3, U_D4
4HOLEMOUNT_M2H1, H2, H3, H4
4INA186A3SC-70-6_L2.0-W1.3-P0.65-LS2.1-BL-1U_A1, U_A2, U_A3, U_A4
4STM32G071GBU6UFQFPN-28_L4.0-W4.0-P0.50-BLU_E1, U_E2, U_E3, U_E4
2100nFC_0402_1005Metric_LC2, C3
212pFC_0402_1005Metric_LC23, C24
222uFC_0805_2012MetricC5, C6
24.7uFC_0402_1005Metric_LC21, C25
25.1kR_0201_0603Metric_LR11, R12
2PAD_BATPAD_BATP_BAT-, P_BAT+
2TLV76733WSON-6_L2.0-W2.0-P0.65-TL-EPU_LDO, U_LDOE
1100RR_0201_0603Metric_LR15
110RR_0402_1005Metric_LR3
110uHIND-SMD_L3.0-W3.0_SWPA3010SL_BEC
11uFC_0201_0603Metric_LC20
127kR_0201_0603Metric_LR2
1330RR_0201_0603Metric_LR14
162kR_0201_0603Metric_LR8
18 MHzCRYSTAL-SMD_4P-L3.2-W2.5-BLY1
182kR_0402_1005Metric_LR4
1AO3400ASOT-23-3_L2.9-W1.3-P1.90-LS2.4-BRQ_BZ
1BOOTKEY-SMD_B3U-1000PMSW_BOOT
1ICM-42688-PLGA-14_L3.0-W2.5-P0.50-TLU_IMU
1LMR36506R5VQFN-9_L2.1-W2.1-P0.50-TLU_BEC
1SMF22ASOD-123FL_L2.8-W1.9-LS3.7-RDD_TVS
1SS1040HESOD-323HE_L2.0-W1.4-LS2.5-RDD_USB
1STM32G473CEU6UFQFPN-48_L7.0-W7.0-P0.50-BL-EP5.6U_FC
1TPS7A1601SON-8_L3.0-W3.0-P0.65-TL-EPU_GVDD
1USB-CUSB-C-SMD_TYPE-C-16P-USB4110-GF-AJ_USB
1USBLC6-2SC6SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BLU_ESD
1blueLED0603-RDLED_STAT
1redLED0603-RDLED_PWR

More from offgridevices/offgrid-hardware

10
  • 6 layers91.6 × 50.6 mmSmokebreak, the printed circuit board in 3D

    Smokebreak

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    208 partsCERN-OHL-S-2.0
  • 8 layers36 × 36 mmRidge3-esc, the printed circuit board in 3D

    Ridge3-esc

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    193 partsCERN-OHL-S-2.0
  • 6 layers65.3 × 57.8 mmLayercam pro, the printed circuit board in 3D

    Layercam pro

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    189 partsCERN-OHL-S-2.0
  • 6 layers38 × 53.6 mmLayercam main, the printed circuit board in 3D

    Layercam main

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    168 partsCERN-OHL-S-2.0
  • 4 layers86 × 50 mmPrint hub, the printed circuit board in 3D

    Print hub

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    137 partsCERN-OHL-S-2.0
  • 6 layers36 × 36 mmRidge3-fc, the printed circuit board in 3D

    Ridge3-fc

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    124 partsCERN-OHL-S-2.0
  • 2 layers60 × 40 mmCanary, the printed circuit board in 3D

    Canary

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    52 partsCERN-OHL-S-2.0
  • 2 layers86 × 58 mmPacket logger carrier, the printed circuit board in 3D

    Packet logger carrier

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    22 partsCERN-OHL-S-2.0
  • 2 layers27.2 × 20.3 mmLayercam ring, the printed circuit board in 3D

    Layercam ring

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    11 partsCERN-OHL-S-2.0
  • 2 layers22 × 16 mmLayercam usb, the printed circuit board in 3D

    Layercam usb

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    7 partsCERN-OHL-S-2.0

Similar boards

  • 4 layers40 × 40 mmAtmos fc, the printed circuit board in 3D

    Atmos fc

    cypamigon/atmos_fc

    Drone flight controller based on STM32G4 with IMU (ICM-468-P), barometer (DPS-386), OSD (MAX7456) and 32MB flash memory for blackbox logging — running Betaflight.

    112 parts1MIT
  • 2 layers99.9 × 99.8 mmMPBCH32M030DS0 panel, the printed circuit board in 3D

    MPBCH32M030DS0 panel

    ghostinkoma/mPBCH32M030DS0

    WCH CH32M030C8U7 (QFN48) の DIP-42 MCU モジュール (ブレッドボード対応) と、差し替え式の パワー段子基板 (MOSFET ×8) の 2 枚構成です。 次のモータを駆動します。 USB-C から ESP32-C3 / Arduino のように書き込めて、USB-PD 充電器 (9〜15V) だけでもモーターを回せます。 内蔵の電流源・USB-PD・OPA/CMP を使い切る設計です…

    318 parts
  • 4 layers80 × 108 mmBmcv, the printed circuit board in 3D

    Bmcv

    Bemeier/bmcv

    Macro CV controller for eurorack inspired by the Emblematic Systems Catalyst

    373 parts7CC-BY-SA-4.0
  • 4 layers77.2 × 25 mmUSB 3.1 to Ethernet, the printed circuit board in 3D

    USB 3.1 to Ethernet

    OmkarTikekar0037/usb3-gigabit-ethernet-adapter

    This is a repository for version control of zoho project - USB 3.1 to Gigabit Ethernet Adapter

    79 parts1
  • 4 layers40.6 × 17.8 mmPD Micro, the printed circuit board in 3D

    PD Micro

    ryan-ma/PD_Micro

    USB-C PD3.0 PPS on ATMega32U4 Arduino board

    61 parts439MIT
  • 4 layers20 × 30 mmMicro17, the printed circuit board in 3D

    Micro17

    M17-Project/Micro17

    M17 baseband processor board - OpenRTX on a Module

    93 parts20
  • 2 layers30 × 46 mmXESC, the printed circuit board in 3D

    XESC

    embeddedalpha/PCB-Design

    Repository for PCB Design Projects

    93 parts77MIT
  • 2 layers35.4 × 16 mmLped dock, the printed circuit board in 3D

    Lped dock

    b1u3-22/LPED

    Highly customizable low-power electronic playing dice

    25 parts1GPL-3.0

Questions

How big is the Ridge3-lite PCB?

It measures 38 × 38 mm and has 8 copper layers, 1.6 mm thick.

What parts does the Ridge3-lite use?

260 parts, built around the STM32G071GBU6, STM32G473CEU6, DRV8300DRGER-MS and TPN2R304PL,L1Q. 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 Ridge3-lite KiCad files?

From the offgridevices/offgrid-hardware repository on GitHub, at the commit this page was made from: the board is products/ridge/ridge-3-lite/ridge3-lite.kicad_pcb and its schematic products/canary/canary.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ridge3-lite design in my own project?

Its repository publishes it under the CERN-OHL-S-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).