This shows you the differences between two versions of the page.
pm:prj2025:avaduva:darius.ignatescu [2025/05/24 20:33] darius.ignatescu |
pm:prj2025:avaduva:darius.ignatescu [2025/05/25 08:13] (current) darius.ignatescu [Demo video proiect cu explicatii] |
||
---|---|---|---|
Line 117: | Line 117: | ||
=====Motivare alegere biblioteci folosite===== | =====Motivare alegere biblioteci folosite===== | ||
- | * Servo.h : am ales folosirea Servo.h deoarece este biblioteca oficiala Arduino | + | * 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" |
- | pentru a controla servomotoare, permitand o manevrare facila a celor 4 servomotoare | + | |
- | utilizate prin functiile attach(pin_x) pentru configurarea servo-ului cu pinul | + | |
- | pin_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 | + | * 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. |
- | ST7735, prima sugestie a library manager-ului din Arduino a fost Adafruit. Am folosit aceasta | + | |
- | biblioteca pentru functionalitatile de desenare. | + | |
- | * Adafruit_ST7735.h: desi toate functionalitatile necesare pentru desenare sunt implementate in | + | * 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. |
- | 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 afisarea. | + | |
* SPI.h: o folosesc pentru transmiterea datelor catre afisor(ecran) pentru afisarea datelor. | * SPI.h: o folosesc pentru transmiterea datelor catre afisor(ecran) pentru afisarea datelor. | ||
- | |||
+ | =====Evidentiere element de noutate al proiectului===== | ||
- | ===== Software Design ===== | + | * 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===== | ||
- | <note tip> | + | * Laboratorul 2: Intreruperi ==> 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). |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * 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 cycle) corespunzator 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). |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * Laboratorul 4: ADC ==> Am folosit conversia analog-digitala(ADC-ul pe Arduino Uno e 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. |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | * 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 stanga, 0V), 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; e 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 suprafata. Mai intai se verifica daca jucatorul a ales sa reseteze jocul(a apasat pe B5) sau nu. Daca 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 ===== |