Gyroskop BNO055 - manual
Gyroskop BNO055
Doteraz sme jazdili rovno bez toho, aby samotné autíčko vedelo, že ide rovno. Na to nám pomôže gyroskop – senzor ktorý zaznamenáva otáčanie v troch osiach: X, Y a Z. My budeme zatiaľ využívať os Z, ktorá zaznamenáva otáčanie doprava a doľava.
Na rozdiel od predchádzajúcich senzorov, gyroskop musíme pred použitím skalibrovať – teda nechať ho chvíľu v pokoji, aby si zaznamenal svoju počiatočnú polohu.
Zapojenie
Senzor komunikuje cez zbernicu I2C – rovnako ako VL53L0X:
| Pin senzora | Pin na RP2350-Zero |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GP4 |
| SCL | GP5 |
Kód Vyskúšaj toto: Skopíruj a spusti nasledujúci program. Otvor sériový monitor (115200 baud) a otáčaj senzorom v rôznych smeroch. Sleduj ako sa menia hodnoty osí X, Y, Z.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
Adafruit_BNO055 bno;
bool active = false;
void setup() {
Serial.begin(115200);
Wire.setSDA(4);
Wire.setSCL(5);
Wire.begin();
delay(1000);
// Hľadáme senzor na I2C zbernici
Serial.println("Hľadám I2C zariadenia...");
int adresa = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
Serial.print("Nájdené zariadenie na adrese: 0x");
Serial.println(addr, HEX);
adresa = addr;
}
}
if (adresa > 0) {
bno = Adafruit_BNO055(55, adresa, &Wire);
if (bno.begin()) {
active = true;
Serial.println("BNO055 OK – čakám na kalibráciu...");
} else {
Serial.println("BNO055 begin() zlyhalo");
}
} else {
Serial.println("Žiadny senzor nenájdený!");
}
}
void loop() {
if (!active) {
Serial.println("Senzor nie je pripravený");
delay(1000);
return;
}
// Kontrola kalibrácie – hodnoty 0-3, kde 3 = plne kalibrované
uint8_t system, gyro, accel, mag;
bno.getCalibration(&system, &gyro, &accel, &mag);
if (system < 1) {
Serial.println("Kalibrujem – pohni senzorom...");
delay(100);
return;
}
imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
Serial.print("X: "); Serial.print(euler.x());
Serial.print(" Y: "); Serial.print(euler.y());
Serial.print(" Z: "); Serial.println(euler.z());
delay(100);
}
Program čaká kým nie je senzor aspoň čiastočne kalibrovaný (system >= 1) pred tým ako začne vypisovať hodnoty. Ak vidíš stále "Kalibrujem", pomaly otáčaj senzorom vo všetkých smeroch – kalibrácia by mala prísť do niekoľkých sekúnd.
| Novinka | Vysvetlenie |
|---|---|
Adafruit_BNO055 |
Objekt reprezentujúci senzor – cez neho voláme všetky funkcie knižnice |
bno.begin() |
Inicializuje senzor – ak vráti false, senzor nie je správne zapojený
|
bno.getVector(VECTOR_EULER) |
Vráti aktuálnu rotáciu vo forme troch uhlov (Eulerove uhly) v stupňoch |
euler.x() / .y() / .z() |
Jednotlivé osi rotácie – os Z sleduje otáčanie doprava/doľava |
imu::Vector<3> |
Dátový typ pre trojrozmerný vektor – obsahuje tri hodnoty naraz |
Čo sme sa naučili?
- Gyroskop BNO055 meria rotáciu v troch osiach – os Z sleduje otáčanie doprava/doľava.
- Eulerove uhly vyjadrujú orientáciu objektu v priestore pomocou troch čísel.