Hrvatsko društvo za robotiku - Uvod u robotiku - vježbe

Istovremenost i varijable

Cilj

Kako držati oko na jednom događaju za vrijeme zbivanja drugog. Primjer programske logike koju ćemo često koristiti.

Varijable

Vještim izborom primjera dosad nismo imali potrebu koristiti "varijable". Za sljedeći će program biti neophodne.

Varijable su spremišta. Često u programu na neki način dođemo do veličine, npr. broja, izračunom ili učitavanjem vrijednosti senzora, ali nam ta vrijednost ne treba odmah, nego kasnije. Najbolje što možemo je spremiti veličinu i kasnije se u programu prisjetiti koja je bila vrijednost. Eto, to radi varijabla.

Kako postoje razne stvari koje možemo spremati (npr. slova, tekst, cijeli brojevi, decimalni brojevi, slike), tako i varijabli ima raznih. Nećemo ih u ovom času navoditi, nego ćemo uvoditi nove tipove kako nam budu zatrebali.

Eksperti,

Program

void RobotLine::loop() {
	static uint32_t ms = millis();
	if (millis() - ms < 10000)
		if (button(2))
			print("Da");
}

U vježbi s pauzom smo naučili kako pauzirati program. Nevolja je s tim rješenjem da tokom pauze ne možemo obavljati druge radnje, a vrlo često bismo htjeli. Npr. provjeravati stanje senzora.

Mikrokontroleri obično ne mogu izvršavati više akcija odjednom, ali postoje trikovi kako da izvršavaju približno istovremeno. U našem slučaju ćemo, tokom prvih 10 sekundi rada, svako malo provjeravati stanje tipkala. Ako bude pritisnuto, ispisat ćemo poruku.

Pogledajmo lijevi program i njegove novosti.
  • Najteži dio je static uint32_t. U skladu s našom dosadašnjom praksom, nećemo detaljno proučavati zašto to tako piše, nego pogledati koji će biti efekt. Kratko objašnjenje bi bilo da će uint32_t rezervirati mjesto za vrlo dugački cijeli broj, varijablu, koju ćemo nazvati kako želimo. Ime varijable mora ići odmah nakon toga. Mi smo ju nazvali "ms", a mogli smo i "pocetak" ili nekako drugačije.

    Na samom početku je riječ static. Ovaj prefiks kaže da će ta varijabla poprimiti vrijednost koja slijedi iza "=" samo kad ju program prvi put izvrši.

    Recimo da je "loop()" prvi put izvršen u trenutku kad je vrijeme bilo 1400 ms. Varijabla "ms" će spremiti vrijednost 1400. Recimo da je sljedeći prolazak kroz "loop()" u 1437 ms. Ovaj put program neće spremiti 1437, nego će vrijednost "ms" i dalje ostati 1400. Kad ne bi bilo "static", "ms" bi postao 1437.

    Drugim riječima, "ms" će zapamtiti kad smo prvi put ušli u "loop()". To je trenutak od kojeg želimo štopati 10 sec. ili 10000 ms.

    Pazite! "static" djeluje kad program prvi put prođe kroz funkciju. Ako funkciju dva puta pokrenete iz menija, drugi put se vrijednost neće postaviti na početnu! Da biste to postigli, morate isključiti i uključiti robota. Želite li bolje rješenje, pogledajte napredniju vježbu "Priprema".
  • Slijedi "if", u kojem provjeravamo koliko je vremena prošlo od prvog pokretanja "loop()" (razlika sadašnjeg vremena u ms i početnog). Dok god je taj broj manji od 10000, "if" će izvršavati naredbu koja slijedi, znači provjeriti stanje tipkala.
Ovaj ćemo koncept često koristiti.

Eksperti,

Zadatak: izmjenični ispis.

Neka "loop()" naizmjence ispisuje "da" i "ne" u svakom prolazu.

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.