Prekidač
Cilj
Tipkalo omogućava brže pokretanje i zaustavljanje robota.
Slobodna tipka
// Set buttons' actions.
mrm_8x8a->actionSet(actionRCJLine, 0); // Button 0 starts RCJ Line.
mrm_8x8a->actionSet(_actionLoop, 1); // Button 1 starts user ...
//mrm_8x8a->actionSet(actionEvacuationZone, 2); // Button 2 starts
mrm_8x8a->actionSet(actionStop, 3); // Stop the robot
Postoji više vrsta tipkala u našem robotu. U ovoj vježbi ćemo koristiti tipkalo pored 8x8 displeja. Uočimo ih 4. Pored svakog je broj: "SW1", "SW2",...
Pronađimo prvo slobodnu tipku. Tipke dobivaju svoje trajne funkcije u "mrm-robot-line.cpp" dijelu koda koji se izvršava uvijek na početku. Nađimo prvo taj dio, npr. putem Ctrl-F pa upisom "
mrm_8x8a->actionSet(" u tražilicu, bez navodnika.
4 su linije. Svaka definira jednu tipku. Ako je linija komentirana, tipka se ne definira i ostaje slobodna. U našem primjeru je slobodna tipka broj 2 (3. tipka jer brojanje počinje od 0).
Želimo li osloboditi neku drugu tipku, upišemo "//" na početak linije, komentirajući ju. Na taj način naredba neće biti izvršena i tipka će ostati slobodna.
U loop-u
void RobotLine::loop() {
if (button(2))
print("Da\n\r");
else
print("Ne\n\r");
}
Za ovu vježbu se preporuča staviti robota na neku podlogu, tako da se kotači slobodno okreću u zraku, a robot se ne pokreće. Na taj je način lakše pritisnuti tipku.
Upišimo kod s lijeve strane u funkciju loop. Pokrenimo program.
Rezultat će biti ispisano "Da", ako je 3. tipkalo pritisnuto, "Ne" ako nije.
button(2) vreća istiniti rezultat kad je tipkalo pritisnuto, neistiniti kad nije. Posljedično, "if" izvršava prvi ili drugi red.
Eksperti,
Stanje robota
void RobotLine::loop() {
static bool started;
if (setup())
started = false;
if (digitalRead(27))
started = !started;
}
U ovom primjeru imamo varijablu "started", koja se na početku programa postavi na vrijednost "false".
Svakim pritiskom na tipkalo će promijeniti stanje: "true" u "false" ili "false" u "true". "!" znači "ne", suprotno od postojeće vrijednosti.
Recimo, ako želite pokrenuti robota pritiskom na tipku. sljedećim pritiskom ga zaustaviti, opet pokrenuti,... ovo je rješenje. Kad je started "true", robot ide, kad je "false" ne ide. Bistabilno stanje.
void RobotLine::loop() {
static bool started;
if (setup())
started = false;
if (digitalRead(27))
started = !started;
if (started)
runRobot();
else
stopRobot();
}
Npr., ako imate 2 funkcije, jednu koja tjera robota da vrši koristan rad ("runRobot") i drugu koja ga održava u stanju mirovanja ("stopRobot"), možete ih pokrenuti na način lijevo.
Zadatak: pauza u radu motora.
Pokrenite motore. Ako pritisnete tipkalo broj 3, motori trebaju stati i ostati u tom stanju, sve dok je tipkalo pritisnuto. Kad ga otpustite, motori trebaju opet krenuti.
Rješenje
void RobotLine::loop() {
if (button(2))
stop();
else
go(50, 50);
}
Prilikom starta
void RobotLine::loop() {
// Set buttons' actions.
mrm_8x8a->actionSet(actionRCJLine, 0); // Button 0 starts RCJ Line.
mrm_8x8a->actionSet(_actionLoop, 1); // Button 1 starts user ...
//mrm_8x8a->actionSet(actionEvacuationZone, 2); // Button 2 starts
mrm_8x8a->actionSet(actionStop, 3); // Stop the robot
}
Vratimo se na kod s početka vježbe. Na ovom se mjestu može definirati svaka od 4 tipke na način da pokreće bilo koju funkciju.
Još nećemo proučavati kako jer nem fali znanje iz jedne od sljedećih vježbi, ali možemo koristiti što je već programirano. Pogledajmo kako su sad definirane tipke:
- Prva linija pokreće funkciju "rcjLine()" u "mrm-robot-line.cpp" koja je zamišljena za pokretanje robota. Možete ju slobodno koristiti na isti način na koji koristite "loop()". Obrišete postojeći sadržaj i upišete svoj.
- Druga linija pokreće "loop()".
- Treća pokreće "evacuationZone()", još jednu funkciju čije tijelo (sve unutar vitičastih zagrada) možete obrisati i napisati svoje. Namijenjena je kretanju robota u zoni evakuacije.
- Četvrta zaustavlja motore.
Pričekajte, doći će na red vježbe u kojoj ćemo opisati strukturu programa pa će tad postati jasno kako koristiti tipkala u općem slučaju.
Eksperti,
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.