
Ridge3-lite
offgridevices/offgrid-hardware
Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.
Layercam pro 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 a 6-layer board of 65.3 × 57.8 mm with 189 parts on 100 nets, routed with 1,683 tracks and 568 vias.
It is built around the RV1106G3, ESP32-C6-MINI-1U-H4 and TLV62569DBV, with the DRV8210PDSG, TEMT6000X01 and EA3036CQBR among its other parts. Its parts include 90 capacitors, 53 resistors, 10 ICs, 8 diodes and 8 inductors. It belongs with the ESP32 and RISC-V boards of this library.

Status: designed and verified in simulation, not yet built. Every gate below passes on this revision; no board has been assembled or powered yet.
This folder always holds the latest revision; an ordered revision stays at
its order tag (docs/versioning.md).
| Revision | What changed | Status | Order tag |
|---|---|---|---|
| 1.0 | first design: SGP40 + SCD41 + SHT40 + NTC tab, ATmega328P, 100 dB sounder, 60 × 40 mm, 2 layers | designed and simulation-verified, not yet built | — |
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:
| Evidence | Sensor | Fires on | Alone it means |
|---|---|---|---|
| Gas | Sensirion 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 photoacoustic | rise ≥ 250 ppm/min or ≥ 1500 ppm over baseline (strong ≥ 1200 ppm/min or ≥ 4000 ppm) | WARN (someone breathing on it) |
| Heat | NTC 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/:

