Gyroskop BNO055 - manual

Zo stránky 3D liga wiki
Prejsť na navigáciu Prejsť na vyhľadávanie

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