This is an old revision of the document!


Minesweeper

Introducere

Nume: Toader Ana-Maria
Grupa: 334CB

Joc Minesweeper pe un LCD.

  • jucătorul controlează mișcările prin intermediul unui joystick și a două butoane
  • un board (solvable) randomizat este generat pentru fiecare nou joc
  • un buzzer emite sunete la realizarea unei mișcări greșite sau la câștigarea jocului

Scopul proiectului este realizarea unui joc entertaining.

Descriere generală

Implementarea jocului Minesweeper pe un LCD. Controlul se va face printr-un joystick și butoane. Va avea un timer și un buzzer care scoate sunete la câștigarea / pierderea jocului.

Placa de dezvoltare compatibilă cu Arduino UNO (ATmega328p) controlează buzzer-ul și display-ul, primind input de la două butoane și un joystick. Pentru comunicarea cu LCD-ul folosește protocolul SPI. Prin joystick se controlează mișcările jucătorului pe tabla de joc, iar prin cele două butoane se poate selecta tipul celulei: clear sau flagged. Obiectivul jocului este descoperirea tuturor celulelor libere. Atunci când pe tablă rămân doar mine nedescoperite, jocul este câștigat, iar buzzer-ul va emite un sunet specific. Alternativ, la o mișcare greșită, jocul se încheie, iar sunetul emis de buzzer anunță înfrângerea.

Hardware Design

Schema electrică:

Lista de componente:

Nume componentă Link achiziție Cantitate Preț unitar
Arduino UNO R3 Placă de dezvoltare 1 39,37 lei
2.8” SPI LCD module cu controller ILI9341 Display 1 69,99 lei
Modul joystick biaxial Joystick 1 5,35 lei
Modul cu buzzer activ Buzzer 1 2,99 lei
Push button Buton 2 1,99 lei
Rezistor 10kΩ Rezistor 10kΩ 6 0.10 lei
Rezistor 100kΩ Rezistor 100kΩ 3 0.10 lei
Diodă 1N4007 Diodă 1N4007 2 0.49 lei
Breadboard HQ (400 points) Breadboard 2 4,56 lei
Fire rigide Set fire rigide 1 12,49 lei
Fire tată-tată Set fire tată-tată 2 2,85 lei
Cost total: 150,87 lei

Software Design

Setup

Mediu de dezvoltare: Visual Studio Code + PlatformIO
Librării:

  • SPI
    • oferă suport pentru resursele hardware care folosesc protocolul SPI
  • Adafruit_GFX
    • oferă o serie de primitive grafice (linii, forme geometrice)
  • Adafruit_ILI9341
    • folosită pentru interfațarea cu display-ul care folosește chip-ul ILI9341
    • oferă o serie de funcții pentru randarea formelor geometrice, textului și a imaginilor, color management, touchscreen integration

Implementare

Timer
Microcontroller-ul ATmega328p conține 3 unități de timer, două pe 8 biți (Timer0 și Timer2) și unul pe 16 biți (Timer1).
Am folosit Timer1 pentru a genera întreruperi la intervale fixe de 1 secundă, pentru a afișa un timer pe display. La expirarea timpului înainte ca jocul să se fi încheiat, jucătorul pierde.

Am folosit formula de calcul:

timer_count = clock_frequency / (prescaler * interrupt_frequency) - 1

Conform datasheet-ului ATmega328p:

  • pentru setarea prescaler-ului am setat bitul CS12 din registrul TCCR1B

  • pentru setarea întreruperilor am activat bitul OCIE1A din registrul TIMSK1

  • am setat pragul numărătorii la care se va declanșa întreruperea (timer_count) în registrul OCR1A

Frecvența de funcționare a procesorului este 16 MHz.

#define CLOCK_FREQUENCY 16000000    /* 16 MHz */
#define INTERRUPT_FREQUENCY 1       /* 1Hz corresponds to 1 second period */
#define PRESCALER 256
#define TIMER_COUNT (CLOCK_FREQUENCY / (PRESCALER * INTERRUPT_FREQUENCY) - 1)
void init_timer1() {
    /* Reset control registers for Timer 1 */
    TCCR1A = 0;
    TCCR1B = 0;
 
    /* The prescaler value is 256 -> set the CS12 bit */
    TCCR1B |= (1 << CS12);
 
    /* Make the comparator trigger Timer/Counter1 input capture interrupt
    -> set the OCIE1A bit in the timer interrupt mask register (TIMSK1). */
    TIMSK1 |= (1 << OCIE1A);
 
    /* Set the threshold value (timer_count) for Timer 1 */
    OCR1A = TIMER_COUNT;
}

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

  • 04/05/2024 - finalizarea documentației + schema bloc
  • 07/05/2024 - testarea componentelor hardware
  • 12/05/2024 - finalizare hardware design

Probleme întâmpinate:​

  • Alimentarea modulului LCD funcționează la tensiunea de 3.3V, iar tensiunea de funcționare a plăcii de dezvoltare este de 5V. De aceea, am încercat inițial să folosesc un translator de nivel logic. După mult timp pierdut (și un display ars :-\) nu am reușit să îl fac să funcționeze. În urma indicațiilor laborantului,​ am ales să introduc în circuit rezistențe de 10kΩ.

Bibliografie/Resurse

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

Datasheet Arduino UNO R3
Datasheet ILI9341

Export to PDF

pm/prj2024/azamfir/ana_maria.toader02.1716486793.txt.gz · Last modified: 2024/05/23 20:53 by ana_maria.toader02
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