This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:alexandru.diaconu [2026/05/09 19:31] alexandru.diaconu04 created |
pm:prj2026:bianca.popa1106:alexandru.diaconu [2026/05/27 03:37] (current) alexandru.diaconu04 [Software Design] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | # CyberPull: Tug of War Digital | + | ====== CyberPull: Tug of War Digital ====== |
| - | **Autor:** Alexandru (Grupa ...) | + | ^ Nume: | Alexandru Diaconu | |
| - | **GitHub:** *(link de adăugat)* | + | ^ Grupa: | 331CD | |
| - | **Video demo:** *(link YouTube de adăugat)* | + | |
| - | --- | + | ===== Introducere ===== |
| - | ## Introducere | + | **Ce face?** |
| - | CyberPull este un joc arcade interactiv pentru doi jucători, inspirat din jocul clasic "trage de sfoară". În loc de forță fizică, sistemul testează viteza de reacție a jucătorilor. | + | CyberPull este un joc arcade interactiv pentru doi jucători inspirat din "trage de sfoară". Un punct luminos pornește din centrul unei benzi LED. Fiecare jucător apasă butonul său cât mai repede pentru a trage punctul în jumătatea lui. Primul care îl duce la capătul său câștigă runda. |
| - | La începutul fiecărei runde, un punct luminos apare fix în centrul unei benzi LED WS2812B. Fiecare jucător are un buton arcade dedicat — trebuie să îl apese cât mai repede pentru a trage punctul luminos spre jumătatea lui. Primul jucător care împinge punctul luminos până la capătul său câștigă runda. | + | **Care este scopul lui?** |
| - | **Ce face proiectul:** | + | Distracție pentru doi jucători, testând viteza de reacție într-un format competitiv și vizual atractiv. |
| - | - Joc multiplayer local pentru doi jucători cu detectarea instantanee a apăsărilor de butoane prin întreruperi hardware | + | |
| - | - Dificultate reglabilă în timp real printr-un potențiometru rotativ (controlează câte apăsări sunt necesare pentru a muta LED-ul o poziție) | + | |
| - | - Feedback audio prin buzzer pasiv — tonuri diferite la fiecare mutare și o melodie de victorie la finalul rundei | + | |
| - | - Scor curent și cronometru de rundă afișate pe un LCD 16x2 cu interfață I2C | + | |
| - | - Carcasă din plexiglass transparent cu electronica ascunsă sub un fund fals | + | |
| - | **De ce este util:** Proiectul demonstrează toate conceptele majore de laborator (întreruperi, timere, PWM, ADC, I2C) într-o formă interactivă și prezentabilă, producând un joc standalone complet funcțional pe care oricine îl poate juca imediat. | + | **Care a fost ideea de la care am pornit?** |
| - | **Ideea de la care am pornit:** Am vrut un proiect care să fie atât tehnic complet cât și distractiv — ceva ce poate fi demonstrat ușor în fața unui public și care implică interacțiunea directă a utilizatorilor. | + | Am vrut un proiect care să folosească toate conceptele de laborator (întreruperi, timere, PWM, ADC, I2C) într-un mod practic și interactiv, rezultând ceva ce poate fi demonstrat imediat oricui. |
| - | --- | + | **De ce este util?** |
| - | ## Descriere Generală | + | Este un joc standalone complet funcțional, cu carcasă fizică din plexiglass, care poate fi folosit fără laptop după ce codul este încărcat. |
| - | ### Schemă Bloc | + | ===== Descriere Generală ===== |
| - | ``` | + | Schema bloc a proiectului: |
| - | ┌─────────────────────────────────────────────────────────────────┐ | + | |
| - | │ SISTEM CYBERPULL │ | + | |
| - | │ │ | + | |
| - | │ ┌──────────┐ INT0 ┌─────────────────┐ I2C │ | + | |
| - | │ │ Buton J1 │───────────▶│ │───────────▶ LCD 1602│ | + | |
| - | │ └──────────┘ │ │ │ | + | |
| - | │ │ Arduino Uno │ Pin Digital │ | + | |
| - | │ ┌──────────┐ INT1 │ (ATmega328P) │───────────▶ Bandă │ | + | |
| - | │ │ Buton J2 │───────────▶│ │ WS2812B │ | + | |
| - | │ └──────────┘ │ │ │ | + | |
| - | │ │ │ PWM (Timer2) │ | + | |
| - | │ ┌──────────┐ ADC0 │ │───────────▶ Buzzer │ | + | |
| - | │ │ Pot 10K │───────────▶│ │ Pasiv │ | + | |
| - | │ └──────────┘ └─────────────────┘ │ | + | |
| - | │ │ │ | + | |
| - | │ ┌──────────┐ Jack DC 9V │ | + | |
| - | │ │ Adaptor │─────────────────────┘ │ | + | |
| - | │ │ 9V / 1A │ │ | + | |
| - | │ └──────────┘ │ | + | |
| - | └─────────────────────────────────────────────────────────────────┘ | + | |
| - | ``` | + | |
| - | ### Descrierea Modulelor | + | {{:pm:prj2026:bianca.popa1106:diaconu_alexandru_schema_bloc.png?200|}} |
| - | **Arduino Uno (ATmega328P)** — Unitatea centrală de procesare. Rulează toată logica jocului, citește inputurile și controlează outputurile. | + | Modulele principale: |
| - | **Bandă LED WS2812B (30 LED-uri, 50cm)** — Afișajul principal al jocului. Un singur LED se mișcă stânga/dreapta în funcție de apăsările butoanelor. LED-ul 15 este poziția centrală de start, LED-urile 0–14 aparțin jucătorului J1, LED-urile 16–29 aparțin jucătorului J2. | + | * **Arduino Uno (ATmega328P)** — unitatea centrală, rulează toată logica jocului |
| + | * **Bandă LED WS2812B (30 LED-uri, 50cm)** — afișajul principal; un LED se mișcă stânga/dreapta | ||
| + | * **2x Butoane Arcade 16mm cu LED** — inputul jucătorilor, conectate pe INT0/INT1 | ||
| + | * **Potențiometru 10kΩ** — reglează dificultatea în timp real prin ADC | ||
| + | * **Buzzer Pasiv** — feedback audio controlat prin PWM (Timer2) | ||
| + | * **LCD 1602 + I2C** — afișează scorul și cronometrul rundei | ||
| + | * **Adaptor 9V/1A** — alimentare standalone prin jack-ul Arduino | ||
| - | **Butoane Arcade (x2, 16mm, iluminate LED)** — Inputurile jucătorilor. Conectate la pinii de întrerupere externă (INT0/INT1) pentru detectare fără latență. | + | ===== Hardware Design ===== |
| - | **Potențiometru Rotativ (10kΩ)** — Selector analogic de dificultate. Citit prin ADC. Mapează valoarea 0–1023 la un număr de apăsări necesare pentru a muta LED-ul o poziție (1 = ușor, 8 = dificil). | + | **Listă de componente:** |
| - | **Buzzer Pasiv** — Feedback audio. Controlat de Timer2 în modul Fast PWM. Generează frecvențe diferite la mutare stânga, mutare dreapta și melodie de victorie. | + | ^ Componentă ^ Specificații ^ Cantitate ^ |
| + | | Arduino Uno R3 | ATmega328P, DIP | 1 | | ||
| + | | Bandă LED WS2812B | 60 LED/m, 30 LED-uri (50cm) | 1 | | ||
| + | | Buton Arcade cu LED | 16mm, 3-6V, roșu | 1 | | ||
| + | | Buton Arcade cu LED | 16mm, 3-6V, albastru | 1 | | ||
| + | | Potențiometru | 10kΩ liniar | 1 | | ||
| + | | Buzzer Pasiv | 3.3V | 1 | | ||
| + | | LCD 1602 + modul I2C | PCF8574, 5V | 1 | | ||
| + | | Adaptor alimentare | 9V / 1A | 1 | | ||
| + | | Breadboard | 830 puncte | 1 | | ||
| + | | Rezistor 330Ω | 1/4W THT | 3 | | ||
| + | | Rezistor 10kΩ | 1/4W THT | 5 | | ||
| + | | Rezistor 100Ω | 1/4W THT | 3 | | ||
| + | | Condensator electrolitic | 1000µF / 35V | 1 | | ||
| + | | Fire Dupont M-F | 30cm, 40 buc | 1 set | | ||
| + | | Fire Dupont M-M | 10cm, 40 buc | 1 set | | ||
| - | **LCD 16x2 + I2C (PCF8574)** — Afișaj secundar. Afișează scorul curent (ex: "J1: 2 J2: 1") și timpul scurs din rundă. | + | **Schema electrică:** |
| - | **Adaptor 9V/1A** — Alimentează Arduino prin jack-ul DC. Regulatorul intern al Arduino furnizează 5V tuturor perifericelor. | + | {{:pm:prj2026:bianca.popa1106:diaconu_alexandru_schema_electrica.png?200|}} |
| - | --- | + | ===== Software Design ===== |
| - | ## Hardware Design | + | **Mediu de dezvoltare:** Arduino IDE 2.x |
| - | ### Listă de Componente | + | **Biblioteci folosite:** |
| + | * ''Adafruit_NeoPixel'' — control bandă LED WS2812B | ||
| + | * ''LiquidCrystal_I2C'' — control LCD prin I2C | ||
| + | * ''avr/interrupt.h'' — întreruperi hardware (built-in) | ||
| - | | Componentă | Specificații | Cantitate | | + | **Concepte de laborator:** |
| - | |---|---|---| | + | |
| - | | Arduino Uno R3 (ATmega328P) | DIP, compatibil Arduino | 1 | | + | * **Lab 2 — Întreruperi:** Butoanele conectate pe INT0 (D2) și INT1 (D3), tratate prin ISR. Timer1 în mod CTC pentru cronometrul rundei (tick 1ms). Debouncing software cu fereastră de 50ms. |
| - | | Bandă LED WS2812B | 60 LED/m, 30 LED-uri folosite (50cm) | 1 | | + | * **Lab 3 — PWM:** Timer2 în mod Fast PWM pe pinul D11 (OC2A) pentru buzzer. Frecvențe diferite: ~500Hz (mutare J1), ~800Hz (mutare J2), melodie la câștig. |
| - | | Buton Arcade cu LED | 16mm, 3–6V, roșu | 1 | | + | * **Lab 4 — ADC:** Potențiometrul citit pe A0. Valoarea 0–1023 mapată la dificultate 1–8 (numărul de apăsări necesare per mutare LED). |
| - | | Buton Arcade cu LED | 16mm, 3–6V, albastru | 1 | | + | * **Lab 6 — I2C:** LCD comunică pe pinii A4 (SDA) / A5 (SCL). Adresă PCF8574: 0x27. Actualizare la fiecare 500ms. |
| - | | Potențiometru Rotativ | 10kΩ liniar (B10K) | 1 | | + | |
| - | | Buzzer Pasiv | 3.3V | 1 | | + | |
| - | | LCD 1602 + modul I2C | PCF8574, 5V, backlight verde | 1 | | + | |
| - | | Adaptor Alimentare | 9V / 1A, jack DC 5.5×2.1mm | 1 | | + | |
| - | | Breadboard | 830 puncte, MB-102 | 1 | | + | |
| - | | Fire Dupont M-F | 30cm, 40 buc | 1 set | | + | |
| - | | Fire Dupont M-M | 10cm, 40 buc | 1 set | | + | |
| - | | Rezistor 330Ω | 1/4W THT | 3 | | + | |
| - | | Rezistor 10kΩ | 1/4W THT | 5 | | + | |
| - | | Rezistor 100Ω | 1/4W THT | 3 | | + | |
| - | | Condensator Electrolitic | 1000µF / 35V, THT | 1 | | + | |
| - | | Cablu USB A-B | 0.3m | 1 | | + | |
| - | ### Conexiuni Electrice | + | ===== Rezultate Obținute ===== |
| - | | Componentă | Pin Arduino | Observații | | + | Aveti link catre youtube mai jos: |
| - | |---|---|---| | + | |
| - | | Buton J1 (semnal) | D2 (INT0) | Pull-down 10kΩ la GND | | + | |
| - | | Buton J2 (semnal) | D3 (INT1) | Pull-down 10kΩ la GND | | + | |
| - | | Buton J1 LED (+) | D4 | Rezistor intern inclus în buton | | + | |
| - | | Buton J2 LED (+) | D5 | Rezistor intern inclus în buton | | + | |
| - | | Bandă LED (DIN) | D6 | Rezistor 330Ω în serie | | + | |
| - | | Bandă LED (5V) | 5V | Condensator 1000µF în paralel | | + | |
| - | | Bandă LED (GND) | GND | | | + | |
| - | | Buzzer (+) | D11 (OC2A) | Rezistor 100Ω în serie | | + | |
| - | | Potențiometru (cursor) | A0 | | | + | |
| - | | Potențiometru (capete) | 5V / GND | | | + | |
| - | | LCD SDA | A4 | Magistrală I2C | | + | |
| - | | LCD SCL | A5 | Magistrală I2C | | + | |
| - | | LCD VCC | 5V | | | + | |
| - | | LCD GND | GND | | | + | |
| - | *(Schema electrică completă va fi adăugată — desenată în Fritzing/Wokwi)* | + | https://www.youtube.com/shorts/ELwuYHDpFSM |
| - | --- | + | ===== Concluzii ===== |
| - | ## Software Design | + | 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. |
| - | ### Mediu de Dezvoltare | ||
| - | - **Arduino IDE 2.x** — IDE principal pentru scriere cod și upload | ||
| - | - **Monitor Serial Arduino** — pentru debugging în timp real | ||
| - | ### Biblioteci și Surse Third-Party | + | 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. |
| - | - **Adafruit NeoPixel** — controlul benzii LED WS2812B (`Adafruit_NeoPixel.h`) | + | |
| - | - **LiquidCrystal_I2C** — controlul LCD-ului prin I2C (`LiquidCrystal_I2C.h`) | + | |
| - | - **avr/interrupt.h** — gestionarea întreruperilor hardware (bibliotecă AVR built-in) | + | |
| - | ### Concepte de Laborator Utilizate | ||
| - | **Laboratorul 2 — Întreruperi & Timere:** | ||
| - | - Ambele butoane conectate la `INT0` (D2) și `INT1` (D3) | ||
| - | - Întreruperile hardware declanșează `ISR(INT0_vect)` și `ISR(INT1_vect)` — fără polling, zero inputuri pierdute | ||
| - | - `Timer1` în modul CTC pentru cronometrul rundei (tick de 1ms → funcția `uptime_ms()`) | ||
| - | - Debouncing software folosind `uptime_ms()` — fereastră de 50ms după fiecare apăsare | ||
| - | **Laboratorul 3 — Timere & PWM:** | + | ===== Jurnal ===== |
| - | - `Timer2` configurat în modul Fast PWM pe pinul `D11` (OC2A) | + | |
| - | - Frecvența buzzerului setată prin scrierea registrului `OCR2A` | + | |
| - | - Tonuri diferite: ~500Hz (mutare J1), ~800Hz (mutare J2), melodie de victorie la finalul rundei | + | |
| - | **Laboratorul 4 — ADC:** | + | ^ Dată ^ Activitate ^ |
| - | - Potențiometrul citit pe `A0` prin `analogRead()` sau acces direct la registrele ADC | + | | 1 Mai 2026 | Definirea conceptului, finalizarea listei de componente | |
| - | - Valoarea pe 10 biți (0–1023) mapată la dificultate: `dificultate = map(valADC, 0, 1023, 1, 8)` | + | | 4 Mai 2026 | Primirea componentelor și asamblarea hardware | |
| - | - Valoare mai mare → mai multe apăsări necesare pentru a avansa LED-ul | + | | 5 Mai 2026 | Implementare software — întreruperi + control LED | |
| + | | 6 Mai 2026 | Implementare software — ADC, PWM, I2C | | ||
| + | | 10 Mai 2026 | Testare și debugging | | ||
| + | | 25 Mai 2026 | Demo final și documentație | | ||
| - | **Laboratorul 6 — I2C:** | + | ===== Software Design ===== |
| - | - LCD-ul comunică prin protocolul I2C pe pinii A4 (SDA) și A5 (SCL) | + | |
| - | - Adresa I2C a PCF8574: `0x27` (default) | + | |
| - | - Actualizare display la fiecare 500ms: linia de scor + cronometrul rundei | + | |
| - | ### Algoritmi și Logica Jocului (Planificat) | + | **Mediu de dezvoltare** |
| - | ``` | + | * PlatformIO (extensie VS Code) |
| - | INIȚIALIZARE: | + | * Placă: Arduino Uno (ATmega328P) |
| - | - Poziție LED = 15 (centru) | + | * Limbaj: C++ |
| - | - Scor J1 = 0, Scor J2 = 0 | + | * Fișier principal: ''main.cpp'' |
| - | - contor_apasari = 0 | + | |
| - | - dificultate = citire ADC → mapare la 1-8 | + | |
| - | BUCLĂ PRINCIPALĂ: | + | **Biblioteci third-party** |
| - | - Citește potențiometrul → actualizează dificultatea | + | |
| - | - Actualizează LCD (scor + timp) | + | |
| - | - Verifică condiția de câștig: | + | |
| - | dacă pos == 0 → J1 câștigă | + | |
| - | dacă pos == 29 → J2 câștigă | + | |
| - | ISR(INT0_vect) [Buton J1]: | + | ^ Bibliotecă ^ Rol ^ |
| - | - verificare debounce | + | | Adafruit NeoPixel | Controlul benzii LED WS2812B adresabile | |
| - | - contor_apasari++ | + | | LiquidCrystal_I2C | Comunicare cu LCD 16x2 prin protocolul I2C | |
| - | - dacă contor_apasari >= dificultate: poziție_LED--, contor = 0 | + | | avr/interrupt.h | Gestionarea întreruperilor hardware INT0/INT1 (built-in AVR) | |
| - | - redă ton (500Hz, 50ms) | + | | Wire.h | Suport I2C pentru comunicarea cu LCD (built-in Arduino) | |
| - | ISR(INT1_vect) [Buton J2]: | + | **Arhitectura sistemului** |
| - | - verificare debounce | + | |
| - | - contor_apasari++ | + | |
| - | - dacă contor_apasari >= dificultate: poziție_LED++, contor = 0 | + | |
| - | - redă ton (800Hz, 50ms) | + | |
| - | CÂȘTIG: | + | 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()''. |
| - | - redă melodie de victorie | + | |
| - | - clipesc toate LED-urile din jumătatea câștigătorului | + | |
| - | - actualizează scorul pe LCD | + | |
| - | - așteptare 3s → rundă nouă | + | |
| - | ``` | + | |
| - | --- | + | Pinout-ul complet: |
| - | ## Rezultate Obținute | + | ^ 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 | | ||
| - | *(De completat după asamblarea hardware și testare)* | + | **Detalii cheie de implementare** |
| - | Rezultate așteptate: | + | //Întreruperi hardware pentru butoane (Lab 2)// |
| - | - LED-ul răspunde instant la apăsările butoanelor fără latență perceptibilă | + | |
| - | - Potențiometrul de dificultate schimbă vizibil dinamica jocului de la 1 apăsare/mutare la 8 apăsări/mutare | + | |
| - | - LCD-ul actualizează scorul în timp real | + | |
| - | - Buzzerul produce sunete distincte la fiecare eveniment din joc | + | |
| - | - O sesiune completă de joc poate fi rulată fără conexiune la PC (standalone prin adaptorul de 9V) | + | |
| - | --- | + | 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. |
| - | ## Concluzii | + | 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. |
| - | *(De completat după finalizarea proiectului)* | + | 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)// |
| - | ## Cod Sursă și Resurse GitHub | + | Buzzerul pasiv este controlat de Timer2 în modul CTC pe pinul D11 (OC2A). Frecvența sunetului se calculează după formula: |
| - | Tot codul sursă, schemele hardware și fotografiile proiectului sunt disponibile pe GitHub: | + | OCR2A = F_CPU / (2 × 256 × frecvență) − 1 |
| - | **Repository GitHub:** *(link de adăugat)* | + | 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 | ||
| - | Structura repository-ului: | + | //Citire potențiometru prin ADC (Lab 4)// |
| - | ``` | + | |
| - | cyberpull/ | + | |
| - | ├── src/ | + | |
| - | │ └── main.ino | + | |
| - | ├── hardware/ | + | |
| - | │ ├── schema_electrica.fzz | + | |
| - | │ └── diagrama_cablaj.png | + | |
| - | ├── images/ | + | |
| - | │ ├── cutie_sus.jpg | + | |
| - | │ ├── cutie_jos.jpg | + | |
| - | │ └── demo.jpg | + | |
| - | └── README.md | + | |
| - | ``` | + | |
| - | --- | + | 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()'': |
| - | ## Jurnal | + | <code cpp> |
| + | difficulty = map(analogRead(A0), 0, 1023, 1, 8); | ||
| + | </code> | ||
| - | | Dată | Activitate | | + | 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. |
| - | |---|---| | + | |
| - | | Mai 2026 | Definirea conceptului, finalizarea listei de componente | | + | |
| - | | *(TBD)* | Comandarea și primirea componentelor | | + | |
| - | | *(TBD)* | Asamblarea hardware și cablajul | | + | |
| - | | *(TBD)* | Dezvoltare software — întreruperi + control LED | | + | |
| - | | *(TBD)* | Dezvoltare software — ADC, PWM, I2C | | + | |
| - | | *(TBD)* | Testare integrată și debugging | | + | |
| - | | *(TBD)* | Demo final și documentație | | + | |
| - | --- | + | //Comunicare LCD prin I2C (Lab 6)// |
| - | ## Bibliografie și Resurse | + | 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ă. |
| - | ### Resurse Hardware | + | **Funcții implementate** |
| - | - [Datasheet ATmega328P](https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf) | + | |
| - | - [Datasheet WS2812B LED](https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf) | + | |
| - | - [Datasheet PCF8574 I2C Expander](https://www.ti.com/lit/ds/symlink/pcf8574.pdf) | + | |
| - | - [Schema Arduino Uno R3](https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf) | + | |
| - | ### Resurse Software | + | ^ Funcție ^ Rol ^ |
| - | - [Biblioteca Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) | + | | ''setup()'' | Inițializează toate perifericele, configurează întreruperile, pornește jocul | |
| - | - [Biblioteca LiquidCrystal_I2C](https://github.com/johnrickman/LiquidCrystal_I2C) | + | | ''loop()'' | Bucla principală: citește ADC, actualizează LED și LCD, verifică câștig | |
| - | - [Arduino Reference — attachInterrupt()](https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/) | + | | ''ISR(INT0_vect)'' | Tratează apăsarea butonului alb (J2) — debounce 150ms + mutare LED spre dreapta | |
| - | - [Arduino Reference — analogRead()](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/) | + | | ''ISR(INT1_vect)'' | Tratează apăsarea butonului roșu (J1) — debounce 150ms + mutare LED spre stânga | |
| - | - [Secrets of Arduino PWM](https://docs.arduino.cc/tutorials/generic/secrets-of-arduino-pwm/) | + | | ''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 ===== | ||
| - | ### Materiale de Laborator (OCW CS Pub) | + | **Resurse Hardware:** |
| - | - [Laboratorul 2: Întreruperi & Timere](https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023) | + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] |
| - | - [Laboratorul 3: Timere & PWM](https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024) | + | * [[https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf|Datasheet WS2812B]] |
| - | - [Laboratorul 4: ADC](https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024) | + | * [[https://www.ti.com/lit/ds/symlink/pcf8574.pdf|Datasheet PCF8574 I2C]] |
| - | - [Laboratorul 6: I2C](https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024) | + | |
| + | **Resurse Software:** | ||
| + | * [[https://github.com/adafruit/Adafruit_NeoPixel|Biblioteca Adafruit NeoPixel]] | ||
| + | * [[https://github.com/johnrickman/LiquidCrystal_I2C|Biblioteca LiquidCrystal_I2C]] | ||
| + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023|Lab 2: Întreruperi & Timere — OCW CS Pub]] | ||
| + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024|Lab 3: Timere & PWM — OCW CS Pub]] | ||
| + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024|Lab 4: ADC — OCW CS Pub]] | ||
| + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024|Lab 6: I2C — OCW CS Pub]] | ||