Lekce 4 - Motory¤
V této lekci si vyzkoušíme točit motory a pohybovat robotem.
Položme si Robůtka na něco tak, aby se kola nedotýkala země a mohla se volně točit - tak můžeme kód otestovat bez toho, aby Robůtek sjel ze stolu.
Vytvoříme si nový projekt z odkazu na prázdný projekt:
https://robutek.robotikabrno.cz/v2/robot/blank_project.tar.gz
import { createRobutek } from "./libs/robutek.js";
import * as colors from "./libs/colors.js";
import * as gpio from "gpio";
import { SmartLed, LED_WS2812B } from "smartled";
const robutek = createRobutek("V2");
To je dobrý začátek - pokračujme na konci souboru.
Async main funkce¤
Motory jsou tzv. asynchroní, to znamená, že se ovládají příkazem, který může trvat delší dobu, než se vykoná (například "ujeď 50cm" bude trvat několik vteřin).
Abychom mohli motory používat, je třeba přidat tuto "kostru" s async function()
. Klidně ji zkopírujme, patří na konec souboru src/index.ts
.
async function main() {
// Tady bude kód na ovládání motorů
}
main().catch(console.error);
Řízení motorů¤
Ježdění má tři části - nastavení rychlosti, rampy, a samotný pohyb:
robutek.setSpeed(SPEED)
– SPEED je rychlost pohybu v milimetrech za vteřinu, na Robůtkovi v rozsahu od -1200 do 1200 (záporné číslo znamená jízdu dozadu, s výjimkou pohybu na vzdálenost, kde se couvání zadává zápornou vzdáleností).robutek.setRamp(ACCEL)
– ACCEL je číslo udávající zrychlení Robůtka v mm/s². V případě, že je rovna nule, je zrychlení okamžité.await robutek.move(CURVE, { distance: DISTANCE })
- CURVE je desetinné číslo od -1 do 1, kdy
- -1 je znamená otáčení na místě doleva,
- 0 je rovně a
- 1 je otáčení doprava.
- Čísla mezi znači jízdu po oblouku s různým poloměrem.
- DISTANCE značí ujetou vzdálenost v milimetrech
- CURVE je desetinné číslo od -1 do 1, kdy
await robutek.move(CURVE, { time: TIME })
– TIME je čas v milisekundách, po který má robot jet.robutek.move(CURVE)
– Robůtek pojede neomezeně dlouho, dokud ho nezastavíme pomocí příkazurobutek.stop()
.
Zadávání parametrů rychlosti a rampy není potřeba opakovat při každém pohybu - knihovna si hodnotu pamatuje a při dalším volání funkce
move
ji použije.
Rychlost je možné měnit i během jízdy, pomocí příkazu robutek.setSpeed
. Příkazem robutek.move(CURVE)
je také možné měnit směr jízdy, aniž by bylo nutné zastavovat Robůtka.
Příklad¤
Operace s motorky píšeme do asynchroních funkcí, často do funkce main()
async function main() {
robutek.setSpeed(100); // Nastav rychlost na 100 mm/s
robutek.setRamp(2000); // Nastav zrychlení na 2000 mm/s^2
await robutek.move(0, { distance: 100 }); // Ujeď 100 mm == 10 cm
}
main().catch(console.error);
Úkol: Zkus přidat kód, aby Robůtek dojel zase zpátky na stejné místo
Řešení
await robutek.move(0, { distance: -100 }) // Ujeď -100 mm == -10 cm
Otáčení¤
Na otáčení má Robůtek připravenou funkci:
await robutek.rotate(ANGLE)
- Otočí Robůtka o ANGLE stupňů rychlostí nastavenou přesrobutek.setSpeed
. Může být záporné číslo.
Úkol¤
Napiš program tak, aby Robůtek popojel 10cm dopředu, otočil se čelem vzad (180 stupňů), a popojel zpátky na původní místo.
Řešení
import { createRobutek } from "./libs/robutek.js";
const robutek = createRobutek("V2");
async function main() {
// Tady bude kód na ovládání motorů
robutek.setSpeed(100); // Nastav rychlost na 100 mm/s
robutek.setRamp(2000); // Nastav zrychlení na 2000 mm/s^2
await robutek.move(0, { distance: 100 }); // Ujeď 10 cm
await robutek.rotate(180); // Otoč se o 180 stupňů
await robutek.move(0, { distance: 100 }); // Ujeď 10 cm
}
main().catch(console.error);
Tvary¤
Kombinováním robutek.move
a robutek.rotate
můžeš s Robůtkem "vyjezdit" různé tvary. Tento program s robotkem vyjezdí čtverec.
import { createRobutek } from "./libs/robutek.js";
const robutek = createRobutek("V2");
async function main() {
// Tady bude kód na ovládání motorů
robutek.setSpeed(100); // Nastav rychlost na 100 mm/s
await robutek.move(0, { distance: 300 }); // Ujeď 30 cm
await robutek.rotate(90);
await robutek.move(0, { distance: 300 });
await robutek.rotate(90);
await robutek.move(0, { distance: 300 });
await robutek.rotate(90);
await robutek.move(0, { distance: 300 });
await robutek.rotate(90);
}
main().catch(console.error);
Výstupní úkol V1¤
Napiš program tak, aby robotek vyjezdil šestiúhelník.
Výstupní úkol V2¤
Napiš program tak, aby robot vyjezdil kruh.