Differences

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

Link to this comparison view

pm:prj2025:avaduva:darius.ignatescu [2025/05/18 12:31]
darius.ignatescu [Descriere functionalitate hardware]
pm:prj2025:avaduva:darius.ignatescu [2025/05/25 08:13] (current)
darius.ignatescu [Demo video proiect cu explicatii]
Line 15: Line 15:
 În fiecare gaură poate apărea, la întâmplare,​ un „vierme”  ​ În fiecare gaură poate apărea, la întâmplare,​ un „vierme”  ​
  
-Viermele apare doar pentru o perioadă scurtă ​( 1 secunda ), apoi dispare. ​+Viermele apare doar pentru o perioadă scurtă , apoi dispare. ​
  
 Jucatorul ​ trebuie să fie rapid și atent, să „loveasca” sau să atinga gaura exact atunci când viermele apare. ​ Jucatorul ​ trebuie să fie rapid și atent, să „loveasca” sau să atinga gaura exact atunci când viermele apare. ​
Line 28: Line 28:
 Gradul de dificultate poate fi crescut sau scazut prin modificarea frecventei cu care apare viermele. ​ Gradul de dificultate poate fi crescut sau scazut prin modificarea frecventei cu care apare viermele. ​
  
-  
  
 Modul de realizare ​ Modul de realizare ​
Line 36: Line 35:
 Laboratorul 2- Intreruperi,​ rutine de tratare a intreruperilo ​ Laboratorul 2- Intreruperi,​ rutine de tratare a intreruperilo ​
  
-Laboratorul 3 - Lucru cu timere+Laboratorul 3 - Lucru cu timere; PWM
  
-Laboratorul 4- Utilizarea conversiei analog-dugitala, ​+Laboratorul 4- Utilizarea conversiei analog-digitala
  
 Laborator 5 - Utilizarea comunicatiei cu un periferic prin intermediul protocolului SPI.  Laborator 5 - Utilizarea comunicatiei cu un periferic prin intermediul protocolului SPI. 
Line 44: Line 43:
    
  
-Placa de dezvoltare Arduino comanda ​ aleatoriu 4 servomotoare ​ prin intermediul a 2 drivere cu 2 canale ​care simuleaza iesirea din gaura a viermelui. ​+Placa de dezvoltare Arduino comanda ​ aleatoriu 4 servomotoare care simuleaza iesirea din gaura a viermelui. ​
  
-Viteza cu care este generata comanda de iesire a viermelui este variabila fiind reglata cu un potentiometru. Tensiunea variabila dependenta de pozitia cursorului potentiometrului ​ este folosita de convertorul analog digital al microcontrolerului ​ care va seta prescalarul ​ ce  da intreruperea folosita la comanda servomotoarelor. ​+Viteza cu care este generata comanda de iesire a viermelui este variabila fiind reglata cu un potentiometru. Tensiunea variabila dependenta de pozitia cursorului potentiometrului ​ este folosita de convertorul analog digital al microcontrolerului ​ care va seta prescalarul ce da intreruperea folosita la comanda servomotoarelor. ​
  
-Starile ​ de apasat sau neapasat a celor 4 butoane sunt  folosite ca semnale de intrare si daca este coincidenta intre apasare si aparitie se incrementeaza un contor.  +Starile ​ de apasat sau neapasat a celor 4 butoane sunt folosite ca semnale de intrare si daca este coincidenta intre apasare si aparitie se incrementeaza un contor.  
- + 
-Durata jocului este stabilita prin intermediul unui timer care valideaza selectarea aleatorie a unuia din cele 4 servomotoare . Timerul este declansat de un buton de start. ​+
  
-Numarul de aparitie a viermelui si a numarului ​de reusite se memoreaza . Aceste sunt  prelucrate (se calculeza rata de reusite) si sunt afisate in timp real prin intermediul protocolului SPI la un display  ​+Numarul de aparitii ale viermelui si numarul ​de reusite se memoreaza . Aceste sunt  prelucrate (se calculeza rata de reusite) si sunt afisate in timp real prin intermediul protocolului SPI la un display  ​
 </​note>​ </​note>​
  
Line 86: Line 84:
     * Potentiometru - pentru reglarea vitezei aparitiei viermelui de la 0.5s la 2s; este de tip liniar cu valoarea de 10Kohmi.     * Potentiometru - pentru reglarea vitezei aparitiei viermelui de la 0.5s la 2s; este de tip liniar cu valoarea de 10Kohmi.
     * Displayul este tip LCD de 1.8 inch cu rezolutia maxima de 128x160 , interfata SPI care afiseaza 3 informatii: 1. Nr de aparitii vierme(Na), 2. Nr de reusite(coincide numarul gaurii unde a aparut viermele cu apasarea butonului asignat) (Nr), 3. Procentul de reusite %= (Nr/​Na)x100.     * Displayul este tip LCD de 1.8 inch cu rezolutia maxima de 128x160 , interfata SPI care afiseaza 3 informatii: 1. Nr de aparitii vierme(Na), 2. Nr de reusite(coincide numarul gaurii unde a aparut viermele cu apasarea butonului asignat) (Nr), 3. Procentul de reusite %= (Nr/​Na)x100.
