This is an old revision of the document!
# CyberPull: Tug of War Digital
Autor: Alexandru (Grupa …) GitHub: *(link de adăugat)* Video demo: *(link YouTube de adăugat)*
—
## Introducere
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.
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.
Ce face proiectul: - 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 16×2 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.
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.
—
## Descriere Generală
### Schemă Bloc
``` ┌─────────────────────────────────────────────────────────────────┐ │ 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
Arduino Uno (ATmega328P) — Unitatea centrală de procesare. Rulează toată logica jocului, citește inputurile și controlează outputurile.
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.
Butoane Arcade (x2, 16mm, iluminate LED) — Inputurile jucătorilor. Conectate la pinii de întrerupere externă (INT0/INT1) pentru detectare fără latență.
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).
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.
LCD 16×2 + I2C (PCF8574) — Afișaj secundar. Afișează scorul curent (ex: “J1: 2 J2: 1”) și timpul scurs din rundă.
Adaptor 9V/1A — Alimentează Arduino prin jack-ul DC. Regulatorul intern al Arduino furnizează 5V tuturor perifericelor.
—
## Hardware Design
### Listă de Componente
| Componentă | Specificații | Cantitate |
| — | — | — |
| Arduino Uno R3 (ATmega328P) | DIP, compatibil Arduino | 1 |
| Bandă LED WS2812B | 60 LED/m, 30 LED-uri folosite (50cm) | 1 |
| Buton Arcade cu LED | 16mm, 3–6V, roșu | 1 |
| Buton Arcade cu LED | 16mm, 3–6V, albastru | 1 |
| 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
| Componentă | Pin Arduino | Observații |
| — | — | — |
| 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)*
—
## Software Design
### 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 - 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: - `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: - Potențiometrul citit pe `A0` prin `analogRead()` sau acces direct la registrele ADC - Valoarea pe 10 biți (0–1023) mapată la dificultate: `dificultate = map(valADC, 0, 1023, 1, 8)` - Valoare mai mare → mai multe apăsări necesare pentru a avansa LED-ul
Laboratorul 6 — I2C: - 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)
``` INIȚIALIZARE:
BUCLĂ PRINCIPALĂ:
dacă pos == 0 → J1 câștigă
dacă pos == 29 → J2 câștigă
ISR(INT0_vect) [Buton J1]:
ISR(INT1_vect) [Buton J2]:
CÂȘTIG:
```
—
## Rezultate Obținute
*(De completat după asamblarea hardware și testare)*
Rezultate așteptate: - 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)
—
## Concluzii
*(De completat după finalizarea proiectului)*
—
## Cod Sursă și Resurse GitHub
Tot codul sursă, schemele hardware și fotografiile proiectului sunt disponibile pe GitHub:
Repository GitHub: *(link de adăugat)*
Structura repository-ului: ``` cyberpull/ ├── src/ │ └── main.ino ├── hardware/ │ ├── schema_electrica.fzz │ └── diagrama_cablaj.png ├── images/ │ ├── cutie_sus.jpg │ ├── cutie_jos.jpg │ └── demo.jpg └── README.md ```
—
## Jurnal
| Dată | Activitate |
| — | — |
| 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 |
—
## Bibliografie și Resurse
### Resurse Hardware - [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 - [Biblioteca Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) - [Biblioteca LiquidCrystal_I2C](https://github.com/johnrickman/LiquidCrystal_I2C) - [Arduino Reference — attachInterrupt()](https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/) - [Arduino Reference — analogRead()](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/) - [Secrets of Arduino PWM](https://docs.arduino.cc/tutorials/generic/secrets-of-arduino-pwm/)
### Materiale de Laborator (OCW CS Pub) - [Laboratorul 2: Întreruperi & Timere](https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023) - [Laboratorul 3: Timere & PWM](https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024) - [Laboratorul 4: ADC](https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024) - [Laboratorul 6: I2C](https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024)