Prvé kolo

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

Druhá stavebnica

VL53L0X senzor

Dostali ste malý, ale účinný senzor na meranie vzdialenosti. VL53L0X funguje na princípe vysielania infračerveného svetla – lúč sa odrazí od objektu a vráti sa späť za rádovo nanosekundy. Zmeria sa čas letu (Time of Flight) a vypočíta sa vzdialenosť.

Táto technológia je výrazne presnejšia a rýchlejšia ako ultrazvukový senzor – pracujeme so svetlom, ktoré je niekoľkonásobne rýchlejšie ako zvuk.

Zapojenie

Senzor komunikuje cez zbernicu I2C – potrebuje iba 4 vodiče:

Pin senzora Pin na RP2350-Zero
VCC 3.3V
GND GND
SDA GP4
SCL GP5

Inštalácia knižnice

  1. V Arduino IDE otvorte Tools → Manage Libraries
  2. Vyhľadajte "VL53L0X" a nainštalujte knižnicu od autora Pololu

Kód

Vyskúšaj toto: Skopíruj a spusti nasledujúci program. Otvor sériový monitor (115200 baud) a pohybuj rukou pred senzorom.

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup() {
  Serial.begin(115200);
  Wire.setSDA(4);  // GP4
  Wire.setSCL(5);  // GP5
  Wire.begin();

  if (!sensor.init()) {
    Serial.println("Senzor nenájdený!");
    while (1);  // zastav program
  }

  sensor.setTimeout(500);
  sensor.startContinuous();
  Serial.println("VL53L0X OK");
}

void loop() {
  int dist = sensor.readRangeContinuousMillimeters();

  if (sensor.timeoutOccurred()) {
    Serial.println("Timeout!");
  } else {
    Serial.print("Vzdialenosť: ");
    Serial.print(dist);
    Serial.println(" mm");
  }

  delay(100);
}
Novinka Vysvetlenie
#include <Wire.h> Knižnica pre I2C zbernicu – spôsob komunikácie medzi mikrokontrolérom a senzorom cez 2 vodiče (SDA, SCL)
Wire.setSDA(4) / Wire.setSCL(5) Nastavíme ktoré piny budú použité pre I2C komunikáciu
sensor.init() Inicializuje senzor – ak vráti false, senzor nie je správne zapojený
sensor.startContinuous() Spustí nepretržité meranie – senzor meria stále bez čakania na príkaz
sensor.timeoutOccurred() Vráti true ak senzor neodpovedal včas – objekt je príliš ďaleko alebo senzor nefunguje

Pre hlbšie vysvetlenie ako funguje tento senzor prikladáme článok od Adafruit.


VAŠA ÚLOHA: Implementujte VL53L0X senzor na svoje prvé autíčko namiesto ultrazvukového senzora. Správanie psíčka zostáva rovnaké – zmeňte iba časť kódu ktorá meria vzdialenosť.

Štruktúra

Bonus: Použite 3× VL53L0X senzory – jeden dopredu, druhý doľava a tretí doprava. Roomba tak bude vidieť do všetkých strán naraz a nebude musieť otáčať hlavou.


Hotový program nahrajte do mikrokontroléra, natočte video a odošlite na insert mail.

Čo sme sa naučili?

  • VL53L0X meria vzdialenosť pomocou infračerveného svetla (Time of Flight) – presnejšie a rýchlejšie ako ultrazvuk.
  • I2C je spôsob komunikácie kde viacero zariadení zdieľa iba 2 vodiče – každé má svoju jedinečnú adresu.
  • Knižnica môže za nás vyriešiť celú komunikáciu so senzorom – stačí zavolať správne funkcie.

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

Inštalácia knižnice

  1. V Arduino IDE otvorte Tools → Manage Libraries
  2. Vyhľadajte "Adafruit BNO055" a nainštalujte knižnicu
  3. Nainštalujte aj závislosť "Adafruit Unified Sensor" ak sa zobrazí výzva

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

Šablóna:Note

VAŠA ÚLOHA: Pripevnite gyroskop k autíčku kolmo na cestu (plocho, aby os Z merala otáčanie). Naprogramujte autíčko ktoré:

  • Ide presne rovno – ak gyroskop zaznamená odchýlku, autíčko sa skoriguje
  • Na príkaz cez sériový monitor sa otočí presne o 90° doprava alebo doľava – otáča sa dovtedy, kým gyroskop nezaznamená 90°

Štruktúra

Šablóna:Note

Bonus: Použite VL53L0X senzor pripevnený na 180° servo a preskúmajte terén ako lidar – servo sa otočí z jednej strany na druhú a senzor zaznamená vzdialenosť v každom uhle. Po preskúmaní sa autíčko otočí smerom k najbližšiemu objektu a príde za ním (upgrade poslušného psíčka).

Hotový program nahrajte do mikrokontroléra, natočte video a odošlite na insert mail.

Č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.
  • Kombináciou gyroskopu a serv vieme autíčku dopomôcť k presnému pohybu a otáčaniu.

8 line senzor