This shows you the differences between two versions of the page.
|
pm:prj2026:victor.stoica0203:stefan.dumitrache [2026/05/23 12:15] stefan.dumitrache [Conectare potentiometru pentru contrast] |
pm:prj2026:victor.stoica0203:stefan.dumitrache [2026/05/24 13:00] (current) stefan.dumitrache [Schema electrica] |
||
|---|---|---|---|
| Line 37: | Line 37: | ||
| Majoritatea componentelor, in afara display-ului LCD grafic, sunt incluse intr-un kit Arduino basic. | Majoritatea componentelor, in afara display-ului LCD grafic, sunt incluse intr-un kit Arduino basic. | ||
| - | ===== Schema electrica provizorie ===== | + | ===== Schema electrica ===== |
| - | Schema electrica finala va fi realizata dupa testarea componentelor pe breadboard. Pentru moment, conexiunile propuse sunt urmatoarele: | + | Schema electrica a proiectului este realizata pe breadboard, folosind placa Arduino Uno R3 ca unitate principala de control. Display-ul LCD ST7920 este conectat in mod serial, butoanele sunt conectate la pini digitali folosind rezistentele interne de pull-up ale microcontrollerului, iar LED-ul RGB si buzzer-ul sunt folosite pentru feedback vizual si sonor. |
| + | |||
| + | {{:pm:prj2026:victor.stoica0203:schema_electrica_invaderzim.png?200|}} | ||
| + | ==== Conectare alimentare ==== | ||
| + | |||
| + | ^ Componenta ^ Conectare ^ | ||
| + | | Arduino 5V | Linia + de pe breadboard | | ||
| + | | Arduino GND | Linia - de pe breadboard | | ||
| ==== Conectare LCD 12864 ST7920 ==== | ==== Conectare LCD 12864 ST7920 ==== | ||
| - | ^ Pin LCD ST7920 ^ Pin Arduino Uno ^ | + | ^ Pin LCD ST7920 ^ Pin Arduino / Breadboard ^ |
| - | | VSS / GND | GND | | + | | GND / VSS | GND | |
| - | | VDD / VCC | 5V | | + | | VCC / VDD | 5V | |
| | VO / V0 | Pin mijloc potentiometru 10K | | | VO / V0 | Pin mijloc potentiometru 10K | | ||
| | RS / CS | D10 | | | RS / CS | D10 | | ||
| - | | RW / SID | D11 | | + | | R/W / SID | D11 | |
| | E / SCLK | D13 | | | E / SCLK | D13 | | ||
| | PSB | GND | | | PSB | GND | | ||
| | RST | D8 | | | RST | D8 | | ||
| + | | VOUT | Pin lateral potentiometru 10K | | ||
| | BLA / LED+ | 5V | | | BLA / LED+ | 5V | | ||
| | BLK / LED- | GND prin rezistenta 220 Ohm | | | BLK / LED- | GND prin rezistenta 220 Ohm | | ||
| + | |||
| + | Pinii DB0-DB7 nu sunt folositi, deoarece display-ul este conectat in mod serial. | ||
| + | |||
| + | ==== Conectare potentiometru pentru contrast ==== | ||
| + | |||
| + | ^ Pin potentiometru ^ Conectare ^ | ||
| + | | Pin lateral 1 | LCD VOUT | | ||
| + | | Pin lateral 2 | GND | | ||
| + | | Pin mijloc | LCD VO / V0 | | ||
| + | |||
| + | ==== Conectare butoane ==== | ||
| + | |||
| + | Butoanele sunt configurate in cod folosind rezistentele interne de pull-up. Fiecare buton este conectat intre pinul digital al placii Arduino si GND. | ||
| + | |||
| + | ^ Buton ^ Pin Arduino ^ Cealalta parte ^ | ||
| + | | Sus | D2 | GND | | ||
| + | | Jos | D3 | GND | | ||
| + | | Stanga | D4 | GND | | ||
| + | | Dreapta | D5 | GND | | ||
| + | |||
| + | ==== Conectare buzzer pasiv ==== | ||
| + | |||
| + | ^ Pin buzzer ^ Conectare ^ | ||
| + | | + | D6 | | ||
| + | | - | GND | | ||
| + | |||
| + | ==== Conectare LED RGB ==== | ||
| + | |||
| + | LED-ul RGB folosit este de tip catod comun. Fiecare culoare este conectata printr-o rezistenta de limitare a curentului. | ||
| + | |||
| + | ^ Pin LED RGB ^ Conectare ^ | ||
| + | | Rosu | D7 prin rezistenta 220/330 Ohm | | ||
| + | | Verde | D9 prin rezistenta 220/330 Ohm | | ||
| + | | Albastru | D12 prin rezistenta 220/330 Ohm | | ||
| + | | Catod comun | GND | | ||
| + | |||
| + | ==== Observatii ==== | ||
| + | |||
| + | * Display-ul LCD ST7920 foloseste pinii D10, D11 si D13 pentru comunicatia seriala. | ||
| + | * Pinul PSB al display-ului este conectat la GND pentru selectarea modului serial. | ||
| + | * Luminozitatea backlight-ului este redusa prin conectarea pinului BLK la GND printr-o rezistenta de 220 Ohm. | ||
| + | * Butoanele folosesc rezistentele interne de pull-up, deci nu sunt necesare rezistente externe pentru acestea. | ||
| ==== Conectare potentiometru pentru contrast ==== | ==== Conectare potentiometru pentru contrast ==== | ||
| Line 81: | Line 131: | ||
| ^ Pin LED RGB ^ Pin Arduino ^ | ^ Pin LED RGB ^ Pin Arduino ^ | ||
| - | | Rosu | D7 prin rezistenta 220/330 Ohm | | + | | Rosu | D7 prin rezistenta 330 Ohm | |
| - | | Verde | D9 prin rezistenta 220/330 Ohm | | + | | Verde | D9 prin rezistenta 330 Ohm | |
| - | | Albastru | D12 prin rezistenta 220/330 Ohm | | + | | Albastru | D12 prin rezistenta 330 Ohm | |
| | Catod comun | GND | | | Catod comun | GND | | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | Proiectul va fi implementat in Arduino IDE sau PlatformIO. Codul va contine functii pentru initializarea tablei de joc, afisarea placutelor pe LCD, citirea butoanelor si procesarea mutarilor. Dupa fiecare mutare valida, va fi adaugata o placuta noua cu valoarea 2 sau 4. | + | Proiectul este implementat in Arduino IDE. Pentru controlul componentelor simple sunt folositi registrii microcontrollerului ATmega328P, iar pentru display-ul LCD ST7920 este folosita biblioteca U8g2 in mod software SPI. |
| - | Functii planificate: | + | Logica jocului este implementata folosind o matrice 4x4. La fiecare mutare, linia sau coloana afectata este comprimata, placutele egale sunt combinate, scorul este actualizat, iar apoi se adauga o noua placuta cu valoarea 2 sau 4. Jocul verifica permanent daca exista mutari valide sau daca s-a ajuns la valoarea 2048. |
| - | * setup() - initializarea display-ului, pinilor si tablei de joc | + | Pentru debugging este folosita comunicatia UART, initializata prin registri. Pentru buzzer-ul pasiv este folosit Timer2 in mod CTC, iar LED-ul RGB si butoanele sunt controlate prin acces direct la registrii GPIO. |
| - | * loop() - citirea comenzilor si actualizarea jocului | + | ==== Laboratoare acoperite ==== |
| - | * initializeGrid() - initializarea tablei 4x4 | + | |
| - | * addRandomTile() - adaugarea unei placute noi | + | |
| - | * drawGrid() - afisarea tablei pe LCD | + | |
| - | * moveLeft(), moveRight(), moveUp(), moveDown() - logica mutarilor | + | |
| - | * isGameOver() - verificarea finalului de joc | + | |
| - | * playSound() - generarea feedback-ului sonor | + | |
| - | * updateLed() - actualizarea LED-ului RGB in functie de starea jocului | + | |
| + | Proiectul foloseste concepte din mai multe laboratoare PM: | ||
| + | |||
| + | * Laboratorul 0 - GPIO: butoanele directionale sunt citite direct din registrul PIND, iar LED-ul RGB si buzzer-ul sunt controlate prin registrii PORTD si PORTB. | ||
| + | * Laboratorul 1 - UART: interfata UART este initializata prin registrii UBRR0H, UBRR0L, UCSR0B si UCSR0C, iar datele de debug sunt trimise prin registrul UDR0. | ||
| + | * Laboratorul 3 - Timere: buzzer-ul pasiv este controlat folosind Timer2 in mod CTC, prin registrii TCCR2A, TCCR2B, OCR2A si TIMSK2. | ||
| + | * Laboratorul 5 - SPI: display-ul LCD ST7920 este controlat prin interfata SPI hardware a microcontrollerului, folosind registrii SPCR, SPSR si SPDR. | ||
| + | |||
| + | ==== Detalii de implementare ==== | ||
| + | |||
| + | Pentru GPIO, pinii folositi pentru butoane sunt configurati ca intrari cu rezistente interne de pull-up, iar starile lor sunt citite din registrul PIND. LED-ul RGB si buzzer-ul sunt configurate ca iesiri prin registrii DDRD si DDRB si sunt controlate prin PORTD si PORTB. | ||
| + | |||
| + | Pentru UART, proiectul foloseste comunicatia seriala pentru debugging. Sunt trimise mesaje in Serial Monitor la pornirea jocului, la apasarea butoanelor, la mutari valide/invalide si la finalul jocului. | ||
| + | |||
| + | Pentru buzzer, Timer2 este configurat in modul CTC. La fiecare intrerupere, pinul buzzer-ului este comutat, generand un semnal periodic necesar pentru buzzer-ul pasiv. | ||
| + | |||
| + | Pentru LCD, comunicatia cu display-ul ST7920 este realizata prin SPI hardware. Arduino Uno foloseste pinii D13 pentru SCK, D11 pentru MOSI si D10 pentru CS. Datele sunt trimise catre LCD prin registrul SPDR, iar finalizarea transferului este verificata prin flag-ul SPIF din registrul SPSR. | ||
| + | |||
| + | ==== Functii implementate ==== | ||
| + | |||
| + | * gpioInitRegisters() - configureaza pinii folositi pentru butoane, LED RGB si buzzer folosind registrii DDRD, DDRB, PORTD si PORTB. | ||
| + | * buttonUpPressed() - verifica daca butonul pentru mutarea in sus este apasat, citind registrul PIND. | ||
| + | * buttonDownPressed() - verifica daca butonul pentru mutarea in jos este apasat, citind registrul PIND. | ||
| + | * buttonLeftPressed() - verifica daca butonul pentru mutarea la stanga este apasat, citind registrul PIND. | ||
| + | * buttonRightPressed() - verifica daca butonul pentru mutarea la dreapta este apasat, citind registrul PIND. | ||
| + | * setLedRegisters() - controleaza LED-ul RGB folosind registrii PORTD si PORTB. | ||
| + | * uartInitRegisters() - initializeaza comunicatia UART pentru debugging, folosind registrii UBRR0H, UBRR0L, UCSR0B si UCSR0C. | ||
| + | * uartSendChar() - trimite un caracter prin UART folosind registrul UDR0. | ||
| + | * uartPrint() - trimite un sir de caractere prin UART. | ||
| + | * uartPrintln() - trimite un sir de caractere prin UART, urmat de linie noua. | ||
| + | * uartPrintNumber() - trimite o valoare numerica prin UART. | ||
| + | * timer2InitForBuzzer() - configureaza Timer2 in mod CTC pentru generarea sunetului pe buzzer. | ||
| + | * ISR(TIMER2_COMPA_vect) - rutina de intrerupere asociata Timer2, folosita pentru comutarea pinului buzzer-ului. | ||
| + | * beepRegisters() - porneste buzzer-ul pentru un interval de timp dat, folosind Timer2. | ||
| + | * clearGrid() - goleste tabla de joc. | ||
| + | * addRandomTile() - adauga o placuta noua cu valoarea 2 sau 4 intr-o pozitie libera. | ||
| + | * initGame() - initializeaza un joc nou, reseteaza scorul si adauga primele doua placute. | ||
| + | * drawGame() - afiseaza tabla de joc, scorul si mesajele de stare pe LCD. | ||
| + | * compressLine() - elimina spatiile libere dintre placute pe o linie. | ||
| + | * mergeLine() - combina doua placute vecine cu aceeasi valoare si actualizeaza scorul. | ||
| + | * moveLeft() - realizeaza mutarea tuturor placutelor spre stanga. | ||
| + | * moveRight() - realizeaza mutarea tuturor placutelor spre dreapta. | ||
| + | * moveUp() - realizeaza mutarea tuturor placutelor in sus. | ||
| + | * moveDown() - realizeaza mutarea tuturor placutelor in jos. | ||
| + | * isGameOver() - verifica daca mai exista mutari valide disponibile. | ||
| + | * processMove() - proceseaza rezultatul unei mutari, adauga placuta noua, actualizeaza LED-ul, buzzer-ul si verifica finalul jocului. | ||
| + | * setup() - initializeaza componentele hardware, UART-ul, Timer2, LCD-ul si jocul. | ||
| + | * loop() - citeste butoanele si executa mutarile jocului. | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | * 8 mai - completare descriere, schema bloc si lista de componente | + | * 8 mai - completare pagina OCW: scurta descriere, schema bloc si lista de componente |
| - | * urmeaza - realizarea schemei electrice finale | + | * 11 mai - realizare montaj hardware pe breadboard si testare componente |
| - | * urmeaza - implementarea logicii jocului si testarea componentelor | + | * 11 mai - testare LCD ST7920, butoane directionale, LED RGB si buzzer pasiv |
| + | * 18 mai - implementare software pentru jocul 2048 | ||