This shows you the differences between two versions of the page.
pm:prj2025:avaduva:darius.ignatescu [2025/05/24 20:30] darius.ignatescu [Introducere] |
pm:prj2025:avaduva:darius.ignatescu [2025/05/25 08:13] (current) darius.ignatescu [Demo video proiect cu explicatii] |
||
---|---|---|---|
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 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.g. AVR Studio, CodeVisionAVR) | + | * SPI.h: o folosesc pentru transmiterea datelor catre afisor(ecran) pentru afisarea datelor. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | =====Evidentiere element de noutate al proiectului===== |
- | * (etapa 3) surse ş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 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). | ||
+ | |||
+ | * 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). | ||
+ | |||
+ | * 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. | ||
+ | |||
+ | * 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 ===== |