Signal uhvaćene lopte
Cilj
Ako je uhvaćena lopta, na displeju 8x8 želimo nacrtati loptu, a ako lopta nije u posjedu, displej treba biti prazan.
Deklaracije
void RobotSoccer::loop() {
if (setup()){
uint8_t red[8];
uint8_t green[8];
}
}
Prvo ćemo spremiti dva znaka u 8x8 displej.
Nakon toga ćemo ih ispisivati prema stanju LED barijere.
Deklarirajmo dvije varijable, koje će spremati crvene i zelene točke.
Prazan displej
void RobotSoccer::loop() {
if (setup()){
uint8_t red[8];
uint8_t green[8];
for (uint8_t i = 0; i < 8; i++)
red[i] = 0, green[i] = 0;
mrm_8x8a->bitmapCustomStore(red, green, 0);
}
}
U "for" petlji spremimo nule u sve elemente oba polja, "red" i "green".
Nakon toga spremimo tako definirani znak u memorije 8x8 displeja na adresu 0.
Budući da su sve nule, neće svijetliti nijedna točka.
Lopta
void RobotSoccer::loop() {
if (setup()){
uint8_t red[8];
uint8_t green[8];
for (uint8_t i = 0; i < 8; i++)
red[i] = 0, green[i] = 0;
mrm_8x8a->bitmapCustomStore(red, green, 0);
green[0] = 0b00000000;
green[1] = 0b00000000;
green[2] = 0b00011000;
green[3] = 0b00111100;
green[4] = 0b00111100;
green[5] = 0b00011000;
green[6] = 0b00000000;
green[7] = 0b00000000;
mrm_8x8a->bitmapCustomStore(red, green, 1);
}
}
Spremimo u "green" jedinice na mjestima gdje želimo upaliti LEDove, u primitivnom prikazu lopte.
Opet spremimo u memoriju 8x8 LEDa, ovaj put na adresu 1.
Detekcija lopte
void RobotSoccer::loop() {
if (setup()){
uint8_t red[8];
uint8_t green[8];
for (uint8_t i = 0; i < 8; i++)
red[i] = 0, green[i] = 0;
mrm_8x8a->bitmapCustomStore(red, green, 0);
green[0] = 0b00000000;
green[1] = 0b00000000;
green[2] = 0b00011000;
green[3] = 0b00111100;
green[4] = 0b00111100;
green[5] = 0b00011000;
green[6] = 0b00000000;
green[7] = 0b00000000;
mrm_8x8a->bitmapCustomStore(red, green, 1);
}
if (barrier())
mrm_8x8a->bitmapCustomStoredDisplay(1);
else
mrm_8x8a->bitmapCustomStoredDisplay(0);
}
Napokon upišimo kod koji ispisuje uhvaćenost lopte.
"if" gleda je li lopta uhvaćena ili nije. Barijera mora biti kalibrirana prema uputama iz vježbe "Kalibracija nogometaša".
Kad je barijera prekinuta, ispisuje se bitmapa na adresi 1, znači lopta.
Ako nije, ispisuje se s adrese 0, znači da se briše ekran.
Video
Prekid barijere.
Zadatak: zadrška.
Recimo da želite bolje uhvatiti kratke prekide barijere. Promijenite program na način da je minimalna duljina prikaza lopte 0.5 sekunde.
Rješenje
void RobotSoccer::loop() {
static uint32_t lastMs;
if (setup()){
uint8_t red[8];
uint8_t green[8];
for (uint8_t i = 0; i < 8; i++)
red[i] = 0, green[i] = 0;
mrm_8x8a->bitmapCustomStore(red, green, 0);
green[0] = 0b00000000;
green[1] = 0b00000000;
green[2] = 0b00011000;
green[3] = 0b00111100;
green[4] = 0b00111100;
green[5] = 0b00011000;
green[6] = 0b00000000;
green[7] = 0b00000000;
mrm_8x8a->bitmapCustomStore(red, green, 1);
lastMs = 0;
}
if (barrier())
lastMs = millis();
if (millis() - lastMs < 500)
mrm_8x8a->bitmapCustomStoredDisplay(1);
else
mrm_8x8a->bitmapCustomStoredDisplay(0);
}
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.