Prvé kolo
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.