Detta projekt använder ett ESP32-C3-kort med en 0,42″ OLED-display och en BNO085 IMU (SPI) för att mäta hastighet och acceleration på en skivstång vid styrketräning.
Koden integrerar filtrerad vertikal acceleration för att uppskatta stångens hastighet, detekterar STILLASTÅENDE/RÖRLIGT beteende och visar realtidsdata på displayen.
- ESP32-C3 mikrokontroller
- 0,42" OLED-display (SSD1306, 128x64 pixlar, 72x40 synligt område)
- I2C-anslutning: SDA=GPIO5, SCL=GPIO6
- Adress: 0x3C
- BNO085 IMU (9-axlig rörelsesensor med sensorfusion)
- SPI-anslutning:
- SCK=GPIO3
- MOSI=GPIO2
- MISO=GPIO4
- CS=GPIO7
- INT=GPIO10
- RST=GPIO1
- SPI-anslutning:
ESP32-C3 OLED (I2C)
GPIO5 ------> SDA
GPIO6 ------> SCL
3.3V ------> VCC
GND ------> GND
ESP32-C3 BNO085 (SPI)
GPIO3 ------> SCK
GPIO2 ------> MOSI
GPIO4 ------> MISO
GPIO7 ------> CS
GPIO10 ------> INT
GPIO1 ------> RST
3.3V ------> VIN
GND ------> GND
Följande Arduino-bibliotek krävs (installera via Library Manager):
-
U8g2lib (>= 2.28.0)
- Displaybibliotek för monokroma OLED/LCD-skärmar
- Stöder SSD1306-kontroller
- GitHub: https://github.com/olikraus/u8g2
-
Adafruit BNO08x (>= 1.2.0)
- Drivrutin för BNO08x IMU-sensorer (BNO080/BNO085)
- Tillhandahåller sensorfusion (linjär acceleration, gravitation, rotation)
- GitHub: https://github.com/adafruit/Adafruit_BNO08x
-
Adafruit BusIO (>= 1.14.0)
- Beroende för Adafruit BNO08x
- Abstraktion för I2C/SPI-kommunikation
-
Wire (inbyggt i Arduino)
- I2C-kommunikation för OLED
-
SPI (inbyggt i Arduino)
- SPI-kommunikation för BNO085
# Via Arduino IDE Library Manager:
# 1. Sketch -> Include Library -> Manage Libraries
# 2. Sök efter och installera:
# - U8g2
# - Adafruit BNO08x
# - Adafruit BusIO (installeras automatiskt som beroende)- Vertikal hastighetsberäkning - Integrerar acceleration i världens upp-riktning (kompenserad för gravitation)
- Rörelsedetektering - Skiljer mellan STILL och MOVING baserat på accelerationsmagnitud
- Endast lyft-integration - Räknar bara hastighet vid uppåtgående acceleration (a_up > 0.25 m/s²)
- Driftskontroll - Mild dämpning och klippning för att förhindra hastighetsackumulering
- Peak acceleration tracking - Spårar maximal acceleration under varje lyftcykel
- Realtidsvisning - Uppdaterar OLED-display ~10 Hz (100ms intervall)
Displayen visar tre rader med information:
- Hastighet: Aktuell stånghastighet i m/s (fryses vid STILL-state)
- amax: Maximal acceleration sedan senaste lyft började
- Status: STILL eller MOVING
Detaljerad debug-information skickas till seriell konsol (115200 baud):
- Linjär acceleration (x, y, z) i m/s²
- Accelerationsmagnitud |a|
- Vertikal acceleration a_up
- Integrerad hastighet v_up
- Aktuell status (STILL/MOVING)
- Peak acceleration amax
Följande konstanter kan justeras för att optimera mätningen (speedSensorTest1.ino:46-50):
const float A_GATE = 0.20f; // Tröskelvärde för "stillastående" (m/s²)
const float A_LIFT = 0.25f; // Minsta a_up för att börja integrera (m/s²)
const uint32_t STILL_HOLD_MS = 120; // Tid under A_GATE för att bekräfta STILL (ms)
const float DAMPING = 0.02f; // Dämpningsfaktor mot drift (0-1)
const float V_CLAMP = 6.0f; // Max hastighet för sanity check (m/s)- A_GATE: Högre värde = mindre känslig för små rörelser, färre falska positiver
- A_LIFT: Högre värde = endast snabbare lyft räknas, ignorerar långsamma faser
- STILL_HOLD_MS: Längre tid = mer stabil detektion men långsammare respons
- DAMPING: Högre värde = mer aggressiv driftreducering men kan underskatta hastighet
- V_CLAMP: Säkerhetstak, bör vara högre än maximal förväntad stånghastighet
- Sensorfusion: BNO085 levererar gravity-kompenserad linjär acceleration och gravitationsvektor
- Upp-riktning: Beräknas som -normalize(gravity) för att få världens vertikala riktning
- Projektion: Linjär acceleration projiceras på upp-vektorn med dot product
- Gating: Endast acceleration över A_LIFT integreras för hastighet
- State machine:
- STILL: Ingen rörelse, v_up fryses till senast kända värde
- MOVING: Aktiv rörelse, v_up integreras från a_up
- Reset: Peak acceleration nollställs vid varje ny MOVING-fas
- Linear Acceleration (SH2_LINEAR_ACCELERATION): Acceleration utan gravitationskomponent, rapporterad i världskoordinater
- Gravity (SH2_GRAVITY): Gravitationsvektor som pekar nedåt, används för att hitta upp-riktningen
- Samplingsfrekvens: 200 Hz (5000 μs) med fallback till 100 Hz
OLED är en 128x64 SSD1306-display men endast ett 72x40 fönster är synligt på detta specifika kort. Texten centreras i det synliga området med offset (X=30, Y=22).
- Styrketräning: Mät stånghastighet vid knäböj, bänkpress, marklyft
- Hastighetsbaserad träning (VBT): Optimera belastning baserat på lyfthastighet
- Teknikanalys: Jämför acceleration mellan olika lyft
- Prestandaspårning: Objektiv mätning av explosivitet och kraft
Öppen källkod - fri att använda och modifiera.