|
|
| (3 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.) |
| Riadok 138: |
Riadok 138: |
| Ku každému komponentu si postavíme jednoduché autíčko ktoré využíva jeho schopnosti – až kým na konci nebudete mať robota ktorý sleduje čiaru, vyhýba sa prekážkam a vie kde sa nachádza. | | Ku každému komponentu si postavíme jednoduché autíčko ktoré využíva jeho schopnosti – až kým na konci nebudete mať robota ktorý sleduje čiaru, vyhýba sa prekážkam a vie kde sa nachádza. |
| ---- | | ---- |
|
| |
| === 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.
| |
|
| |
| [[Image:BNO055.jpg|250px]]
| |
|
| |
| ''' 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
| |
| |}
| |
|
| |
| ''' 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).
| |
|
| |
| [[Lidar structure| Štruktúra]]
| |
|
| |
| Hotový program '''nahrajte do mikrokontroléra''', natočte krátke demonštračňé video a odošlite.
| |
|
| |
| Č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.
| |
|
| |
| ----
| |
|
| |
| === Line senzor + multiplexer ===
| |
|
| |
| Dostali ste modul zložený z '''QTR-8A''' line senzora a '''74HC4051''' multiplexera.
| |
|
| |
| QTR-8A obsahuje 8 infračervených snímačov odrazivosti – každý meria koľko infračerveného svetla sa odrazí od povrchu. Tmavá čiara odráža menej ako svetlý podklad.
| |
|
| |
| Senzor nemá indikačnú LED, takže navonok nevidno či dostáva napájanie. Pre najlepší účinok IR senzorov ich treba zapojiť do 5V (IR pin).
| |
|
| |
| ''' Prečo potrebujeme multiplexer? '''
| |
|
| |
| RP2350-Zero má iba '''4 analógové vstupy''' (GP26–GP29), ale senzor má '''8 analógových výstupov'''. Na to nám pomôže multiplexer 74HC4051 – prepína 8 analógových kanálov na jeden výstup. Každý kanál má svoju adresu od <code>000</code> po <code>111</code> (binárne), ktorú nastavujeme cez 3 select piny (S0, S1, S2).
| |
|
| |
| Postup čítania všetkých 8 kanálov:
| |
| # Nastavíme adresu kanála cez S0, S1, S2
| |
| # Počkáme kým sa multiplexer prepne (~10 µs)
| |
| # Prečítame hodnotu z výstupu Z
| |
| # Opakujeme pre všetky kanály 0–7
| |
|
| |
| ''' Zapojenie '''
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Pin modulu !! Pin na RP2350-Zero
| |
| |-
| |
| | '''VCC''' || 3.3V
| |
| |-
| |
| | '''GND''' || GND
| |
| |-
| |
| | '''IR (QTR-8A)''' || 5V
| |
| |-
| |
| | '''Z''' (analógový výstup) || GP26 (ADC)
| |
| |-
| |
| | '''S0''' || GP6
| |
| |-
| |
| | '''S1''' || GP7
| |
| |-
| |
| | '''S2''' || GP8
| |
| |}
| |
|
| |
| [[Image:QTR-8A-pinout.png|400px]]
| |
|
| |
| ''' Kód '''
| |
|
| |
| <span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Skopíruj a spusti nasledujúci program. Otvor sériový monitor (115200 baud) a pomaly pohybuj senzorom nad čiernou čiarou na bielom podklade.
| |
|
| |
| <syntaxhighlight lang="C">
| |
| /*
| |
| RP2040 74HC4051 QTR-8A
| |
| ┌──────────┐ ┌──────────────────────────┐ ┌────────┐
| |
| | 5V ├─┘ ┌──────────┐ └──┤ IR |
| |
| | 3.3V├──────────┤VCC VCC├─────────┤ VCC |
| |
| │ GP26├──────────┤Z GND├─────────┤ GND |
| |
| │ GP13├──────────┤S2 Y0├─────────┤ D1 |
| |
| │ GP14├──────────┤S1 Y1├─────────┤ D2 |
| |
| │ GP15├──────────┤S0 Y2├─────────┤ D3 |
| |
| │ GND├──────────┤GND Y3├─────────┤ D4 |
| |
| └──────────┘ | Y4├─────────┤ D5 |
| |
| | Y5├─────────┤ D6 |
| |
| | Y6├─────────┤ D7 |
| |
| | Y7├─────────┤ D8 |
| |
| └──────────┘ └────────┘
| |
| */
| |
| const int MUX_Z = 26; // analógový výstup multiplexera
| |
| const int MUX_S0 = 6; // select bit 0
| |
| const int MUX_S1 = 7; // select bit 1
| |
| const int MUX_S2 = 8; // select bit 2
| |
|
| |
| const uint8_t SENSOR_COUNT = 8;
| |
| const int THRESHOLD = 400; // prah medzi bielou (~40) a čiernou (~800)
| |
|
| |
| void setup() {
| |
| Serial.begin(115200);
| |
| analogReadResolution(12); // 12-bitové ADC (0–4095)
| |
|
| |
| pinMode(MUX_S0, OUTPUT);
| |
| pinMode(MUX_S1, OUTPUT);
| |
| pinMode(MUX_S2, OUTPUT);
| |
|
| |
| Serial.println("QTR-8A + 74HC4051 OK");
| |
| }
| |
|
| |
| // Prepne multiplexer na daný kanál (0–7)
| |
| void selectChannel(uint8_t channel) {
| |
| digitalWrite(MUX_S0, (channel >> 0) & 1);
| |
| digitalWrite(MUX_S1, (channel >> 1) & 1);
| |
| digitalWrite(MUX_S2, (channel >> 2) & 1);
| |
| }
| |
|
| |
| void loop() {
| |
| for (uint8_t i = 0; i < SENSOR_COUNT; i++) {
| |
| selectChannel(i);
| |
| delayMicroseconds(10); // počkáme kým sa multiplexer prepne
| |
| int val = analogRead(MUX_Z);
| |
| Serial.print(val > THRESHOLD ? "1" : "0");
| |
| Serial.print("\t");
| |
| }
| |
| Serial.println();
| |
| delay(100);
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Novinka !! Vysvetlenie
| |
| |-
| |
| | <code>analogReadResolution(12)</code> || Nastaví ADC na 12-bitové čítanie (0–4095) – bez toho by Arduino používalo 10-bitové (0–1023)
| |
| |-
| |
| | <code>selectChannel(i)</code> || Nastaví adresu kanála cez select piny S0, S1, S2
| |
| |-
| |
| | <code>(channel >> n) & 1</code> || Bitový posun – vyextrahuje n-tý bit adresy kanála. Napr. kanál 5 = <code>101</code> → S0=1, S1=0, S2=1
| |
| |-
| |
| | <code>delayMicroseconds(10)</code> || Krátke čakanie kým sa multiplexer fyzicky prepne na nový kanál
| |
| |}
| |
|
| |
| {{Note|Typické hodnoty: biely povrch ~40, čierna čiara ~800. Ak sa tvoje hodnoty líšia, uprav konštantu <code>THRESHOLD</code> na hodnotu v strede medzi tvojimi nameranými hodnotami.}}
| |
|
| |
| <span style="background:#FFFFA0">'''VAŠA ÚLOHA:'''</span> Naprogramujte autíčko ktoré sleduje čiaru. Čiara môže odbáčať, robiť cik-cak, rozvetvovať sa alebo tvoriť slučku. Pripojte aj VL53L0X senzor na detekciu náhodnej prekážky v ceste:
| |
|
| |
| * Ak senzor detekuje prekážku bližšie ako 100 mm – autíčko zastaví a počká kým prekážka nezmizne
| |
| * Ak je cesta voľná – autíčko sleduje čiaru ďalej
| |
|
| |
| [[Line sensor structure | Štruktúra]]
| |
|
| |
| <span style="background:#FF9900">'''Bonus:'''</span> Pripevnite aj gyroskop BNO055. Počas jazdy zaznamenávajte čas a uhol otočenia do súboru pomocou '''LittleFS''' – po skončení jazdy pripojíte mikrokontrolér k počítaču a súbor si stiahnete a vizualizujete.
| |
|
| |
| [[Line sensor bonus structure | Štruktúra]]
| |
|
| |
| [[LittleFS into| Úvod do LittleFS (jednoduchý file system)]]
| |
|
| |
| Hotový program '''nahrajte do mikrokontroléra''', natočte krátke demonštračňé video a odošlite.
| |
|
| |
| Čo sme sa naučili?
| |
| * QTR-8A meria odrazivosť povrchu pomocou IR svetla – tmavá čiara odráža menej ako svetlý podklad.
| |
| * Multiplexer 74HC4051 nám umožnil čítať 8 analógových kanálov cez jeden ADC pin.
| |
| * Adresu kanála nastavujeme cez 3 select piny pomocou binárneho kódovania.
| |
| * <code>analogReadResolution(12)</code> nastaví 12-bitové čítanie pre väčšiu presnosť merania.
| |
|
| |
|
| == Tretia stavebnica == | | == Tretia stavebnica == |
| Riadok 417: |
Riadok 144: |
|
| |
|
| Ak nájdete chyby v návode, prosíme napíšte nám ich pri odovzdávaní výsledkov. | | Ak nájdete chyby v návode, prosíme napíšte nám ich pri odovzdávaní výsledkov. |
|
| |
| === Joystick ===
| |
|
| |
| Joystick ktorý ste dostali má '''2 osi''' (X a Y) a '''1 tlačidlo''' (SW – stlačenie joysticku). Funguje ako dva potenciometre – otočením v smere X alebo Y sa mení odpor a tým aj analógová hodnota na výstupe.
| |
|
| |
| ''' Zapojenie '''
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Pin joysticku !! Pin na RP2350-Zero
| |
| |-
| |
| | '''VCC''' || 3.3V
| |
| |-
| |
| | '''GND''' || GND
| |
| |-
| |
| | '''VRX''' (os X) || GP26 (ADC)
| |
| |-
| |
| | '''VRY''' (os Y) || GP27 (ADC)
| |
| |-
| |
| | '''SW''' (tlačidlo) || GP6
| |
| |}
| |
|
| |
| ''' Kód '''
| |
|
| |
| <span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Skopíruj a spusti nasledujúci program. Otvor sériový monitor (115200 baud) a pohybuj joystickom. Sleduj ako sa menia hodnoty.
| |
|
| |
| <syntaxhighlight lang="C">
| |
| const int JOY_X = 26;
| |
| const int JOY_Y = 27;
| |
| const int JOY_SW = 6;
| |
|
| |
| void setup() {
| |
| Serial.begin(115200);
| |
| analogReadResolution(12); // 12-bitové ADC (0–4095)
| |
| pinMode(JOY_SW, INPUT_PULLUP); // tlačidlo – aktívne LOW
| |
| }
| |
|
| |
| void loop() {
| |
| int x = analogRead(JOY_X);
| |
| int y = analogRead(JOY_Y);
| |
| int sw = digitalRead(JOY_SW); // 0 = stlačené, 1 = nestlačené
| |
|
| |
| Serial.print("X: "); Serial.print(x);
| |
| Serial.print(" Y: "); Serial.print(y);
| |
| Serial.print(" SW: "); Serial.println(sw == LOW ? "stlacene" : "volne");
| |
|
| |
| delay(100);
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Novinka !! Vysvetlenie
| |
| |-
| |
| | <code>INPUT_PULLUP</code> || Aktivuje vnútorný pull-up rezistor – tlačidlo číta <code>LOW</code> keď je stlačené a <code>HIGH</code> keď nie
| |
| |-
| |
| | <code>sw == LOW</code> || Tlačidlo je aktívne LOW – stlačenie stiahne pin na GND
| |
| |}
| |
|
| |
| {{Note|Stred joysticku by mal ukazovať hodnotu okolo 2048 (polovica rozsahu 0–4095). Ak je hodnota iná, joystick je mierne mimo stredu – to je normálne.}}
| |
|
| |
| ----
| |
|
| |
| === Touch senzor ===
| |
|
| |
| Touch senzor detekuje dotyk prsta pomocou zmeny kapacitancie. Keď sa dotknete senzora, váš prst zmení elektrické pole okolo elektródy – senzor to zaznamená a vyšle digitálny signál.
| |
|
| |
| ''' Zapojenie '''
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Pin senzora !! Pin na RP2350-Zero
| |
| |-
| |
| | '''VCC''' || 3.3V
| |
| |-
| |
| | '''GND''' || GND
| |
| |-
| |
| | '''SIG''' || GP7
| |
| |}
| |
|
| |
| ''' Kód '''
| |
|
| |
| <span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Skopíruj a spusti nasledujúci program. Dotknite sa senzora prstom a sleduj zmenu v sériovom monitore.
| |
|
| |
| <syntaxhighlight lang="C">
| |
| const int TOUCH_PIN = 7;
| |
|
| |
| void setup() {
| |
| Serial.begin(115200);
| |
| pinMode(TOUCH_PIN, INPUT);
| |
| }
| |
|
| |
| void loop() {
| |
| int val = digitalRead(TOUCH_PIN);
| |
|
| |
| if (val == HIGH) {
| |
| Serial.println("Dotyk detekovaný!");
| |
| } else {
| |
| Serial.println("Žiadny dotyk");
| |
| }
| |
|
| |
| delay(100);
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ----
| |
|
| |
|
| === Robotické rameno === | | === Robotické rameno === |
Vitajte v prvom kole 3D ligy!
V tomto kole sa zoznámite so súčiastkami, programovacím prostredím a samotnou konštrukciou stavebnice.
Zvládnutie základov je kľúčové – bez nich by sme nedokázali stavať zložitejšie a zaujímavejšie roboty.
Komplexnejším projektom sa budeme venovať v 2. kole.
Pravidlá prípravy
Pre začiatok na setupnutie si vlastnej stavebnice budeme musiet si pripravit:
- Hadrver
- Softver
Príprava hardvéru
Celkový setup elektorniky a HW súčiastok
Príprava arduino rozhrania
Arduino IDE setup
Pred začatím odporúčame prezrieť si prehľad premenných a operátorov.
Vytlačená stavebnica
Súčasťou vašej sady je aj 3D tlačená stavebnica – podobne ako Merkur, skladá sa z rôznych dielikov, ktoré sa dajú spájať skrutkami M3 do ľubovoľných tvarov a konštrukcií.
Prehľad dielikov
| Farba |
Typ dielikov |
Popis
|
| Biela |
Základné stavebné prvky |
Nosné diely s dierami pre skrutky M3 (8mm od seba) vo veľkostiach 1×N dier, ohnuté spoje (90° vertikálne aj horizontálne)
|
| Žltá |
Základné doskly |
Ploché dosky s dierami pre skrutky M3 (8mm od seba) vo veľkostiach 3×N a 4×N dier.
|
| Červená |
Moduly pre senzory a joystick a držiaky na káble |
Držiaky elektronických komponentov – napájajú sa priamo na biele časti
|
| Čierna |
Elektronické krabičky a ohnuté dosky |
Krabička pre napájanie (batérie), modul pre mikrokontrolér RP2350-Zero a ohnuté dosky M×N dier v tvare U s odierkovanými bočnými hranami na skrutky M3 (8mm od seba).
|
| Modrá |
Moduly a ramienka pre servo motorčeky |
Niektoré majú diery pre M3 matice, ktoré spolu so skrutkou spájajú modul s bielimi/žltími/čiernymi súčiastkami.
|
Inšpirácia
Pozri si tieto dva modely a nechaj sa inšpirovať – čo všetko sa dá z dielikov poskladať:
A tu je príklad toho, čo dokázali poskladať iní účastníci – srdce len zo základných dielikov:
Galéria súčiastok a ich zapojenie
Zadanie
VAŠA ÚLOHA: Poskladajte si z dielikov čokoľvek, čo vás napadne. Nemusí to byť funkčný robot – pokojne to môže byť zviera, písmeno, stavba alebo čokoľvek iné. Použite svoju fantáziu!
Hotovú konštrukciu odfotografujte a foto odošlite.
Čo sme sa naučili?
- Spoznali sme jednotlivé typy dielikov stavebnice a ich farebné označenie.
- Vyskúšali sme si, ako sa dieliky spájajú pomocou skrutiek M3.
- Zistili sme, že zo stavebnice sa dá poskladať prakticky čokoľvek – od robotov až po dekorácie.
Prva stavebnica
V prvej stavebnici sa zoznámite so základnými elektronickými modulmi. Niektoré z nich sa vám budú hodiť pri ladení zložitejších robotov – napríklad LED vám vie ukázať v akom stave sa robot nachádza, bzučiak vás upozorní keď sa niečo stane. Iné moduly sú dôležité pre pochopenie základov, na ktorých budeme neskôr stavať.
Budeme sa zaoberať:
- RGB LED – farebná dióda na vizuálnu signalizáciu
- Bzučiak – jednoduchý reproduktor na zvukovú signalizáciu
- Mikrofón – zachytávanie zvuku z okolia
- Ultrazvukový senzor – meranie vzdialenosti
- Servo motorček – presné ovládanie pohybu
Na konci prvej stavebnice poskladáte autíčko ktoré sa samo vyhýba prekážkam – prvého autonómneho robota!
Roomba
Naučili ste sa ako narábať s hlavnými komponentmi stavebnice. Teraz využijete všetky znalosti dokopy a postavíte si robotického vysavača – Roombu.
Autíčko bude skúmať terén pred sebou. Keď narazí na prekážku, pozrie sa doprava a doľava, nájde voľný smer a pokračuje ďalej. Konštrukciu auta môžete nechať z predchádzajúcej úlohy – stačí pridať 180° servo s ultrazvukovým senzorom na otáčanie hlavy.
Použijete:
- 2× 360° servo (kolesá)
- 1× 180° servo (otáčanie senzora)
- 1× HC-SR04
- 1× RGB LED modul (voliteľné)
- 1× bzučiak (voliteľné)
Algoritmus
Roomba má v každom momente nejaký stav – a podľa neho sa rozhoduje čo urobiť:
- Ide rovno – ak je pred ňou voľno (> 20 cm)
- Narazila na prekážku – otočí senzor doprava a zmeria
- Ak je doprava voľno – otočí sa doprava a pokračuje
- Ak nie – otočí senzor doľava a zmeria
- Ak je doľava voľno – otočí sa doľava a pokračuje
- Ak je všade prekážka – cúvne a zopakuje skenovanie
LED a bzučiak sú voliteľné – ale môžu pekne znázorniť jednotlivé stavy (napr. zelená = ide, červená = prekážka, pípnutie pri otočení).
VAŠA ÚLOHA: Zostrojte Roombu a naprogramujte algoritmus podľa opisu vyššie. Dostávate štruktúru na doplnenie:
Štruktúra
Bonus: Roomba si môže pamätať históriu otočení – ak sa viackrát za sebou otočila doprava, skúsi to doľava a naopak. Tak sa vyhne zaseknutiu v rohu.
Hotový program nahrajte do mikrokontroléra, natočte krátke demonštračňé video a odošlite.
Čo sme sa naučili?
- Komplexnejšie správanie robota sa dá rozložiť na jednoduché stavy a prechody medzi nimi.
- 180° servo vie presne namieriť senzor na konkrétny uhol – využili sme ho ako "hlavu" robota.
- Kombináciou všetkých komponentov vieme postaviť autonómneho robota schopného orientovať sa v priestore.
Druhá stavebnica
V druhej stavebnici prídete do kontaktu s presnejšími a výkonnejšími senzormi. Oproti prvej stavebnici tu pracujeme s modernými komunikačnými protokolmi – I2C zbernicou a 12-bitovými analógovými prevodníkmi, ktoré nám dávajú oveľa presnejšie merania.
Budeme sa zaoberať:
- VL53L0X – laserový senzor vzdialenosti (Time of Flight), presnejší ako ultrazvuk
- BNO055 – gyroskop ktorý meria orientáciu a rotáciu robota v priestore
- QTR-8A + 74HC4051 – line senzor s multiplexerom na sledovanie čiary
Ku každému komponentu si postavíme jednoduché autíčko ktoré využíva jeho schopnosti – až kým na konci nebudete mať robota ktorý sleduje čiaru, vyhýba sa prekážkam a vie kde sa nachádza.
Tretia stavebnica
Najľahšie nakoniec! Túto stavebnicu sme navrhli ako oddych od programovania – aby ste si užili skladanie podľa návodu. Najprv sa zoznámime s dvoma novými ale jednoduchými elektronickými komponentmi: joystickom a touch senzorom. Po zoznámení sa s nimi sa vrhneme do stavby jednoduchého robotického ramena.
Ak nájdete chyby v návode, prosíme napíšte nám ich pri odovzdávaní výsledkov.
Robotické rameno
Teraz keď poznáte joystick a touch senzor, postavíte si robotické rameno ovládané joystickom. Touch senzor bude slúžiť ako tlačidlo pre uchopenie objektu (napr. otvoriť/zatvoriť kliešte).
Rameno pozostáva z niekoľkých servo motorčekov ktoré ovládajú jednotlivé kĺby – podobne ako ľudská ruka.
Postavte rameno podľa návodu:
Návod na skladanie ramena
Vaša úloha
VAŠA ÚLOHA: Naprogramujte ovládanie ramena joystickom:
- Os X joysticku otáča rameno doľava/doprava
- Os Y joysticku pohybuje ramenom nahor/nadol
- Stlačenie joysticku (SW) otvára/zatvára kliešte
- Dotyk touch senzory pohybujú ramenom dopredu/dozadu
Štruktúra
Bonus: Pridajte pamäť pohybov – rameno si zapamätá sekvenciu pohybov a bude ju opakovať. Každé stlačenie joysticku uloží aktuálnu pozíciu všetkých serv do poľa. Po stlačení touch senzora rameno sekvencию prehrá.
Hotové rameno natočte pri práci a video odošlite.
Čo sme sa naučili?
- Joystick kombinuje dva potenciometre a tlačidlo – os X a Y dávajú analógovú hodnotu 0–4095.
- Touch senzor detekuje dotyk bez mechanického tlačidla – využíva zmenu kapacitancie.
- Robotické rameno kombinuje všetky doterajšie znalosti – servo motorčeky, joystick aj touch senzor.