Bluetooth Battleships

Introducere

Joc Battleships cu doua placi Arduino (cate una pentru fiecare jucator) conectate prin Bluetooth. Harta fiecarui jucator este reprezentata de o matrice de led-uri 8×8. Dupa ce jucatorii si-au plasat navele, jocul incepe, iar fiecare dintre cei 2 jucatori va arunca cate o bomba pe harta adversarului. Daca un jucator a nimerit toate cele 12 spatii, o sa se afiseze “WINNER” pe matricea de led-uri, respectiv “LOSER” pe matricea celuilalt jucator.

Descriere generală

La inceputul jocului, fiecare jucator va plasa 3 nave, fiecare de lungime 3, 4, respectiv 5. Fiecare nava este plasata dupa ce sunt efectuati pasii de “selectare orientare”, “selectare rand-celula de inceput” si “selectare coloana-celula de inceput”. Pentru a efectua acesti pasi, fiecare jucator se foloseste de butonul de select, butonul care decrementeaza o valoare si cel care incrementeaza o valoare si urmeaza instructiunile de pe ecranul LCD. Pana la inceperea jocului, navele plasate sunt vizibile pe matricea de led-uri.

Dupa ce ambii jucatori au terminat de plasat navele, cele 2 placi Arduino isi transmit reciproc cate un mesaj pentru a incepe jocul. Cele 2 placi fac schimb de harti, fara ca acestea sa fie afisate pe matricea de led-uri.

Randul unui jucator este semnalizat de aprinderea unui LED rosu de pe breadboard. Jucatorul care trebuie sa faca mutarea alege randul, respectiv coloana unei celule pe care vrea sa arunce bomba cu ajutorul celor 3 butoane. Daca nimereste o celula a unei nave, se aprinde led-ul corespunzator de pe matrice si mai are dreptul sa arunce o bomba. Daca rateaza, se afiseaza un mesaj corespunzator, iar placa Arduino transmite prin bluetooth celeilalte placi ca e randul celuilalt jucator.

Daca un jucator alege o celula pe care a mai aruncat o bomba in turele trecute, este lasat sa aleaga alta celula.

Daca un jucator a nimerit toate cele 12 celule de nave, jocul se termina, iar pe cele 2 matrici de led-uri vor fi afisate animatii de “WINNER”, respectiv “LOSER”. Invingatorul va avea led-ul de pe breadboard aprins.

Hardware Design

Lista piese:

  • 2 x Arduino UNO
  • 2 x Breadboard
  • 2 x Modul Bluetooth HC-05
  • 2 x Matrice LED-uri 8×8 + circuit de control
  • 2 x Ecran LCD 1602 + adaptor I2C
  • 6 x Buton
  • 4 x Rezistor 220 Ohmi
  • 2 x LED simplu
  • Fire Male-Male si Female-Female

Schema electrica

Software Design

Pentru dezvoltarea codului am folosit Arduino IDE.

Biblioteci utilizate:

  • Arduino_LED_matrix
  • Arduino_LiquidCrystal-I2C

Codul este structurat in patru functii, setup(), loop(), setBoat() si configureBoards().

In setup(), intai se initializeaza pinii digitali pentru butoane si led, matricea de led-uri, comunicarea seriala prin Bluetooth si comunicarea cu ecranul LCD 1602 prin convertorul I2C. Apoi, se apeleaza de 3 ori functia setBoat() pentru a pune cele 3 nave de lungime 3, 4, respectiv 5 pe harta. Apoi, se transmite prin Bluetooth faptul ca initializarea hartii s-a incheiat. La final, se apeleaza functia configureBoards() care transmite harta proprie catre celalalt player si primeste harta celuilalt player.

Functia setBoat() are 3 etape in care se alege orientarea, randul celulei de inceput si coloana celulei de inceput a navei. Fiecare etapa presupune un busy-waiting care se termina la apasarea butonului SELECT de pe pinul 7.

Functia configureBoard() are 2 etape: de transmitere a hartii si primire a hartii celuilalt player. Transmiterea informatiilor este seriala. O diferenta cheie intre codurile de pe cele doua placi este faptul ca o placa are etapele in ordinea trimite-primeste, in timp ce cealalta placa are etapele in ordinea primeste-trimite pentru a evita un deadlock.

Functia loop() are doua stari: una de wait si una de go. In cea de wait, se face un busy-waiting pana cand se primeste semnal de la celalalt player ca si-a terminat randul. In cea de go, se alege celula intr-un busy-waiting si la apasarea butonului SELECT, se decide daca playerul a nimerit celula sau nu. Daca a ratat, intra in starea de wait. Daca nu, reia starea de go.

Rezultate Obţinute

Concluzii

Mi-a facut placere sa lucrez la acest proiect in cadrul caruia am invatat o mica parte din ceea ce inseamna sa lucrezi cu microcontrollere. Am invatat ca nu trebuie subestimat niciodata niciun bug, fie el software sau hardware si, totodata, ca daca conectezi din neatentie pinul de 5V cu GND-ul Arduino-ului, se duc banii de mancare pe 2 zile :)).

Datorita acestui proiect, imi doresc sa transform lucrul cu tot ce inseamna sfera Arduino intr-un mic hobby.

Download & Bibliografie

pm/prj2022/apredescu/bluetooth-battleships.txt · Last modified: 2022/05/25 13:14 by gpoalelungi
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