Prvé kolo: Rozdiel medzi revíziami
Bez shrnutí editace |
|||
| 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
- V Arduino IDE otvorte Tools → Manage Libraries
- 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ť.
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
- 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 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 |
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°
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.