LEGO Mindstorms
Základní pojmy
- Robot – automaticky nebo poloautomaticky řízené zařízení, které vnímá své okolí pomocí senzorů a na základě naprogramovaného chování na něj reaguje pomocí aktuátorů
- Senzor (čidlo) – vstupní zařízení, které snímá fyzikální veličinu (vzdálenost, světlo, barvu, dotek, náklon) a převádí ji na elektrický signál zpracovatelný řídicí jednotkou
- Aktuátor – výstupní zařízení, které přeměňuje elektrický signál na fyzický pohyb nebo jiný účinek (motor, světlo, zvuk)
- Řídicí jednotka – „mozek” robotu, u LEGO Mindstorms je jím programovatelná kostka EV3, která zpracovává data ze senzorů a podle nahraného programu ovládá motory
Části stavebnice EV3
- Řídicí kostka EV3 (EV3 Brick) – centrální jednotka s procesorem, malým LCD displejem, čtyřmi tlačítky pro ovládání menu, 4 vstupními porty (1–4) pro připojení senzorů, 4 výstupními porty (A–D) pro připojení motorů, komunikací přes USB, Bluetooth a Wi-Fi (s adaptérem), slotem na paměťovou kartu a reproduktorem
- Motory s enkodérem – „Large motor” (silnější, pro pohon podvozku) a „Medium motor” (rychlejší, pro menší mechanismy). Každý motor obsahuje vestavěný rotační enkodér, který měří natočení hřídele s přesností na 1°, takže lze programovat pohyb „ujeď přesně 3 otáčky” nebo „otoč se přesně o 90°”
- Senzory
- Dotykový senzor (Touch sensor) – rozezná, zda je tlačítko stisknuté, uvolněné, nebo právě stisknuté/uvolněné
- Ultrazvukový senzor (Ultrasonic sensor) – měří vzdálenost k překážce v centimetrech nebo palcích (typický rozsah cca 3–250 cm) na principu odrazu ultrazvukového vlnění
- Barevný senzor (Color sensor) – rozpoznává barvu povrchu (rozlišuje několik základních barev), intenzitu odraženého světla (použití při sledování čáry) nebo intenzitu okolního světla
- Gyroskopický senzor (Gyro sensor) – měří úhel natočení robotu (ve stupních) a rychlost otáčení (ve stupních za sekundu), používá se pro přesné zatáčení nebo udržení směru jízdy
- Stavební prvky – nosníky, kolíky, spojky a další konstrukční díly systému LEGO Technic, ze kterých se sestavuje mechanická konstrukce (podvozek, chapadlo, věž se senzorem apod.)
- Zdroj napájení – dobíjecí akumulátor nebo sada tužkových baterií umístěná v EV3 kostce
Vývojové prostředí a princip blokového programování
- Programuje se v prostředí EV3 Software (EV3-G), postaveném na platformě LabVIEW – jde o čistě blokové (vizuální) programování, textový kód se nepíše
- Program se sestavuje přetahováním bloků z palety (Programming Palette) na sekvenční linku (Sequence Wire) – tenkou čáru, která určuje pořadí, v jakém se bloky provádějí
- Základní kategorie bloků
- Akční bloky (zelené) – ovládání motorů (Move Steering/Tank, Motor Rotation), zvuku, displeje, LED
- Bloky toku programu (oranžové) – Start, Smyčka (Loop), Přepínač/podmínka (Switch), Čekání (Wait), Přerušení smyčky (Loop Interrupt)
- Senzorové bloky (žluté) – čtení hodnoty z konkrétního senzoru
- Datové bloky (červené) – práce s proměnnými, matematické a logické operace
- Blok pro pohyb motoru má tzv. „mód doby běhu” – lze nastavit, aby běžel po určitý počet otáček/stupňů, po určitou dobu, nebo „neomezeně” (Unlimited/On). Poslední varianta je důležitá: program se v ní nezastaví a hned pokračuje dalším blokem, zatímco motor běží dál na pozadí – to se využívá právě tehdy, když má robot zároveň jet a vyhodnocovat senzor
- Hotový program se z počítače nahraje do EV3 kostky přes USB kabel nebo Bluetooth a poté se na robotu spustí stiskem tlačítka
Příklad úlohy: zastavení a zatočení před překážkou
Úloha: robot jede rovně, dokud ultrazvukový senzor nenaměří překážku blíž než 10 cm; pak zastaví a zatočí.
Protože blokové programování nelze zapsat jako textový kód, popisuje se sled bloků na sekvenční lince slovně:
[Start]
|
v
[Pohyb (Move Steering)] Steering = 0 (rovně), výkon = 50 %,
| mód běhu = "Zapnuto" (Unlimited)
| -> motory se rozjedou, blok NEČEKÁ na dokončení
| a program hned pokračuje dál
v
[Čekání (Wait)] senzor = Ultrazvukový, porovnání = "Vzdálenost < 10 cm"
| -> program čeká na tomto bloku, robot mezitím
| dál jede (motory stále běží z předchozího bloku)
v
[Pohyb (Move Steering)] mód běhu = "Vypnuto" (Stop), Brzdit = Ano
| -> motory se zastaví
v
[Pohyb (Move Steering)] Steering = 100 (otáčení na místě), výkon = 50 %,
| mód běhu = po dobu 1 sekundy
v
[konec programu]
Pro opakované chování (robot se po zatočení znovu rozjede a znovu hledá překážku) by se celá tato sekvence od druhého bloku vložila dovnitř bloku Smyčka (Loop) nastaveného na „Opakuj neustále”.
Programování vstupů a výstupů
- Programování vstupních zařízení – čtení hodnoty ze senzoru a její vyhodnocení pomocí bloku Čekání nebo Přepínač (např. „pokud je vzdálenost menší než 10 cm, zastav”)
- Programování výstupních zařízení – nastavení výkonu, směru (Steering) a doby běhu motorů, případně dalších výstupů (zvuk, text/obrázek na displeji)
- Typická úloha spojuje obojí do zpětnovazební smyčky – robot neustále vyhodnocuje data ze senzorů a podle nich upravuje chování motorů (např. sledování čáry pomocí barevného senzoru, vyhýbání se překážkám pomocí ultrazvukového senzoru)
Návrh, tvorba a prezentace programu
- Návrh vlastního programu – rozmyšlení úlohy, kterou má robot splnit, rozdělení na dílčí kroky, návrh algoritmu (např. formou vývojového diagramu nebo slovního popisu sledu bloků, jako v příkladu výše)
- Tvorba programu – sestavení bloků na sekvenční lince podle návrhu, postupné testování a ladění chování (výkon motorů, prahové hodnoty senzorů) na reálném robotu
- Prezentace programu – ukázka funkčního chování robotu, vysvětlení použitých senzorů, motorů a logiky programu ostatním
Arduino
Základní pojmy
- Arduino Uno – deska s mikrokontrolérem ATmega328P, jedna z nejrozšířenějších vývojových desek pro výuku a prototypování elektroniky
- Mikrokontrolér – malý počítač na jednom čipu, obsahuje procesor, paměť (flash pro program, RAM pro proměnné, EEPROM pro trvalé uložení dat) a vstupně-výstupní obvody, určený k řízení konkrétního zařízení nebo úlohy
- GPIO piny (General Purpose Input/Output) – univerzální vstupně-výstupní piny desky. Arduino Uno má 14 digitálních pinů (0–13, z toho 6 podporuje PWM a jsou označené vlnovkou „~”) a 6 analogových vstupů (A0–A5), které lze programově nastavit jako vstup (čtení signálu ze senzoru) nebo výstup (ovládání LED, motoru apod.)
- Napájení – Arduino Uno se napájí a zároveň programuje přes USB kabel z počítače (5 V), případně externím zdrojem 7–12 V přes DC konektor (např. baterií, pokud pracuje samostatně bez počítače)
Části soupravy
- Deska Arduino Uno – obsahuje mikrokontrolér, GPIO piny, USB konektor pro napájení a nahrávání programu, resetovací tlačítko
- Senzory – např. tlačítko, fotorezistor (LDR), potenciometr, teplotní čidlo, ultrazvukový dálkoměr HC-SR04, PIR čidlo pohybu
- Aktuátory – LED diody, motory (stejnosměrné, servomotory, krokové), displeje (LCD, LED matice), reproduktory/bzučák (buzzer)
- Nepájivé pole (breadboard) a propojovací vodiče (jumper wires) – umožňují sestavit elektrický obvod bez pájení
- Rezistory – např. jako proudové omezení pro LED, nebo jako součást napěťového děliče u analogových senzorů (fotorezistor)
Vývojové prostředí a programovací jazyk
- Programuje se v prostředí Arduino IDE – textovém editoru s vestavěným kompilátorem a nástrojem pro nahrání programu do desky přes USB
- Program se nazývá sketch a píše se ve zjednodušeném jazyce vycházejícím z C/C++ (tzv. Wiring)
- Základní struktura každého programu obsahuje dvě funkce
setup()– spustí se jednou při startu/resetu desky, slouží k nastavení pinů (pinMode) a inicializaci (např.Serial.begin)loop()– opakuje se stále dokola po celou dobu běhu programu
- Arduino IDE obsahuje Sériový monitor (Serial Monitor) – okno, ve kterém lze zobrazovat hodnoty odeslané z desky pomocí
Serial.println(), což se hodí k ladění programu (zjištění, jaké hodnoty senzor skutečně naměřil)
Programování vstupů a výstupů
- Programování vstupních zařízení – čtení stavu digitálního pinu pomocí
digitalRead()(např. tlačítko – hodnotaHIGH/LOW) nebo hodnoty z analogového pinu pomocíanalogRead()(např. fotorezistor, potenciometr – hodnota 0 až 1023) - Programování výstupních zařízení – nastavení digitálního pinu pomocí
digitalWrite()(zapnuto/vypnuto, např. LED), nebo simulace analogového výstupu pomocíanalogWrite()(PWM, hodnota 0 až 255, např. jas LED nebo rychlost motoru) - Níže je několik kompletních, funkčních příkladů.
1. Blikání LED
// blikani_led.ino
// Rozsvěcí a zhasíná LED připojenou k pinu 13 v intervalu 1 sekunda.
void setup() {
pinMode(13, OUTPUT); // nastavení pinu 13 jako výstup
}
void loop() {
digitalWrite(13, HIGH); // rozsvícení LED
delay(1000); // čekání 1000 ms (1 sekunda)
digitalWrite(13, LOW); // zhasnutí LED
delay(1000); // čekání 1000 ms
}
2. Čtení tlačítka (INPUT_PULLUP)
// tlacitko.ino
// Tlačítko je zapojené mezi pin 2 a GND. Díky vnitřnímu pull-up rezistoru
// není potřeba žádný externí rezistor - pin je v klidu HIGH a po stisku LOW.
const int tlacitkoPin = 2; // digitální pin, na který je připojené tlačítko
const int ledPin = 13; // vestavěná LED na desce
void setup() {
pinMode(tlacitkoPin, INPUT_PULLUP); // zapnutí interního pull-up rezistoru
pinMode(ledPin, OUTPUT);
}
void loop() {
int stavTlacitka = digitalRead(tlacitkoPin);
if (stavTlacitka == LOW) {
// LOW znamená, že tlačítko je stisknuté (uzemnilo pin)
digitalWrite(ledPin, HIGH); // rozsviť LED
} else {
digitalWrite(ledPin, LOW); // zhasni LED
}
}
3. Analogové čtení senzoru a řízení jasu LED
// fotorezistor_jas.ino
// Fotorezistor v napěťovém děliči je připojen na analogový vstup A0.
// Podle intenzity světla se plynule mění jas LED připojené na PWM pinu 9.
const int fotorezistorPin = A0; // analogový vstup
const int ledPin = 9; // PWM pin (označený ~) pro řízení jasu
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // spuštění sériové komunikace pro ladění
}
void loop() {
int hodnota = analogRead(fotorezistorPin); // 0 (tma) až 1023 (světlo)
int jas = map(hodnota, 0, 1023, 0, 255); // převod na rozsah PWM 0-255
analogWrite(ledPin, jas); // nastavení jasu LED
Serial.print("Osvetleni: ");
Serial.print(hodnota);
Serial.print(" -> jas LED: ");
Serial.println(jas);
delay(100); // krátká pauza mezi měřeními
}
4. Ultrazvukový senzor vzdálenosti HC-SR04
// hc_sr04.ino
// Senzor HC-SR04 změří vzdálenost k překážce a výsledek vypíše
// do Sériového monitoru. TRIG vyšle ultrazvukový impuls, ECHO změří,
// za jak dlouho se impuls odrazil zpátky.
const int trigPin = 9;
const int echoPin = 10;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
// krátký impuls na TRIG spustí vyslání ultrazvukového pulzu
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// pulseIn() změří délku HIGH pulzu na ECHO v mikrosekundách,
// tedy dobu, za kterou zvuk doletí k překážce a zpět
long doba = pulseIn(echoPin, HIGH);
// rychlost zvuku je přibližně 0,0343 cm/us, dělíme 2,
// protože zvuk urazí vzdálenost k překážce a zpět (tam i zpátky)
float vzdalenost = doba * 0.0343 / 2;
Serial.print("Vzdalenost: ");
Serial.print(vzdalenost);
Serial.println(" cm");
delay(500); // pauza mezi jednotlivými měřeními
}
5. Ovládání servomotoru
// servo_ovladani.ino
// Servomotor SG90 připojený na pin 6 se postupně natáčí
// do tří poloh: 0°, 90° a 180°.
#include <Servo.h> // knihovna pro řízení servomotorů
Servo mujServo; // vytvoření objektu reprezentujícího servomotor
const int servoPin = 6;
void setup() {
mujServo.attach(servoPin); // připojení objektu ke konkrétnímu pinu
}
void loop() {
mujServo.write(0); // natočení hřídele do polohy 0°
delay(1000);
mujServo.write(90); // natočení do střední polohy 90°
delay(1000);
mujServo.write(180); // natočení do polohy 180°
delay(1000);
}
Návrh, tvorba a prezentace programu
- Návrh vlastního programu – určení, jaké senzory a aktuátory úloha vyžaduje, návrh zapojení obvodu (např. do schématu nebo náčrtu breadboardu) a algoritmu chování
- Tvorba programu – zapojení obvodu podle návrhu, napsání sketch v Arduino IDE, nahrání kódu do desky přes USB a postupné testování a odstraňování chyb (mimo jiné pomocí výpisů přes
Serial.println) - Prezentace programu – předvedení funkčního zapojení a programu, vysvětlení použitých komponent (senzorů, aktuátorů), principu činnosti kódu a případných úprav oproti původnímu návrhu