Gyroskop BNO055 - manual: Rozdiel medzi revíziami

Zo stránky 3D liga wiki
Prejsť na navigáciu Prejsť na vyhľadávanie
Sebastian (diskusia | príspevky)
dBez shrnutí editace
Sebastian (diskusia | príspevky)
Riadok 4: Riadok 4:


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.
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.
Bližšie informácie o protokole [[RP2350-Zero/I2C | '''I2C''']], ktorý BNO055 používa pri komunikácií.


''' Kód '''
''' Kód '''

Verzia z 10:54, 4. september 2026

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.

Bližšie informácie o protokole I2C, ktorý BNO055 používa pri komunikácií.

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