Hodnocení soutěžních úloh

Kategorie programování mikrořadičů

22. dubna 2021

Soutěž v programování – 34. ročník

Krajské kolo 2020/2021

Souboj tlačítek

Na řešení úlohy máte 4 hodiny čistého času.

Pro řešení můžete použít vývojovou platformu s mikrokontrolérem dle své preference (např. Arduino, Raspberry, ESP8266, FRDM, STM32, micro:bit, PicAxe, BASIC Stamp, AVR, PIC …). Pro řešení úlohy budete dále potřebovat:

Vaše řešení nahrávejte do cloudu přístupného na adrese https://svp.proed.cz/

Přihlašovací jméno a heslo jste dostali emailem. Po přihlášení uvidíte složku odpovídající vašemu přihlašovacímu jménu (např. X123) a do ní řešení uložte. Pokud je řešení jedné úlohy složeno z více souborů, doporučujeme je nenahrávat samostatně, ale jako jeden ZIP archiv, jehož jméno odpovídá názvu úlohy (uloha-xyz.zip).

Vaše řešení musíte nahrát do 13:00, pozdější nahrání souborů nebude možné. Doporučujeme proto řešení nahrát s několikaminutovou rezervou. Pokud ve vaší kategorii řešíte více úloh, je vhodné každou úlohu nahrát hned, jak ji dokončíte.

Nahrávejte jak zdrojové kódy vašeho řešení, tak zkompilované spustitelné soubory (pokud to ve vámi používaném programovacím jazyce dává smysl).

Důležitou součástí vašeho řešení je video, které demonstruje funkčnost vašeho řešení. Natočené video nahrejte do cloudu do složky určené pro video (např. X123_video). U této složky bude povolen zápis i po 13:00, takže se nemusíte obávat toho, že se vám objemnější video nestihne nahrát včas.

Součástí vaší práce, a tedy i hodnocení, je vytvoření schématu zapojení vašeho mikrořadiče s periferiemi. Schéma stačí volnou rukou na papír a vyfotit, fotografii přiložit k řešení.

Pro řešení vytvořte vývojový diagram, který zadání řeší na úrovni větvení programu. I vývojový diagram bude součástí hodnocení, ale i ten stačí jen nakreslit na papír a vyfotit, fotografii přiložit k řešení.

U úlohy bude hodnocena i přehlednost zdrojového kódu (vhodné členění zdrojového kódu, vhodně zvolené názvy identifikátorů, komentáře na místech kde je to potřeba, atd.).


Souboj tlačítek

Vaším úkolem je realizovat jednoduchou hru pro dva hráče. Každý hráč má k dispozici své tlačítko. Hráči se snaží co nejrychleji mačkat tlačítko.

Další herní součástí je ručička vychylovaná servomotorkem. Na začátku hry je ručička ve střední poloze (90°), během hry se vychyluje na dvě strany (levá krajní poloha 0°, pravá krajní poloha 180°). Ručička se vychyluje na stranu hráče, který v danou chvíli mačká tlačítko rychleji.

Každý stisk tlačítka vychýlí ručičku směrem k hráči o 1/10 rozsahu pohybu ručičky (od středu do krajní polohy). Hraje-li pouze jeden hráč, po 10 stisknutích tlačítka je tedy ručička na jeho straně.

Cílem hry je překlopit ručičku na své straně do krajní polohy. Tím hra končí.

Další hra začíná poté, co oba hráči (najednou nebo postupně) stisknou své tlačítko. Hra začíná stiskem tlačítka. O začátku hry informují informační diody (viz níže).

Hra má časový limit 20 s. Po celou hru se sčítá levému i pravému hráči počet stisků. Jestliže žádný z nich nedokáže vychýlit ručičku do krajní polohy, vyhrává ten, kdo má více stisků.

Každý hráč má dvě skóre: skóre aktuální hry – počet stisků a celkové skóre – počet vítězství, kterých hráč dosáhl od zapnutí zařízení.

Mají-li levý i pravý hráč po uplynutí časového limitu stejný počet stisků, je hra anulována. Zařízení se chová, jako kdyby ke hře nedošlo; hra se nepřidává do celkového skóre.

Po resetu zařízení se servo přemístí do středové polohy a rozsvítí se zeleně prostřední LED na páse. Stejně se zařízení chová i 5 s po skončení poslední hry nebo po návratu z testovacího režimu (zde se jinak chová pás, viz. dále).

