This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:alexandru.diaconu [2026/05/09 22:12] alexandru.diaconu04 |
pm:prj2026:bianca.popa1106:alexandru.diaconu [2026/05/27 03:37] (current) alexandru.diaconu04 [Software Design] |
||
|---|---|---|---|
| Line 81: | Line 81: | ||
| ===== Rezultate Obținute ===== | ===== Rezultate Obținute ===== | ||
| - | //De completat după asamblare și testare.// | + | Aveti link catre youtube mai jos: |
| + | |||
| + | https://www.youtube.com/shorts/ELwuYHDpFSM | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | //De completat după finalizarea proiectului.// | + | Cea mai delicată parte a fost lucratul cu banda LED și butoanele. Mai exact partea hardware, în care a trebuit să lipesc firele la pinii corespunzători de mai multe ori, deoarece legăturile s-au rupt între ele. |
| - | ===== Download ===== | ||
| - | Codul sursă, schema electrică și fotografiile proiectului sunt disponibile pe GitHub: | + | De asemenea, LCD-ul nu afișa nimic la prima pornire, deși adresa I2C era corectă (0x27). Problema era contrastul setat la zero din fabrică, rezolvat prin reglarea potențiometrului de pe spatele modulului. |
| - | [[https://github.com/alexandru-diaconu/cyberpull|Repository GitHub CyberPull]] | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| ^ Dată ^ Activitate ^ | ^ Dată ^ Activitate ^ | ||
| - | | Mai 2026 | Definirea conceptului, finalizarea listei de componente | | + | | 1 Mai 2026 | Definirea conceptului, finalizarea listei de componente | |
| - | | TBD | Primirea componentelor și asamblarea hardware | | + | | 4 Mai 2026 | Primirea componentelor și asamblarea hardware | |
| - | | TBD | Implementare software — întreruperi + control LED | | + | | 5 Mai 2026 | Implementare software — întreruperi + control LED | |
| - | | TBD | Implementare software — ADC, PWM, I2C | | + | | 6 Mai 2026 | Implementare software — ADC, PWM, I2C | |
| - | | TBD | Testare și debugging | | + | | 10 Mai 2026 | Testare și debugging | |
| - | | TBD | Demo final și documentație | | + | | 25 Mai 2026 | Demo final și documentație | |
| + | |||
| + | ===== Software Design ===== | ||
| + | |||
| + | **Mediu de dezvoltare** | ||
| + | |||
| + | * PlatformIO (extensie VS Code) | ||
| + | * Placă: Arduino Uno (ATmega328P) | ||
| + | * Limbaj: C++ | ||
| + | * Fișier principal: ''main.cpp'' | ||
| + | |||
| + | **Biblioteci third-party** | ||
| + | |||
| + | ^ Bibliotecă ^ Rol ^ | ||
| + | | Adafruit NeoPixel | Controlul benzii LED WS2812B adresabile | | ||
| + | | LiquidCrystal_I2C | Comunicare cu LCD 16x2 prin protocolul I2C | | ||
| + | | avr/interrupt.h | Gestionarea întreruperilor hardware INT0/INT1 (built-in AVR) | | ||
| + | | Wire.h | Suport I2C pentru comunicarea cu LCD (built-in Arduino) | | ||
| + | |||
| + | **Arhitectura sistemului** | ||
| + | |||
| + | Firmware-ul este structurat într-un singur fișier principal ''main.cpp''. Acesta inițializează toate perifericele (bandă LED, LCD, butoane, buzzer, potențiometru), configurează întreruperile hardware și gestionează logica principală în bucla ''loop()''. | ||
| + | |||
| + | Pinout-ul complet: | ||
| + | |||
| + | ^ Pin Arduino ^ Componentă ^ Rol ^ | ||
| + | | D2 (INT0) | Buton J2 (alb) | Întrerupere externă — apăsare jucător 2 | | ||
| + | | D3 (INT1) | Buton J1 (roșu) | Întrerupere externă — apăsare jucător 1 | | ||
| + | | D4 | LED buton J2 (alb) | Iluminare buton jucător 2 | | ||
| + | | D5 | LED buton J1 (roșu) | Iluminare buton jucător 1 | | ||
| + | | D6 | Bandă LED WS2812B (DIN) | Semnal date bandă LED (prin rezistență 330Ω) | | ||
| + | | D11 (OC2A) | Buzzer pasiv | Timer2 CTC — generare sunete | | ||
| + | | A0 | Potențiometru 10kΩ | ADC — citire dificultate 1–8 | | ||
| + | | A4 (SDA) | LCD I2C | Linie date I2C | | ||
| + | | A5 (SCL) | LCD I2C | Linie clock I2C | | ||
| + | |||
| + | **Detalii cheie de implementare** | ||
| + | |||
| + | //Întreruperi hardware pentru butoane (Lab 2)// | ||
| + | |||
| + | Butoanele jucătorilor sunt conectate pe pinii INT0 (D2) și INT1 (D3), configurate pe front descrescător (falling edge) prin registrele EICRA și EIMSK. La fiecare apăsare se declanșează automat rutinele ''ISR(INT0_vect)'' și ''ISR(INT1_vect)''. Aceasta garantează că nicio apăsare nu este pierdută, indiferent de ce face programul în acel moment. | ||
| + | |||
| + | Fiecare ISR implementează debouncing software cu o fereastră de 150ms — dacă două apăsări vin în mai puțin de 150ms, a doua este ignorată (zgomot mecanic al butonului). ISR-ul verifică și starea fizică a butonului cu ''digitalRead()'' pentru a ignora bouncing-ul la eliberare. | ||
| + | |||
| + | Logica de mutare a LED-ului: | ||
| + | * ISR numără apăsările într-un contor | ||
| + | * Când contorul atinge valoarea de dificultate → LED-ul se mută o poziție | ||
| + | * Contorul se resetează la 0 | ||
| + | |||
| + | //Control buzzer prin Timer2 CTC (Lab 3)// | ||
| + | |||
| + | Buzzerul pasiv este controlat de Timer2 în modul CTC pe pinul D11 (OC2A). Frecvența sunetului se calculează după formula: | ||
| + | |||
| + | OCR2A = F_CPU / (2 × 256 × frecvență) − 1 | ||
| + | |||
| + | Prescaler-ul folosit este 256. Sunete generate: | ||
| + | * **400 Hz** — mutare spre J1 | ||
| + | * **600 Hz** — mutare spre J2 | ||
| + | * **300→500→700 Hz** — start rundă | ||
| + | * **Melodie Do-Re-Mi-Fa-Sol (262–392 Hz)** — victorie meci | ||
| + | |||
| + | //Citire potențiometru prin ADC (Lab 4)// | ||
| + | |||
| + | Potențiometrul este citit pe pinul A0 folosind ''analogRead()''. Valoarea de 10 biți (0–1023) este mapată la intervalul de dificultate 1–8 folosind funcția ''map()'': | ||
| + | |||
| + | <code cpp> | ||
| + | difficulty = map(analogRead(A0), 0, 1023, 1, 8); | ||
| + | </code> | ||
| + | |||
| + | Dificultatea reprezintă numărul de apăsări necesare pentru a muta LED-ul o poziție. La dificultate 1 fiecare apăsare mută LED-ul, la dificultate 8 sunt necesare 8 apăsări. Valoarea este recitită la fiecare iterație a ''loop()'', deci se poate modifica în timp real. | ||
| + | |||
| + | //Comunicare LCD prin I2C (Lab 6)// | ||
| + | |||
| + | LCD-ul 16x2 cu modulul PCF8574 comunică prin protocolul I2C pe pinii A4 (SDA) și A5 (SCL), la adresa ''0x27''. Display-ul se actualizează la fiecare 500ms cu scorul curent, timpul scurs din rundă și dificultatea curentă. | ||
| + | |||
| + | **Funcții implementate** | ||
| + | ^ Funcție ^ Rol ^ | ||
| + | | ''setup()'' | Inițializează toate perifericele, configurează întreruperile, pornește jocul | | ||
| + | | ''loop()'' | Bucla principală: citește ADC, actualizează LED și LCD, verifică câștig | | ||
| + | | ''ISR(INT0_vect)'' | Tratează apăsarea butonului alb (J2) — debounce 150ms + mutare LED spre dreapta | | ||
| + | | ''ISR(INT1_vect)'' | Tratează apăsarea butonului roșu (J1) — debounce 150ms + mutare LED spre stânga | | ||
| + | | ''showStrip()'' | Actualizează banda LED: zona J1 albastru, zona J2 roșu, bila albă | | ||
| + | | ''flashStrip()'' | Clipire bandă LED în culoarea câștigătorului | | ||
| + | | ''startAnimation()'' | Animație sweep alb la pornirea jocului | | ||
| + | | ''buzzerOn()'' | Pornește buzzerul la frecvența specificată prin Timer2 CTC | | ||
| + | | ''buzzerOff()'' | Oprește buzzerul | | ||
| + | | ''playTone()'' | Emite un sunet la frecvența și durata specificate | | ||
| + | | ''playMoveJ1Sound()'' | Sunet la mutarea LED-ului spre J1 (400Hz) | | ||
| + | | ''playMoveJ2Sound()'' | Sunet la mutarea LED-ului spre J2 (600Hz) | | ||
| + | | ''playRoundStart()'' | Sunet de start rundă: 300→500→700Hz | | ||
| + | | ''playRoundWin()'' | Sunet la câștigarea unei runde | | ||
| + | | ''playVictory()'' | Redă melodia Do-Re-Mi-Fa-Sol la câștigarea meciului | | ||
| + | | ''updateLCDScore()'' | Afișează scorul, cronometrul și dificultatea pe LCD prin I2C | | ||
| + | | ''checkWin()'' | Verifică dacă bila a ajuns la capătul benzii și actualizează scorul | | ||
| + | | ''startRound()'' | Resetează pozițiile și contoarele pentru o rundă nouă | | ||
| + | | ''checkReset()'' | Verifică dacă ambele butoane sunt ținute 500ms pentru reset joc | | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||