Introducere

Proiectul reprezintă versiunea electronică a jocului cu avioane, jucat de regulă cu hârtia și pixul. (o variație a jocului Battleship)

Descrierea jocului
Joc cu avioane pe hârtieLa joc participă 2 persoane, fiecare are 3 avioane (a câte 10 pătrățele) de poziționat într-o matrice de 10×10 pătrățele și de îndată ce acestea au fost poziționate, jucătorii incearcă să ghicească pe rând pozițiile avioanelor adversarului. Fiecare jucător încearcă câte o poziție din matrice și adversarul îi spune ce se găsește la poziția respectivă (gol, corpul sau capul avionului). Pentru a câștiga, toate avioanele trebuie “doborâte” înaintea adversarului prin ghicirea celor 3 poziții corespunzătoare pentru capetele avioanelor.

Nu știu cât de util este pentru alții acest proiect, dar noi am căutat ca prin intermediul lui să dobândim cunoștiințe noi intr-o manieră care sa ne distreze și care să ne trezească interesul pentru această latură a științei calculatoarelor.

Descriere generală

Schema bloc

Proiectul conține:

Module hardware

Plăcuța de bază

  • μC ATMega16
  • interfața serială folosită la comunicarea în rețea
  • interfața de programare prin USB

Plăcuța de extensie

  • matricea de led-uri
  • butoane

Module software

project.hex - conține toate instrucțiunile necesare pentru joc

Hardware Design

2xLista de piese
Componentă Număr
Rezistență 3K310
Rezistență 30010
Tranzistor10
Convertor BCD CD4028BE1
Push button5
Baretă4
Led100
Placuța de test1
Cablu
Schema electrică pentru plăcuța de bază
|ATMega16Interfața serialăInterfața de programare prin USB
Schema electrică pentru plăcuța de extensie
Convertor BCDButoaneAșezare led-uriTranzistoare

Pentru plăcuța de extensie:

  • 4 pini ai unui PORT de pe plăcuța de bază la cei 4 pini (15, 14, 13, 12) ai convertorului BCD
  • restul pinilor convertorului BCD (PINIBCD - {15, 14, 13, 12}) sunt conectați fiecare printr-o rezistență de 300 Ohmi (care nu apare în figură) la liniile matricei de leduri (L0 ,… ,L9)
  • cei 10 tranzistori NPN sunt conectați cu emitorii la GND, colectorii la coloanele matricei (C0, …, C9) iar în bazele lor intră rezistențe de 3K3 Ohmi care fac legătura și cu pinii conectați la 8 pini ai unui PORT și la alți 2 pini ai altui PORT de pe plăcuța de bază
  • cele 5 push button-uri sunt legate la GND și la 5 pini ai unui PORT de pe plăcuța de bază
  • 2 pini de pe plăcuța de bază sunt conectați la 2 pini de pe plăcuța de extensie servind drept Vcc și GND

Am considerat 1 convertor BCD și 10 tranzistoare în loc de 2 convertoare BCD pentru că ne-am gândit că vrem să aprindem mai multe led-uri deodată dar ne-am dat seama că mai bine aprindem câte un led pe rând deoarece n-am fi avut destulă intensitate pentru led-uri.

Inițial am vrut să facem cu interfață ethernet, ne-am cumparat tot ce ne trebuia mai puțin mufa magnetică mamă RJ45, mufă pe care nu am găsit-o nicăieri (la momentul respectiv) de aceea am decis că facem partea de rețea prin interfața serială RS232 dar nu știm de ce aceasta nu a mers cum ne așteptam să meargă (ca la etapa 1 a proiectului când a fost testată) și drept urmare am scos circuitul integrat MAX232 și am șuntat curentul electric prin cabluri în pinii respectivi.

Se poate vedea conectarea componentelor electrice și în galeria de poze de la “rezultate obținute” de mai jos.

Software Design

Ne așteptam ca partea de programare să ne ia mai puțin timp decât partea în care a trebuit să conectăm componentele electrice însă se pare că a programa și a ține cont de constrângerile mediului pe care programezi înseamnă ceva mai mult decât a te gândi la niște algoritmi care să-ți rezolve problema.

Jocul a fost gândit în așa fel încât să fie cât mai compact în ceea ce privește folosirea resurselor prin utilizarea unor tipuri de date cât mai mici ca memory footprint, prin scrierea unui cod fără informație redundantă și prin eliminarea codului nefolosit care venea o dată cu header-ele incluse.

