← IT

Robotika a mikropočítače

Doplněný obsah — není z archivu podkladů, napsáno podle ŠVP. Vhodné ověřit u vyučujícího.

LEGO Mindstorms

Základní pojmy

Části stavebnice EV3

Vývojové prostředí a princip blokového programování

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ů

Návrh, tvorba a prezentace programu

Arduino

Základní pojmy

Části soupravy

Vývojové prostředí a programovací jazyk

Programování vstupů a výstupů

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