Operácie

Buzz Wire Game

Zo stránky SensorWiki

Verzia z 14:34, 23. jún 2023, ktorú vytvoril StudentDTV (diskusia | príspevky)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)

Záverečný projekt predmetu DTV / LS2023 - Angelika Loduhová


Zadanie

Cieľom tohto projektu bolo vytvoriť hru, ktorej cieľom je sledovať drôtik (cestu) slučkou, pričom sa slučkou nesmiete dotknúť drôtiku na doske. Ak sa slučka a drôtik dotknú, obvod sa dokončí a zaznie bzučiak.

Arduino Buzz Wire Game


Zdroje:


Analýza a opis riešenia

Podstava (stolček)

Ako prvé budeme potrebovať malý stolček, na ktorom bude stáť celá hra. Skladať sa bude z troch dosiek: jednej väčšej, do ktorej vyvŕtame dve dierky a bude slúžiť ako vrch stolčeka a dve menšie dosky, ktoré budú slúžiť ako nohy stolčeka. Dosky som najskôr obrúsila a prišrobovala k sebe. Na nasledujúcom obrázku je hotový celý stolček.

Stolček

Drôtik a slučka

Ako druhé budeme potrebovať drôtik a slučku z drôtiku, čo bude tvoriť podstatu celej hry. Drôtik zohneme do rôzneho tvaru, tak aby vznikla cesta ako napríklad na nasledujúcom obrázku. Cesta by nemala byť príliš náročná ani príliš ľahká. Dôležitým detailom je spraviť cestu tak, aby pretŕčala zospodu stolčeka. Potom cestu vložíme do vyvŕtaných dierok stolčeka. Následne drôtik zaizolujeme napríklad elektrikárskou páskou asi centimeter nad stolčekom na oboch koncoch (aby sme mali kam odložiť slučku).

Drôtik (cesta)


Slučku tiež vytvoríme z drôtiku. Je to len rovný drôtik, ktorý je zakrivený na konci tak, aby tvoril slučku. Drôtik aj slučku je dobré predtým ošmirgľovať šmirgľovým papierom na zaistenie dobrého vedenia, inak hra nebude fungovať (naozaj odporúčam tento krok nepreskočiť). Potom vytvoríme rúčku slučky. Ja som na rúčku slučky použila tavnú pištoľ, ale môže sa vytvoriť napríklad aj z dreva. Rúčka by tiež mala byť nevodivá, preto som svoju oblepila elektrikárskou páskou. Opäť by sme mali nechať koniec slučky nezaizolovaný, budeme to potrebovať.

Slučka s rúčkou


Slučku napojíme na cestu. Cestu so slučkou upevníme v stolčeku, aby sa nehýbala. Opäť som na to použila tavnú pištoľ. Výsledok doterajšej práce by mohol vyzerať nejako takto:

Stolček s cestou a slučkou

Ďalším krokom bude pozapájať obvod a vytvoriť niečo ako podstavu na celú elektroniku.

Schéma zapojenia

V tomto kroku vytvoríme obvod našej hry. Všetky súčiastky som našla vo svojej Arduino súprave. Hlavnými súčiastkami, ktoré budeme potrebovať sú: Arduino Uno, I2C LCD displej, Breadboard, tlačidlá, vodiče, bzučiak a rezistory. Schéma zapojenia bude vyzerať približne nasledovne:

Schéma zapojenia

Vývod "Na drôtik" prispájkujeme zospodu stolčeka k ceste a vývod "Na slučku" prispájkujeme ku koncu slučky, ktorý následne zaizolujeme.

Podstava na arduino

Pôvodne som chcela vytvoriť celú krabičku na arduino, do ktorého som chcela schovať celú elektroniku, ale nakoniec som sa rozhodla len pre podstavu, na ktorej to všetko bude sedieť. Podstavu som najskôr namodelovala v prostredí OpenSCAD a potom vytlačila na 3D tlačiarni z resinu. Podstava sa kvôli rozmerom tlačiarne musela rozdeliť na dve časti, po vytlačení sa zlepili lepidlom na to určeným. Tlač sa síce nepodarila tak ako mala, ale stále bola podstava použiteľná za pomoci (opäť) tavnej pištole. Prikladám fotky hotového výrobku, ako aj súbory .scad s modelom podstavy.