Ierahia fișierelor cu dimensiunile lor

void clear_display() // stinge toate led-urile

void my_delay() // stabilește cât ar trebui sa rămână aprinse led-urile

void init_random() // initializeaza / suprascrie seed-ul din memoria EEPROM folosit la generarea unui număr random

void refresh_display() // actualizează display-ul / matricea de led-uri la fiecare intrare în bucla principală conform schimbărilor

uint8_t validate_dot_position(uint8_t x, uint8_t y) // validează poziția unui punct

void draw_dot(uint8_t x, uint8_t y, uint8_t  led_value) // aprinde led-ul corespunzător coordonatelor

void get_plane_dots(dot_t *vect, uint8_t x, uint8_t y, uint8_t dir) // întoarce punctele conținute de un avion dat prin coordonatele mijlocului acestuia

uint8_t validate_plane_position(uint8_t x, uint8_t y, uint8_t dir, uint8_t validate) // validează poziția unui avion

void draw_plane(uint8_t x, uint8_t y, uint8_t dir, uint8_t led_value) // aprinde led-urile corespunzătoare punctelor conținute de avion

dot_t random_cursor_position() // generează un pct de coordonate x, y aleator

dot_t random_plane_position(uint8_t *dir) // generază un pct valid de coordonate x, y aleator pentru un avion

void init_game(uint8_t *start_x, uint8_t *start_y, uint8_t *dir, uint8_t *dot_type, uint8_t *saved_dot_type) // inițializează parametrii jocului

void init_USART() // inițializeaza interfața serială

uint8_t pack_bcd(uint8_t x, uint8_t y) // împachetarea informației transmise 

void unpack_bcd(uint8_t bcd, uint8_t *x, uint8_t *y) // despachetarea informației primite

void usart_send(uint8_t data) // trimite date prin interfața serială

Rezultate Obţinute

În urma muncii depuse am realizat ce ne-am propus, un joc cu avioane pe matrice de leduri; însă placuța cu leduri poate fi folosită și pentru alte jocuri.

Galerie de poze cu plăcuțele realizate

 Rezultatul final  Rezultatul final  Munca din spate  Atelierul  În timpul jocului </aviewer>|

Concluzii

  • Proiectul a durat ceva până a fost terminat de aceea: cel mai bine este să te apuci din timp. Dacă îți cumperi componentele electrice din timp și le testezi, te asiguri că ai tot ce-ți trebuie când te apuci de proiect. Dacă te apuci din timp poți să-i aduci îmbunătățiri proiectului.
  • Cunoștiințele de electronică te ajută foarte mult în cazul proiectului, cu toate astea a pune în practică ce știi este destul de dificil datorită nesiguranței pe care o ai pentru că nu ai mai fost pus în situația aceasta. Ar fi fost mult mai ușor dacă la electronică am fi făcut și ceva circuite de bază pe astfel de plăcuțe.
  • Suntem de părere că este mult mai ușor de lucrat pe plăcuța imprimată decât pe plăcuța test. Din experiența dobândită la plăcuța de bază am zis că o să facem plăcuța de extensie pe plăcuța imprimată, însă ne-am lăsat convinși la un moment dat că e mai bine pe plăcuța de test dar n-a fost așa. Să lipim 100 de led-uri ca să scăpăm mai ieftin decât dacă ne-am fi luat un LCD a durat ceva și în plus a fost o treabă monotonă. Încă o problemă care ți-o rezolvă o plăcuța imprimată este cea in care ai un circuit foarte încărcat, deoarce pe plăcuța de test e posibil să facă masă unde nu trebuie.
  • Dacă îți alegi ceva care-ți place, te ajută sa treci peste momentele în care nu-ți dai seama cum trebuie să faci anumite lucruri.

Download

Jurnal

27 Mai 2010 Am cumpărat componentele electrice. Nu am găsit tot ce ne trebuia.

28 Mai 2010 Ne-am apucat de implementat circuitul electric.

1 Iunie 2010 Am fost să căutam restul componentelor. Tot nu am găsit ce trebuie pentru interfața Ethernet. Am terminat de implementat circuitul electric.

2 Iunie 2010 Ne-am apucat de programare.

4 Iunie 2010 Am terminat cu programarea și am făcut documentația proiectului.

Bibliografie/Resurse

1) software-ul mai trebuie îmbunătățit pe partea de rețea
pm/prj2010/dloghin/jocul-cu-avioane-pe-matrice-de-leduri.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