Bygg en krengevinkel-logger
Registrer dine egne krengevinkler med en liten ESP32 mikrokontroller, en BNO055 retningssensor og et microSD-kort. Denne guiden dekker delene, koblingen, montering, kalibrering og kodeeksempler for å forstå prinsippene.
Krengo er et prosjekt under utvikling. Denne siden beskriver den generelle tilnærmingen vi bruker; den lover ikke spesifikke målte resultater.
Det du trenger
- ESP32 utviklingskort. Kontroller kortets pinner, strømforsyning og I2C-kompatibilitet med BNO055. En Li-Po-celle kan ikke uten videre kobles til 3,3 V-pinnen; batteriinngang, regulering og lading må passe kortet.
- BNO055 IMU. En 9-akset sensor med innebygd sensorfusjon. Den sender kalibrert orientering som Euler-vinkler eller kvaternioner over I2C. Standardadressen er vanligvis 0x28; noen moduler har en loddet bro for å velge 0x29.
- microSD-modul. Bruk en modul spesifisert for 3,3 V-signaler og valgt forsyning. En modul laget for 5 V inn kan ha for stort spenningsfall ved 3,3 V.
- Batteri. En enkeltcelle Li-Po eller Li-Ion med nok kapasitet til planlagt tur. En liten 1000 mAh-celle er et vanlig utgangspunkt.
- Kasse og feste. En liten boks eller 3D-printet etui, pluss strips, tape eller skruer for å feste under setet eller på seterøret.
Kobling
Koblingen under er et eksempel for en klassisk ESP32 med disse pinnene tilgjengelige, ikke for alle ESP32-varianter. I2C- og SPI-pinner må settes eksplisitt i programmet. Bruk 3,3 V-logikk, felles jord og moduler som støtter den valgte forsyningen.
| Signal | ESP32-pinne | Merknad |
|---|---|---|
| BNO055 VCC | 3,3 V | Tåler ikke 5 V |
| BNO055 GND | GND | Felles jord |
| BNO055 SDA | GPIO 21 | I2C data |
| BNO055 SCL | GPIO 22 | I2C klokke |
| SD VCC | 3,3 V | Bruk en 3,3 V-modul |
| SD GND | GND | Felles jord |
| SD CS | GPIO 5 | Chip select |
| SD MOSI | GPIO 23 | SPI MOSI |
| SD MISO | GPIO 19 | SPI MISO |
| SD SCK | GPIO 18 | SPI klokke |
Noen BNO055-kort har en liten spenningsregulator og tåler 5 V på Vin-pinnen, men I2C-linjene må fortsatt være 3,3 V. Sjekk alltid modulens skjema før du kobler.
Montering av sensoren
Sensoren må festes solid til sykkelen. Vibrasjoner eller rotasjon i forhold til ramma ødelegger målingen. Gode monteringssteder er:
- Under setet. Kan skjermes mot sprut med en egnet kasse. Sensoren bør være innrettet langs sykkelens foroverakse.
- På seterøret. Også sentralt og stivt, om enn litt lavere.
Statisk krengevinkel avhenger ikke av sensorens høyde. Under bevegelse påvirker monteringsstedet vibrasjoner og akselerasjoner. Fest sensoren stivt, dokumenter aksene og mål orienteringen når sykkelen holdes loddrett. Kompenser for monteringsvinkelen i analysen.
Kalibrering
BNO055 rapporterer kalibreringsstatus for fire delsystemer: system, gyroskop, akselerometer og magnetometer. Hver gir en verdi fra 0 til 3, der 3 er fullt kalibrert. Du kan lese dem med:
uint8_t sys, gyro, accel, mag;
bno.getCalibration(&sys, &gyro, &accel, &mag);
// Gyro: stillhet. Akselerometer: seks stabile retninger.
Hold sensoren i ro for gyrokalibrering. For akselerometeret brukes seks stabile retninger: ±X, ±Y og ±Z opp. Magnetometeret kalibreres med bevegelser i flere retninger, ofte et åttetall, borte fra magnetiske forstyrrelser. Status 3 betyr kalibrert delsystem, ikke bevist målenøyaktighet på sykkel.
Lese rulle-vinkel
Adafruit-bibliotekets VECTOR_EULER returnerer heading, roll og pitch i henholdsvis x(), y() og z(). Det er navn på utgangsverdier, ikke en automatisk kobling til sykkelens akser. Kontroller sensorens aksetilordning og montering med kjente bevegelser før du kaller en verdi krengevinkel.
imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
float heading = euler.x();
float roll = euler.y();
float pitch = euler.z();
BNO055s Euler-utgang har begrensninger ved sammensatte rotasjoner, ikke bare nær 90°. Adafruit anbefaler kvaternioner for generell orientering. Uttrykket under gir en konvensjonell ZYX-rullevinkel fra en normalisert kvaternion i riktig koordinatsystem; det er ikke automatisk sykkelens krengevinkel. Også konverterte Euler-vinkler har singulariteter, ved pitch ±90° i denne konvensjonen.
imu::Quaternion q = bno.getQuat();
float sinr_cosp = 2 * (q.w() * q.x() + q.y() * q.z());
float cosr_cosp = 1 - 2 * (q.x() * q.x() + q.y() * q.y());
float rollZYX = atan2(sinr_cosp, cosr_cosp) * 180.0 / PI;
Logging til SD-kort
20 Hz kan brukes som et første designvalg for logging. Registrer faktisk tidsstempel, kvaternion og kalibreringsstatus for å kunne kontrollere tidsavvik og montering senere. CSV-biten under illustrerer bare filskriving med en allerede beregnet roll-verdi; den er ikke et komplett eller maskinvareverifisert loggerprogram.
File log = SD.open("/lean.csv", FILE_APPEND);
if (log) {
log.print(millis());
log.print(",");
log.println(roll);
log.close();
}
Å åpne og lukke for hver måling er enkelt, men gir ekstra SD-arbeid. Ved kontinuerlig logging kan filen holdes åpen, med bufrede skrivinger og et valgt flush-intervall. Kontroller returverdier og mål pauser i loggingen. Verken close() eller flush() garanterer mot tap eller filskade ved strømbrudd; bruk kontrollert avslutning.
Strøm og driftstid
Driftstid må måles på den faktiske kombinasjonen av kort, sensor, SD-kort og strømforsyning. Ideelt gir 1000 mAh / 200 mA fem timer hvis strømmen er målt på batterisiden. Brukbar kapasitet, regulatorens tap, temperatur og avstengningsgrense reduserer eller endrer dette anslaget. SD-skriving krever også margin for strømtopper.
Fra loggfil til innsikt
Kontroller tidsstempler, tapte målinger og kalibreringsstatus før du tolker toppvinkler. Sammenlign kjent statisk helning og dynamisk bevegelse med en uavhengig referanse. Et glidende gjennomsnitt kan skjule topper og retter ikke systematiske orienteringsfeil. Behold rådata og dokumenter filtreringen.
Hvor Krengo passer inn
Krengo bygger en logger langs disse linjene: ESP32 + BNO055, microSD-lagring, batteridrift og et feste under setet. Den langsiktige ideen er å gjøre dataene nyttige på en Garmin Edge via Bluetooth. Foreløpig er prosjektet fokusert på pålitelig logging og repeterbar analyse.
Kilder: Adafruit BNO055 veiledning og FAQ · Adafruit_BNO055 driverkode.