Lekce 5 - Servo (Kreslení tužkou)¤
Abychom mohli používat servo, musíme ho inicializovat. K tomu slouží příkaz const servo = new Servo(SERVO_PIN, 1, 4)
. Parametr SERVO_PIN
specifikuje, ne který pin je servo připojeno.
import { Servo } from "./libs/servo.js";
import { createRobutek } from "./libs/robutek.js";
const robutek = createRobutek("V2");
// robutek.Pins.Servo2 je pin 38
const servo = new Servo(robutek.Pins.Servo2, 1, 4);
Na nastavení pozice serva používáme funkci write(POSITION)
. Parametr POSITION
je číslo od 0 do 1023. Specifikuje úhel, na který se má servo otočit.
servo.write(0); // 0°
servo.write(512); // 90°
servo.write(1023); // 180°
Pro konverzi úhlu na číslo musíte úhel vynásobit 1024 a vydělit 180
Kreslení tužkou¤
Tím, že zvedáme nebo pokládáme servo, můžeme ovládat připevněnou tužku.
Abychom si nemuseli pamatovat konkrétní hodnoty pro zvedání tužky, Robůtek má 3 předdefinované konstaty pro ovládání: Up
, Down
a Unload
.
Pokud bychom do něj dávali různé druhy tužek, můžeme si samozřejmě nadefinovat vlastní.
Aby ovládací konstanty fungovaly, musí být pacička nasazena ve spravné pozici. Proto musíme servo programem otočit na 0° a pacičku nasadit tak, aby směřovala přímo vzhůru.
import { createRobutek } from "./libs/robutek.js";
import { Servo } from "./libs/servo.js";
const robutek = createRobutek("V2");
const servo = new Servo(robutek.Pins.Servo2, 1, 4);
servo.write(0);
Jakmile mamé pacičku správně nastavenou, můžeme na ni nasadit fixu.
Teď už máme všechno připraveno, takže můžeme kreslit.
Na nastavení pozice tužky zase použijeme funkci write(POSITION)
. Místo čísla 0-1023
ale do parametru POSITION
vložíme jednu z konstant Up
, Down
a Unload
.
import { Servo } from "./libs/servo.js";
import { createRobutek } from "./libs/robutek.js";
const robutek = createRobutek("V2");
const pen = new Servo(robutek.Pins.Servo2, 1, 4); // robutek.Pins.Servo2 je pin 38
// Začne kreslit
pen.write(robutek.PenPos.Down);
// Přestane kreslit
pen.write(robutek.PenPos.Up);
// Vytáhne tužku
pen.write(robutek.PenPos.Unload);
Neočekávaný výsledek
Pokud tento program zpustíme, zjistíme, že se provede pouze poslední write
. Program totiž nečeká na dokončení pohybu, ale příkazy pošle okamžitě po sobě. Servo pak provede pouze poslední přijatý příkaz, z našeho pohledu tedy pohyb na pozici Unload
. V běžném programu to však nebude problém, jelikož mezi příkazy write budeme provádět i jiné příkazy, jako třeba příkaz move
, u kterých program čeká na dokoncčení.
Zadání A¤
Vytvořte program, který při zmáčknutí tlačítka zasune pero a druhé tlačítko, které ho vysune.
Řešení
import { Servo } from "./libs/servo.js";
import * as gpio from "gpio";
import { createRobutek } from "./libs/robutek.js";
const robutek = createRobutek("V2");
gpio.pinMode(robutek.Pins.ButtonLeft, gpio.PinMode.INPUT);
gpio.pinMode(robutek.Pins.ButtonRight, gpio.PinMode.INPUT);
const pen = new Servo(robutek.Pins.Servo2, 1, 4);
gpio.on("falling", robutek.Pins.ButtonLeft, () => {
pen.write(robutek.PenPos.Down);
});
gpio.on("falling", robutek.Pins.ButtonRight, () => {
pen.write(robutek.PenPos.Up);
});
Zadání B¤
Zkombinuj poznatky z lekce 4 s touto a vytvoř program, který po stistku tlačítka nakreslí fixou na papír čtverec.
Řešení
import { Servo } from "./libs/servo.js"
import \* as gpio from "gpio"
import { createRobutek } from "./libs/robutek.js"
const robutek = createRobutek("V2");
const LBTN_PIN = 2;
const RBTN_PIN = 0;
gpio.pinMode(LBTN_PIN, gpio.PinMode.INPUT);
gpio.pinMode(RBTN_PIN, gpio.PinMode.INPUT);
const pen = new Servo(robutek.Pins.Servo2, 1, 4);
gpio.on("falling", LBTN_PIN, async () => {
pen.write(robutek.PenPos.Down); // fixa dolů
robutek.setSpeed(100) // Nastav rychlost na 100
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)
pen.write(robutek.PenPos.Up); // fixa nahoru
});
Výstupní ukol V1¤
Př stisknutí jednoho tlačítka vykreslí Robůtek kruh, při stisknutí druhého vykreslí trojúhelník.
Výstupní úkol V1¤
Při stisknutí jednoho tlačítka vykreslí Robůtek první písemeno vašeho jméno, při stisku druhého tlačítka první písmeno vašeho příjmení.