Introducere

Jocul Volfied este un joc arcade clasic, in care jucatorul manuieste o nava care trebuie sa cucereasca cat mai mult dintr-un teritoriu pentru a avansa la nivelul urmator. Se poate juca varianta cea mai complexa online aici:volfied

Pentru a cuceri teritoriu, nava avanseaza in zona inamica, si traseaza in urma ei linia care va delimita noul teritoriu. In momentul in care nava uneste doua puncte din propria zona, aria delimitata de linia trasata va fi cucerita.

Jucatorul trebuie sa se fereasca de inamicii care incearca sa impiedice nava sa castige din teritoriu. Nava este in siguranta cand se afla in propriu teritoriu (nu poate fi omorat de inamici). Atunci cand nava avanseaza in teritoriul inamic devine vulnerabila, si poate fi omorata daca un inamic atinge nava sau linia trasata pentru noul teritoriu.

Jocul implementat de mine are doi inamici care se vor deplasa aleatoriu. Nava este controlata prin 4 butoane, pentru deplasare stanga, dreapta, sus, jos. Jucatorul are 3 sanse sa castige nivelul: daca pierde o viata, revine pe pozitia de start si isi pastreaza teritoriul cucerit. Jocul este castigat cand se reuseste cucerirea a minim 80% din ecran.

Descriere generala

Pentru realizarea proiectului am mai creat doua placi suplimentare fata de placuta de baza cu microcontrolerul:

1. o placuta imprimata pentru LCD. Deoarece este riscanta lipirea pinilor lcd-ului cu letconul (se poate arde foarte usor), am ales sa fac o placa imprimata cu circuite doar pentru pinii lcd-ului, pe care fixez ecranul (lipit cu banda, sau fixat cu suruburi).

2. o placuta cu butoanele si celelalte componente:

  • 5 rezistente de 1k8
  • 5 rezistente de 3k3
  • 2 diode 1N4148
  • 1 condensator 10uF
  • 6 butoane (stanga, dreapta, sus, jos, start, stop)
  • pini (pentru legatura intre placute)

Piesele le-am cumparat majoritatea de la Syscom, in total m-au costat cam 15 lei (inclusiv placuta de test). LCD-ul l-am cumparat cu 15 lei de la un service GSM din piata Crangasi (l-am comandat dimineata la 11 si la 5 jumate in aceeasi zi puteam sa il iau).

Placuta lcd-ului se conecteaza la 8 pini de pe placuta cu butoane. Placuta cu butoane se leaga prin 13 pini cu placuta de baza:

  • 1 pin VCC
  • 1 pin GND
  • 5 pini pentru legatura rezistentelor (deci a lcd-ului) cu portul B al microcontrolerului
  • 6 pini pentru legatura butoanelor cu portul D al microcontrolerului

Schema

  • Diodele sunt necesare pentru a limita tensiunea de 5V de la VCC la 3.6V (LCD-ul foloseste 3.3V, pe care ii primeste pe pinul 1 - VDD)
  • Condensatorul se leaga intre pinul 7 al LCD-ului si masa
  • Pinul 6 al LCD-ul este GND, se leaga la masa
  • Restul de 5 pini ai LCD-ului trebuie conectati la microcontroler pentru a controla ecranul. Deoarece uC foloseste 5V, iar LCD-ul 3.3V, trebuie pus un divizor de tensiune, realizat din rezistenele de 1k8 si 3k3 (rezistentele de 1k8 se leaga intre uC si rezistentele de 3k3, iar rezitentele de 3k3 la masa).
  • Butoanele se leaga direct la uC, deoarece acesta are incluse rezistente de pull-up (care trebuie activate prin software)
  • Observatie: Pinii microcontrolerului sunt numerotati gresit de Eagle, numele lor este cel corect. LCD-ul este simulat cu ajutorul celor 8 pini.

Implementare software

Am pornit de la driverul de la Quantum Torque: 37. Acesta contine functii pentru initializarea lcd-ului, scrierea de caractere si siruri, pozitionarea cursorului, si are definita o lista de caractere ce pot fi afisate. Trebuie modificat makefile-ul pentru atmega16 (in loc de atmega64 cum este el).

Trebuie modificat in lcd.h portul la care este conectat ecranul si fiecare pin in parte. In cazul meu, conform schemei de mai sus, definitiile sunt:

#define LCD_CLK_PIN 	(1<<PB1)
#define LCD_DATA_PIN 	(1<<PB2)
#define LCD_DC_PIN 	(1<<PB3)
#define LCD_CE_PIN 	(1<<PB4)
#define LCD_RST_PIN 	(1<<PB7)
#define LCD_PORT	PORTB
#define LCD_DDR	        DDRB

Pentru a reprezenta nava si inamicii mi-am creat doua caractere speciale, SHIP si ENEMY, cu o forma particulara. Am creat si caracterul DELETE pentru a putea sterge toti cei 5 octeti care formeaza un caracter deodata.

{ 0x10, 0x28, 0x44, 0x28, 0x10 } SHIP

{ 0x54, 0x38, 0x7C, 0x38, 0x54 } ENEMY

{ 0x00, 0x00, 0x00, 0x00, 0x00 } DELETE

Folosind caracterul DELETE, pentru a sterge nava e suficient sa pozitionez cursorul unde se afla nava si sa trimit caracterul la LCD.

lcd_goto_xy_exact(px, py);
lcd_chr(DELETE);

Pentru testarea codului, am realizat o schema in Proteus, pe care am simulat programul. Deoarece Proteus nu contine in mod implicit LCD-ul de Nokia 3310, am downloadat o librarie separata. Libraria o gasiti aici: downloads217.html. Dupa cum zice si pe site, nu functioneaza pe toate versiunile de Proteus, eu am instalat 6.9 cu SP5 si a mers.

Schema mea de test in Proteus:

Observatie: In aceasta schema nu mai sunt necesare rezistentele datorita modului in care a fost implementat lcd-ul in librarie. Pe placa trebuie neaparat sa existe divizorul de tensiune pentru ca lcd-ul sa functioneze corect.

Linkuri utile

pm/prj2010/cvasile/volfied.txt · Last modified: 2021/04/14 17:07 (external edit)
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