Podstava

Model podstavy: Model_podstavy.zip

Algoritmus a program

Nasledovný program nahráme do Arduina a máme hotovo.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

char freePlay[] = "FREE PLAY";
char challenge[] = "CHALLENGE MODE";
char motivation[] = "you can do it!";
char gameOver[] = "GAME OVER";
char youWon[] = "** YOU WON! **";
byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
  0b00000
};

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int buzzer = 10;
const int circuit = 9;
const int changeButton = 2;
int mode = 1;
int showTimer = 20;
int timerTime = showTimer;
const int stopCountdown = 3;
bool countdown = false;

unsigned long previousMillis = 0;
const long interval = 1000;
int buzzed = 0;

void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  pinMode(buzzer, OUTPUT);
  pinMode(circuit, INPUT);
  pinMode(changeButton, INPUT);
  pinMode(stopCountdown, INPUT);
  showFreePlay();
  lcd.createChar(0, heart);
}

void loop() {
  // put your main code here, to run repeatedly:

  if (digitalRead(circuit) == HIGH) {
    digitalWrite(buzzer, HIGH);
  } else {
    digitalWrite(buzzer, LOW);
  }

  if (digitalRead(changeButton) == HIGH) {
    changeMode();
    delay(500);
  }

  unsigned long currentMillis = millis();
  if (mode == 2) {
    if (currentMillis - previousMillis >= interval && countdown == true) {
      previousMillis = currentMillis;
      if (showTimer > 0) {
        showCountdown();
      } else {
        lcd.setCursor(3, 1);
        lcd.print(gameOver);
        if (buzzed == 0) {
          digitalWrite(buzzer, HIGH);
          delay(1500);
          digitalWrite(buzzer, LOW);
          buzzed = 1;
        }
      }
    }
    if (digitalRead(stopCountdown) == HIGH) {
      countdown = false;
      lcd.clear();
      lcd.setCursor(1,1);
      lcd.print(youWon);
    }
  }
}

void showFreePlay() {
  lcd.setCursor(3, 0);
  lcd.print(freePlay);
  lcd.setCursor(0, 1);
  lcd.print(motivation);
  lcd.write((byte)0);
  showTimer = timerTime;
}

void showChallenge() {
  lcd.setCursor(1, 0);
  lcd.print(challenge);
}

void changeMode() {
  if (mode == 1) {
    mode = 2;
    lcd.clear();
    buzzed = 0;
    countdown = true;
    showChallenge();
  } else {
    mode = 1;
    lcd.clear();
    showFreePlay();
  }
}

void showCountdown() {
  if (showTimer >= 10) {
    lcd.setCursor(7, 1);
    lcd.print("");
    lcd.print(showTimer);
  }
  if (showTimer < 10) {
    lcd.setCursor(7, 1);
    lcd.print("  ");
    lcd.setCursor(8, 1);
    lcd.print(showTimer);
  }
  showTimer--;
}

Zdrojový kód: Buzz_wire_game_program.zip

Princíp

Po úspešnom zapojení a nahratí programu do Arduina sa nám na obrazovke ukáže "FREE PLAY" mód, ktorý umožňuje hráčovi skúšať prejsť slučkou celú cestu bez dotyku a počet pokusov je neobmedzený.

Free play

Po stlačení prvého tlačidla sa zmení mód na "CHALLENGE MODE" a začne odpočet od 20 sekúnd, počas ktorých hráč musí prejsť celú cestu bez dotyku.

Challenge mode

Po uplynutí 20 sekúnd zaznie bzučiak a na obrazovke sa vypíše nápis "GAME OVER".

Game over

Ak hráč stihne prejsť celú cestu bez dotyku stlačí druhé tlačidlo, ktoré zastaví časovač a obrazovka vypíše "YOU WON!".

Vyhral si

Celý projekt je znázornený na prvom obrázku.