-    * Curentul maxim pe care il consuma montajul este suma urmatoarelor consumuri partialeArduino(datasheet) = 100mAPotentiometru(5V/​10kohmi) = 0,5mAServomotor (datasheet = 250mA) Observatie importanta: cu toate ca sunt 4 la numar, ele se manevreaza aleatoriu, niciodata simultan.- Dispalay(datashhet) = 100mA TOTAL= ​450mA.Avand in vedere ca valoarea maxima recomandata pentru alimentarea din portul USB 2 (laptop)este de cca 500mA rezulta ca montajul poate functiona in siguranta alimentat din portul USB. Pentru siguranta in functionare , protejarea laptopului in caz de scurtcircuit in montaj si realizarea functionarii independente a montajului , acesta dupa incarcarea si testarea programului va fi alimentat de la o sursa externa de 5V si curent maxim mai mare de 1A.+    * Curentul maxim pe care il consuma montajul este suma urmatoarelor consumuri partialeArduino(datasheet) = 100mA Potentiometru(5V/​10kohmi) = 0,5mA Servomotor (datasheet = 250mA) Observatie importanta: cu toate ca sunt 4 la numar, ele se manevreaza aleatoriu, niciodata simultan ​Dispalay(datashhet) = 100mA TOTAL= ​450.5mA.Avand in vedere ca valoarea maxima recomandata pentru alimentarea din portul USB 2 (laptop)este de cca 500mA rezulta ca montajul poate functiona in siguranta alimentat din portul USB. Pentru siguranta in functionare , protejarea laptopului in caz de scurtcircuit in montaj si realizarea functionarii independente a montajului , acesta dupa incarcarea si testarea programului va fi alimentat de la o sursa externa de 5V si curent maxim mai mare de 1A.
 =====Justificare alegere pini===== =====Justificare alegere pini=====
  
Line 116: Line 114:
  
     * Dupa conectarea componentelor conform cu ce am mentionat anterior, pentru verificarea functionalitatii am ales sa afisez pe display ceva la intamplare, considerand ca orice e diferit de un ecran alb (cum afisa display-ul fara sa fi rulat vreun cod pentru el) este o justificare valida a functionarii. ​     * Dupa conectarea componentelor conform cu ce am mentionat anterior, pentru verificarea functionalitatii am ales sa afisez pe display ceva la intamplare, considerand ca orice e diferit de un ecran alb (cum afisa display-ul fara sa fi rulat vreun cod pentru el) este o justificare valida a functionarii. ​
-  
  
 +=====Motivare alegere biblioteci folosite=====
  
-===== Software Design =====+  * Servo.h : am ales folosirea Servo.h deoarece este biblioteca oficiala Arduino pentru a controla servomotoare,​ permitand o manevrare facila a celor 4 servomotoare utilizate prin functiile attach(pin_x) pentru configurarea servo-ului cu pinulpin_x de pe placuta Arduino si write(unghi_x) pentru pozitionarea bratului de plastic al servomotorului la unghi_x grade, pentru miscarile de "​aparitie",​ respectiv "​revenire in vizuina"​ a unui "​Mole"​
  
 +  * Adafruit_GFX.h:​ uitandu-ma in datasheet-ul display-ului SPI, fiind vorba de un controller ST7735, prima sugestie a library manager-ului din Arduino a fost Adafruit. Am folosit aceasta biblioteca pentru functionalitatile de desenare.
  
