Buzz Wire Game: Rozdiel medzi revíziami
Zo stránky SensorWiki
Vytvorená stránka „Záverečný projekt predmetu DTV / LS2023 - '''Angelika Loduhová''' == Zadanie == Cieľom tohto projektu bolo vytvoriť hru, ktorej cieľom je nedotknúť sa slučk…“ |
Bez shrnutí editace |
||
(11 medziľahlých úprav od 3 ďalších používateľov nie je zobrazených) | |||
Riadok 4: | Riadok 4: | ||
== Zadanie == | == Zadanie == | ||
Cieľom tohto projektu bolo vytvoriť hru, ktorej cieľom je | 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. | ||
[[ | [[Image:Dtv-buzz-wire.jpg|500px|thumb|center|Arduino Buzz Wire Game]] | ||
'''Zdroje:''' | |||
''' | |||
* [https://www.makeuseof.com/tag/make-buzz-wire-game-arduino/ Make a buzz wire game with an Arduino] | * [https://www.makeuseof.com/tag/make-buzz-wire-game-arduino/ Make a buzz wire game with an Arduino] | ||
Riadok 20: | Riadok 17: | ||
== Analýza a opis riešenia == | == 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. | |||
[[Súbor:Stolcek-buzz-wire.jpg|400px|thumb|center|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). | |||
[[Súbor:Drotik-buzz.jpg|500px|thumb|center|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ť. | |||
[[Súbor:Slucka-buzz-wire.jpg|400px|thumb|center|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: | |||
[[Súbor:Stolcek-slucka-buzz-wire.jpg|500px|thumb|center|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: | |||
[[Súbor:Schema-zapojenia-buzz-wire.png|700px|thumb|center|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. | |||
[[Súbor: | [[Súbor:Podstava-buzz-wire.jpg|400px|thumb|center|Podstava]] | ||
Model podstavy: [[Médiá:Podstava-model-buzz-wire.zip|Model_podstavy.zip]] | |||
=== Algoritmus a program === | === Algoritmus a program === | ||
Nasledovný program nahráme do Arduina a máme hotovo. | |||
<tabs> | |||
<tab name="Kód v prostredí Arduino IDE"><source lang="c++" style="background: LightYellow;"> | |||
#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 | 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--; | |||
} | |||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá:Buzz_wire_game.zip|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ý. | |||
[[Súbor:Freeplay-buzz-wire.jpg|300px|thumb|center|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. | |||
[[Súbor:Challenge-buzz-wire.jpg|300px|thumb|center|Challenge mode]] | |||
Po uplynutí 20 sekúnd zaznie bzučiak a na obrazovke sa vypíše nápis "GAME OVER". | |||
[[Súbor:Gameover-buz-wire.jpg|300px|thumb|center|Game over]] | |||
Ak hráč stihne prejsť celú cestu bez dotyku stlačí druhé tlačidlo, ktoré zastaví časovač a obrazovka vypíše "YOU WON!". | |||
[[Súbor: | [[Súbor:Won-buzz-wire.jpg|300px|thumb|center|Vyhral si]] | ||
Celý projekt je znázornený na prvom obrázku. | |||
[[Category:AVR]] [[Category: | [[Category:AVR]] [[Category:DTV]] |
Aktuálna revízia z 14:34, 23. jún 2023
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.
![](/sensorwiki/images/thumb/7/73/Dtv-buzz-wire.jpg/500px-Dtv-buzz-wire.jpg)
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.
![](/sensorwiki/images/thumb/4/4a/Stolcek-buzz-wire.jpg/400px-Stolcek-buzz-wire.jpg)
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).
![](/sensorwiki/images/thumb/0/09/Drotik-buzz.jpg/500px-Drotik-buzz.jpg)
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ť.
![](/sensorwiki/images/thumb/2/23/Slucka-buzz-wire.jpg/400px-Slucka-buzz-wire.jpg)
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:
![](/sensorwiki/images/thumb/3/31/Stolcek-slucka-buzz-wire.jpg/500px-Stolcek-slucka-buzz-wire.jpg)
Ď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:
![](/sensorwiki/images/thumb/0/03/Schema-zapojenia-buzz-wire.png/700px-Schema-zapojenia-buzz-wire.png)
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.
![](/sensorwiki/images/thumb/b/b9/Podstava-buzz-wire.jpg/400px-Podstava-buzz-wire.jpg)
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ý.
![](/sensorwiki/images/thumb/d/d2/Freeplay-buzz-wire.jpg/300px-Freeplay-buzz-wire.jpg)
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.
![](/sensorwiki/images/thumb/8/86/Challenge-buzz-wire.jpg/300px-Challenge-buzz-wire.jpg)
Po uplynutí 20 sekúnd zaznie bzučiak a na obrazovke sa vypíše nápis "GAME OVER".
![](/sensorwiki/images/thumb/c/c4/Gameover-buz-wire.jpg/300px-Gameover-buz-wire.jpg)
Ak hráč stihne prejsť celú cestu bez dotyku stlačí druhé tlačidlo, ktoré zastaví časovač a obrazovka vypíše "YOU WON!".
![](/sensorwiki/images/thumb/b/bd/Won-buzz-wire.jpg/300px-Won-buzz-wire.jpg)
Celý projekt je znázornený na prvom obrázku.