Prvé kolo: Rozdiel medzi revíziami

Zo stránky 3D liga wiki
Prejsť na navigáciu Prejsť na vyhľadávanie
Sebastian (diskusia | príspevky)
Bez shrnutí editace
Sebastian (diskusia | príspevky)
Riadok 108: Riadok 108:
* Knižnica môže za nás vyriešiť celú komunikáciu so senzorom – stačí zavolať správne funkcie.
* Knižnica môže za nás vyriešiť celú komunikáciu so senzorom – stačí zavolať správne funkcie.


=== Gyroskop ===
=== 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:
{| class="wikitable"
|-
! Pin senzora !! Pin na RP2350-Zero
|-
| '''VCC''' || 3.3V
|-
| '''GND''' || GND
|-
| '''SDA''' || GP4
|-
| '''SCL''' || GP5
|}
''' Inštalácia knižnice '''
# V Arduino IDE otvorte '''Tools → Manage Libraries'''
# Vyhľadajte '''"Adafruit BNO055"''' a nainštalujte knižnicu
# Nainštalujte aj závislosť '''"Adafruit Unified Sensor"''' ak sa zobrazí výzva
''' Kód '''
<span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> 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.
<!--{{Note|Pred spustením skontroluj či tvoj modul BNO055 má pin označený '''VIN''' (5V tolerantný) alebo '''VCC''' (3.3V only). Ak má iba VCC, pripoj ho na '''3.3V''' – priame napojenie na 5V môže senzor poškodiť!}}-->
<syntaxhighlight lang="C">
#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);
}
</syntaxhighlight>
Program čaká kým nie je senzor aspoň čiastočne kalibrovaný (<code>system >= 1</code>) 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.
{| class="wikitable"
|-
! Novinka !! Vysvetlenie
|-
| <code>Adafruit_BNO055</code> || Objekt reprezentujúci senzor – cez neho voláme všetky funkcie knižnice
|-
| <code>bno.begin()</code> || Inicializuje senzor – ak vráti <code>false</code>, senzor nie je správne zapojený
|-
| <code>bno.getVector(VECTOR_EULER)</code> || Vráti aktuálnu rotáciu vo forme troch uhlov (Eulerove uhly) v stupňoch
|-
| <code>euler.x()</code> / <code>.y()</code> / <code>.z()</code> || Jednotlivé osi rotácie – os Z sleduje otáčanie doprava/doľava
|-
| <code>imu::Vector<3></code> || Dátový typ pre trojrozmerný vektor – obsahuje tri hodnoty naraz
|}
{{Note|Os Z vracia hodnoty 0°–360°. Keď autíčko stojí rovno = 0°, otočenie doprava zvyšuje hodnotu, otočenie doľava ju znižuje (alebo ide k 360°). Toto treba zohľadniť v kóde.}}
<span style="background:#FFFFA0">'''VAŠA ÚLOHA:'''</span> 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°
[[Gyroscope structure | Štruktúra]]
{{Note|Nápoveda: Presné otáčanie na 90° vyžaduje aby ste sledovali '''zmenu uhla''' od momentu keď ste začali otáčanie – nie absolútnu hodnotu. Uložte si počiatočný uhol do premennej a sledujte rozdiel.}}
<span style="background:#FF9900">'''Bonus:'''</span> Použite VL53L0X senzor pripevnený na 180° servo a preskúmajte terén ako [https://cs.wikipedia.org/wiki/Lidar 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 <code>insert mail</code>.
Č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 ===
=== 8 line senzor ===

Verzia z 11:57, 3. máj 2026

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