Při čtení stisku tlačítka je vhodné ošetřit zákmity tlačítka.

Informační diody

Každý hráč má na své straně samostatnou diodu. Když se nehraje, je dioda zhasnutá. Během hry svítí ve chvíli, když je ručička na straně hráče (vychýlená směrem od středu ke krajní poloze hráče).

Dále obě tyto diody slouží k odpočtu před začátkem hry – do zahájení hry (stisk obou tlačítek) po dobu 1 s blikají. Ve chvíli, kdy tyto diody zhasnou, hra začíná a počítají se stisky tlačítek. Od zahájení hry se diody chovají tak, jak je popsáno o odstavec výše. Ve chvíli, kdy hra skončí, na straně vítěze se dioda rozbliká a bliká až do zahájení příští hry.

Po zapnutí testovacího režimu obě diody blikají (viz popis testovacího režimu).

Sériová linka

Zařízení komunikuje s počítačem s pomocí sériové linky po celou dobu hry. Do sériové linky zapisuje:

  1. Během hry informaci o počtu sekund, které zbývají – každou 1s počet zbývajících sekund hry.
  2. Po skončení hry vypisujete “Game over”.
  3. Po skončení hry informaci vypište do sériové linky skóre aktuální hry obou hráčů a celkové skóre obou hráčů. Formát můžete zvolit.
  4. Je-li hra anulována kvůli shodnému počtu stisků, zobrazte “Last game ignored”.
  5. Před začátkem další hry (po uplynutí 5 vteřin) zobrazte  “Game ready”. Dále přidejte informaci, že hra začíná stiskem obou tlačítek.
  6. Po stisku obou tlačítek a zahájení hry vypište “Game on”.
  7. Při přechodu do testovacího režimu vypíšete “Debug mode”.

Diodový pás

Diodový pásek slouží k zobrazení dvou informací:

  1. Stav hry pro oba hráče.
  2. Informace o zbývajícím čase.

Pásek je rozdělen na levou a pravou polovinu, prostřední dioda zobrazuje čas. Levému hráči je přidělena modrá barva, pravému hráči fialová barva.

Levému hráči svítí v páse vždy nejvýše jedna modrá dioda, její poloha odpovídá poloze ručičky. Pravému hráči svítí v jeho polovině pásu vždy nejvýše jedna dioda fialově, poloha diody odpovídá poloze ručičky. Dioda se pohybuje v obou případech od středu pásu k okraji, střed odpovídá středové poloze ručičky, kraj mezní poloze ručičky servomotoru. Chování pásu je zakresleno v obrázku.

Chování diodového pásu

Čím blíže je rozsvícená dioda ke kraji pásu, tím vyšší je jas diody. Celkový počet diod záleží na vaší volbě a délce vašeho pásu, minimální počet je alespoň 5 pro každou stranu.

Středová dioda slouží k zobrazení informace o zbývajícím čase. Na začátku hry svítí jasně zeleně, během hry přechází plynule do červené, 5 s před koncem hry svítí jasně červeně. Posledních 5 vteřin dioda bliká (nejméně 3x za vteřinu).

Celkem tedy na páse využijete nejméně 11 diod (minimálně 5 vlevo, 1 střed, minimálně 5 vpravo).

Testovací režim

Zařízení může kromě režimu, v němž se hraje (režim hry), pracovat také v testovacím režimu. Přepnutí do testovacího režimu se dělá polohovým přepínačem: jedna poloha přepínače odpovídá režimu hry, druhá poloha režimu testování. Testovací režim se tedy ukončí přepnutím přepínače do režimu hry.

Do testovacího režimu je možné se přepnout pouze ve chvíli, když se nehraje. Je-li do polohy pro testovací režim přepnuto během hry, aktivuje se testovací režim až po skončení hry.

Je-li zařízení v režimu testování, informační diody blikají podobně jako světla na železničním přejezdu: když svítí levá, nesvítí pravá a naopak.

V testovacím režimu se poloha ručičky nemění stiskem tlačítek, ale posunem potenciometru. Otočením vlevo vychylujeme ručičku vlevo, otočením vpravo směrem vpravo. Diodový pás reaguje na pohyb ručičky jako při skutečné hře tak, jak je popsáno v kapitole o diodovém pásu. Středová dioda ale barvu nemění – neplyne čas. V testovacím režimu vůbec nesvítí.

