Build an OpenNIRScap 24-channel fNIRS brain cap from open-source hardware — Altium conversion, BOM sourcing, PCB fab, assembly, firmware flash
Open-source 24-channel fNIRS wearable brain cap. Kim et al. 2025, University of Toronto.
Repo has Altium .PcbDoc source files, no exported gerbers or CSV BOMs.
| Project | File | Description |
|---|---|---|
| fNIRS_sensor_module | SensorModulePCB.PcbDoc | 25mm circular, combined emitter+detector |
| fNIRS_ECU | fNIRS_PCB.PcbDoc | 112x112mm main control board |
| DetectorOptode | DetectorOptode.PcbDoc | Detector-only variant |
| SourceOptode | SourceOptode.PcbDoc | Source-only variant |
| STLINK_Breakout | STLINK_Breakout.PcbDoc | Programming adapter |
perl convertpcb.pl file.PcbDoc. Repo: thesourcerer8/altium2kicad. Needs unpack.pl first.altium-cli (Rust, akiselev) — broken workspace deps, won't buildpyaltium — crashes on Python 3.14 (missing dateutil dep)altium2kicad unpack.pl worked but convertpcb.pl couldn't find unpacked filesInstall KiCad 8 (brew install --cask kicad or nix shell nixpkgs#kicad), import PcbDoc, export gerbers + BOM + CPL from KiCad.
| Part | MPN | Qty | DigiKey URL |
|---|---|---|---|
| Photodiode | VBPW34S | 24 | https://www.digikey.com/en/products/detail/vishay-semiconductor-opto-division/VBPW34S/4073399 |
| Quad op-amp | AD8618ARUZ | 12 | https://www.digikey.com/en/products/detail/analog-devices-inc/AD8618ARUZ/1993937 |
| Dual LED 660/940nm | VSMD66694 | 8 | https://www.digikey.com/en/products/detail/vishay-semiconductor-opto-division/VSMD66694/7681025 |
| N-ch MOSFET | BSD840NH6327XTSA1 | 16 | https://www.digikey.com/en/products/detail/infineon-technologies/BSD840NH6327XTSA1/5409567 |
| MCU | STM32L476RET6 | 1 | https://www.digikey.com/en/products/detail/stmicroelectronics/STM32L476RET6/5177041 |
| Analog MUX | TMUX1104DBVR | 8 | https://www.digikey.com/en/products/detail/texas-instruments/TMUX1104DBVR/9685876 |
| PWM/IO | PCA9685PW,118 | 3 | https://www.digikey.com/en/products/detail/nxp-usa-inc/PCA9685PW-118/2034325 |
Core known values (exact values need Altium schematic export):
| Category | Cost |
|---|---|
| Semiconductors | ~$130 |
| Passives | ~$15 |
| PCBs | ~$13 |
| Amazon | ~$150 |
| Total | ~$310-420 |
Located in firmware/STM32/fNIRS/. STM32CubeIDE project.
Located in software/. Python 3.
forester — bci.horse forest publishing (bcf-0036 is this device's tree)reverse-engineering — MCP servers for Ghidra/radare2/IDA if binary analysis neededbinary-triage — systematic binary survey workflowperforming-firmware-extraction-with-binwalk — firmware extraction from embedded devicesprotocol-reverse-engineering — reverse engineering communication protocolsradare2-hatchery — radare2 ecosystem toolsaltium2kicad (Perl, 933 stars): https://github.com/thesourcerer8/altium2kicadaltium-cli (Rust, broken): https://github.com/akiselev/altium-cliResearch-grade fNIRS (NIRx NIRSport 2) costs $50k-150k. PLUX biosignalsplux fNIRS sensor is $789 for 1 channel with short source-detector separation — measures superficial scalp hemodynamics, not cortical activity.
Light follows a banana-shaped path through tissue. Separation controls measurement depth:
50mm: too much attenuation
Per Strangman et al. (PLOS ONE 2013): every 10mm increase up to ~45mm adds ~4% gray matter sensitivity. Depth sensitivity decays as S = 0.75 * 0.85^depth.
PLUX has emitter+detector in one housing = short path = scalp oximetry. NIRSport 2 uses separate optodes at 30mm = cortical imaging = $50k+. OpenNIRScap uses separate optodes at 35mm = cortical imaging = $419.
Build 3x OpenNIRScap ($1,257) as the walk-up fNIRS fleet. If/when a commercial reference is acquired (Artinis Brite Lite ~$6k or Cortivision Spectrum C23), use it to validate OpenNIRScap signal quality. The AFE4404 in the earlier DIY spec (bcf-0012) uses the same modified Beer-Lambert deconvolution as NIRx's proprietary pipeline — the physics is identical, only the engineering precision differs.
| USB isolator | ADUM4160BRWZ | 1 | https://www.digikey.com/en/products/detail/analog-devices-inc/ADUM4160BRWZ/1861340 |