Differences

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

Link to this comparison view

pm:prj2026:bianca.popa1106:alexandru.diaconu [2026/05/09 19:35]
alexandru.diaconu04
pm:prj2026:bianca.popa1106:alexandru.diaconu [2026/05/27 03:37] (current)
alexandru.diaconu04 [Software Design]
Line 26: Line 26:
 Schema bloc a proiectului:​ Schema bloc a proiectului:​
  
-{{:​pm:​prj2026:​alexandru.diaconu04:schema_bloc.png|Schema bloc CyberPull}}+{{:​pm:​prj2026:​bianca.popa1106:diaconu_alexandru_schema_bloc.png?200|}}
  
 Modulele principale: Modulele principale:
Line 61: Line 61:
 **Schema electrică:​** **Schema electrică:​**
  
-{{:​pm:​prj2026:​alexandru.diaconu04:schema_electrica.png|Schema electrica CyberPull}}+{{:​pm:​prj2026:​bianca.popa1106:diaconu_alexandru_schema_electrica.png?200|}}
  
 ===== Software Design ===== ===== 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 asemeneaLCD-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 | +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 =====
  
pm/prj2026/bianca.popa1106/alexandru.diaconu.1778344550.txt.gz · Last modified: 2026/05/09 19:35 by alexandru.diaconu04
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