diff --git a/TEAM.md b/TEAM.md new file mode 100644 index 0000000..daafce0 --- /dev/null +++ b/TEAM.md @@ -0,0 +1,77 @@ +# SaltyLab — Ideal Team + +## Project +Self-balancing two-wheeled robot using a drone flight controller (STM32F722), hoverboard hub motors, and eventually a Jetson Nano for AI/SLAM. + +## Current Status +- **Hardware:** Assembled — FC, motors, ESC, IMU, battery, RC all on hand +- **Firmware:** Balance PID + hoverboard ESC protocol written, but blocked by USB CDC bug +- **Blocker:** USB CDC TX stops working when peripheral inits (SPI/UART/GPIO) are added alongside USB OTG FS — see `USB_CDC_BUG.md` + +--- + +## Roles Needed + +### 1. Embedded Firmware Engineer (Lead) +**Must-have:** +- Deep STM32 HAL experience (F7 series specifically) +- USB OTG FS / CDC ACM debugging (TxState, endpoint management, DMA conflicts) +- SPI + UART + USB coexistence on STM32 +- PlatformIO or bare-metal STM32 toolchain +- DFU bootloader implementation + +**Nice-to-have:** +- Betaflight/iNav/ArduPilot codebase familiarity +- PID control loop tuning for balance robots +- FOC motor control (hoverboard ESC protocol) + +**Why:** The immediate blocker is a USB peripheral conflict. Need someone who's debugged STM32 USB issues before — this is not a software logic bug, it's a hardware peripheral interaction issue. + +### 2. Control Systems / Robotics Engineer +**Must-have:** +- PID tuning for inverted pendulum / self-balancing systems +- Complementary filter / Kalman filter for IMU sensor fusion +- Real-time control loop design (1kHz+) +- Safety system design (tilt cutoff, watchdog, arming sequences) + +**Nice-to-have:** +- Hoverboard hub motor experience +- ELRS/CRSF RC protocol +- ROS2 integration + +**Why:** Once USB is fixed, the balance loop needs real-world tuning. PID gains, filter coefficients, motor response curves, safety margins — all need someone with hands-on balance bot experience. + +### 3. Perception / SLAM Engineer (Phase 2) +**Must-have:** +- Jetson Nano / NVIDIA Jetson platform +- Intel RealSense D435i depth camera +- RPLIDAR integration +- SLAM (ORB-SLAM3, RTAB-Map, or similar) +- ROS2 + +**Nice-to-have:** +- Person tracking / following +- Obstacle avoidance +- Nav2 stack + +**Why:** Phase 2 goal is autonomous navigation. Jetson Nano with RealSense + RPLIDAR for indoor mapping and person following. + +--- + +## Hardware Reference +| Component | Details | +|-----------|---------| +| FC | MAMBA F722S (STM32F722RET6, MPU6000) | +| Motors | 2x 8" pneumatic hoverboard hub motors | +| ESC | Hoverboard ESC (EFeru FOC firmware) | +| Battery | 36V pack | +| RC | BetaFPV ELRS 2.4GHz TX + RX | +| AI Brain | Jetson Nano + Noctua fan | +| Depth | Intel RealSense D435i | +| LIDAR | RPLIDAR A1M8 | +| Spare IMUs | BNO055, MPU6050 | + +## Repo +- Gitea: https://gitea.vayrette.com/seb/saltylab-firmware +- Design doc: `projects/saltybot/SALTYLAB.md` +- Bug doc: `USB_CDC_BUG.md` diff --git a/USB_CDC_BUG.md b/USB_CDC_BUG.md new file mode 100644 index 0000000..76100c1 --- /dev/null +++ b/USB_CDC_BUG.md @@ -0,0 +1,44 @@ +# USB CDC TX Bug — 2026-02-28 + +## Problem +Balance firmware produces no USB CDC output. Minimal "hello" test firmware works fine. + +## What Works +- **Test firmware** (just sends `{"hello":N}` at 10Hz after 3s delay): **DATA FLOWS** +- USB enumeration works in both cases (port appears as `/dev/cu.usbmodemSALTY0011`) +- DFU reboot via RTC backup register works (Betaflight-proven pattern) + +## What Doesn't Work +- **Balance firmware**: port opens, no data ever arrives +- Tried: removing init transmit, 3s boot delay, TxState recovery, DTR detection, streaming flags +- None of it helps + +## Key Difference Between Working & Broken +- **Working test**: main.c only includes USB CDC headers, HAL, string, stdio +- **Balance firmware**: includes icm42688.h, bmp280.h, balance.h, hoverboard.h, config.h, status.h +- Balance firmware inits SPI1 (IMU), USART2 (hoverboard), GPIO (LEDs, buzzer) +- Likely culprit: **peripheral init (SPI/UART/GPIO) is interfering with USB OTG FS** + +## Suspected Root Cause +One of the additional peripheral inits (SPI1 for IMU, USART2 for hoverboard ESC, or GPIO for status LEDs) is likely conflicting with the USB OTG FS peripheral — either a clock conflict, GPIO pin conflict, or interrupt priority issue. + +## Hardware +- MAMBA F722S FC (STM32F722RET6) +- Betaflight target: DIAT-MAMBAF722_2022B +- IMU: MPU6000 on SPI1 (PA4/PA5/PA6/PA7) +- USB: OTG FS (PA11/PA12) +- Hoverboard ESC: USART2 (PA2/PA3) +- LEDs: PC14, PC15 +- Buzzer: PB2 + +## Files +- PlatformIO project: `~/Projects/saltylab-firmware/` on mbpm4 (192.168.87.40) +- Working test: was in src/main.c (replaced with balance code) +- Balance main.c backup: src/main.c.bak +- CDC implementation: lib/USB_CDC/src/usbd_cdc_if.c + +## To Debug +1. Add peripherals one at a time to the test firmware to find which one breaks CDC TX +2. Check for GPIO pin conflicts with USB OTG FS (PA11/PA12) +3. Check interrupt priorities — USB OTG FS IRQ might be getting starved +4. Check if DCache (disabled via SCB_DisableDCache) is needed for USB DMA