-<note tip> +  * Adafruit_ST7735.h:​ desi toate functionalitatile necesare pentru desenare sunt implementate in Adafruit_GFX.h,​ a trebuit sa folosesc si Adafruit_ST7735.h deoarece este specializat pentru afisari pe ST7735, Adafruit_GFX.h avand implementari doar la modul general, nestiind specificatiile dispozitivului pe care se va face concret desenarea. 
-Descrierea codului aplicaţiei ​(firmware): + 
-  mediu de dezvoltare ​(if any) (e.gAVR StudioCodeVisionAVR+  * SPI.h: o folosesc pentru transmiterea datelor catre afisor(ecranpentru afisarea datelor. 
-  librării şi surse 3rd-party (e.gProcyon AVRlib+ 
-  algoritmi şi structuri ​pe care plănuiţi să le implementaţi +=====Evidentiere element de noutate al proiectului===== 
-  * (etapa 3surse şi funcţii implementate + 
-</note>+    * Se evidentiaza ca element de noutate reglarea gradului de dificultate(viteza de aparitie a unui "​Mole"​) prin intermediul unui potentiometru (intre 0.5s pentru dificultate mare si 2s pentru dificultate mai scazuta). 
 + 
 +=====Justificare utilizare functionalitati din laborator in cadrul proiectului===== 
 + 
 +    * Laboratorul 2Intreruperi ==> Am setat timer-ul 2 sa genereze o intrerupere care are ca efect oprirea jocului dupa un timp stabilit(60 de secunde) si care poate fi modificat prin inlocuirea timpului de divizare a frecventei de numarare(prescaler-ul). 
 + 
 +    ​Laboratorul 3: Timere. PWM ==> Comanda servomotoarelor s-a facut prin stabilirea unghiului de rotatie de la 0 la 90 de grade si implicit a gradului de modulare a factorului ​de umplere(duty cyclecorespunzator unghiului stabilit. De asemenea, pinii de comanda ai servomotoarelor au trebuit obligatoriu sa faca parte din grupa pinilor care suporta operatii PWM(pinii cu ~ de pe placuta Arduino Uno: 3,​5,​6,​9,​10,​11). 
 + 
 +    * Laboratorul 4: ADC ==> Am folosit conversia analog-digitala(ADC-ul pe Arduino Uno pe 10 biti, deci valori intre 0 si 1023) pentru a avea o corespondenta intre pozitia butonului potentiometrului si valoarea frecventei de aparitie a viermelui. 
 + 
 +    * Laboratorul 5: SPI ==> Am folosit materia din acest laborator deoarece am ales sa afisez datele corespunzatoare starii jocului pe un display folosind SPI, care e compatibil cu biblioteci accesibile din library manager in Arduino IDE. 
 + 
 +=====Calibrare elemente de senzoristica===== 
 + 
 +    * Pentru pozitia de minim a potentiometrului(maxim stanga0V), conform maparii facute prin program, am obtinut frecventa cea mai mare de aparitie a viermelui(1 / 0.5s = 2Hz), iar pentru pozitia de maxim a potentiometrului(5V,​ maxim dreapta) am obtinut frecventa cea mai mica de aparitie(0.5 Hz = 1 / 2s
 + 
 +=====Explicare schelet si interactiune intre functionalitati===== 
 + 
 +    ​In partea de set-up configuram butoanele in stare de pull-up si initializam afisajul pe display-ul SPI si timer 2 pentru a cauza mai tarziu terminarea jocului dupa 60 de secunde printr-o intrerupere. 
 +    * Din punct de vedere logic, jocul este gandit la nivel de 6 stari, avand urmatoarele semnificatii:​ 
 +      * START_GAME = starea initiala; ​responsabila doar de contorizarea momentului in care a inceput propriu-zis jocul, dupa care trecem in starea CHOOSE_MOLE 
 +      * CHOOSE_MOLE = se asteapta alegerea unui numar aleator care va desemna "​Mole-ul"​ care iese la suprafataMai intai se verifica daca jucatorul a ales sa reseteze jocul(a apasat pe B5) sau nuDaca se continua jocul curent, alegem un "​Mole"​ aleator (diferit intre iteratii consecutive pentru un joc mai interesant), ridicam steguletul corespunzator acestuia, crestem numarul de aparitii si tranzitionam in starea SURFACE_MOLE 
 +      SURFACE_MOLE = un "​Mole"​ este la suprafata si trebuie sa fie lovit pentru a obtine puncte(trebuie ca butonul corespunzator sa fie apasat in tr-un timp mai mic decat cel de reactie). Cand apasam ​pe buton sau expira timpul, "​Mole-ul"​ intra in vizuina si mergem in starea de actualizare a tabelei(REFRESH_SCORE). 
 +      * REFRESH_SCORE = aici actualizam statisticile,​ dupa care ne intoarcem in CHOOSE_MOLE 
 +      RESET_WAIT = ajungem in aceasta stare daca se apasa pe B5(RESET_BUTTON de la pin 8); se reseteaza jocul dupa ce tin apasat macar jumatate de secunda, dupa care eliberez 
 +      * GAME_OVER = stare finala; ajung aici dupa ce expira timpul  
 + 
 +    * Explicare setare durata la 60 de secunde 
 +      * Frecventa pe Arduino Uno este 16MHz = 16 000 000 Hz. Prin setarea prescaler-ului la 1024 rezulta 16000000 ​1024 = 15625 de tick-uri pe secunda. Prin setarea registrului OCR2A la 249, programul va itera prin 250 de valori(de la 0 la 249) pentru a produce a intrerupere ==o intrerupere are loc periodic la 250 / 15625 = 0.016s ==> este nevoie de 60s / 0.016s = 3750 de intreruperi ca sa pot sti ca a trecut un minut, timp dupa care trebuie sa opresc jocul.  
 +
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +    * Un joc interactiv pe care o sa il mai joc in viitor.
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +
-</​note>​+
  
-===== Concluzii ​=====+=====Demo video proiect cu explicatii=====
  
-===== Download =====+    * https://​www.youtube.com/​watch?​v=UiAcehrmnwM
  
-<note warning>​ +=====Link Github=====
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +    ​https://​github.com/​dariuusss/​software-pm-milestone-3
-</​note>​+
  
-===== Jurnal ===== 
  
-<note tip> 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. 
-</​note>​ 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2025/avaduva/darius.ignatescu.1747560705.txt.gz · Last modified: 2025/05/18 12:31 by darius.ignatescu
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