- Details
- Written by: Super User
- Read Time: 1 min
- Hits: 735
How Dependent Are You on Big Tech?
GAFAM (Google, Apple, Facebook/Meta, Amazon, Microsoft) control much of our digital lives. This free tool helps you understand your level of dependence on these tech giants.
What You'll Discover
- Your GAFAM Index - An overall score of your digital dependence
- Per-company breakdown - See which companies you rely on most
- Category analysis - Understand where your dependencies lie
Who Is This For?
Whether you're an individual curious about your digital footprint, a company assessing vendor lock-in, or a government agency evaluating digital sovereignty - this tool adapts to your context.
Time required: 3-5 minutes
Your responses are processed locally in your browser. Anonymous statistics are only collected with your explicit consent.
- Details
- Written by: Super User
- Read Time: 39 mins
- Hits: 93
ICM-42688-P Library Comparison Matrix
Purpose: Live document comparing FIVE ICM-42688-P library implementations for design reference and decision-making.
Last Updated: 2026-01-09 (v3.0 - All 5 libraries reviewed)
Libraries Under Comparison
| Library | Location | Status | Primary Author |
|---|---|---|---|
| Finani Library | GitHub: finani/ICM42688 (v1.1.0) | ✅ Reviewed (FINANI_LIBRARY_REVIEW.md) | Inhwan Wee (finani) |
| Sysrox Library | /ICM42688P-sysrox-library |
✅ Reviewed (SYSROX_LIBRARY_REVIEW.md) | Sysrox (libDM_icm42688) |
| Kriswiner Sketches | GitHub: kriswiner/ICM42688 | ✅ Reviewed (KRISWINER_DFROBOT_LIBRARY_REVIEW.md) | Kris Winer (Tlera Corp) |
| DFRobot Library | GitHub: DFRobot/DFRobot_ICM42688 | ✅ Reviewed (KRISWINER_DFROBOT_LIBRARY_REVIEW.md) | DFRobot (SEN0452) |
| This Implementation | /src/ (in development) |
🚧 In Development | Sylvain Boyer |
5-Library Quick Comparison
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| Type | Library | Library | Sketches | Library | Library (planned) |
| I2C Support | ✅ ⭐⭐⭐⭐⭐ | ❌ No | ✅ ⭐⭐⭐☆☆ | ✅ ⭐⭐⭐⭐☆ | 📋 Planned |
| SPI Support | ✅ ⭐⭐⭐⭐☆ | ✅ ⭐⭐⭐⭐⭐ | ❌ No | ✅ ⭐⭐⭐☆☆ (4MHz) | 📋 Planned (24MHz) |
| APEX Features | ❌ Not exposed | ✅ ⭐⭐⭐⭐⭐ Full | ✅ ⭐⭐⭐☆☆ Tilt/WOM | ✅ ⭐⭐⭐⭐⭐ Tap/WOM/SMD | 📋 Optional |
| Documentation | ⭐⭐⭐⭐⭐ README | ⭐⭐☆☆☆ Minimal | ⭐⭐⭐☆☆ Moderate | ⭐⭐⭐⭐⭐ Doxygen | 📋 Planned |
| Register Defs | ⚠️ Addresses only | ✅ Complete | ⚠️ Basic #define | ⚠️ Has conflicts | ✅ Most complete |
| Code Quality | ⭐⭐⭐⭐☆ (4/5) | ⭐⭐⭐⭐⭐ (5/5) | ⭐⭐⭐☆☆ (3/5) | ⭐⭐⭐⭐☆ (4/5) | 🚧 In Development |
| Arduino Library | ✅ Yes | ❌ Framework-specific | ❌ No (sketches) | ✅ Yes | 📋 Yes (planned) |
| Platform | Any Arduino | ESP32-S3 + framework | STM32L4 only | Any Arduino | ESP32 family |
| Unique Feature | SI units | 20-bit FIFO | External clock | Tap detection | Comprehensive regs |
| Code Size | ✅ ~10KB | ⚠️ Large (STL) | ⚠️ Duplicated | ✅ Medium | 📋 Small (goal) |
Best for I2C: Finani ⭐⭐⭐⭐⭐ (production-tested, correct repeated START)
Best for SPI: Sysrox ⭐⭐⭐⭐⭐ (24 MHz, production quality)
Best for APEX: DFRobot ⭐⭐⭐⭐⭐ (most complete: tap, WOM, SMD)
Best Documentation: Finani & DFRobot (tie - both excellent)
Best Register File: This Implementation ✅ (most complete, best organized)
Most Unique: Kriswiner (external clock support - 4x gyro stability)
Critical Findings:
- Kriswiner: NOT a library - Arduino sketches only, 90% code duplication, STM32L4-specific
- DFRobot: Has critical gyro scaling bug (uses 65535 instead of 65536)
- All libraries: None expose AAF/notch filter configuration completely
Detailed 5-Library Comparison Overview
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| I2C Support | ✅ Yes (400 kHz) | ❌ No | ✅ Yes (I2Cdev) | ✅ Yes (with checks) | 📋 Planned |
| SPI Support | ✅ Yes (1/24 MHz) | ✅ Yes (production quality) | ❌ No | ✅ Yes (4 MHz) | 📋 Planned (24 MHz) |
| Arduino Standalone | ✅ Yes | ❌ No (heavy dependencies) | ❌ No (STM32L4 only) | ✅ Yes | 📋 Design goal |
| ESP32 Target | ✅ Yes (Arduino Nano ESP32) | ✅ Yes (ESP32-S3) | ❌ No (STM32L4 only) | ✅ Yes | ✅ Yes (ESP32 family) |
| FIFO Support | ✅ Basic (16-bit) | ✅ Full (20-bit mode) | ❌ No | ✅ Basic (16-bit) | 📋 Planned (Stage E) |
| APEX Features | ❌ Not exposed | ✅ Full (WOM, pedometer, etc.) | ✅ Basic (Tilt, WOM) | ✅ Excellent (Tap, WOM, SMD) | 📋 Optional (Stage E) |
| External Clock | ❌ No | ✅ Yes | ✅ Yes (32.768 kHz RTC) | ❌ No | 📋 Optional |
| Register Definitions | ⚠️ Addresses only | ✅ Comprehensive (struct-based) | ⚠️ Basic #define | ⚠️ Has conflicts | ✅ Complete with bit fields |
| Code Quality | ⭐⭐⭐⭐☆ (4/5) | ⭐⭐⭐⭐⭐ (5/5 production) | ⭐⭐⭐☆☆ (3/5) | ⭐⭐⭐⭐☆ (4/5) | 🚧 In Development |
| Documentation | ⭐⭐⭐⭐⭐ (excellent README) | ⚠️ Minimal inline docs | ⭐⭐⭐☆☆ (moderate) | ⭐⭐⭐⭐⭐ (Doxygen) | 📋 Planned |
Legend:
- ✅ Implemented/Complete
- ❌ Not Supported
- ⚠️ Unknown/To Be Determined
- 🚧 In Development (actively working on)
- 📋 Planned (not yet started)
Detailed Feature Comparison
1. Communication Protocols
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| I2C Support | ✅ Yes | ❌ No | ✅ Yes (I2Cdev) | ✅ Yes | 📋 Planned |
| I2C Addresses | ✅ 0x68/0x69 (configurable) | N/A | ✅ 0x68/0x69 | ✅ 0x68 (L) / 0x69 (H) | 📋 0x68/0x69 (both) |
| I2C Clock Speed | ✅ 400 kHz | N/A | ⚠️ Default (100 kHz) | ⚠️ Default (100 kHz) | 📋 Up to 1 MHz |
| I2C Repeated START | ✅ Yes (correct!) | N/A | ✅ Yes (correct!) | ✅ Yes (correct!) | 📋 Required |
| I2C Error Handling | ✅ Return codes | N/A | ❌ None | ✅ endTransmission() check | 📋 Planned |
| I2C Delays | ⚠️ 10ms after writes | N/A | ❌ None | ❌ None | 📋 As needed |
| I2C Write Verification | ✅ Readback every write | N/A | ❌ None | ❌ None | 🚧 Optional |
| SPI Support | ✅ Yes | ✅ Yes | ❌ No | ✅ Yes | 📋 Planned |
| SPI Mode | ✅ MODE0 | ✅ MODE0 | N/A | ✅ MODE0 | 📋 MODE0 (planned) |
| SPI Clock Speed | ✅ 1 MHz (setup), 24 MHz (data) | ✅ Configurable (24 MHz max) | N/A | ⚠️ 4 MHz only | 📋 24 MHz (target) |
| SPI Read/Write Bit | ✅ 0x80 for reads | ✅ 0x80 for reads | N/A | ✅ 0x80 for reads | 📋 0x80 for reads |
| SPI Delays | ⚠️ Unknown | ✅ None | N/A | ❌ 1ms before EVERY write | 📋 None (goal) |
| Bus Abstraction | ❌ No (direct TwoWire/SPIClass) | ✅ ABSTRACT_SENSOR_SPI | ✅ I2Cdev wrapper | ❌ Inheritance-based | 📋 IBus interface (planned) |
Analysis:
I2C Implementations:
-
Finani: ⭐⭐⭐⭐⭐ Best I2C implementation
- Correct repeated START pattern (
endTransmission(false)) - 10ms delay after writes (conservative but reliable)
- Write readback verification (catches errors but doubles traffic)
- 400 kHz clock speed
- Production-tested, reliable
- Correct repeated START pattern (
-
Kriswiner: ⭐⭐⭐☆☆ Functional but basic
- Correct repeated START via I2Cdev wrapper
- Clean abstraction pattern
- No error handling (assumes I2C never fails)
- No delays (may cause issues on slower buses)
- Default 100 kHz clock speed
-
DFRobot: ⭐⭐⭐⭐☆ Good with error checking
- Correct repeated START pattern
- Error checking on
endTransmission() - Null pointer checks with debug output
- No delays (may cause issues)
- Default 100 kHz clock speed
SPI Implementations:
-
Sysrox: ⭐⭐⭐⭐⭐ Best SPI implementation
- Production quality, 24 MHz capable
- Proper error handling and timeout
- No unnecessary delays
-
Finani: ⭐⭐⭐⭐☆ Good dual-speed approach
- 1 MHz for setup/config
- 24 MHz for data reads
- Correct read/write bit encoding
-
DFRobot: ⭐⭐⭐☆☆ Functional but slow
- Only 4 MHz (datasheet allows 24 MHz)
- 1ms delay before EVERY write (excessive, unnecessary)
- Correct read/write bit encoding
- No error detection
Recommendations:
- I2C: Adopt Finani's pattern (repeated START, delays, optional verification)
- SPI: Target Sysrox's 24 MHz speed, avoid DFRobot's excessive delays
- Abstraction: IBus interface superior to all (enables testing without hardware)
2. Architecture & Design
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| Type | Library | Library | Sketches | Library | Library (planned) |
| Bus Abstraction | ❌ No (direct TwoWire/SPIClass) | ✅ ABSTRACT_SENSOR_SPI | ✅ I2Cdev wrapper | ❌ Inheritance-based | 📋 IBus interface (planned) |
| Dependencies | ✅ Arduino only (Wire/SPI) | ❌ Heavy (streamLogger, timerTool, framework) | ⚠️ STM32L4 HAL | ✅ Arduino only (Wire/SPI) | 📋 Minimal (design goal) |
| Standalone Usable | ✅ Yes (Arduino library) | ❌ No | ❌ No (sketches only) | ✅ Yes (Arduino library) | 📋 Yes (design goal) |
| Platform Support | ✅ Any Arduino | ✅ ESP32-S3 + framework | ❌ STM32L4 only | ✅ Any Arduino | ✅ ESP32 family (primary) |
| Object-Oriented | ✅ Yes (class + inheritance) | ✅ Yes (class-based) | ⚠️ Mostly procedural | ✅ Yes (inheritance) | 📋 Class-based (planned) |
| Dynamic Allocation | ✅ None (embedded-friendly) | ⚠️ STL maps (std::map) | ✅ None | ✅ None | 📋 None (design goal) |
| Code Size | ✅ Small (~10KB) | ⚠️ Large (STL, framework) | ⚠️ Duplicated (~90%) | ✅ Medium | 📋 Small (design goal) |
| Reusability | ✅ Excellent | ⚠️ Framework-locked | ❌ None (copy-paste) | ✅ Excellent | 📋 Excellent (goal) |
Analysis:
-
Finani: ⭐⭐⭐⭐⭐ Perfect Arduino library pattern
- Simple class inheritance (ICM42688 → ICM42688FIFO)
- Direct use of Arduino Wire/SPI (no abstraction layer)
- Inline methods for efficiency
- Zero external dependencies
- Works on any Arduino platform
-
Sysrox: ⭐⭐⭐⭐⭐ Professional architecture (but framework-locked)
- Clean abstraction with ABSTRACT_SENSOR_SPI parent class
- Production-quality error handling
- Timeout and retry logic
- Heavy dependencies (not standalone)
- Requires specific framework
-
Kriswiner: ⭐⭐☆☆☆ NOT A LIBRARY - Sketch collection
- 4 separate Arduino sketch folders
- ~90% code duplication across sketches
- Cannot be installed as Arduino library
- STM32L4-specific (Ladybug board hardcoded)
- Platform-specific sleep modes, pin definitions
- Good for learning, bad for reuse
-
DFRobot: ⭐⭐⭐⭐☆ Proper Arduino library
- Inheritance-based abstraction (Base → I2C/SPI)
- Pure virtual
readReg()/writeReg()in base class - Uses C++ structs with bitfields for registers
- Arduino-standard installation
- Works on any Arduino platform
- No external dependencies
Recommendations:
- Pattern: Adopt Finani/DFRobot standalone Arduino library approach
- Abstraction: Use IBus interface (superior to inheritance for testing)
- Avoid: Kriswiner's sketch-based architecture (not reusable)
- Avoid: Sysrox's heavy framework dependencies (limits portability)
3. Register Definitions
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| Bank 0 Registers | ✅ Complete | ✅ Complete (44 regs) | ⚠️ Partial | ✅ Good | ✅ Complete |
| Bank 1 Registers | ⚠️ Partial (gyro filters) | ✅ Complete (18 regs) | ⚠️ Partial | ✅ Good | ✅ Complete |
| Bank 2 Registers | ⚠️ Partial (accel filters) | ✅ Complete (6 regs) | ⚠️ Partial | ✅ Good | ✅ Complete |
| Bank 4 Registers | ⚠️ Partial (APEX) | ✅ Complete (18 regs) | ⚠️ Partial | ✅ Good | ✅ Complete |
| Bit Field Definitions | ❌ None (addresses only) | ✅ Comprehensive (struct-based) | ⚠️ Basic #define | ✅ Struct with bitfields | ✅ Comprehensive (#define) |
| Enum Usage | ✅ enum class (FSR, ODR, filters) |
⭐ enum class (comprehensive) |
❌ Old-style #define | ❌ Old-style #define | ⚠️ #define (to be upgraded) |
| Scaling Factors | ⚠️ In code (not constants) | ✅ In maps (8 gyro + 4 accel) | ⚠️ Hardcoded | ⚠️ In code | ✅ As constants (8 gyro + 4 accel) |
| Datasheet References | ❌ Minimal | ⚠️ Minimal comments | ⚠️ References Rev 1.2 (old) | ⚠️ Some inline comments | ✅ Extensive (Rev 1.7) |
| Bank Documentation | ⚠️ Implicit in code | ✅ Clear | ❌ None | ❌ Address conflicts | ✅ Clear bank comments |
| Register Conflicts | ❌ None | ❌ None | ❌ None | ❌ Has conflicts | ✅ None |
Analysis:
-
Finani: ⭐⭐☆☆☆ Incomplete - addresses only
- Bank 0: Complete (basics only)
- Bank 1/2/4: Partial (missing notch, AAF, complete APEX)
- No bit field constants (can't do read-modify-write easily)
- Good
enum classusage for what's defined - Scaling factors hardcoded in methods
-
Sysrox: ⭐⭐⭐⭐⭐ Most comprehensive bit fields
- All 4 banks complete (44+18+6+18 registers)
- Excellent struct-based register definitions
- Best
enum classusage (type-safe, self-documenting) - Scaling factors stored with register values
- Minimal datasheet comments
-
Kriswiner: ⭐⭐☆☆☆ Basic #define constants
- Partial bank coverage (basics only)
- Old-style C
#defineconstants - References old datasheet Rev 1.2 (current is 1.7)
- No modern C++ features
- Hardcoded magic numbers in code
-
DFRobot: ⭐⭐⭐☆☆ Good coverage but has conflicts
- Good bank coverage (basics + APEX)
- Uses C++ structs with bitfields (good pattern)
- Critical issue: Register address conflicts (same address used in different banks without documentation)
- No bank number documentation (hard to tell which bank)
- Old-style
#defineinstead ofenum class - Example conflict:
GYRO_CONFIG_STATIC2= 0x0B conflicts withSENSOR_CONFIG0
-
This Implementation: ⭐⭐⭐⭐⭐ Most complete and organized
- All 4 banks complete with full bit field coverage
- Clear bank number comments for every register
- Extensive datasheet references (section numbers, page numbers)
- All scaling factors as constants (8 gyro + 4 accel + temp)
- All timing constants (reset delay, startup times)
- No address conflicts - careful bank organization
- Current datasheet Rev 1.7
- To upgrade: Convert from
#definetoenum class
Recommendations:
- ✅ Adopt Sysrox
enum classpattern for type safety (our top priority upgrade) - ✅ Keep our comprehensive coverage (superior to all 4 libraries)
- ✅ Keep datasheet references (none of the other 4 do this well)
- ❌ Avoid DFRobot's register conflicts (ensure clear bank documentation)
- ✅ Use modern datasheet (Rev 1.7, not Kriswiner's old Rev 1.2)
4. Initialization & Error Handling
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| begin() Method | ✅ Yes (simple, effective) | ✅ Yes | ⚠️ setup() in sketch | ✅ Yes | 📋 Planned |
| WHO_AM_I Check | ✅ Yes (0x47, returns -3) | ✅ Yes (0x47) | ✅ Yes (0x47) | ✅ Yes (0x47) | 📋 Planned |
| Timeout Protection | ❌ No | ✅ Yes (configurable) | ❌ No | ❌ No | 🚧 Planned |
| Soft Reset | ✅ Yes (1ms delay) | ✅ Yes (with retry) | ✅ Yes (delays vary) | ✅ Yes (delays vary) | 📋 Planned |
| Retry Logic | ❌ No | ✅ Yes (reset + retry) | ❌ No | ❌ No | 🚧 Planned |
| Error Reporting | ✅ Simple return codes | ✅ Logging framework | ❌ None (assumes success) | ✅ Return codes (limited) | 📋 Return codes (planned) |
| I2C Error Checks | ✅ Byte count, WHO_AM_I | N/A | ❌ None | ✅ endTransmission() | 📋 Planned |
| SPI Error Detection | ⚠️ Limited | ✅ Timeout-based | N/A | ❌ None | 📋 Planned |
Error Code Comparisons:
Finani:
1= Success-1= Read failed (byte count mismatch)-2= Write verification failed-3= WHO_AM_I mismatch
DFRobot:
0= Success (no errors)-1= Generic error- Serial debug messages for diagnostics
Kriswiner:
- No error codes (assumes all operations succeed)
- Prints values to Serial for manual verification
Analysis:
-
Finani: ⭐⭐⭐⭐☆ Simple, effective Arduino error handling
- WHO_AM_I validation catches connection issues
- Write readback verification (catches errors but doubles I2C traffic)
- Clear negative return codes
- No timeout/retry (simpler but less robust)
-
Sysrox: ⭐⭐⭐⭐⭐ Production-quality error handling
- Timeout protection (configurable)
- Retry logic with exponential backoff
- Logging framework integration
- Robust reset + retry mechanism
-
Kriswiner: ⭐☆☆☆☆ No error handling
- Assumes I2C never fails
- No return codes
- Relies on Serial monitor for debugging
- Dangerous for production use
-
DFRobot: ⭐⭐⭐☆☆ Basic error handling
- I2C endTransmission() checking
- WHO_AM_I validation
- Null pointer checks
- Limited error codes (mostly generic -1)
- No SPI error detection
Recommendations:
- Adopt Finani's simple return codes (Arduino-friendly)
- Add Sysrox timeout/retry for robustness
- Avoid Kriswiner's no-error-handling approach (not production-ready)
- Balance: Simple API like Finani, robust internals like Sysrox
5. Sensor Configuration
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| ODR Configuration | ✅ 1.5625 Hz - 32 kHz (14 rates) | ✅ 12.5 Hz - 32 kHz | ⚠️ Hardcoded (200/1000 Hz) | ✅ 1.5625 Hz - 32 kHz | 📋 Planned (all ranges) |
| Gyro FSR | ✅ 8 ranges (±15.625 to ±2000 dps) | ✅ 8 ranges (±15.625 to ±2000 dps) | ⚠️ Hardcoded (250 dps) | ✅ 4 ranges (±250 to ±2000 dps) | 📋 Planned (all 8) |
| Accel FSR | ✅ 4 ranges (±2g to ±16g) | ✅ 4 ranges (±2g to ±16g) | ⚠️ Hardcoded (2g/4g) | ✅ 4 ranges (±2g to ±16g) | 📋 Planned (all 4) |
| UI Filter (BW/Order) | ⚠️ Basic enable/disable only | ✅ Yes | ❌ No API | ✅ Yes (set bandwidth) | 🚧 Planned (Stage D) |
| Temperature Filter | ❌ No | ✅ Yes | ❌ No | ❌ No | 🚧 Planned (Stage D) |
| AAF Configuration | ❌ Not exposed | ❌ No API | ❌ No API | ❌ Not exposed | 🚧 Planned (Stage D) |
| Notch Filter | ❌ Not exposed | ❌ No API | ❌ No API | ❌ Not exposed | 🚧 Planned (Stage D) |
| Power Modes | ✅ Low-Noise mode only | ✅ Low-Noise mode | ⚠️ Hardcoded (LN) | ✅ Low-Power / Low-Noise | 📋 Planned (LN + LP) |
| Configuration API | ✅ Clean methods | ✅ Clean methods | ❌ Manual register writes | ✅ Clean methods | 📋 Clean API (planned) |
Analysis:
-
Finani: ⭐⭐⭐⭐☆ Good basic configuration
- Complete ODR ranges (1.5625 Hz to 32 kHz, 14 options)
- All 8 gyro FSR ranges (±15.625 to ±2000 dps)
- All 4 accel FSR ranges (±2g to ±16g)
- Simple UI filter enable/disable (fixed 1st order)
- Missing: Notch filter control, AAF control
- Defaults: ±16g accel, ±2000 dps gyro, filters disabled
-
Sysrox: ⭐⭐⭐⭐☆ Good basic configuration
- Good ODR range coverage
- All gyro/accel FSR ranges
- UI filter bandwidth control
- Temperature filter
- Missing: AAF and Notch filter API
-
Kriswiner: ⭐⭐☆☆☆ Hardcoded configuration
- No configuration API - all settings hardcoded in sketch
- Different sketches have different hardcoded settings
- ODR: 200 Hz (most sketches) or 1000 Hz (6DoF sketch)
- Gyro FSR: ±250 dps (hardcoded)
- Accel FSR: ±2g or ±4g depending on sketch
- Manual register writes scattered throughout code
- Not flexible - must edit code to change settings
-
DFRobot: ⭐⭐⭐⭐☆ Good configuration with clean API
- Complete ODR ranges (1.5625 Hz to 32 kHz)
- Only 4 gyro FSR ranges (±250, ±500, ±1000, ±2000 dps) - missing ±15.625, ±31.25, ±62.5, ±125 dps
- All 4 accel FSR ranges (±2g to ±16g)
- UI filter bandwidth configuration
- Power mode selection (Low-Power / Low-Noise)
- Clean API methods
- Missing: AAF and Notch filter API
-
This Implementation: 🚧 Plan to expose ALL configuration
- All 8 gyro FSR ranges (complete)
- All 4 accel FSR ranges
- Complete ODR ranges
- AAF (Anti-Alias Filter) - NONE of the 4 libraries expose this
- Notch Filter - NONE of the 4 libraries expose this
- UI filter with full control
- Temperature filter
- Bank caching for efficiency
Recommendations:
- ✅ Adopt Finani/DFRobot clean API pattern
- ✅ Support all 8 gyro FSR ranges (DFRobot only has 4)
- ✅ Expose AAF and Notch filters (CRITICAL - none of the 4 libraries do this)
- ❌ Avoid Kriswiner's hardcoded approach (not flexible)
6. Sensor Data Reading
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| Read Accelerometer | ✅ Yes (per-axis accessors) | ✅ Yes | ✅ Yes (per-axis) | ✅ Yes (per-axis) | 📋 Planned (Stage C) |
| Read Gyroscope | ✅ Yes (per-axis accessors) | ✅ Yes | ✅ Yes (per-axis) | ✅ Yes (per-axis) | 📋 Planned (Stage C) |
| Read Temperature | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | 📋 Planned (Stage C) |
| Combined Read | ✅ getAGT() (burst 14 bytes) | ✅ readAllImu() | ❌ No (separate reads) | ❌ No (separate reads) | 📋 Planned |
| Raw Data | ✅ getRawAGT() | ⚠️ Not exposed | ✅ Yes (readAccelData) | ⚠️ Limited | 📋 Planned (optional) |
| Scaled Data | ✅ Float (m/s², rad/s, °C) | ✅ Float (m/s², dps) | ✅ Float (g's, dps, °C) | ✅ Float (mg, dps, °C) | 📋 Planned (float or int) |
| Burst Read | ✅ Yes (14-byte register burst) | ✅ Yes (FIFO) | ❌ No (6 separate 2-byte reads) | ❌ No (separate per-axis) | 📋 Planned |
| Byte Ordering | ✅ MSB first (correct) | ✅ MSB first | ✅ MSB first | ✅ MSB first | 📋 MSB first (planned) |
| Scaling Accuracy | ✅ Correct | ✅ Correct | ✅ Correct | ❌ Gyro bug (65535) | 📋 Correct (65536) |
Data Units Comparison:
Finani:
- Accelerometer: m/s² (SI units, not g's)
- Gyroscope: rad/s (SI units, not dps)
- Temperature: °C
- Inline accessors:
accX(),accY(),accZ(),gyrX(),gyrY(),gyrZ(),temp()
Sysrox:
- Accelerometer: m/s² (SI units)
- Gyroscope: dps (degrees per second, not rad/s)
- Temperature: °C
Kriswiner:
- Accelerometer: g (gravity units)
- Gyroscope: dps (degrees per second)
- Temperature: °C
DFRobot:
- Accelerometer: mg (milligravity)
- Gyroscope: dps (degrees per second)
- Temperature: °C
Analysis:
-
Finani: ⭐⭐⭐⭐⭐ Best API design - efficient burst read
- 14-byte burst read: temp + accel + gyro in single I2C/SPI transaction
- Inline accessors for zero overhead
- SI units (m/s², rad/s, °C) - scientific standard
- Proper byte ordering (MSB first)
- Accurate scaling factors
- Both raw and scaled data available
- Most efficient implementation
-
Sysrox: ⭐⭐⭐⭐⭐ Excellent quality, similar to Finani
- Combined read via FIFO
- Uses dps instead of rad/s (more common in IMU applications)
- Accurate scaling
- Production quality
-
Kriswiner: ⭐⭐⭐☆☆ Functional but inefficient
- No burst read - reads each axis separately (6 separate 2-byte I2C transactions!)
- Uses g's and dps (common units, easy to understand)
- Correct scaling
- Simple but inefficient (12x more I2C overhead vs burst read)
-
DFRobot: ⭐⭐⭐☆☆ Good API but has critical bug
- Per-axis methods (separate reads, not efficient)
- Uses mg (milligravity) - precise but unconventional
- CRITICAL BUG: Gyro scaling uses 65535 instead of 65536 (2^16)
_gyroRange = 4000/65535.0; // ❌ WRONG - should be 4000.0/65536.0 - Error: ~0.0015% scaling inaccuracy
- Clean API but inefficient
Recommendations:
- ✅ Adopt Finani's 14-byte burst read (most efficient)
- ✅ Use SI units (m/s², rad/s) like Finani/Sysrox (scientific standard)
- ✅ Optional: Also provide g's and dps accessors for user convenience
- ✅ Fix DFRobot's scaling bug - use 65536, not 65535
- ❌ Avoid Kriswiner's inefficient separate reads (12x more bus overhead)
7. FIFO Implementation
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| FIFO Support | ✅ Yes (ICM42688FIFO class) | ✅ Yes (advanced) | ❌ No | ✅ Basic | 🚧 Optional (Stage E) |
| 20-bit Mode | ❌ No (16-bit only) | ✅ Yes (packet format 4) | N/A | ❌ No (16-bit only) | 🚧 Planned |
| 16-bit Mode | ✅ Yes (standard) | ⚠️ Not used | N/A | ✅ Yes | 🚧 Planned |
| Timestamp Support | ❌ No | ✅ Yes (with validation) | N/A | ❌ No | 🚧 Planned |
| FIFO Count Check | ✅ Yes | ✅ Yes | N/A | ❌ No (blind reads) | 🚧 Planned |
| Watermark Config | ⚠️ Unknown | ✅ Yes | N/A | ❌ No | 🚧 Planned |
| Overflow Detection | ⚠️ Unknown | ✅ Yes | N/A | ❌ No | 🚧 Planned |
| Corruption Detection | ⚠️ Basic (byte count check) | ✅ Yes | N/A | ❌ No | 🚧 Planned |
| Fast Read Mode | ❌ No | ✅ Yes (readFifoFast) | N/A | ❌ No | 🚧 Planned |
| FIFO Flush | ✅ Yes | ✅ Yes | N/A | ✅ Yes | 🚧 Planned |
Analysis:
-
Finani: ⭐⭐⭐⭐☆ Good basic FIFO via derived class
- Separate
ICM42688FIFOderived class - 16-bit mode only (standard resolution)
- Per-axis data extraction methods
- FIFO count checking
- No timestamp support
- Good for simple FIFO applications
- Clean class inheritance pattern
- Separate
-
Sysrox: ⭐⭐⭐⭐⭐ Production-quality FIFO with 20-bit mode
- 20-bit high-resolution mode (packet format 4)
- Timestamp support with validation
- Corruption detection
- Watermark configuration
- Overflow detection
- Fast read mode optimization
- Best FIFO implementation among all 5 libraries
-
Kriswiner: ❌ No FIFO support
- Does not use FIFO at all
- Direct sensor register reads only
-
DFRobot: ⭐⭐☆☆☆ Basic FIFO with critical issues
- 16-bit mode only
- ❌ No FIFO count checking (blind reads - dangerous!)
- ❌ No watermark configuration
- ❌ No overflow detection
- ❌ Inconsistent temperature scaling in FIFO vs normal mode:
- Normal mode:
raw/132.48 + 25 - FIFO mode:
raw/2.07 + 25(WRONG!)
- Normal mode:
- Fixed 16-byte reads (not flexible)
- Can lose data or read stale data
Recommendations:
- ✅ Reference Sysrox for 20-bit mode (most advanced)
- ✅ Adopt Finani's derived class pattern (clean API)
- ✅ Always check FIFO count before reading (avoid DFRobot's mistake)
- ✅ Implement overflow detection (critical for data integrity)
- ✅ Consistent scaling factors (avoid DFRobot's temp bug)
8. APEX Motion Functions
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| Wake-on-Motion (WOM) | ❌ Not exposed | ✅ Yes | ✅ Yes (basic) | ✅ Yes (configurable) | 🚧 Optional (Stage E) |
| Significant Motion | ❌ Not exposed | ✅ Yes | ❌ No | ✅ Yes | 🚧 Optional (Stage E) |
| Pedometer | ❌ Not exposed | ✅ Yes | ❌ No | ❌ No | 🚧 Optional (Stage E) |
| Tilt Detection | ❌ Not exposed | ✅ Yes | ✅ Yes (immediate) | ❌ No | 🚧 Optional (Stage E) |
| Tap Detection | ❌ Not exposed | ✅ Yes | ❌ No | ✅ Yes (single/double) | 🚧 Optional (Stage E) |
| Raise to Wake/Sleep | ❌ Not exposed | ✅ Yes | ❌ No | ❌ No | 🚧 Optional (Stage E) |
| APEX Status Struct | ❌ Not exposed | ✅ Yes | ⚠️ Partial (INT_STATUS) | ⚠️ Partial | 🚧 Planned |
| Threshold Configuration | N/A | ✅ Yes | ⚠️ Hardcoded | ✅ Yes (per-axis WOM) | 🚧 Planned |
| API Quality | N/A | ⭐⭐⭐⭐⭐ Complete | ⭐⭐☆☆☆ Hardcoded | ⭐⭐⭐⭐⭐ Excellent | 🚧 Planned |
APEX Feature Comparison:
Finani:
- ❌ No APEX features exposed (registers defined but no API)
- Focused purely on basic IMU functionality
- Keeps library simple and lightweight
- Good for applications that don't need motion detection
Sysrox:
- ⭐⭐⭐⭐⭐ Complete APEX implementation
- All motion functions supported
- Pedometer with step counting
- Raise to wake/sleep gestures
- Complete status struct
- Excellent reference implementation
Kriswiner:
- ⭐⭐⭐☆☆ Basic APEX (Tilt + WOM only)
- Tilt Detection:
- Uses DMP for immediate tilt interrupt
- Hardcoded configuration
- No user-adjustable parameters
- Wake-on-Motion:
- Configurable thresholds (~312mg default)
- Status reading from INT_STATUS2/3 registers
- Limitations:
- No tap detection
- No pedometer
- No significant motion detection
- All settings hardcoded (not flexible)
DFRobot:
- ⭐⭐⭐⭐⭐ BEST APEX implementation among all 5 libraries!
- Tap Detection ⭐⭐⭐⭐⭐
tapDetectionInit(),getTapInformation()numberOfTap()- returns SINGLE or DOUBLEaxisOfTap()- returns X, Y, or Z axis- Configures timing (TMIN, TAVG, TMAX)
- Jerk threshold and peak tolerance
- Uses datasheet-recommended defaults
- Wake-on-Motion ⭐⭐⭐⭐☆
setWOMTh(axis, threshold)- per-axis configuration (0-255)setWOMInterrupt(axis)- per-axis enable- Threshold resolution: ~3.9mg (1g/256)
- AND/OR interrupt logic
- Fixed 1g range (independent of FSR)
- Significant Motion ⭐⭐⭐☆☆
enableSMDInterrupt(mode)- 0=off, 2=short, 3=long- Simple API but basic implementation
- Assumes WOM already configured
Analysis - APEX Winner: DFRobot
Among all 5 libraries:
- DFRobot: ⭐⭐⭐⭐⭐ Most complete user-facing APEX (Tap, WOM, SMD)
- Sysrox: ⭐⭐⭐⭐⭐ Most complete overall (includes Pedometer, R2W/R2S)
- Kriswiner: ⭐⭐⭐☆☆ Basic APEX (Tilt, WOM only)
- Finani: ❌ No APEX support
- This Implementation: 🚧 Planned (Stage E)
Recommendations:
- ✅ Reference DFRobot for tap detection (best user API)
- ✅ Reference DFRobot for WOM (per-axis configuration)
- ✅ Reference Sysrox for pedometer (complete implementation)
- ✅ Provide configurable thresholds (avoid Kriswiner's hardcoded approach)
- ✅ Clean API like DFRobot (simple methods, clear return values)
9. Advanced Features
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| External Clock (RTC) | ❌ No | ✅ Yes | ✅ Yes (32.768 kHz) | ❌ No | 🚧 Optional |
| Interrupts | ✅ Yes (data-ready INT) | ✅ Yes (INT1 config) | ✅ Yes (APEX INT) | ✅ Yes (INT1/INT2, full config) | 🚧 Optional (Stage E) |
| Self-Test | ❌ Not implemented | ⚠️ Not implemented | ✅ Yes (factory comparison) | ❌ Not implemented | 🚧 Optional |
| Calibration | ✅ Software gyro bias (1000-sample) | ⚠️ Not implemented | ✅ Yes (128-sample, gravity removal) | ❌ Not implemented | 🚧 Optional |
| User Offsets | ⚠️ Software gyro bias only | ⚠️ Not implemented | ⚠️ Software only (HW commented out) | ❌ Not implemented | 🚧 Optional |
| Bank Switching | ⚠️ Implicit (in code, not exposed) | ✅ Explicit (no cache) | ⚠️ Manual scattered writes | ✅ Explicit | 📋 Planned (with cache) |
| Sensor Fusion | ❌ No | ❌ No | ✅ Madgwick 9-DOF | ❌ No | ❌ Out of scope |
Analysis:
Finani:
- ⭐⭐⭐☆☆ Limited but functional advanced features
- Data-ready interrupt support (enable/disable)
- Software gyro calibration (1000-sample average)
- No hardware offset registers used
- Bank switching hidden in implementation
- No external clock support
Sysrox:
- ⭐⭐⭐⭐☆ Good advanced features
- External clock (RTC) support
- INT1 configuration
- Explicit bank switching (no caching)
- No calibration API
Kriswiner:
- ⭐⭐⭐⭐☆ Unique external clock implementation
- External 32.768 kHz clock from STM32L4 RTC (1-ppm accuracy)
- 4x gyro stability improvement (~24°/hr → ~6°/hr drift)
- Self-test implementation:
- Forces 4G/250dps, 1kHz ODR
- Compares against factory-stored values (Bank 1/2)
- Expected: Accel 50-1200mg diff, Gyro >60dps diff, Ratio 50-150%
- Calibration:
- Averages 128 samples (~6.4 seconds at 20 Hz)
- Removes gravity (±0.8g threshold)
- Software bias storage (hardware offset registers commented out)
- Madgwick sensor fusion:
- 9-DOF AHRS filter
- Optimized with
-O3compiler flag - 20x iterations per gyro sample
- <1° RMS heading accuracy reported
- APEX interrupts for tilt/WOM
DFRobot:
- ⭐⭐⭐⭐⭐ BEST interrupt configuration
setINTMode(INTPin, INTmode, INTPolarity, INTDriveCircuit)- Supports both INT1 and INT2
- Latched or pulsed mode
- Active high/low polarity
- Push-pull or open-drain
- Most complete interrupt API among all libraries
- Explicit bank switching
- No calibration or self-test
Recommendations:
- ✅ Adopt DFRobot's interrupt configuration API (most complete)
- ✅ Reference Kriswiner for external clock (unique 4x stability feature)
- ✅ Reference Kriswiner for self-test (factory comparison method)
- ✅ Implement bank caching (more efficient than all 4 libraries)
- ⚠️ Sensor fusion out of scope (users can integrate Madgwick separately)
10. Code Quality & Maintainability
| Feature | Finani | Sysrox | Kriswiner | DFRobot | This Implementation |
|---|---|---|---|---|---|
| Code Style | ⭐⭐⭐⭐☆ Clean, readable | ⭐⭐⭐⭐⭐ Professional | ⭐⭐⭐☆☆ Mixed C/C++ | ⭐⭐⭐⭐☆ Clean, professional | 🚧 In Development |
| Inline Comments | ⚠️ Moderate (method-level) | ⚠️ Minimal | ⚠️ Minimal | ⭐⭐⭐⭐⭐ Excellent (Doxygen) | 📋 Extensive (planned) |
| API Documentation | ⭐⭐⭐⭐⭐ Excellent README | ⚠️ Sphinx (external) | ⭐⭐⭐☆☆ Moderate | ⭐⭐⭐⭐⭐ Excellent (Doxygen + README) | 📋 Inline + examples (planned) |
| Examples | ⭐⭐⭐⭐⭐ 5 examples (I2C+SPI) | ❌ None (framework-specific) | ✅ 4 sketches (duplicated) | ⭐⭐⭐⭐⭐ 5 examples (I2C+SPI) | 📋 Planned (I2C + SPI) |
| Unit Tests | ❌ None included | ⚠️ Unknown | ❌ None | ❌ None | 📋 Planned (Unity) |
| Compile Warnings | ✅ Clean compilation | ⚠️ NOLINT pragmas used | ✅ Clean | ✅ Clean | 📋 Zero warnings (goal) |
| Modern C++ | ✅ enum class | ✅ enum class, STL | ❌ Old C style (#define) | ⚠️ Structs + #define | 📋 enum class (planned) |
| Arduino IDE Integration | ✅ keywords.txt | N/A | ❌ No | ✅ keywords.txt | 📋 Planned |
| License | ✅ MIT | ⚠️ Unknown | ⚠️ None stated | ✅ MIT | 📋 MIT (planned) |
Documentation Comparison:
Finani:
- README.md: ⭐⭐⭐⭐⭐ Comprehensive (API ref, wiring, examples, troubleshooting)
- Examples: 5 working sketches (Basic_I2C, Basic_SPI, Advanced_I2C, Interrupt_SPI, FIFO_SPI)
- Code comments: Method-level documentation, clear parameter descriptions
- keywords.txt: Syntax highlighting for Arduino IDE
- Clean, readable code style
- Arduino-friendly patterns
Sysrox:
- Sphinx documentation: External (requires framework context)
- No Arduino examples
- Professional production-quality code
- Minimal inline comments
- Framework-specific
Kriswiner:
- README: Basic setup and hardware description
- Code comments: Minimal, mostly register descriptions
- 4 separate sketch folders (90% code duplication)
- No reusable library structure
- Mixed old C style and Arduino patterns
- Good for learning hardware integration
- No license information
DFRobot:
- README.md: ⭐⭐⭐⭐⭐ Comprehensive with API reference
- Doxygen comments: ⭐⭐⭐⭐⭐ Best among all libraries
- Every method documented with doxygen tags
- Parameter descriptions with valid ranges
- Return value documentation
- ASCII art register bit field tables
- Examples: 5 working sketches covering all features
- keywords.txt: Arduino IDE syntax highlighting
- Clean, professional code style
- MIT License
- Example doxygen comment:
/** * @fn getAccelDataX * @brief Get X-axis accelerometer value * @return X-axis accelerometer value unit: mg */ float getAccelDataX(void);
Analysis:
-
Finani: ⭐⭐⭐⭐⭐ Best overall documentation for learning
- Outstanding README with complete API reference
- Working examples for I2C and SPI
- Clear, Arduino-friendly code style
- Good for beginners and prototyping
-
Sysrox: ⭐⭐⭐⭐⭐ Best production code quality
- Professional architecture
- Clean modern C++
- Minimal documentation (expects framework knowledge)
-
Kriswiner: ⭐⭐⭐☆☆ Good for hardware learning, poor for reuse
- Shows real-world hardware integration
- 90% code duplication (major maintainability issue)
- Not a library (cannot be reused)
- Old C style (#define, no modern C++)
- Good educational value
-
DFRobot: ⭐⭐⭐⭐⭐ Best inline documentation (Doxygen)
- Every method has comprehensive doxygen comments
- ASCII art register tables
- Excellent README
- 5 working examples
- Clean professional code
- Best for API reference
Recommendations:
- ✅ Adopt DFRobot's doxygen documentation style (best inline docs)
- ✅ Follow Finani's README structure (best for learning)
- ✅ Use Sysrox's modern C++ patterns (enum class, type safety)
- ✅ Provide 5+ examples like Finani/DFRobot (cover I2C, SPI, FIFO, APEX, interrupts)
- ❌ Avoid Kriswiner's code duplication (maintainability nightmare)
Pros & Cons Summary
Finani Library
✅ Pros
- ⭐⭐⭐⭐⭐ CRITICAL: Full I2C support (essential for our I2C debugging)
- ⭐⭐⭐⭐⭐ Correct I2C repeated START pattern (
endTransmission(false)) - ⭐⭐⭐⭐⭐ Excellent documentation (comprehensive README, API reference)
- ⭐⭐⭐⭐⭐ 5 working examples (I2C and SPI)
- ✅ Arduino standalone (no external dependencies)
- ✅ Small code size (~10KB, embedded-friendly)
- ✅ Dual interface (I2C + SPI)
- ✅ SI units (m/s², rad/s, °C - scientific standard)
- ✅ Efficient burst read (14 bytes: temp + accel + gyro)
- ✅ Simple error handling (clear return codes)
- ✅ Basic FIFO support (ICM42688FIFO derived class)
- ✅ Gyro calibration (1000-sample averaging)
- ✅ Complete ODR/FSR ranges (all datasheet options)
- ✅ Interrupt support (data-ready)
- ✅ Clean, readable code (Arduino-friendly style)
❌ Cons
- ❌ Incomplete register file (addresses only, no bit field constants)
- ❌ No notch filter API (important for vibration rejection)
- ❌ No AAF API (anti-alias filter not configurable)
- ❌ No APEX features (WOM, pedometer, tap detection not exposed)
- ❌ No 20-bit FIFO mode (16-bit only)
- ❌ No timestamp support (FIFO or general)
- ❌ No bus abstraction (direct TwoWire/SPIClass usage)
- ❌ No hardware offset registers (software gyro bias only)
- ⚠️ 10ms delay after every write (conservative, may limit performance)
- ⚠️ Write readback verification (doubles I2C traffic)
- ⚠️ Limited filter control (UI filter enable/disable only, fixed 1st order)
- ⚠️ No timeout protection (could hang if sensor fails)
- ⚠️ Bank switching not exposed (hidden in implementation)
📝 Notes:
- GitHub: https://github.com/finani/ICM42688
- Version: v1.1.0 (MIT License)
- Author: Inhwan Wee (finani)
- Target: Arduino (Nano ESP32, but works on all Arduino platforms)
- Status: ✅ REVIEWED - See FINANI_LIBRARY_REVIEW.md
📊 Overall Rating: ⭐⭐⭐⭐☆ (4 out of 5)
Best Use: I2C reference implementation, learning, prototyping, basic IMU applications
Sysrox Library (libDM_icm42688)
✅ Pros
-
Production-Quality Code
- Robust error handling (timeout, retry, logging)
- Clean architecture with bus abstraction
- Comprehensive register definitions
-
Advanced Features
- Full FIFO support (20-bit mode, timestamp validation)
- Complete APEX implementation (WOM, pedometer, tilt, tap, etc.)
- External clock (RTC) support
- Interrupt configuration
-
Type Safety
- Excellent
enum classusage (self-documenting, type-safe) - Scaling factors stored with register values
- Excellent
-
SPI Implementation
- Correct and tested SPI communication
- Proper read/write bit handling
- Configurable clock speed
❌ Cons
-
No I2C Support
- ❌ SPI-only (cannot help debug I2C issues)
- ❌ No I2C addressing or timing
-
Heavy Dependencies
- ❌ Requires
ABSTRACT_SENSOR_SPIparent class - ❌ Requires
ABSTRACT_IMUparent class - ❌ Requires
streamLogger,timerToolframework - ❌ Not standalone Arduino-compatible
- ❌ Requires
-
Documentation
- ⚠️ Minimal inline comments
- ⚠️ No Arduino examples
- ⚠️ External documentation requires framework context
-
Missing Features
- ❌ No AAF (Anti-Alias Filter) configuration API
- ❌ No Notch Filter configuration API
📊 Overall Rating: ⭐⭐⭐⭐ (4/5)
Best Use: Reference implementation for SPI, FIFO, APEX patterns
Kriswiner ICM42688 Sketches
✅ Pros
-
Unique External Clock Feature ⭐⭐⭐⭐⭐
- 32.768 kHz RTC clock from STM32L4 (1-ppm accuracy)
- 4x gyro stability improvement (~24°/hr → ~6°/hr drift)
- Unique among all 5 libraries
-
Sensor Fusion ⭐⭐⭐⭐☆
- Madgwick 9-DOF AHRS filter
- <1° RMS heading accuracy reported
- Optimized with compiler flags
- 20x iterations per gyro sample
-
Self-Test Implementation ⭐⭐⭐⭐☆
- Factory comparison method
- Forces 4G/250dps, 1kHz ODR
- Expected ranges documented
- Good validation approach
-
Calibration ⭐⭐⭐☆☆
- 128-sample averaging
- Gravity removal (±0.8g threshold)
- Simple but effective
-
Real-World Hardware Integration ⭐⭐⭐⭐☆
- Proven on actual hardware (STM32L4 Ladybug)
- Shows complete system integration
- Good educational value
-
I2C Repeated START ✅
- Correct I2Cdev wrapper pattern
- Clean abstraction
❌ Cons
-
NOT A LIBRARY ❌❌❌ CRITICAL
- 4 separate Arduino sketch folders
- ~90% code duplication across sketches
- Cannot be installed as Arduino library
- Cannot be reused in other projects
- Must copy-paste code (maintainability nightmare)
-
Platform-Specific ❌❌
- STM32L4-specific (Ladybug board hardcoded)
- Platform-specific sleep modes, pin definitions, RTC
- Will not run on ESP32, Arduino Nano, etc.
- Requires significant porting effort
-
No Configuration API ❌❌
- All settings hardcoded in sketches
- Different sketches have different hardcoded values
- Must edit code to change ODR, FSR, filters
- Not flexible for different applications
-
Inefficient Data Reading ❌
- No burst read - reads each axis separately
- 6 separate 2-byte I2C transactions (12x more overhead)
- Inefficient use of I2C bus
-
No Error Handling ❌
- Assumes I2C never fails
- No return codes or error checking
- Dangerous for production use
-
Old C Style ❌
- Old-style
#defineconstants (no type safety) - No modern C++ features (no enum class)
- No RAII patterns
- Old-style
-
Outdated Datasheet ⚠️
- References Rev 1.2 (current is Rev 1.7)
- May be missing errata or updates
-
No License ⚠️
- No license information stated
- Legal uncertainty for reuse
-
No FIFO Support ❌
- Direct register reads only
- Cannot buffer high-rate data
-
Limited APEX ⚠️
- Only Tilt + WOM (no tap, pedometer, SMD)
- Hardcoded thresholds (not configurable)
📝 Notes:
- GitHub: https://github.com/kriswiner/ICM42688
- Type: Arduino sketches (NOT a library)
- Author: Kris Winer (Tlera Corp)
- Target: STM32L432 (Ladybug) ONLY
- Status: ✅ REVIEWED - See KRISWINER_DFROBOT_LIBRARY_REVIEW.md
📊 Overall Rating: ⭐⭐⭐☆☆ (3 out of 5)
Best Use: Learning hardware integration, external clock reference, NOT for reusable library development
Key Takeaway: Great for learning and unique external clock feature, but NOT suitable as a library reference due to sketch-based architecture and 90% code duplication.
DFRobot ICM42688 Library
✅ Pros
-
BEST APEX Implementation ⭐⭐⭐⭐⭐ CRITICAL
- Tap Detection (single/double, per-axis)
- Wake-on-Motion (per-axis configurable thresholds)
- Significant Motion Detection
- Best user-facing APEX API among all 5 libraries
- Clean, simple methods with clear return values
-
BEST Inline Documentation ⭐⭐⭐⭐⭐
- Comprehensive doxygen comments for every method
- Parameter descriptions with valid ranges
- Return value documentation
- ASCII art register bit field tables
- Best for API reference
-
BEST Interrupt Configuration ⭐⭐⭐⭐⭐
setINTMode()- complete control (INT1/INT2, latched/pulsed, polarity, drive)- Most complete interrupt API among all libraries
-
Excellent Documentation ⭐⭐⭐⭐⭐
- Comprehensive README with API reference
- 5 working example sketches
- keywords.txt for Arduino IDE
- MIT License
-
Proper Arduino Library ✅
- Arduino-standard installation
- Works on any Arduino platform
- No external dependencies (just Wire/SPI)
- Standalone and portable
-
Dual Interface ✅
- Both I2C and SPI support
- Good error checking on I2C (endTransmission())
- Null pointer checks
-
Good Configuration API ⭐⭐⭐⭐☆
- Clean methods for ODR, FSR, filters
- Power mode selection (Low-Power / Low-Noise)
- UI filter bandwidth configuration
-
Code Quality ⭐⭐⭐⭐☆
- Clean, professional code style
- Struct with bitfields for registers
- Explicit bank switching
- Clean compilation
❌ Cons
-
CRITICAL BUG: Gyro Scaling ❌❌ CRITICAL
- Uses 65535 instead of 65536 (2^16) for full-scale range
_gyroRange = 4000/65535.0;(WRONG - should be 4000.0/65536.0)- ~0.0015% scaling error in all gyro readings
- Must be fixed before use
-
FIFO Has Critical Issues ❌❌
- No FIFO count checking (blind reads - dangerous!)
- No watermark configuration
- No overflow detection
- Inconsistent temperature scaling in FIFO vs normal mode:
- Normal:
raw/132.48 + 25 - FIFO:
raw/2.07 + 25(WRONG!)
- Normal:
- Can lose data or read stale data
-
Inefficient Data Reading ❌
- No burst read - reads each axis separately
- Separate per-axis method calls (not efficient)
- More I2C/SPI transactions than necessary
-
SPI Has Performance Issues ❌
- 1ms delay before EVERY SPI write (excessive, unnecessary)
- Only 4 MHz SPI clock (datasheet allows 24 MHz)
- No SPI error detection
- Slow compared to Finani (24 MHz) and Sysrox (24 MHz)
-
Register Definition Issues ❌
- Register address conflicts (same address in different banks without documentation)
- No bank number documentation (hard to tell which bank)
- Example conflict:
GYRO_CONFIG_STATIC2= 0x0B conflicts withSENSOR_CONFIG0 - Old-style
#defineinstead ofenum class
-
Missing Gyro FSR Ranges ⚠️
- Only 4 gyro FSR ranges (±250, ±500, ±1000, ±2000 dps)
- Missing: ±15.625, ±31.25, ±62.5, ±125 dps
- Finani and Sysrox have all 8 ranges
-
No Advanced Filters ❌
- No AAF (Anti-Alias Filter) API (important for high-frequency noise)
- No Notch Filter API (important for vibration rejection)
- UI filter only
-
No 20-bit FIFO ❌
- 16-bit FIFO only
- No high-resolution mode
- No timestamp support
-
No Timeout/Retry ⚠️
- No timeout protection (could hang if sensor fails)
- No retry logic
- Basic error handling only
📝 Notes:
- GitHub: https://github.com/DFRobot/DFRobot_ICM42688
- Version: Latest (MIT License)
- Author: DFRobot (SEN0452)
- Target: Arduino (any platform)
- Status: ✅ REVIEWED - See KRISWINER_DFROBOT_LIBRARY_REVIEW.md
📊 Overall Rating: ⭐⭐⭐⭐☆ (4 out of 5)
Best Use: APEX features reference (tap detection), interrupt configuration, documentation style
Key Takeaway: Excellent APEX implementation and documentation, but has critical gyro scaling bug and FIFO issues that must be fixed. Best reference for tap detection and interrupt configuration.
This Implementation (In Development)
✅ Pros
-
Dual Protocol Support
- ✅ Both I2C and SPI from the start
- ✅ Bus abstraction (IBus interface)
-
Arduino Ecosystem Focus
- ✅ Minimal dependencies (Arduino Wire/SPI only)
- ✅ Standalone library (no external frameworks)
- ✅ Lightweight (embedded-friendly, no STL)
-
Comprehensive Documentation
- ✅ Extensive inline comments
- ✅ Datasheet references in register definitions
- ✅ Planned examples (I2C + SPI)
- ✅ Signal path documentation
-
Complete Feature Coverage
- ✅ All configuration options (AAF, Notch, UI filters)
- ✅ All sensor ranges (8 gyro + 4 accel)
- ✅ Bank caching for efficiency
❌ Cons (Current State)
-
In Development
- 🚧 Not yet implemented (Stage A complete only)
- 🚧 No hardware validation yet
-
Pending Improvements
- ⚠️ Need to adopt
enum classpattern (currently#define) - ⚠️ Error handling patterns need implementation
- ⚠️ Need to adopt
📊 Overall Rating: 🚧 In Development
Goal: Best-in-class Arduino library for ICM-42688-P (I2C + SPI)
Decision Matrix: When to Use Which Library?
| Use Case | 1st Choice | 2nd Choice | Avoid | Rationale |
|---|---|---|---|---|
| I2C Communication | ✅ Finani | ✅ DFRobot | Sysrox (no I2C), Kriswiner (no error handling) | Finani: best I2C (repeated START, 400kHz, verified writes) |
| I2C Debugging | ✅ Finani | ✅ DFRobot | Kriswiner | Test with Finani to validate hardware setup |
| SPI Communication | ⭐ Sysrox | ✅ Finani | DFRobot (slow 4MHz, 1ms delays) | Sysrox: production-proven 24 MHz SPI |
| FIFO 20-bit Mode | ⭐ Sysrox | - | DFRobot, Finani, Kriswiner | Only Sysrox supports 20-bit high-res mode |
| FIFO 16-bit Simple | ✅ Finani | - | DFRobot (no count check) | Finani: clean derived class pattern, safe FIFO reads |
| APEX: Tap Detection | ⭐ DFRobot | ⭐ Sysrox | Others (not exposed) | DFRobot: best tap API (single/double, per-axis) |
| APEX: Wake-on-Motion | ⭐ DFRobot | ⭐ Sysrox | Kriswiner (hardcoded) | DFRobot: per-axis configurable thresholds |
| APEX: Pedometer | ⭐ Sysrox | - | Others (not exposed) | Only Sysrox has pedometer |
| APEX: Tilt Detection | ⭐ Sysrox | ✅ Kriswiner | Others (not exposed) | Kriswiner shows DMP usage |
| Interrupt Configuration | ⭐ DFRobot | ⭐ Sysrox | Others (limited) | DFRobot: most complete (INT1/INT2, polarity, drive) |
| External Clock (RTC) | ✅ Kriswiner | ⭐ Sysrox | Others (not supported) | Kriswiner: unique 32.768kHz, 4x stability improvement |
| Self-Test | ✅ Kriswiner | - | Others (not implemented) | Kriswiner: factory comparison method |
| Sensor Fusion (9-DOF) | ✅ Kriswiner | - | Others (not included) | Kriswiner: Madgwick AHRS, <1° accuracy |
| Arduino Projects (General) | ✅ Finani | ✅ DFRobot | Kriswiner (not a library), Sysrox (framework) | Finani: standalone, excellent docs, small footprint |
| Learning/Prototyping | ✅ Finani | ✅ DFRobot | Kriswiner (code duplication) | Finani: best README, 5 working examples |
| Hardware Integration Learning | ✅ Kriswiner | - | - | Shows real-world STM32L4 integration (educational only) |
| ESP32-S3 with Framework | ⭐ Sysrox | - | - | Designed for specific framework |
| Minimal Code Size | ✅ Finani (~10KB) | ✅ DFRobot | Sysrox (large, STL) | Finani: smallest footprint, no dependencies |
| Code Quality Reference | ⭐ Sysrox | ✅ DFRobot | Kriswiner (old C style) | Sysrox: production patterns, modern C++ |
| Documentation Reference (README) | ✅ Finani | ✅ DFRobot | Kriswiner, Sysrox | Finani/DFRobot: comprehensive README with examples |
| Documentation Reference (Inline) | ⭐ DFRobot | - | Kriswiner, Sysrox | DFRobot: best Doxygen comments, ASCII art tables |
| Register Definitions | ✅ This Implementation | ⭐ Sysrox | Finani (addresses only), DFRobot (conflicts) | Ours: most complete, datasheet refs, no conflicts |
| All 8 Gyro FSR Ranges | ✅ Finani | ⭐ Sysrox | DFRobot (only 4 ranges) | Finani/Sysrox: all ±15.625 to ±2000 dps ranges |
| Burst Read Efficiency | ✅ Finani | ⭐ Sysrox | Kriswiner, DFRobot | Finani: 14-byte burst (1 transaction vs 6+ separate) |
| Production Use (I2C) | ✅ Finani | ✅ DFRobot | Kriswiner (no error handling) | Finani: proven reliable with error checking |
| Production Use (SPI) | ⭐ Sysrox | ✅ Finani | DFRobot (slow, delays) | Sysrox: 24 MHz, robust, timeout/retry |
Summary - Best Library for Each Domain:
- 🥇 I2C Implementation: Finani
- 🥇 SPI Implementation: Sysrox
- 🥇 FIFO (Advanced): Sysrox
- 🥇 APEX Features: DFRobot (tie with Sysrox)
- 🥇 Documentation: DFRobot (inline) & Finani (README) - tie
- 🥇 Code Quality: Sysrox
- 🥇 Register Definitions: This Implementation
- 🥇 External Clock: Kriswiner (unique feature)
- 🥇 Ease of Use: Finani
WARNING - Critical Issues to Avoid:
- ❌ Kriswiner: Not a library - 90% code duplication, cannot reuse
- ❌ DFRobot: Critical gyro scaling bug (uses 65535 instead of 65536)
- ❌ DFRobot: FIFO has no count checking (dangerous blind reads)
- ❌ DFRobot: SPI too slow (4 MHz + 1ms delays before every write)
Key Learnings & Action Items
From Sysrox Review:
- ✅ Adopt
enum classpattern (Stage B) - Type-safe configuration - ✅ Implement bank caching (Stage B) - Avoid redundant SPI writes
- ✅ Use timeout + retry pattern (Stage B) - Robust initialization
- ✅ Reference FIFO implementation (Stage E) - Learn from production code
- ✅ Reference APEX implementation (Stage E) - Complete motion features
From Finani Review:
- ✅ CRITICAL: I2C repeated START pattern - Use
endTransmission(false)beforerequestFrom() - ✅ I2C timing: 10ms delay after writes - Conservative but reliable (may optimize later)
- ✅ Burst read pattern - 14-byte read (temp + accel + gyro) for efficiency
- ✅ SI units for data - Use m/s², rad/s, °C (scientific standard)
- ✅ Simple error codes - Negative values for errors (Arduino-friendly)
- ✅ Inline accessors - Zero-overhead data access pattern
- ✅ Proper byte ordering - MSB first, correct int16_t assembly
- ⚠️ Write readback verification - Good for debugging, may be excessive for production
- ⚠️ Avoid notch/AAF filters - Finani doesn't expose them, we should
- ⚠️ Keep register file comprehensive - Our bit fields superior to Finani's addresses-only
From Kriswiner Review:
- ✅ External clock approach - Reference for 32.768 kHz RTC implementation (4x stability)
- ✅ Self-test method - Factory comparison approach with expected ranges
- ✅ I2Cdev wrapper pattern - Clean abstraction (but our IBus is better)
- ⚠️ Sensor fusion out of scope - Users can integrate Madgwick separately if needed
- ❌ Avoid sketch-based architecture - Use proper library structure for reusability
- ❌ Avoid code duplication - DRY principle critical for maintainability
- ❌ Avoid platform-specific code - Keep portable across Arduino platforms
- ❌ Avoid hardcoded configuration - Provide flexible API for all settings
From DFRobot Review:
- ✅ CRITICAL: Adopt tap detection API - Best implementation (single/double, per-axis)
- ✅ CRITICAL: Adopt WOM API pattern - Per-axis configurable thresholds (0-255)
- ✅ CRITICAL: Adopt interrupt configuration API - Complete control (INT1/INT2, polarity, drive)
- ✅ Doxygen documentation style - Method-level docs with ASCII art register tables
- ✅ Support all 8 gyro FSR ranges - DFRobot only has 4, we should have all 8
- ❌ FIX gyro scaling bug - Use 65536, NOT 65535 for full-scale range
- ❌ Always check FIFO count - Never blind read (avoid DFRobot's mistake)
- ❌ Avoid excessive SPI delays - No 1ms delays before writes
- ❌ Use 24 MHz SPI - Not 4 MHz like DFRobot
- ❌ Avoid register address conflicts - Document bank numbers clearly
Next Steps
Immediate (Task #3 - I2C Debugging):
-
Test Finani Library with Hardware
- Validates our hardware setup (wiring, pullups, address)
- Confirms I2C communication works
- Provides baseline for comparison
-
Implement I2C Pattern from Finani
- Use repeated START (
endTransmission(false)) - Add 10ms post-write delays
- Test with our hardware
- Use repeated START (
-
Debug and Iterate
- If Finani works but ours doesn't → compare I2C transactions
- Use logic analyzer if available
- Fix any identified issues
Stage B Implementation:
- Adopt Best Patterns from ALL Libraries
- From Finani: I2C repeated START, burst read, SI units, simple error codes
- From Sysrox:
enum classpattern, bank caching, timeout/retry, 20-bit FIFO - From Kriswiner: External clock approach (optional), self-test method
- From DFRobot: Tap detection API, WOM API, interrupt configuration, doxygen docs
- Our Innovation: IBus abstraction, comprehensive register coverage, AAF/Notch filters
Document Maintenance
This is a LIVE DOCUMENT - update as we learn more about each library.
Update Triggers:
- ✅ After reviewing Finani library (Task #4)
- ✅ After implementing features in This Implementation
- ✅ When discovering new patterns or issues
- ✅ When comparing actual hardware behavior
Version History:
- v1.0 (2026-01-09) - Initial 3-library matrix created after Sysrox review
- v2.0 (2026-01-09) - ✅ Finani review complete - All TBD entries filled
- v3.0 (2026-01-09) - ✅ ALL 5 LIBRARIES REVIEWED - Added Kriswiner & DFRobot analysis
- v4.0 (2026-01-09) - ✅ FULL 5-LIBRARY DETAILED COMPARISON - All 10 sections expanded, comprehensive pros/cons, updated decision matrix
Last Updated: 2026-01-09
Status: ✅ COMPREHENSIVE 5-LIBRARY COMPARISON COMPLETE (v4.0)
Libraries Analyzed:
- ✅ Finani - Arduino library (I2C+SPI) - FINANI_LIBRARY_REVIEW.md
- 🥇 Best I2C, Best README, Best for learning
- ✅ Sysrox - Framework library (SPI only) - SYSROX_LIBRARY_REVIEW.md
- 🥇 Best SPI, Best FIFO, Best code quality
- ✅ Kriswiner - Arduino sketches (I2C only, STM32L4) - KRISWINER_DFROBOT_LIBRARY_REVIEW.md
- 🥇 Best external clock (unique), Best sensor fusion
- ⚠️ NOT a library - educational reference only
- ✅ DFRobot - Arduino library (I2C+SPI) - KRISWINER_DFROBOT_LIBRARY_REVIEW.md
- 🥇 Best APEX, Best inline docs, Best interrupts
- ⚠️ Has critical gyro scaling bug and FIFO issues
- 🚧 This Implementation - In development
- 🥇 Best register definitions (most complete)
Comparison Scope:
- ✅ All 10 detailed feature sections expanded to include all 5 libraries
- ✅ Comprehensive pros/cons for all 5 libraries
- ✅ Updated decision matrix with 25+ use cases
- ✅ Key learnings extracted from all 4 reference libraries
Next Action: I2C debugging (TODO Task #3) using insights from Finani and DFRobot
- Details
- Written by: Sylvain Boyer
- Read Time: 1 min
- Hits: 2491
Coming soon, I will detail the development of a home-made fume air purifier for soldering fumes.
- Details
- Written by: Sylvain Boyer
- Read Time: 1 min
- Hits: 3382
This undergoing project is the creation of a graphical user tool to analyse the GPS data from the Nielsen-Kellerman Speedcoach GPS model 2 and the compatible oarlock powermeter Empower.
The program is written in Python with the Pyside6 framework, which allows the use of Qt components. The source code is not available yet but will be available on my github in the future. The plan is to offer a user-friendly tool to explore rowing data. The program will be available as source code (github), and later as an executable (using Nuitka)
I hope to get some times in my hand to progress on the data processing and integration in a clean Graphical User Interface.
As the project stands for now, the tool is able to directly read the user SQLite database and allow selection and save of the rowing sessions to be analysed later. The selection of the session allow to display a GPS track on OpenStreetMap. (see screenshot bellow)