| Requirement | How it is checked | Met? |
|---|---|---|
| Order from PCBWay, arrive assembled and working | Gerbers + PCBWay BOM + CPL + firmware HEX in production/; all parts on top; every part has an MPN | Yes (files); hardware not yet built |
| Parts in production today | Distributor check 2026-10-14, docs/sourcing-2026-10-14.md | Yes — one NRND part replaced (NTC) |
| Latest KiCad | KiCad 10.0.6 (kicad/kicad:10.0.6-full), current stable | Yes |
| Schematic clean | kicad-cli sch erc: 0 violations | Yes |
| Board clean, fab's limits | kicad-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 current | check_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 rise | Yes |
| Schematic = circuit = board = firmware | check_netlist.py (27 nets, 0 mismatches), DRC parity, check_pins.py (11 pins, 0 mismatches) | Yes |
| Detects a vent within seconds, ignores single-cause events | HIL 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 scenarios | Yes, in simulation |
| Sounder driver safe | ngspice: drain clamped at 5.4 V on 5 V, clamp diode ≤ 0.34 A, VBUS dip ≥ 4.95 V, for 0.5–4 mH coils | Yes |
| Pack temperature good enough at the thresholds | Tolerance stack-up: ≤ 1.24 °C worst case at 65 °C; rate quantum 0.2 °C/min | Yes |
| Runs from any USB charger | 23.5 mA watching, ~520 mA worst-case peak in alarm | Yes (≤ 900 mA) |
production/canary-gerbers.zip.
production/canary-bom-pcbway.csv (MPN, maker, LCSC # for reference, notes)production/canary-cpl.csv; drawing: production/canary-assembly.pdfproduction/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.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.

t= st= tp= ... sraw= co2= rate= dtdt= e= f=).firmware/src/detect.h may move.src/models3d.py (KiCad 10.0.6 ships none).| Path | What |
|---|---|
production/ | Gerber zip, PCBWay BOM, CPL, netlist, assembly + schematic PDFs, firmware HEX |
canary.kicad_sch, canary.kicad_pcb, canary.kicad_pro | KiCad 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.md | every test with results; the trade-offs |
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.
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.mdRouting 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.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 36 | 100nF | C_0402_1005Metric | C3, C4, C24, C25, C26, C27, C28, C29, C36, C37, C38, C42, C43, C44, C46, C47 +20 |
| 15 | 10uF | C_0603_1608Metric | C1, C2, C5, C8, C9, C10, C21, C33, C34, C35, C40, C41, C53, C87, C89 |
| 15 | 1uF | C_0402_1005Metric | C11, C30, C31, C32, C39, C45, C55, C57, C61, C69, C73, C74, C75, C78, C85 |
| 11 | 10k | R_0402_1005Metric | R1, R23, R27, R28, R30, R31, R33, R34, R35, R36, R37 |
| 10 | 100k | R_0402_1005Metric | R4, R5, R7, R10, R12, R13, R29, R43, R44, R46 |
| 8 | 22uF | C_0603_1608Metric | C7, C15, C16, C18, C20, C22, C23, C70 |
| 8 | TP | PAD_TP | TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8 |
| 6 | 850nm | LED_PLCC2_VSMY3850 | D2, D3, D4, D5, D6, D7 |
| 4 | 18pF | C_0402_1005Metric | C62, C63, C64, C65 |
| 4 | 1k | R_0402_1005Metric | R22, R25, R38, R47 |
| 4 | 22R | R_0402_1005Metric | R20, R26, R32, R40 |
| 4 | HOLE_M2 | MOUNT_M2 | H1, H2, H3, H4 |
| 3 | 1.5uH | IND-SMD_L2.5-W2.0 | L2, L3, L4 |
| 3 | 100R | R_0402_1005Metric | R19, R24, R45 |
| 3 | 120R@100MHz | L_0402_1005Metric | L6, L7, L8 |
| 3 | 1R | R_0402_1005Metric | R15, R16, R39 |
| 3 | 220pF | C_0402_1005Metric | C14, C17, C19 |
| 3 | 47R | R_1206_3216Metric | R90, R91, R92 |
| 2 | 2.2uF | C_0402_1005Metric | C83, C84 |
| 2 | 2.2uH | IND-SMD_L2.5-W2.0 | L1, L5 |
| 2 | 200k | R_0402_1005Metric | R6, R11 |
| 2 | 22.6k | R_0402_1005Metric | R8, R14 |
| 2 | 4.7k | R_0402_1005Metric | R41, R42 |
| 2 | 4.7uF | C_0402_1005Metric | C58, C80 |
| 2 | 5.1k | R_0402_1005Metric | R49, R50 |
| 2 | HOLE_M1V6 | MOUNT_M1V6 | H5, H6 |
| 2 | TLV62569 | SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BR | U2, U4 |
| 1 | 10nF | C_0402_1005Metric | C66 |
| 1 | 127k | R_0402_1005Metric | R9 |
| 1 | 18k | R_0402_1005Metric | R2 |
| 1 | 1M | R_0402_1005Metric | R21 |
| 1 | 1nF | C_0402_1005Metric | C67 |
| 1 | 2.8V | WSON-6_L2.0-W2.0-P0.65-BL-EP | U9 |
| 1 | 22k | R_0402_1005Metric | R48 |
| 1 | 240R | R_0402_1005Metric | R18 |
| 1 | 24MHz | CRYSTAL-SMD_4P-L3.2-W2.5-BL | Y1 |
| 1 | 32.768kHz | FC-135R_L3.2-W1.5 | Y2 |
| 1 | 330nF | C_0402_1005Metric | C12 |
| 1 | 470nF | C_0402_1005Metric | C13 |
| 1 | 51k | R_0402_1005Metric | R3 |
| 1 | 6.2k | R_0402_1005Metric | R17 |
| 1 | 6.8pF | C_0402_1005Metric | C6 |
| 1 | AO3400A | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | Q1 |
| 1 | DRV8210P | WSON-8_L2.0-W2.0-P0.50-TL-EP | U7 |
| 1 | EA3036C | WQFN-20_L3.0-W3.0-P0.40-BL-EP | U3 |
| 1 | ESP32-C6-MINI-1U-H4 | WIFIM-SMD_61P-L13.2-W12.5-P0.80 | U6 |
| 1 | IR-cut | CONN-SMD_532610271 | J3 |
| 1 | RV1106G3 | QFN-128_L12.3-W12.3-P0.35-TL-EP7.0-1 | U1 |
| 1 | SC4336H | CSP-35_L5.7-W3.7-P0.64-R5-C7-S0.58-TL | U8 |
| 1 | SMF6.0CA | SOD-123FL_L2.8-W1.8-LS3.7-BI | D1 |
| 1 | TEMT6000 | SENSORS-SMD_TEMT6000X01 | Q2 |
| 1 | USB-C | USB-C_SMD-TYPE-C-31-M-12_1 | J1 |
| 1 | USBLC6-2SC6 | SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BL | U10 |
| 1 | W25N02KV | WSON-8_L8.0-W6.0-P1.27-TL-EP-1 | U5 |
| 1 | green | LED0603-RD | LED1 |
It measures 65.3 × 57.8 mm and has 6 copper layers, 1.6 mm thick.
189 parts, built around the RV1106G3, ESP32-C6-MINI-1U-H4, TLV62569DBV and DRV8210PDSG. 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.
From the offgridevices/offgrid-hardware repository on GitHub, at the commit this page was made from: the board is products/layercam/layercam-pro/layercam-pro.kicad_pcb and its schematic products/canary/canary.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
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).

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

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

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

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

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

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

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

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

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

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





cristianchelu/oddware
Personal collection of projects that don't deserve their own repositories.

AntoG00/ESP32-C6-CO2-Monitor
Low-power CO2, temperature and humidity monitor using ESP32-C6 and E-Paper display.

openconcepts-ar/accel2d
This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

frankplow/ELEC3885
A robust and lightweight helmet-mounted safety camera for cycling