Při vstupu do testovacího režimu se do sériové linky napíše zpráva “Debug mode”.

Dokumentace

Váš kód by měl být přehledný a srozumitelný. U jednotlivých funkcí v komentáři stručně popište jejich účel. Dále doplňte svou práci stručným popisem toho, jak je co zapojeno – tedy na jakých portech máte připojena zařízení. Popište, jak řešíte zákmit tlačítek.

Odevzdání

Odevzdáváte zdrojový kód a video natočené podle testovacího scénáře. Video natáčejte maximálně s rozlišením Full-HD. Video se může skládat z více částí, s natáčením videa může pomáhat druhá osoba.

Video můžete komentovat a vysvětlovat, co demonstrujete.

Video je základní podklad pro hodnocení, co není vidět ve videu, za to nedostanete body (s výjimkou bodů, které se týkají zdrojového kódu a dokumentace).

Při demonstraci funkce sériové linky je nutné zabírat také displej počítače s otevřeným terminálem sériové linky. 

Je naprosto nutné dodržet níže předepsaný testovací scénář, jinak vám nemůžeme přidělit správně body. Zachovejte pořadí akcí tak, jak je ve scénáři popsáno.

Maximální délka videa (nebo všech částí v součtu) by měla být zhruba 2 minuty.

Testovací scénář

Ve vašem videu dodržte následující postup:

  1. Úvod – vidíme výpis sériové linky: game ready.
  2. Hra – vyhraje levý na 10 stisků před vypršením časového limitu. Sériová linka ukazuje game on. Potřebujeme vidět diody i pás po dobu hry.
  3. Sériová linka ukáže po skonšení hry "game over"; skóre hry a celkové skóre. Po 5 s se servo vrátí do původní polohy a rozsvítí se zelená LED.
  4. Pauza – demonstrace testovacího režimu:
    1. Aktivace přepínačem.
    2. Sériová linka – debug mode.
    3. Mačkání tlačítek, abychom viděli, že na stisky nyní zařízení nereaguje.
    4. Vychýlit potenciometr do jedné krajní polohy – je vidět pohyb ručičky.
    5. Vychýlit potenciometr do druhé krajní polohy – znovu je vidět správný pohyb ručičky.
    6. Vypnutí přepínačem, návrat do režimu hry: Ručička jde do středové polohy, rozsvítí se zelená LED na páse.
  5. Znovu hra, nyní vyhraje pravý na 10 stisků. I nyní se také kroutí potenciometrem a přepíná přepínač na testovací režim a zde přepínač zůstane (to je během hry ignorováno) a my to potřebujeme vidět.
  6. Po ukončení hry automatické spuštění testovacího režimu – jen je potřeba vidět, že testovací režim nastal a že jej lze přepínačem ukončit.
  7. Poslední hra – simulace reálné hry, ručička se vychyluje náhodně, hraje se na timeout, nikoliv na rozdíl.
    1. Musí být vidět funkce pásu (blikání ke konci hry)
    2. Ukažte sériovou linku (informace o zbývajícím čase)
  8. Hra pro demonstraci "remízy": siskněte vlevo 2x stisk, vpravo 2x stisk. Sériová linka nyní zobrazí – game over; skóre hry a celkové skóre, navíc informaci "Last game ignored".

Hodnocení

