Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:agrigore:snake [2021/05/26 18:17]
george.bukkosi
pm:prj2021:agrigore:snake [2021/05/31 10:46] (current)
george.bukkosi [Hardware Design]
Line 29: Line 29:
  
 {{ snake.png }} {{ snake.png }}
 +
 +
 +Componentele conectate arata astfel:
 +
 +
 +{{ hardwaredesignscaleddown.jpg }}
 +
 +
 +{{ conectarelcd_50.jpeg }}
 +
 +
 +Schema electrica este urmatoarea:
 +
 +{{ schemasnake.png }}
 +
 +Configurarea pinilor este urmatoarea:
 +
 +Butoane -> Arduino:
 +
 +  * Buton1 -> D2
 +  * Buton2 -> D3
 +  * Buton3 -> D4
 +  * Buton4 -> D5
 +  * Buton5 -> D6
 +
 +LCD -> Arduino:
 +
 +  * GND-> GND
 +  * VCC -> 5V
 +  * RS -> D10
 +  * R/W -> D11
 +  * E -> D13
 +  * PSB -> GND
 +  * RST -> D8
 +  * BLA -> 3.3V
 +  * BLK -> GND
 +
  
 ====== Software Design ====== ====== Software Design ======
 +
 +Biblioteci utilizate:
 +
 +  * U8g2lib.h
 +  * ArduinoQueue.h
 +  * stdlib.h
 +
 +Mediul de dezvoltare utilizat a fost Arduino IDE.
 +
 +Am folosit o coada (din biblioteca ArduinoQueue.h) pentru a stoca pozitiile sarpelui. Pozitia sa initiala este aleator generata. Fiecare patratel din corpul sarpelui are asociata cate o pozitie (x,y) a coltului stanga sus. La afisarea pe ecran se foloseste functia u8g2.drawBox(),​ care ia ca parametru coltul din stanga sus si size-ul laturii in pixeli. Pentru pozitie am creat structura Position, ce are x si y. De fiecare data cand sarpele creste, o noua pozitie este adaugata in coada. ​
 +
 +Deoarece update-ul sarpelui vrem sa il facem independent de functia de loop() care se acceseaza de foarte multe ori pe secunda (la frecventa procesorului arduino), functia updateSnake() va fi apelata doar cand a trecut suficient timp (care este considerat variabila "​speed",​ deoarece modificarea sa creeaza iluzia de viteza marita a sarpelui cu cat se avanseaza in dificultate). Update-ul sarpelui la fiecare "​frame"​ se face in functie de doua detalii: directia in care se merge si daca sarpele a mancat sau nu. Miscarea sarpelui se realizeaza prin randarea pe directia corespunzatoare a unui patratel in fata corpului deja existent si stergerea unuia de la coada. In cazul in care se intampla ca sarpele sa fi si mancat la acel frame, se randeaza doua patratele la cap. 
 +
 +De asemenea, la fiecare apelare a loop-ului se verifica daca exista un bait generat, iar daca nu este, se genereaza la o pozitie aleatoare pe ecran. Input-ul va fi considerat si updatat la fiecare loop(), nu la fiecare "​frame",​ pentru o actualizare cat mai precisa. In cazul in care nu s-a modificat directia, se va intra in loop() cu directia anterior setata.
 +
 +Functia isSnakeCollision() verifica daca sarpele are o coliziune cu el insusi si intoarce un flag, care este verificat la fiecare loop().
 +
 +
 ====== Demo ====== ====== Demo ======
  
-[[http://​youtube.com/​|Demonstratie ​video]]+Se poate observa cum sarpele castiga in lungime si capata viteza cu cat mananca mai mult. De asemenea, se poate vedea ca atunci cand acesta se mananca pe sine sau iese din ecran, jocul se sfarseste si se afiseaza punctajul obtinut de jucator pentru runda respectiva. 
 + 
 + 
 +[[https://www.youtube.com/​watch?​v=mEPqu4qxyvI|Demo video]]
 ====== Rezultate Obţinute ====== ====== Rezultate Obţinute ======
  
Line 41: Line 99:
 Am invatat sa ma documentez despre conectarea pieselor cu Arduino (in cazul de fata display-ul ST7920) si citirea inputului generat de butoanele conectate la breadboard. De asemenea, lucrul cu IDE-ul oferit de Arduino a fost o experienta placuta, iar afisarea pe display a reprezentat un mic challenge ce a necesitat de asemenea documentare. Am invatat sa ma documentez despre conectarea pieselor cu Arduino (in cazul de fata display-ul ST7920) si citirea inputului generat de butoanele conectate la breadboard. De asemenea, lucrul cu IDE-ul oferit de Arduino a fost o experienta placuta, iar afisarea pe display a reprezentat un mic challenge ce a necesitat de asemenea documentare.
 ====== Download ====== ====== Download ======
-[[http://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​agrigore/​snake?​do=export_pdf|Descarca ​PDF]]+<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ 
 + 
 + 
 +Download arhiva (cod+documentatie wiki): 
 +{{ bukkosigeorgedaniel_proiectpm.zip }}
 ====== Jurnal ====== ====== Jurnal ======
  
Line 51: Line 113:
   * **14 mai** -- Finalizare implementare software   * **14 mai** -- Finalizare implementare software
   * **26 mai** -- Realizare video demo   * **26 mai** -- Realizare video demo
-  * **TBD** -- Realizare schema electrica+  * **27 mai** -- Realizare schema electrica 
 +  * **31 mai** -- Update final wiki si upload proiect
   * **31 mai** -- Prezentarea proiectului la laborator   * **31 mai** -- Prezentarea proiectului la laborator
  
Line 61: Line 124:
   * https://​github.com/​olikraus/​u8g2 (u8g2 library for ST7920 display)   * https://​github.com/​olikraus/​u8g2 (u8g2 library for ST7920 display)
   * https://​github.com/​EinarArnason/​ArduinoQueue (ArduinoQueue)   * https://​github.com/​EinarArnason/​ArduinoQueue (ArduinoQueue)
 +  * https://​www.arduino.cc/​reference/​en/​language/​functions/​time/​millis/​ ("​framing"​ system)
  
  
  
pm/prj2021/agrigore/snake.1622042276.txt.gz · Last modified: 2021/05/26 18:17 by george.bukkosi
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0