|
|
| (5 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) |
| Riadok 85: |
Riadok 85: |
|
| |
|
| ---- | | ---- |
|
| |
| === Servo motorček ===
| |
|
| |
| Dostali ste dva druhy servo motorčekov: '''180°''' a '''360°'''. Oba fungujú na rovnakom princípe ovládania, ale majú rozdielne vlastnosti:
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Typ !! Správanie
| |
| |-
| |
| | '''180° servo''' || Nastaví sa na presnú pozíciu (napr. 0°, 90°, 180°) a tam zostane
| |
| |-
| |
| | '''360° servo''' || Namiesto pozície ovládate '''smer a rýchlosť''' otáčania – hodnota 90° = stoj, pod 90° = jedna strana, nad 90° = druhá strana
| |
| |}
| |
|
| |
| Servo dostáva riadiace impulzy v rozsahu '''500–2500 µs''', ktoré dekóduje ako požadovanú pozíciu alebo smer otáčania. Zapojte servo na pin '''GP12'''.
| |
|
| |
| <!--{{Note|Ak servo pri pohybe spôsobuje reštart mikrokontroléra, je odberané priveľa prúdu. V takom prípade napájajte servo samostatne a spojte iba GND.}}-->
| |
|
| |
| <span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Nahrajte nasledujúci program. Otvorte sériový monitor (115200 baud), zadajte číslo od 0 do 180 a stlačte Enter. Vyskúšajte si to najprv s 180° servom, potom s 360°. Čo si všimnete?
| |
|
| |
| <syntaxhighlight lang="C">
| |
| #include <Servo.h>
| |
|
| |
| #define SERVO_PIN 12
| |
|
| |
| Servo servo;
| |
| String inputString = "";
| |
| int position = 90;
| |
|
| |
| void setup() {
| |
| Serial.begin(115200);
| |
| servo.attach(SERVO_PIN, 500, 2500);
| |
| servo.write(position);
| |
| Serial.println("Zadajte uhol (0-180) a stlačte Enter:");
| |
| }
| |
|
| |
| void loop() {
| |
| while (Serial.available()) {
| |
| char c = Serial.read();
| |
| if (c == '\n') {
| |
| position = inputString.toInt();
| |
| if (position >= 0 && position <= 180) {
| |
| servo.write(position);
| |
| Serial.print("Servo nastavené na uhol: ");
| |
| Serial.println(servo.read());
| |
| } else {
| |
| Serial.println("Neplatná pozícia – zadajte číslo od 0 do 180");
| |
| }
| |
| inputString = "";
| |
| } else {
| |
| inputString += c;
| |
| }
| |
| }
| |
| delay(50);
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Novinka !! Vysvetlenie
| |
| |-
| |
| | <code>#include <Servo.h></code> || Načítame knižnicu pre ovládanie serva – bez nej by sme museli impulzy generovať ručne
| |
| |-
| |
| | <code>servo.attach(pin, 500, 2500)</code> || Pripojíme servo na pin a definujeme rozsah impulzov (500–2500 µs)
| |
| |-
| |
| | <code>servo.write(uhol)</code> || Nastavíme servo na požadovaný uhol (0–180°)
| |
| |-
| |
| | <code>inputString.toInt()</code> || Prevedie textový reťazec na celé číslo – napr. <code>"120"</code> → <code>120</code>
| |
| |}
| |
|
| |
| <span style="background:#FFFFA0">'''VAŠA ÚLOHA:'''</span> Zostrojte autíčko z dvoch '''360° servo motorčekov''', guličky (ako tretie koleso) a ultrazvukového senzora. Ultrazvuk upevnite na predok. Naprogramujte '''poslušného psíčka''' – autíčko sleduje objekt pred sebou:
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Vzdialenosť !! Správanie
| |
| |-
| |
| | > 30 cm || Ide vpred – ide za páničkom
| |
| |-
| |
| | 10 – 30 cm || Stojí – páničko je na ideálnej vzdialenosti
| |
| |-
| |
| | < 10 cm || Ide vzad – páničko je príliš blízko
| |
| |}
| |
|
| |
| [[Servo structure | Štruktúra]]
| |
|
| |
| <!--{{Note|Nápoveda: Keďže ľavé a pravé koleso sú namontované oproti sebe, musia sa otáčať '''opačným smerom''' aby autíčko išlo rovno. Ak jedno servo ide na hodnotu 70, druhé musí ísť na 110.}}-->
| |
|
| |
| <span style="background:#FF9900">'''Bonus:'''</span> Upravte program tak, aby sa psíček pohyboval '''proporcionálne''' – čím ďalej je objekt, tým rýchlejšie autíčko ide. Na škálovanie hodnôt sa vám môže hodiť funkcia [//docs.arduino.cc/language-reference/en/functions/math/map/ <code>map()</code>]
| |
|
| |
|
| |
| Hotový program '''nahrajte do mikrokontroléra''', natočte video a odošlite.
| |
|
| |
| Čo sme sa naučili?
| |
| * Servo motorček ovládame pomocou knižnice <code>Servo.h</code> a funkcie <code>servo.write()</code>.
| |
| * 180° servo nastavuje presnú polohu, 360° servo ovláda smer a rýchlosť otáčania.
| |
| * Pri dvoch kolesách namontovaných oproti sebe musia servá ísť opačnými smermi aby sa autíčko pohybovalo rovno.
| |
| * Funkcia <code>map()</code> umožňuje previesť hodnotu z jedného rozsahu do druhého.
| |
|
| |
|
| === Roomba === | | === Roomba === |
| Riadok 235: |
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. |
| ---- | | ---- |
|
| |
| === 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.
| |
|
| |
| [[Image:VL53L0X.jpg|300px]]
| |
|
| |
| ''' Zapojenie '''
| |
|
| |
| Senzor komunikuje cez zbernicu '''I2C''' – potrebuje iba 4 vodiče:
| |
|
| |
| {| 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 pohybuj rukou pred senzorom.
| |
|
| |
| <syntaxhighlight lang="C">
| |
| #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);
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Novinka !! Vysvetlenie
| |
| |-
| |
| | <code>#include <Wire.h></code> || Knižnica pre I2C zbernicu – spôsob komunikácie medzi mikrokontrolérom a senzorom cez 2 vodiče (SDA, SCL)
| |
| |-
| |
| | <code>Wire.setSDA(4)</code> / <code>Wire.setSCL(5)</code> || Nastavíme ktoré piny budú použité pre I2C komunikáciu
| |
| |-
| |
| | <code>sensor.init()</code> || Inicializuje senzor – ak vráti <code>false</code>, senzor nie je správne zapojený
| |
| |-
| |
| | <code>sensor.startContinuous()</code> || Spustí nepretržité meranie – senzor meria stále bez čakania na príkaz
| |
| |-
| |
| | <code>sensor.timeoutOccurred()</code> || Vráti <code>true</code> ak senzor neodpovedal včas – objekt je príliš ďaleko alebo senzor nefunguje
| |
| |}
| |
|
| |
| Pre hlbšie vysvetlenie ako funguje tento senzor prikladáme [https://learn.adafruit.com/adafruit-vl53l0x-micro-lidar-distance-sensor-breakout/overview článok od Adafruit].
| |
|
| |
| <!--{{Note|Na rozdiel od HC-SR04, VL53L0X vracia vzdialenosť priamo v '''milimetroch''' – nie je potrebný žiadny prepočet.}}-->
| |
|
| |
| <span style="background:#FFFFA0">'''VAŠA ÚLOHA:'''</span> 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ť.
| |
|
| |
| [[Car with lasers | Štruktúra]]
| |
|
| |
| <span style="background:#FF9900">'''Bonus:'''</span> 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.
| |
|
| |
| <!--{{Note|Nápoveda: Každý I2C senzor má svoju adresu. Ak zapojíte viac rovnakých senzorov, budú mať rovnakú adresu a budú si navzájom prekážať. VL53L0X umožňuje adresu zmeniť cez pin XSHUT – skúste vyhľadať ako na to.}}-->
| |
|
| |
| Hotový program '''nahrajte do mikrokontroléra''', natočte krátke demonštračňé video a odošlite.
| |
|
| |
| Č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.
| |
|
| |
| [[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 617: |
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.