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:

  1. Poziție LED = 15 (centru)
  2. Scor J1 = 0, Scor J2 = 0
  3. contor_apasari = 0
  4. dificultate = citire ADC → mapare la 1-8

BUCLĂ PRINCIPALĂ:

  1. Citește potențiometrul → actualizează dificultatea
  2. Actualizează LCD (scor + timp)
  3. Verifică condiția de câștig:

dacă pos == 0 → J1 câștigă

    dacă pos == 29 → J2 câștigă

ISR(INT0_vect) [Buton J1]:

  1. verificare debounce
  2. contor_apasari++
  3. dacă contor_apasari >= dificultate: poziție_LED–, contor = 0
  4. redă ton (500Hz, 50ms)

ISR(INT1_vect) [Buton J2]:

  1. verificare debounce
  2. contor_apasari++
  3. dacă contor_apasari >= dificultate: poziție_LED++, contor = 0
  4. redă ton (800Hz, 50ms)

CÂȘTIG:

  1. redă melodie de victorie
  2. clipesc toate LED-urile din jumătatea câștigătorului
  3. actualizează scorul pe LCD
  4. așteptare 3s → rundă nouă

```

## 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)

pm/prj2026/bianca.popa1106/alexandru.diaconu.1778344268.txt.gz · Last modified: 2026/05/09 19:31 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