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

Natjecanje - Dvostruka Formula 1

Cilj

Utrka na stazi oblika osmice između 2 robota.

Arena

×
Postavite sve ove spojnice.

Rasporedite ih na približnu udaljenost od 30 cm. Ne treba biti točno.
×
Postavite ploče.
×
Postavite gornje dijelove 9 spojnica.
×
Postavite aluminijske stupove.
×
Postavite 9 spojnica međukatova.
×
Postavite ploče mosta.
×
Natječu se 2 robota.

Roboti mogu biti autonomni ili upravljani iz daljine, po želji.

Utrka traje 3 kruga. Pobjeđuje brži.

Ako jedan robot siđe cijeli van crte, protivnik pobjeđuje.

Dodatni zadaci

Proširimo zadatak novim zahvjetima:
  • Roboti kreću s platoa i idu 2 kruga. Nakon 2. moraju sami stati na platou.
  • Na 8x8 displeju moraju ispisivati koji krug voze (1. ili 2.).
  • Na kraju moraju na mobitelu ispisati ukupno vrijeme u ms.
  • Kad stanu, na 8x8 displeju moraju ispisati "Stop".

Varijable

Kod za praćenje linije nađite u prethodnim vježbama i upišite ga umjesto "...".

Budući da je robot na platou, prvo će ići ravno, pa nizbrdo, ravno i na kraju uzbrdo.

Tako je gotov cijeli ciklus i na temelju toga ćemo brojati krugove.

Trebamo deklarirati varijablu tipa "bool" (2 vrijednosti), koja označava da smo bili na uzbrdici, i na početku je postaviti na "false" (nismo).

U slučaju da još nismo bili na uzbrdici ("not up") i ako je uzbrdica ("pitch() < -10"), postavimo da je "up" "true" (bili smo na uzbrdici).

U protivnom, ako ovo gore nije zadovoljeno, provjerimo još jesmo li na ravnom (plato). Ako jesmo, opet postavimo da je "up" "false", kako bismo mogli brojati sljedeći krug.

Naravno, ovaj kod neće raditi ništa korisno. Na vama je da upišete ostatak, u principu nešto što treba obaviti nakon što je "up" postavljen na "true", a još nije na "false".

Krugovi

Potrebno je uvesti brojač krugova.

U našem slučaju su samo 2 kruga, ali mogli bismo kasnije tražiti da utrka traje 5 krugova, pa nam treba još jedan varijabla, koja će biti cjelobrojna - "roundCount".

U prvom prolazu kroz funkciju postavimo brojač na 1 (prvi krug).

Svaki put kad dođemo na visoravan, povećamo ga za 1 ("roundCount++").

Stop

Sljedeći cilj je stati nakon 2. kruga.

U tu svrhu trebamo jedan "if" koji zaustavi kretanje kad je "roundCount" veći ili jednak 2.

Displej

Koristimo 8x8 displej za ispis kruga.

Na početku ispišemo 1 (display("1")).

Nakon toga, svaki put kad povećamo broj kruga, to odmah ispišemo.

Još nismo naučili kako ispisati broj na displej. Ispisivali smo bitmape (slike) i tekst, ali brojeve ne.

Ovo je način:
char buffer [33];
itoa(roundCount, buffer, 10);
display(buffer);
Nećemo detaljno objašnjavati zašto je to tako. Ukratko, za napredne, "buffer" je varijabla, koja sadrži slova (znakove), koja može primiti 33 znaka.

"itoa" je funkcija koja upisuje broj ("roundCount") u tu varijablu, koju potom ispišemo.

Vrijeme

Još nam je preostao ispis vremena na kraju.

Trebat će nam jedna varijabla koja prihvaća vrlo velike cijele brojeve (tip uint32_t), koju ćemo nazvati "startMs", za pamćenje broja milisekundi na početku.

Trenutni broj milisekundi daje funkcija millis() pa isti spremimo u gornju varijablu kad program prvi put prođe kroz našu funkciju.

Na kraju ćemo ispisati razliku trenutnog broja milisekundi i "startMs".

Cijelo rješenje

Video

Djeca vježbaju na areni.

3D

Na ovom linku možete pogledati 3D vizualizaciju modela i cijeloga ga otvoriti u Autodesk Fusion 360 programu.

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.