Pauza
Cilj
Cilj vježbe je pojam "pauze", koji će nam pomoći da ostvarimo jednostavno gibanje robota.
Potreba
Vrlo je korisna naredba koja ne radi ništa (pauza) - ali točno određeno vrijeme.
Kad smo ispisivali tekst na ekran, ispis je išao, nepotrebno, jako brzo, red za redom.
Kad je robot došao do prepreke, u zadatku iz prethodne vježbe, nije se okrenuo za 90° ili 180°, jer nismo znali kako to učiniti, nego se okretao dok nije nestalo prepreke.
Da smo tad poznavali naredbu za pauzu, naša bi rješenja bila bolja.
delayMs()
void RobotLine::loop() {
if (front() < 200)
print("Prepreka\n\r");
delayMs(100);
}
Program je vrlo sličan prijašnjem, uz dodanu liniju koja koristi "
delayMs()" funkciju. Njen
parametar (podatak koji šaljemo u funkciju) je
100, broj milisekundi koji program mora čekati.
Rezultat je da će se tekst ispisivati svakih 100 ms, znači 0.1 sekundi. Fizikalno, frekvencija će biti 10 Hz.
Eksperti,
Ako ste koristili Arduino, sigurno ste uočili funkciju "delay()", koja ima istu zadaću kao i naša "delayMs()". Nemojte ju nikad koristiti!
Koja je razlika? "delayMs()" obavlja dodatne zadaće. Glavna je izmjena CAN Bus poruka.
Bez izmjene poruka glavni mikrokontroler prestane dobivati informacije o senzorima i općenito više ne kolaju informacije koje ove poruke prenose.
Okret u mjestu
void RobotLine::loop() {
go(50, 50);
if (front() < 100)
go(50, -50), delayMs(700);
}
Robot će ići ravno (oba motora brzinom 50 naprijed), sve do udaljenost naprijed ("front()") na postane manja od 100. Želimo da se tad okrene za 180° u mjestu.
Dosad smo šutke prelazili preko pojave znaka ";", ali nekako je bilo jasno da je njegova funkcija slična točki na kraju rečenice. Stvarno, u primjerima koje smo imali, to je bilo točno.
Sad se pojavio poznati znak, ali u novom kontekstu: ",". Omogućava nam da napišemo blok (više o bloku u sljedećoj vježbi) od 2 naredbe u jednom redu.
Dakle, nakon što je otkrivena prepreka, logički izraz u "if-u" je postao istina i s izvršavanjem je krenuo blok od 2 naredbe: desni motori su promijenili smjer, robot se počeo okretati u mjestu, nakon čega je nastupila pauza od 700 ms - ali okretanje se nastavilo do kraja pauze. 700 sigurno nije dobar broj. Eksperimentalno utvrdite koji broj je potreban za okret od 180°.
Video
Video prikazuje robota koji izvršava gornji program.
Vrijeme okretanja je malo preveliko pa se okreće preko 180°.
Trebalo bi ga probati skratiti na oko 1800 ms.
Zadatak: cik-cak.
Natjerajte robota da ide cik-cak: ravno, skrene lijevo u mjestu, ravno, skrene desno u mjestu, itd.
Rješenje
void RobotLine::loop() {
go(50, 50);
delayMs(1000);
go(50, -50);
delayMs(200);
go(50, 50);
delayMs(1000);
go(-50, 50);
delayMs(200);
}
Prazne linije su dozvoljene.
- Prve 2 naredbe: ravno 1 sekundu.
- Druge 2 naredbe: okretanje u mjestu udesno 200 ms.
- Treće 2 naredbe: ravno 1 sekundu.
- Četvrte 2 naredbe: okretanje u mjestu ulijevo 200 ms.
Nakon toga "loop" kreće od početka i periodičko gibanje se nastavlja.
Primjedbe
Projekt "Uvod u robotiku" sufinanciran je iz Europskog socijalnog fonda, poziv "Jačanje kapaciteta organizacija civilnoga društva za popularizaciju STEM-a".
Relevantne stranice:
Sadržaj vježbe za virtualne radionice isključiva je odgovornost Hrvatskog društva za robotiku.