Echipa:
Grupa: 332 CA
Asistent: Dan Tudose
![]() | Pong este unul dintre cele mai vechi și populare jocuri arcade. El constă în redarea bidimensională a unui joc de tenis. Prin proiectul nostru, am urmărit să revigorăm clasicul joc prin introducerea unui control de joc bazat pe noile tendințe din materie de dispozitive portabile: Q-Touch.Doi utilizatori pot juca un meci de pong utilizând cele patru zone sensibile la atingere pentru a mișca paletele de tenis sus-jos. Scopul este ca mingea să nu iasă din teren. Dacă mingea iese din teren, numărul de vieți ale jucătorului vinovat scade. Atunci când un jucator rămăne fără vieți, jocul se termină cu un mesaj care anunță căștigătorul.Credem că proiectul este util altora fiindcă folosește comunicația serială între două plăcuțe, o bibliotecă pentru afișare pe LCD și o bibliotecă Atmel Q-Touch peste care se pot cladi numeroase alte proiecte ingenioase pe viitor. |
Proiectul conține:
Module hardware
Plăcuța de afișare
Plăcuța de control
Plăcuța de extensie
Module software
Plăcuța de afișare - Componente suplimentare | |
---|---|
Componentă | Număr |
Potențiometru 10K | 1 |
Rezistență 10K | 1 |
Rezistență 100 | 1 |
Condensator 100nF | 1 |
Baretă de 20 pini | 2 |
Cablu | ∞ |
Schema de mai jos a fost folosită la simularea interfeței dintre microcontroller și LCD în Proteus. LCD-ul din Proteus este LGM12641BS1R, care are 20 de pini cu funcționalități similare pinilor ecranului WG2864A folosit de noi, chiar dacă ordinea lor pe cele două diferă.
Ordinea corectă a pinilor de pe WG12864A este cea din tabelul de mai jos.
Se observă din tabel că există 5 pini de control ce trebuie conectați la portul C ai microcontrollerului. Pentru pinii de date (linii Data Bus DB0-DB1) nu este obligatoriu să se folosească portul B, folosit de noi, ci orice alt port liber al microcontrollerului.
Pinout LCD - microcontroller | ||||
---|---|---|---|---|
WG12864A | ATMEGA16 | |||
Pin | Simbol | Funcție | Pin | Simbol |
1 | Vss | GND | ||
2 | Vdd | Alimentare +5V | ||
3 | Vo | Ajustarea contrastului | ||
4 | D/I | Dată/Instrucțiune | 22 | PC0 |
5 | R/W | Read/Write | 23 | PC1 |
6 | E | H→L Signal Enable | 24 | PC2 |
7 | DB0 | Linie Data Bus | 1 | PB0 |
8 | DB1 | Linie Data Bus | 2 | PB1 |
9 | DB2 | Linie Data Bus | 3 | PB2 |
10 | DB3 | Linie Data Bus | 4 | PB3 |
11 | DB4 | Linie Data Bus | 5 | PB4 |
12 | DB5 | Linie Data Bus | 6 | PB5 |
13 | DB6 | Linie Data Bus | 7 | PB6 |
14 | DB7 | Linie Data Bus | 8 | PB7 |
15 | CS1 | Chip Select 1 | 25 | PC3 |
16 | CS2 | Chip Select 2 | 26 | PC4 |
17 | RST | Reset | ||
18 | Vee | Negative Voltage Output | ||
19 | LED+ | Alimentare pentru LED+ 4.2V RA=0 Ohmi | ||
20 | LED- | Alimentare pentru LED 0V |
Vee, Vo și GND se conectează la piciorușele potențiometrului. Vdd și LED+ se conectează la alimentare. LED- se conectează la masă printr-o rezsitență de 100. Reset se leagă la alimentare printr-o rezistență de 10K și la masă printr-un condensator de 100nF.
Plăcuța de control - Componente suplimentare | |
---|---|
Componentă | Număr |
Condensator 22nF | 4 |
Rezistență 1K | 4 |
Plăcuță de cupru | 1 |
Bareta de 20 pini | 1 |
Cablu | ∞ |
Cei 4 senzori (sus-jos pentru cei doi jucători) răspund la apăsări, nu la mișcări de alunecare. Ei au fost conectați la microcontroller-ul de pe plăcuța de senzori pe portul C, ocupand 8 pini (fiecare senzor ocupă 2 pini consecutivi).
Schema pentru conectarea unui senzor la doi pini ai ATMEGA16 |
---|
![]() |
Sursa: Atmel QTouch Library |
S-a respectat sugestia Atmel pentru designul senzorilor de atingere. S-a folosit o plăcuță de cupru pentru decuparea unor senzori de mai mult de 6mm lățime. S-a aplicat și un strat subtire izolant pe fiecare senzor.
Sugestia Atmel |
---|
![]() |
Sursa: Touch Sensor Design Guide |
Pentru interconectarea prin serială s-au folosit cei trei pini de Rx, Tx și GND.
Programul rulat pe plăcuta de afișare, lcd.hex care afișează jocul de pong pe LCD foloseste biblioteca KS0108 scrisă de Fabian Maximilian Thiele. Fucțiile acestei biblioteci permit:
Funcțiile care implementează logica jocului se găsesc în fisierul lcd.c. Logica jocului tratează:
Pentru a muta paletele coresunzător, se verifică periodic dacă există date primite pe serială. Dacă acestea există, se citește octetul care conține împachetate 2 constante care indică ce mutări au făcut cei doi jucători: UP, DOWN sau NONE. Se actualizează deplasările jucătorilor în mod corespunzător. Daca nu s-a primit nimic, mingea va continua să se miște (The show must go on). Toate aceste lucruri se petrec intr-o buclă căreia i se pune capăt în momentul în care unul dintre scoruri ajunge pe 0 si jocul se termină.
În programul control.hex:
Timerul este folosit pentru a indica la ce intervale de timp să fie generată o întrerupere a cărei rutina de tratare verifică dacă s-a apăsat vreunul dintre senzori.
Programul intră într-o buclă infinită, care verifică dacă este timpul să facă o măsurătoare. Dacă este cazul, măsoară senzorii și reține care au fost apăsați. Rezultatul este trimis apoi pe serială codificat într-un singur octet.
Pentru a rula programul am folosit biblioteci externe puse la dispoziție de Atmel. Ele depind de modelul microcontrollerului și de configurația senzorilor. Mai multe detalii se regăsesc pe pagina de utilizare a bibliotecii.
Implementarea proiectului a urmarit etapele:
S-au atins obiectivele propuse de a realiza un joc 2D de Pong controlat prin patru butoane sensibile la apăsare. O mică demonstrație se poate vedea in filmulețul de mai jos.
Demo |
---|