Body Za co
2 Hra se spouští stiskem obou tlačítek současným nebo postupným.
1 V úvodu hry se rozsvítí levá dioda, když levý hráč stiskne tlačítko pro zahájení.
1 V úvodu hry se rozsvítí pravá dioda, když pravý hráč stiskne tlačítko pro zahájení.
2 Na začátku nové hry musí být servo ve středové poloze.
1 Na začátku nové hry je prostřední dioda pásu zelená.
2 Před startem hry indikační diody blikají.
1 Sériová linka před startem zobrazuje "Game ready".
1 Po startu hry se v sériové lince zobrazí "Game on".
2 Stisk tlačítka vychýlí indikační diodu v herním režimu.
2 Držení jednoho z tlačítek neznemožní klikání druhého tlačítka.
2 Tlačítka v herním režimu ovlivňují pás LED.
2 Na pásu svítí dioda indikující stav hry (pro levého nebo pravého hráče).
2 Na páse vždy svítí jen dvě diody současně (středová a vítězící hráč).
1 Levý hráč má správnou barvu "své" diody na páse.
1 Pravý hráč má správnou barvu "své" diody na páse.
3 Poloha ručičky na motorku odpovídá stavu LED na pásku.
2 Rozsvícené diody indikující vítěze se na pásu pohybují od středu ke stranám.
2 Levá indikační dioda svítí vždy, když je ručička vychýlena na stranu levého hráče.
2 Tlačítka v herním režimu ovlivňují servo s ručičkou dle zadání.
1 Po 10 stisknutích na levé straně je ručička v levé krajní poloze.
1 Po 10 stisknutích na levé straně svítí nejlevější dioda v pásu.
2 Hra se zastaví, když jeden hráčů vede o deset stisků.
1 Dioda na straně hráče, jenž prohrál, po skončení hry nesvítí.
1 V závěru hry bliká dioda na straně vítěze.
1 Sériová linka zobrazí po skončení hry nápis "Game over".
1 Sériová linka zobrazí po skončení hry skore hry.
1 Sériová linka zobrazí po skončení hry celkové skore od resetu.
1 5 s po skončení hry se ručička vrací do středové polohy.
1 5 s po skončení hry se rozsvítí středová LED pásu zeleně.
2 Po ukončení hry zařízení 5 s nereaguje na stisk tlačítek.
2 Testovací režim lze zapnout přepínačem při čekání na novou hru.
1 Po vstupu do testovacího režimu se servo vychýlí do středové polohy.
1 Při zahájení testovacího režimu zhasne středová LED na páse.
1 Informační diody v testovacím režimu blikají.
1 Informační diody nejen, že blikají, ale navíc v souladu se zadáním svítí jako železniční přejezd (střídají se).
1 V testovacím režimu posun potenciometru vlevo vychýlí ručičku vlevo.
1 V testovacím režimu posun potenciometru vlevo vyvolá pohyb rozsvícené LED na páse vlevo.
1 V testovacím režimu posun potenciometru vpravo vychýlí ručičku vpravo.
1 V testovacím režimu posun potenciometru vpravo vyvolá pohyb rozsvícené LED na páse vpravo.
1 V testovacím režimu je v sériovém portu je rozsvíceno "Debug mode".
1 V testovacím režimu zařízení nereaguje na stisk tlačítek.
1 Testovací režim lze vypnout přepínačem.
1 Po ukončení testovacího režimu přechází zařízení do režimu "čekám na hru".
1 Změna polohy přepínače je během hry ignorována.
1 Během hry je ignorována změna polohy potenciometru.
2 Pravá indikační dioda svítí vždy, když je ručička vychýlena na stranu pravého hráče.
1 Po 10 stisknutích na pravé straně je ručička v pravé krajní poloze.
1 Po 10 stisknutích na pravé straně svítí nejpravější dioda v pásu.
1 Sériová linka zobrazuje uplynulý počet sekund hry.
1 Po ukončení hry přechází zařízení do testovacího režimu; má-li v této poloze přepínač.
2 Středová LED pásu během hry správně mění barvu podle času.
2 Středová LED pásu před koncem hry bliká červeně.
2 Středová LED pásu těsně před skončením hry červeně svítí.
2 Hra je ukončena po vypršení časového limitu (20 s).
1 Po remíze (stejný počet stisků na obou stranách) sériová linka zobrazí celkové skore a skore hry.
1 Sériová linka v případě remízy zobrazí "Game ignored".
3 Součástí odevzdané úlohy je i vývojový diagram zachycující strukturu programu.
1 Ve videu je přehledně vidět zapojení kabelů a lze poznat detailnější zapojení.
1 Video se netřese a přesně odpovídá pokynům testovacího scénáře.
1 Video je srozumitelně komentováno.
1 Video je maximálne v rozlišení FullHD.
2 V dokumentaci je popsáno, co je připojeno na jakém portu.
1 Součástí dokumentace je i vývojový diagram.
1 Kód obsahuje stručné komentáře s vysvětlením účelu u podporogramů.
1 Podprogramy a proměnné jsou pojmenovány podle své funkce a kód je tím srozumitený.
1 V dokumentaci je popsáno, jak je řešen zákmit tlačítek.
3 Zákmit tlačítek je v kódu ošetřen.
2 Pro zpracování signálu z tlačítek je užito přerušení.