Contradictions, all resolved against the design files (U10 pad nets and component values parsed from hardware/OpenFC.kicad_pcb): - LED series resistors in DESIGN.md re-derived from the board: D2 is R52+R53 = 150R from GPIO26 (not 510R), D7 is R36 = 510R from +3.3V (not 680R), and the missing D8 row is added. Currents recomputed. - OSD op-amp supply corrected from +5 V to +3.3 V (U1 pin 5 is on the +3.3V net); the headroom question is raised as an open item. - EMC checklist rewritten for the RP2354A: SPI0/SPI1 swapped to match the netlist (IMU on SPI1, SD on SPI0), USB series R corrected to 30R at pads 51/52, core inductor L1 to L4, RSSI/external-ADC and ECO/ELRS sections dropped, D1 noted as unpopulated. - audit_design.py docstring corrected to KiCad 10, plus a note that its hardcoded refdes and GPIO map are Rev 1 and need re-deriving. Deleted, all superseded by the Rev 2 RP2354A design or one-time artifacts: - hardware/tools/design_audit.md, hardware/research/rp2354a-routing-validation.md, hardware/tools/rp2350_layout_notes.md (Rev 1 QFN-80 refdes and pin numbers) - hardware/_U2BEFORE.kicad_pro, hardware/_U2BEFORE-top.png, hardware/OpenFC-top.png (one-time U2 3D model verification, unreferenced) - hardware/emc.json, hardware/thermal.json (generated dumps, now gitignored) - hardware/tools/eco_strip_sheets.py, hardware/tools/rebuild_blackbox.py (one-time scripts that would delete or regress live sheets) - images/.gitkeep (directory is no longer empty) Technical content from the deleted notes was moved, not dropped: the PIO instruction-budget analysis and the SBUS hardware-UART constraint into open-items.md and DESIGN.md, and the RP2350 core-buck layout rule into the DESIGN.md power tree. Duplications collapsed to one copy plus a link: sibling-board description, production-export sentence, SBUS and microSD rationale, SPI pin assignments, buck part change, FB_OSD upstream status, IMU footprint compatibility, and the EMC checklist body that add_emc_note.py now reads from the markdown file. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
IMU Selection Investigation: OpenFC-Lite-Mini Rev 2
Status: open · Started: 2026-06-02
The Rev 1 IMU (ST LSM6DSV16XTR) is populated for development only. The Betaflight team considers it unflyable; bench/flight data agrees. This folder collects datasheets, sourcing data, and test evidence to pick the Rev 2 IMU.
The footprint and its ST/TDK compatibility are described in
hardware/docs/DESIGN.md (IMU section). IMU swap is a
part-population change once a part is chosen. Pin-by-pin verification against each
candidate family is in §8c below.
imu-selection/
├── README.md ← this file (single source of truth for the investigation)
├── datasheets/ ← collected datasheets, named by part
└── (add scope captures, logs, FFTs here as they come in)
1. Hard requirements
| # | Requirement | Why |
|---|---|---|
| R1 | Betaflight driver on current master | No driver = no flyable firmware. Authoritative list below. |
| R2 | Drops into LGA-14 (2.5×3 mm), pins 2/3 GND, 10/11 NC | Existing footprint; pin-1 orientation must match. |
| R3 | Flyable: low in-band gyro noise, robust to electrical + vibration noise | The whole reason DSV16X is being replaced. |
| R4 | Sourceable at volume (LCSC/JLC preferred, real stock) | Selling the board; rest of BOM < $5. |
| R5 | Price target: ideally ≤ ~$3-4 to keep the "Lite" price point | IMU currently dominates BOM cost. |
| R6 | VDDIO works at 1.8 V analog / 3.3 V IO | Board runs IMU off +1.8V_GYRO (U6 NCV8187) + 3.3V IO. |
A part failing R1 or R2 is out unless someone commits to adding the driver / reworking the footprint.
2. Betaflight supported-IMU list (authoritative)
From drivers/accgyro/accgyro.h (gyroHardware_e) + sensors/acceleration.h on current
master. Only these have flyable drivers today.
- InvenSense MPU: MPU6000, MPU6050, MPU6500, MPU9250
- InvenSense ICM-206xx: ICM20601, ICM20602, ICM20608G, ICM20649, ICM20689
- InvenSense ICM-426xx / 40609: ICM42605, ICM42688P, ICM42622P, ICM42686P, ICM40609D
- InvenSense IIM industrial (426xx driver): IIM42652, IIM42653
- InvenSense ICM-456xx: ICM45605, ICM45686
- Bosch: BMI160, BMI270
- ST: LSM6DSO, LSM6DSV16X, LSM6DSK320X, L3GD20 (gyro-only)
- Virtual: SITL/HITL
NOT on master (would need a driver): ICM-56686 (RPi is adding it, not merged), BMI323, BMI088, ICM-42670-P, LSM6DSV320X (the V high-g, ≠ the K).
3. Candidate matrix
Pricing/stock from LCSC paste 2026-06-02 (EUR). "BF" = on master. Footprint column flags anything that isn't a clean drop-in.
| Part | BF | Price (qty) | LCSC stock | Footprint | Gyro noise mdps/√Hz | Verdict |
|---|---|---|---|---|---|---|
| ICM-42688-P | ✓ king | €12.15 / €10.49 lt | 0 (10k @7-9d other) | LGA-14 2.5×3 ✓ | 2.8 | Best-flying, too expensive + tight supply |
| ICM-42622P | ✓ | not in paste, source | ? | LGA-14 ✓ | ~2.8 (class) | strong reports, find pricing/stock |
| IIM-42652 | ✓ | (see paste; IIM-42653 €13.15) | 42653: 4,969 | LGA-14 ✓ | 3.8 | Industrial temp, pricey |
| ICM-45686 | ✓ | €18.20 / €6.23 lt | 0 (353 other) | LGA-14 3×2.5 ⚠ rotated | ~ | Newer; verify pin-1, costly |
| ICM-45605 | ✓ | €6.35 | 0 | LGA-14 | - | budget 456xx, 0 stock |
| ICM-42605 | ✓ | €5.60 / €4.90 lt | 10,000 ✓ | LGA-14 2.5×3 ✓ | (class) | In stock, supported: solid fallback |
| BMI270 | ✓ | €3.19 / €1.36 lt | 0 (50k @6-8d other) | LGA-14 2.5×3 | 7 (perf) | Cheap + available + only AC-PSRR spec'd ⚠ verify Bosch pinout |
| LSM6DSO | ✓ | €3.70 | 6,312 ✓ | LGA-14 2.5×3 ✓ | (older) | cheap, available, older gen |
| LSM6DSV16X | ✓ | €4.07 | 4,350 | LGA-14 2.5×3 ✓ | 2.8 | Current Rev 1: unflyable, being replaced |
| LSM6DSK320X | ✓ | not released | 0 | LGA-14 2.5×3 ✓ | 3.8 | BF/STM target; not orderable, samples gated |
| ICM-56686 | ✗ | (RPi sharing ds) | - | LGA-14 2.5×3 | 2.9 | No BF driver yet (RPi adding); 29.3kHz MEMS |
| BMI323 | ✗ | €3.28 | 2,920 | LGA-14 | - | No BF driver; Bosch filters undocumented |
| BMI088 | ✗ | €8.16 | 3,468 | LGA-16 3×4.5 ✗ | 14 | No driver, wrong footprint, 2.4V floor: out |
| LSM6DSV320X | ✗ | €10.95 | 0 | LGA-14L | - | V variant, no BF driver (≠ DSK) |
4. Datasheet spec comparison
Mined from the PDFs in datasheets/. "n/s" = not specified in datasheet.
| Spec | ICM-42688-P | IIM-42652 | ICM-56686 | BMI270 | BMI088 | LSM6DSV16X | LSM6DSK320X |
|---|---|---|---|---|---|---|---|
| Gyro noise (mdps/√Hz) | 2.8 | 3.8 | 2.9 / 2.5(20b) | 7 / 10 | 14 | 2.8 | 3.8 |
| Accel noise (µg/√Hz) | 65/70 | 70 | 55/70 | 160 | 190 | 60/100 | 60/100/1000(hi-g) |
| Gyro FS max (dps) | 2000 | 2000 | 4000 | 2000 | 2000 | 4000 | 4000 |
| Accel FS max (g) | 16 | 16 | 32 | 16 | 24 | 16 | 320 (hi-g) |
| Max gyro ODR (kHz) | 8 | 8 | 6.4 | 6.4 | 2 | 7.68 | 7.68 |
| MEMS resonant freq | n/s | n/s | 29.3 kHz | n/s | n/s | n/s | n/s |
| Anti-alias filter | AAF 42-3979Hz + notch | AAF 42-3979Hz | AAF+LPF | LPF | LPF 5-532Hz | analog AAF + LPF1 | analog AAF + LPF1 |
| VDD / VDDIO (V) | 1.71-3.6 / 1.71-3.6 | 1.71-3.6 / 1.71-3.6 | 1.71-3.6 / 1.08-3.6 | 1.71-3.6 / 1.2-3.6 | 2.4-3.6 / 1.2 | 1.71-3.6 / 1.08 | 1.71-3.6 / 1.08 |
| SPI max (MHz) | 24 | 24 | 24 | 10 | 10 | 10 | 10 |
| Package | LGA-14 2.5×3 | LGA-14 2.5×3 | LGA-14 2.5×3 | LGA-14 2.5×3 | LGA-16 3×4.5 | LGA-14 2.5×3 | LGA-14 2.5×3 |
| PSRR / supply-noise spec | 10mVpp tol. | 10mVpp tol. | 10mV typ/50max, to 1MHz | AC PSRR: gyro 0.40dps/50mV, accel <8mg/50mV, 100Hz-1MHz | DC drift only | n/s | n/s |
| CLKIN | yes 31-50k | yes | yes 20-40k | no | no | no | no |
Headline findings
-
The DSK320X is NOT a quieter gyro than the DSV16X. On paper it's worse: 3.8 vs 2.8 mdps/√Hz, identical accel noise. Neither ST datasheet documents a MEMS resonant-freq change or sensor-level vibration-immunity improvement. The DSK's only vibration-relevant edge is the ±320 g high-g channel (clip resistance under hard impact) + quad-channel UI/EIS/OIS/high-g filtering, not a lower-noise or more supply-robust gyro core. This directly contradicts the framing that the DSK "fixes the noise": the fix, if real, is in MEMS hardware ST does not document, or in the high-g anti-clip path.
-
Neither ST part specs any PSRR / supply-noise rejection. This is the standout gap versus the observed failure (sensitivity to electrical noise). You cannot design a supply-ripple budget against a number that doesn't exist.
-
BMI270 is the only candidate with a frequency-resolved AC PSRR: gyro 0.40 dps per 50 mV ripple (100 Hz-1 MHz). InvenSense parts at least give a max-tolerable-ripple (10 mV). If supply-coupled noise is the real culprit, Bosch + InvenSense give you a spec; ST gives you nothing.
-
Vibration-aliasing immunity: ICM-56686 is the only part publishing a MEMS drive frequency (29.3 kHz, far above any propwash band, good anti-alias margin). BMI088 is the only one with explicit "drone/robotics vibration suppression + ±24 g anti-clip" language, but it's the worst on noise, wrong footprint, no driver. Out on R1/R2.
5. External input and flight data
Betaflight-ecosystem consensus
- LSM6DSV16X is considered unflyable: "too sensitive to electrical noise." Tested on 5+ FCs across brands, all unacceptable; it will not be approved for ecosystem hardware.
- LSM6DSK320X is the recommended successor, developed together with ST; mass production targeted June 2026. Described as worth waiting for, drop-in on the LSM16 design.
- ICM-42688 "still king" but TDK supply is hard. ICM-42622 also rated very highly.
- Bosch BMI270: internal filters undocumented, "not great but cheap and works", pin-for-pin swappable later. Recommended only as a cheap interim.
- Clone IMUs (HXY ICM-42688P etc.) rejected on principle: unknown provenance.
- ⚠ Bias to note: Betaflight and ST have a working relationship, and ST has a commercial interest in the DSK320X winning the comparison. Weigh accordingly.
Counter-argument: the failure may be PDN-specific
- This board's IMU supply is unusually good: NCV8187 ~90 dB PSRR, and running the IMU at 1.8 V means a large LDO dropout → even better rejection. The board's electrical environment is likely better than the cheap FCs the DSV16X was condemned on, so those failures may be PCB/PDN-specific, not intrinsic to the part. (For comparison, at least one well-regarded reference design uses a ~75 dB PSRR IMU LDO, worse than ours.)
- DSK320X has different MEMS hardware. DSV320X is €5-6 at DigiKey (the V high-g).
- One proposed strategy: ship the Lite with BMI270 (cheap, holds the price point) now; a premium board with a higher-end IMU later.
Flight data: hover A/B against an ICM reference board
- Our board (DSV16X): prefilter gyro shows ~20 dB more <100 Hz broadband noise than an ICM reference board, on a hover test. Would need a hard detune to fly.
- Comparison is apples-to-apples: both FCs MCU-down, gyro-up → noise is not ESC-side.
- Adding a cap on 5 V often helps in this failure mode → points at supply-coupled noise.
- ⚠ Counter-datapoint: a 1408/3750kv/6S 3" test quad on DSV16X flew perfectly once a suitable tune/filter preset was applied, i.e. the issue may be tune/filtering, not raw sensor. Sample size 1. Worth resolving before committing.
ICM-56686
- Betaflight support for the ICM-56686 (positioned as an ICM-42688 alternative) is
reportedly in development elsewhere; no driver on master yet. TDK cleared the
datasheet for sharing → in
datasheets/.
5b. What actually matters in FPV (not bench noise density)
FPV is not a clean environment: the gyro lives in heavy mechanical vibration (motors, props, frame/arm resonances, often 0.5-4 kHz) plus ESC switching/EMI. Bench noise density is nearly the wrong figure of merit. Proof: the DSV16X has the best noise density of every candidate here (2.8 mdps/√Hz, tied with the 42688) and is still unflyable. Flyability is set by how the part handles out-of-band energy, not its quiet-room floor:
- Vibration rectification / aliasing. Out-of-band vibration (kHz) folds into the control band as a DC offset shift + low-frequency broadband, exactly the <100 Hz broadband signature in the hover A/B data (§5). Governed by the MEMS drive/sense resonant frequency and the analog anti-alias filter ahead of the ADC (not the digital LPF, which is too late). → ICM-56686 is the only part publishing its resonant freq (29.3 kHz, big margin). ST parts publish neither resonant freq nor rectification behavior.
- Clipping headroom under vibration. Instantaneous rate/accel spikes that exceed FS clip, and clipping rectifies into DC + harmonics. This, not "more range", is why DSK320X has a ±320 g accel channel and BMI088 has ±24 g. A ±16 g accel can saturate on a rough quad.
- Supply / EMI rejection. ESC switching coupling into a part with unbounded PSRR. ST specs none; BMI270 specs AC PSRR; InvenSense specs a max tolerable ripple.
Consequence for this investigation: rank candidates on (1) anti-alias/resonant-freq margin, (2) clip headroom, (3) PSRR, and above all on empirical flight/blackbox data, since datasheets barely document any of the three. The noise-density column in §4 is informational, not a selection criterion. This is why BF qualifies gyros by flying them, and why a worse-on-paper part (DSK320X) can outfly the DSV16X.
5c. Prior diagnostic campaign, firmware A/B builds (sister board)
A documented DSV16X diagnostic effort already ran on a sister board carrying the same LSM6DSV16XTR (late April 2026): one firmware variant per hypothesis, each with a blackbox test plan. Results live in the blackbox logs, still to be recovered.
| Firmware change | Hypothesis | Symptom targeted |
|---|---|---|
| DRDY PULSED→LATCHED | RP2350 @150 MHz EXTI+SPI-DMA latency exceeds the 75 µs DRDY pulse under heavy IRQ load (PIO DSHOT/UART, SD blackbox) → missed gyro samples → sample-rate drift | 200 Hz oscillation under throttle, fine at hover |
| accel LPF2 250 Hz→~22 Hz | motor-harmonic vibration >250 Hz leaks into accel → corrupts IMU-fusion gravity vector | "gravity-vector wandering" in ANGLE mode |
on-board chirp PID identifier (USE_SYSID) |
(tooling) sysid raw emits a versioned FRF CSV for frequency-response analysis |
n/a |
Why this matters for IMU selection: the two leading in-house hypotheses for the DSV16X misbehaviour are firmware/platform, not "bad MEMS":
- a DRDY timing bug specific to RP2350 under load (missed samples → the 200 Hz throttle oscillation), and
- an accel-filter config leaking vibration into fusion (gravity wander).
Both are fixable without changing the sensor. This strongly reinforces §6: the part may be partly mis-integrated on RP2350, not intrinsically unflyable. Note these symptoms (200 Hz under-throttle oscillation; gravity wander) are distinct from the hover A/B result (<100 Hz broadband prefilter noise at hover), so there may be ≥2 independent problems, only one of which the sensor swap would fix.
The blackbox logs from these builds plus their baseline, and the sysid raw FRF CSV, are
the highest-value missing evidence (see §8).
5d. RESOLVED on the sister board, empirical
The firmware A/B campaign concluded the DSV16X problem is not firmware-fixable: it's a MEMS hardware property. The sister board's firmware config records the swap rationale: the LSM6DSV16XTR was found to have a MEMS resonance vulnerability in the ~25 kRPM motor band on that airframe (the internal gyro saturating from acoustic/vibration energy at the resonator's drive frequency, producing bursts of false rotation reads up to chip full-scale ±2000 dps). Swapping to the ICM-42688-P (drop-in pin-compatible, confirmed by multiple BF targets that support both chips on the same pads) eliminated the resonance issue, and the sister board's next PCB revision is designed with the ICM-42688-P only.
What this settles, and what it does NOT.
Settled: swapping to ICM-42688-P made the board flyable, and the sister board's next revision standardizes on it. That's a solid empirical result for part selection.
NOT settled: the root cause. The "MEMS resonance in the ~25 kRPM band" wording is a hypothesis writeup, not a measured result, and it does not survive scrutiny as a single cause:
- The hover A/B noise is <100 Hz broadband at HOVER (low RPM/vibration). A high-RPM resonance should be throttle-dependent and absent at hover, which is what the diag build describes ("200 Hz under throttle, fine at hover"). So there are ≥2 distinct symptoms, not one.
- "~25 kRPM band" is physically shaky: 25 kRPM ≈ 417 Hz fundamental; a MEMS gyro drive resonance is ~20-25 kHz (~50× higher). 417 Hz vibration doesn't excite a 20 kHz drive mode directly. The plausible mechanism is aliasing (out-of-band energy folding in through an inadequate AAF), a filtering/architecture issue, not "resonator saturation."
- "5 V cap helps" + the "electrical noise" reports + ST publishing no PSRR → an independent supply/PSRR contributor.
- A tune/filter preset made one build fly perfectly → tune/filtering is a large lever; a hard MEMS-saturation defect wouldn't yield to a preset.
- The ICM swap is a confounded experiment: it changed sensor + driver maturity + AAF/notch behavior + CLKIN jitter removal simultaneously. It does not isolate resonance as the cause.
Working model: multi-causal, at least: (1) anti-alias/filtering inadequacy → aliased broadband; (2) supply/PSRR sensitivity; (3) RP2350 DRDY/sample-timing under load; (4) MEMS resonance/clipping at high vibration; (5) driver/tune immaturity. The ICM-42688-P is better on several of these at once, which is why it works, but the dominant factor is not isolated.
Consequence for selection: because the win is partly filtering/driver/PSRR (not purely a MEMS-element property), a same-family ICM-42605 is a strong bet (shares AAF+notch+driver), and the BMI270's real AC-PSRR spec regains relevance if supply coupling is a major contributor. Only the actual logs/FFT (hover vs throttle, ± a supply-ripple injection test) can decompose it.
6. Working hypothesis
The DSV16X's in-flight noise is most plausibly supply/electrical-coupling + tune, not a raw-noise-density deficit (its density spec is best-in-class, tied with the 42688). Evidence:
- 20 dB excess is broadband <100 Hz = classic aliased/rectified noise, not white density.
- "Adding a cap on 5 V helps" + "sensitive to electrical noise" = PDN/supply path.
- A good preset made it fly fine on our board (better PDN than the FCs BF condemned).
- ST publishes no PSRR, so the part's supply robustness is genuinely unknown/unbounded, consistent with it being fragile on noisy boards even if fine on a clean one.
This means the decision is partly political (BF approval / the 180-brand ecosystem rejects DSV16X regardless of our data) and partly technical (what actually flies clean on our PDN). Those can have different answers.
7. Decision options
Reframed by §5d: the failure is MEMS resonance saturation, and ICM-42688-P is the empirically proven fix on the sister board. The 426xx family shares the same gyro sense-element architecture, so a cheaper family member is the likely, but not yet proven, way to keep the fix at a Lite price. A different-MEMS part (BMI270) is now a real risk, not a safe interim.
- A: ICM-42688-P (proven). ← lowest technical risk. The exact part that eliminated the resonance on the sister board, whose next revision standardizes on it. Drop-in (§4), uses wired CLKIN (GPIO15). Cost is the only problem: €10-12, 0 LCSC stock (10k other @7-9d). Kills the sub-$5 "Lite" price point. Right call for a premium OpenFC; painful for Lite.
- B: ICM-42605 (cheap same-family bet). ← leading for Lite (2026-06-02). Same 426xx gyro
architecture as the 42688 → most likely shares the resonance immunity (same sense element,
different binning/noise grade). BF-supported, 10,000 in LCSC stock @ €4.90-5.60, clean
2.5×3 footprint, uses the wired CLKIN. Risk: the resonance immunity is not yet confirmed on
the 42605 specifically: verify by flying it (it shares the 42688 driver, so it's a config
one-liner:
USE_GYRO_SPI_ICM42605). If it holds, this is the answer for Lite. - C: ICM-42622P (highly rated, same family), but €15 / out of stock at last check. Out on price/supply right now.
- D: BMI270 (cheapest, now higher risk). €1.36-3.19, 50k stock, BF-supported, footprint drop-in (§7b), only candidate with a real AC-PSRR spec. But: different Bosch MEMS: we now know the DSV16X failure was MEMS-resonance, and there is no evidence BMI270 survives this airframe's resonance band. Bench noise density (7) is irrelevant (§5b); the resonance question is not. Only choose if 42605 also fails and price dominates, and flight-test it against the same airframe first.
- E: DSK320X, BF/STM blessed, drop-in, but not orderable (samples gated), and per §4 not a lower-noise gyro. Track for the premium SKU; not actionable for Rev 2 now.
- F: Two-SKU strategy. Premium OpenFC = ICM-42688-P (proven). Lite = ICM-42605 if it flies clean, else BMI270 as the cost-floor fallback. Aligns the premium board with the sister board's next revision.
Recommendation: Lite-Mini Rev 2 → ICM-42605 (in stock, cheap, same family as the proven fix, wired CLKIN usable), with ICM-42688-P as the drop-in premium/no-compromise option on the identical footprint. Flight-test the 42605 against a ~25 kRPM-band airframe before committing: that's the one open risk, and it's cheap to close.
7b. BMI270 footprint verification (DONE 2026-06-02)
Checked BMI270 pinout vs the actual board net on U9 (netlist export of OpenFC.kicad_sch).
Board pins wired for the LSM6DSV16X: 1 MISO, 2 GND, 3 GND, 4 INT, 5 +3.3V, 6 GND, 7 GND,
8 +1.8V_GYRO, 9 CLKIN(GPIO15), 10 NC, 11 NC, 12 CS, 13 SCK, 14 MOSI.
BMI270 is a drop-in, with two caveats:
- Pins 2/3 = ASDx/ASCx (aux/OIS), hard-grounded on our board. Bosch documents "VDDIO or DNC", not GND. The shared 20×20 FC footprint grounds these and BMI270 ships on it across many BF boards (works empirically), but it is outside Bosch's stated spec: verify on a sample; worst case a DNC cut on 2/3.
- Pin 9 = our CLKIN net (GPIO15). On BMI270 pin 9 is INT2 (no clock input). No regression (ST part also has no CLKIN); just don't drive a clock on GPIO15 in firmware. Aligns with the Rev 2 "drop CLKIN" plan.
- All other pins (SPI 1/12/13/14, VDD 8 @1.8V, VDDIO 5 @3.3V, INT1 4, GND 6/7, NC 10/11) match 1:1.
8. Open verification tasks
- BMI270 LGA-14 pinout vs our footprint → drops in; caveats on pins 2/3 (grounded aux, out-of-spec but field-proven) and pin 9 (CLKIN→INT2, harmless). See §7b.
- ICM-45686 footprint is LGA-14 3×2.5 (rotated vs our 2.5×3): check pin-1 / land.
- Source ICM-42622P: LCSC/DigiKey/Mouser pricing, stock, lead time.
- DSK320X availability + price: DigiKey/Mouser/STM samples; realistic date beyond "June."
- CLKIN decision: Rev 2 plan drops CLKIN (GPIO15); if a TDK part (42605/42688/42622/ 45686/56686) is chosen, keep CLKIN for jitter removal. ST/Bosch don't use it.
- Get the actual FFT/blackbox behind the hover A/B (§5) into this folder: quantify the 20 dB, identify the noise frequency signature (aliased vs supply tone vs propwash).
- Resolve the contradiction: if a tune made DSV16X fly clean on our board, characterize why BF's boards failed: PDN measurement on a noisy reference FC vs ours.
- Confirm +1.8V_GYRO rail is fine for each finalist's VDD (all OK except BMI088's 2.4V).
- Decide whether ICM-56686 is worth waiting for its in-development driver.
8b. Log comparison: PIDtoolbox method + first run (2026-06-02)
How PIDtoolbox (PTB) works (Brian White / bw1129, MATLAB or compiled standalone): decodes BF blackbox → modules: Spectral Analyzer (gyro/dterm PSD in dB + Freq×Throttle spectrogram), Step Response (setpoint→gyro deconvolution), time-domain plots.
- Set
debug_mode = GYRO_SCALEDso unfiltered gyro is logged (PTB then shows gyro prefilt vs gyro, and computes filter phase latency). Modern BF (2026.x) logsgyroUnfilt[]natively regardless of debug_mode, our logs have it, so prefilter analysis works anyway. - Log at 2 kHz (spectrograms reach ~1 kHz). Fly throttle sweeps (idle→full over 5-10 s, ×2-3).
- Reading Freq×Throttle: diagonal line rising with throttle = motor noise (tracks RPM); horizontal line at fixed Hz = frame resonance or electrical (throttle-independent); <20 Hz = real craft movement (ignore for noise); 20-100 Hz should be quiet (propwash/tune).
- Bad-gyro test: one axis much noisier <200 Hz; rotate FC 90°: if the noisy axis follows, gyro suspect.
Why prefilter (gyroUnfilt) is the right signal here: it's the raw sensor before BF's filter
stack, so comparing it removes the filter-tune confound and isolates the sensor.
Reproduce without MATLAB: analysis/compare_gyro.py LOG_A.csv LOG_B.csv labelA labelB
(numpy/scipy/matplotlib) emits psd_overlay.png, spectrogram_<label>_<axis>.png, and a
band-RMS table. PTB GUI crashed on macOS 2026-06-02; this is the fallback + it's repo-committed.
First run: LOG00083 vs LOG00090 (both built for OPENFC_ECO, the OpenFC-ECO-era firmware target since superseded by OPENFC_LITE_MINI_RP2350A; BF 2026.6.0-alpha, 8 kHz loop, logged ≈1.88 kHz → 940 Hz Nyquist). Inconclusive on sensor, the pair is not controlled:
- LOG83 = 135 s full sweep, gyro LPF off; LOG90 = only 6 s, sparse throttle, dyn-LPF 250/500.
- Which log is which sensor is unknown (BF header doesn't name the gyro; same firmware hash runs either chip via autodetect). The LOG#→sensor mapping must be recovered from test notes.
- Prefilter PSD floors nearly overlap in the noise-dominated bands (motor hump ~200-400 Hz,
400 Hz). The big 0-20 Hz "RMS" differences are flight movement, not noise (135 s aggressive vs 6 s), not a sensor signal.
- LOG83 spectrogram = clean, healthy: motor band tracks throttle, no fixed horizontal lines, no saturation bursts. LOG90 looks hotter in 200-500 Hz but is too short/sparse to trust.
Verdict: these two logs cannot decide DSV16X vs ICM. Need a matched pair: same craft, both throttle sweeps, ≥30 s each, same filter config (or compare prefilt only), and a known LOG#→sensor map. Then the Freq×Throttle + prefilt-PSD overlay will show whether the DSV16X has (a) RPM-tracking diagonal excess (vibration/alias), (b) fixed-Hz lines at idle (electrical/PSRR), or (c) saturation bursts (resonance/clipping), decomposing §5d's multi-causal model.
8c. Universal drop-in verification (footprint + nets, working tree 2026-06-03)
Footprint lib:LGA-14_L3.0-W2.5-P0.50-BR. U9 net map (current schematic): 1 MISO · 2 GND ·
3 GND · 4 INT · 5 +3.3V(VDDIO) · 6 GND · 7 GND · 8 +1.8V_GYRO(VDD) · 9 CLKIN(GPIO15) ·
10 NC · 11 NC · 12 CS · 13 SCK · 14 MOSI. Checked against datasheet pinouts:
| Pin | Board net | ST LSM6D* (DSV16X / DSK320X / DSO) | TDK ICM-426xx / IIM-426xx | Bosch BMI270 |
|---|---|---|---|---|
| 1 | MISO | SDO ✓ | AP_SDO ✓ | SDO ✓ |
| 2 | GND | SDx: "VDDIO or GND" ✓ | RESV: NC/GND ✓ | ASDx (aux, unused→input): table prefers VDDIO/DNC, GND benign ✓ |
| 3 | GND | SCx: "VDDIO or GND" ✓ | RESV: NC/GND ✓ | ASCx (aux, unused→input): GND benign ✓ |
| 4 | INT | INT1 ✓ | INT1 ✓ | INT1 ✓ |
| 5 | +3.3V | VDDIO ✓ | VDDIO ✓ | VDDIO ✓ |
| 6 | GND | GND ✓ | GND ✓ | GNDIO ✓ |
| 7 | GND | GND ✓ | RESV→GND ✓ | GND ✓ |
| 8 | +1.8V | VDD ✓ | VDD ✓ | VDD ✓ |
| 9 | CLKIN | INT2 (idle, ok)¹ | INT2/FSYNC/CLKIN ✓ (uses it) | INT2 (idle, ok)¹ |
| 10 | NC | OCS_Aux NC ✓ | RESV NC ✓ | OCSB DNC ✓ |
| 11 | NC | SDO_Aux NC ✓ | RESV NC ✓ | OSDO DNC ✓ |
| 12 | CS | CS ✓ | AP_CS ✓ | CSB ✓ |
| 13 | SCK | SCL/SCLK ✓ | AP_SCLK ✓ | SCK ✓ |
| 14 | MOSI | SDA/SDI ✓ | AP_SDI ✓ | SDI ✓ |
¹ pin 9 = INT2 on ST/Bosch; harmless as long as firmware does not drive a clock on GPIO15.
Verdict: pins 2/3 at GND are fine for all; footprint is universal
The board grounds pins 2/3. For an unused aux interface this is correct/benign across all families:
- ST LSM6D* (DSV16X / DSK320X / DSO): datasheet sanctions pins 2/3 → "VDDIO or GND". ✓
- TDK ICM-426xx/IIM and ICM-456xx/56xx-gen (confirmed from ICM-56686 pinout: pins 2/3/10/11 = RESV/AUX1, pin 9 = INT2/FSYNC/CLKIN, same universal layout): RESV = "NC or GND". ✓
- Bosch BMI270: GND is safe (mechanism verified in datasheet, 2026-06-03): aux/OIS is disabled
by default (
PWR_CTRL.aux_en=0; BF never enables it for a bare gyro), so ASDx/ASCx are high-Z inputs: nothing drives them, GND = no contention. The only "pull-up" is a configurable internal pull-up on ASDA (AUX_IF_TRIM.asda_pupsel: off/40k/10k/2k) used for the aux-I2C SDA line; inactive when aux is off (worst case a 40k pull → ~80 µA to GND, harmless). Bosch's "VDDIO or DNC" is conservative guidance for the aux-enabled case; it does not mean GND damages the part. Bosch's own power-off note even says interface pins "must be kept close to GNDIO potential." The only failure case is firmware enabling the aux I2C master (ASCx becomes a driven clock → GND short), which BF does not do. GND is the correct universal tie (VDDIO fails TDK RESV; NC fails ST's "needs a level"). One firmware caveat: never enable the BMI270 aux interface.
So the footprint is a genuine universal drop-in for every ST LSM6D*, every TDK ICM-426xx/IIM, the 456xx/56xx-generation TDK parts, and the BMI270: no schematic change needed.
Open item
- ICM-45686/45605 physical orientation: pin functions match (per 56686), but LCSC lists the 45686 as LGA-14 3×2.5 vs our 2.5×3 → check body/pin-1 rotation against the footprint before committing. (Functional pinout is fine; this is purely a package-outline check.)
- Keep pin 9 (GPIO15→CLKIN) wired: revisit the Rev 2 "drop CLKIN" note. Harmless for ST/Bosch (INT2, idle), and gives TDK 426xx/456xx sample-clock jitter removal (relevant to the noise work).
9. Datasheet index
| File | Part | Class | BF driver |
|---|---|---|---|
datasheets/ICM-42688-P.pdf |
TDK ICM-42688-P | consumer flagship | ✓ |
datasheets/IIM-42652.pdf |
TDK IIM-42652 | industrial-temp 426xx | ✓ |
datasheets/ICM-56686.pdf |
TDK ICM-56686 | AR/VR-OIS (29.3kHz MEMS) | ✗ (RPi adding) |
datasheets/BMI270.pdf |
Bosch BMI270 | consumer/wearable | ✓ |
datasheets/BMI088.pdf |
Bosch BMI088 | drone/robotics high-vib | ✗ |
datasheets/LSM6DSV16X.pdf |
ST LSM6DSV16X | consumer/OIS (Rev 1 part) | ✓ |
datasheets/LSM6DSK320X_rev0.1.pdf |
ST LSM6DSK320X | high-end dual-accel | ✓ |
Still to collect: ICM-42622P, ICM-42605, ICM-45686, ICM-45605, LSM6DSO datasheets.