Table of Contents

Arduino Space Invaders

  • Băceanu Robert-Cosmin
  • 332CD
  • îndrumător: Răzvan Virtan

Introducere

În acest proiect, voi folosi Arduino Uno împreună cu un display LCD și alte componente (precum un joystick şi un buzzer pasiv pentru redare de sunete) pentru a crea un mic joc de tip Space Invaders. Acest joc va permite utilizatorului să controleze o navă spaţială care se poate mișca în stânga și în dreapta, trăgând proiectile pentru a distruge navele invadatoare. De asemenea, voi integra un sistem de leaderboard care va stoca scorurile pe un card SD, permițând astfel jucătorului să își înregistreze performanțele.

Ideea proiectului a plecat de la pasiunea mea pentru jocuri video, care m-a introdus înca de mic în lumea programării şi a tehnologiei în general. Un factor ce a contribuit la alegerea acestei teme a fost curiozitatea mea legată de “cum sunt făcute jocurile”, atât din punct de vedere software, cât şi hardware.

Descriere generală

Următoarea schemă bloc arată toate modulele proiectului şi descrie modul în care acestea interacţionează.

Schema Bloc

Hardware Design

Pentru realizarea proiectului, am folosit următoarele componente:

Modulul pentru citirea cardului SD foloseşte protocolul de comunicaţie SPI. Modulul Joystick foloseşte 3 conexiuni, două analogice (pentru măsurarea înclinaţiei joystick-ului pe axele Ox şi Oy, mişcând nava spaţială) şi una digitală (apăsarea butonului joystick-ului, ce va face ca nava să tragă cu proiectile).

Următoarea schemă prezintă conexiunile necesare la nivel de schemă bloc.

Schema Hardware

Schema de mai jos prezintă cablajul necesar realizării proiectului.

Schema Hardware Tinkercad

Mai jos, se poate vedea stadiul curent al proiectului la nivel hardware.

Stadiu Curent Hardware

Software Design

Mediu de dezvoltare:

  • Arduino IDE 1.8.19

Biblioteci folosite:

  • LiquidCrystal.h
  • SPI.h
  • SD.h

Detalii despre implementare şi fluxul programului

La pornirea jocului, jucătorul este întâmpinat de un title-screen care se glisează din partea dreaptă, în timp ce o scurtă melodie de bun venit este emisă de buzzer-ul pasiv. Pe urmă, jucătorul este trimis în meniul principal, de unde poate alege să joace sau să consulte leaderboard-ul. Pentru a naviga în meniu, jucătorul foloseşte joystick-ul.

La alegerea opţiunii “Leaderboard”, jucătorului îi vor fi prezentaţi cei mai buni 3 timpi ai săi. Prima pagină afişează cel mai bun timp, în timp ce a doua pagină afişează timpii de pe locurile 2 şi 3. Atunci când jucătorul se află pe prima pagină, apăsarea butonului joystick-ului îl va întoarce în meniul principal. Clasamentul este stocat sub forma unui fişier text pe cardul SD, iar acesta este suprascris cu noile valori la fiecare actualizare.

La alegerea opţiunii “Play”, jucătorul va avea de eliminat 5 valuri de nave extraterestre, unde fiecare nivel are un grad de dificultate diferit (mai mulţi inamici/inamici mai rapizi). La finalul celor 5 valuri, jucătorul primeşte un mesaj de victorie şi îi este calculat timpul în care a reuşit să elimine inamicii.

Pentru desenarea spaţiului de joc, am împărţit la nivel logic rândurile display-ului în câte două rânduri mai mici, astfel obţinând o hartă de 16×4. La fiecare “frame”, este parcursă o matrice de 16×4 a căror valori indică dacă spaţiul reprezintă nava jucătorului, o navă extraterestră, un proiectil sau un spaţiu liber.

Logica meniului principal este descrisă în funcţia loop(), care fie afişează meniul curent, fie apelează funcţia play(), unde este implementată logica jocului (funcţie care foloseşte, la rândul ei, alte funcţii menite să modularizeze structura codului pentru a fi uşor de urmărit).

Rezultate Obţinute

Mai jos puteţi vedea poze ce surprind stadiul final al proiectului.

Stadiu final

Piesele folosite în realizarea proiectului (placa de dezvoltare, breadboard-ul, modulele joystick şi SD) au fost lipite pe o placă de polistiren. În imagine este surprinsă o sesiune de gameplay.

Download

Mai jos este ataşată o arhivă ce conţine fişierul .ino al proiectului.

SpaceInvadersCode.zip

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite.

Resurse hardware

Datasheet ATmega328p

Datasheet LCD 1602

Datasheet modul joystick biaxal

Datasheet modul citire card microSD

Resurse software

Documentaţie Arduino IDE

Documentaţie LiquidCrystal.h

Documentaţie SPI.h

Documentaţie SD.h