Სარჩევი:
ვიდეო: Arduino OLED გველი თამაში: 3 ნაბიჯი
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:17
მოგესალმებით და მივესალმებით, ჩვენს ინსტრუქციებს, თუ როგორ უნდა გავაკეთოთ და არდუინო OLED თამაში, ეს პროექტი მოხდა მაშინ, როდესაც ჩვენ ვცდილობდით ჩვენი პირველი თამაში არდუინოთი, ასე რომ, ჩვენ ვიფიქრეთ, სად უნდა დავიწყოთ უკეთესი ვიდრე ნოკია კლასიკური გველი (კარგად მინიმუმ გველის კლონი:)).
რაც დაგჭირდებათ
მარაგები
Arduino UNO ან კლონი
OLED ეკრანი
4 დიოდი
500-1k რეზისტორი
4 კონტროლერის ღილაკი
პასიური პიეზოს ზუზუნი
სურვილისამებრ
Solderless BreadBoard
გთხოვთ გაითვალისწინოთ, რომ ეს ბმულები მხოლოდ მაგალითისთვისაა
ნაბიჯი 1: წრე
ზემოთ მოცემულ სურათზე თქვენ ხედავთ ჩვენს წრეს, ჩვენ ვიყენებთ d3 პუნქტს arduino– ზე, როგორც შეწყვეტის მოთხოვნის პინს, ისე რომ arduino უპირატესობას მიანიჭებს კონტროლერის მონაცემების კითხვას d4 d5 d6 d7. მიკროსქემის საფუძვლებია ის, რომ დაჭერილია მიმართულების ღილაკი, რომელიც 5v მაღლა ადის, ეს ააქტიურებს შეწყვეტის მოთხოვნის პინს (d3 მეწამული მავთული) და შესაბამისი მიმართულების პინს, შეწყვეტის ფუნქცია იძახებს განახლების მიმართულების ფუნქციას და ეს კოდი გველის შესაბამისად მოძრაობს. პინ 9 გამოიყენება როგორც ხმის პინი, რადგან ეს არის PWM (~ პულსის სიგანის მოდულაცია), რომელიც უშუალოდ უკავშირდება 5 ვ პიეზოს + პინზე და - ბრუნდება 0 ვ/ადგილზე.
(FYI arduino uno და კლონებზე მხოლოდ d2 და d3 შეიძლება მოქმედებდეს როგორც შეწყვეტის მოთხოვნის ქინძისთავები).
მიმართულების ქინძისთავები:
d4 ნარინჯისფერი
d5 ქვემოთ ვარდისფერი
d6 მარცხნივ ლურჯი
d7 მარჯვნივ BROWN
d9 ჟღერს ნაცრისფერი
თითოეულ ღილაკს აქვს 5v კავშირის შეყვანა და გამომავალი, რომელიც ჯერ დაკავშირებულია არდუინოს შესაბამის ციფრულ შეყვანასთან, თითოეული ღილაკის იგივე გამომავალი შემდეგ უკავშირდება საკუთარ დიოდს, ჩვენ ვიყენებთ დიოდებს ძაბვის კვების შესაჩერებლად სხვა ღილაკები და მათი გააქტიურება. ოთხივე დიოდის კათოდზე (-) ბოლოს ჩვენ მათ ვუერთდებით, რათა შევქმნათ გამომავალი კავშირი, რომელიც აკავშირებს d3- ს და შემდეგ რეზისტორის საშუალებით 0v/დედამიწაზე, რათა არდუინოს ქინძისთავები დაბლა გაიყვანოს ისე, რომ არ დატოვოს მცურავი ქინძისთავები, როდესაც არ არის გააქტიურებულია.
(FYI მცურავ პინს შეუძლია მიიღოს მოჩვენებითი ძაბვა და გამოიწვიოს უჩვეულო ქცევა)
ეკრანის მართვისთვის გამოიყენება 2 ანალოგური ქინძისთავები, ეს არის arduino აპარატურის i2c ქინძისთავები.
A5 უკავშირდება SCL YELLOW- ს
A4 უკავშირდება SDA GREEN- ს
არდუინოდან გამომავალი +5v და 0v (დედამიწა) გამოიყენება როგორც ენერგიის წყარო მთელი წრედისთვის, რომელიც შეიძლება იკვებებოდეს USB ან ტელეფონის დამტენით.
ნაბიჯი 2: კოდი
// ------------------------ ANJAWARE გველის თამაშები წმინდა ხალხების დახმარებით --------------- -------
#ჩართეთ
#მოიცავს // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // ჩვენების ნაკრები (სიგანე, სიმაღლე) Adafruit_SSD1306 ჩვენება (128, 64); // განსაზღვრეთ შეყვანის ქინძისთავები ეს არის ქინძისთავები არდუინოზე ისინი არასოდეს იცვლება ასე რომ #განსაზღვრეთ #განსაზღვრეთ INTPIN 3/ DWNPIN 5 #განსაზღვრეთ LFTPIN 6 #განსაზღვრეთ RHTPIN 7 #განსაზღვრეთ SND 9 // განსაზღვრეთ მიმართულებები #განსაზღვრეთ DIRUP 1 // ეს მნიშვნელობები არის ის, რასაც "გველი" უყურებს გადაწყვეტილების მისაღებად- #განსაზღვრეთ DIRDOWN 2 // მიმართულებით, სადაც გველი იმოგზაურებს # განსაზღვრეთ DIRLEFT 3 #განსაზღვრეთ DIRRIGHT 4
// ღილაკის ცვლადების დაყენება
// volitile cos ჩვენ გვჭირდება ის განახლება interupt ასე რომ შეიძლება იყოს ნებისმიერი ცოტა ციკლის ღირებულება
// არასოდეს არის 4 -ზე მაღალი, ასე რომ საჭიროა მხოლოდ 8 ბიტიანი int რესურსების შესანახად არასტაბილური uint8_t ღილაკზე დაჭერით = 0; bool butup = 0; bool butdown = 0; // ჩვენ ვიყენებთ ამას, რომ დავაყენოთ true, რათა „გამოვავლინოთ“რომელი მიმართულებით დაჭერილია bool butleft = 0; bool butright = 0;
// გველის ინტ
ბაიტი snakePosX [30]; // მასივი გველის ბაიტის სხეულის შესაქმნელად snakePosY [30];
int snakeX = 30; // გველის თავის პოზიცია
int გველი Y = 30; int snakeSize = 1; // გველის ზომის რაოდენობა შეზღუდულია მასივის ზომით
// მსოფლიოს ინტ
uint8_t worldMinX = 0; // ეს ადგენს სათამაშო მოედნის ლიმიტებს
uint8_t worldMaxX = 128; uint8_t worldMinY = 10; uint8_t worldMaxY = 63;
// შეაგროვეთ სკრანი (საკვები) და სკრანის პოზიცია
bool scranAte = 0; uint8_t scranPosX = 0; uint8_t scranPosY = 0;
// ცვლის ცვლადებს
გრძელი სათამაშო ქულა = 0; გრძელი ქულა = 30; // დააყენეთ მაღალი ქულა 3 შეაგროვეთ საწყის წერტილად
// --------------------------- ეს არის ის, რასაც წყვეტილი ახორციელებს ძაბვის მატებასთან ერთად ------------ -------------
void interruptpressed () {დაგვიანებით (150); // მცირე შეფერხება დამატებული "bounce" დაცვის განახლებული მიმართულებისათვის (); } // ------------------ განაახლეთ მიმართულების მნიშვნელობა ღილაკის დაჭერით ----------------- ძალადაკარგულად განახლებულია მიმართვა () { // Serial.println ("განახლების მიმართულება"); butup = digitalRead (UPPIN); // შეამოწმეთ რომელი შეყვანაა მაღალი და დააყენეთ შესაბამისი bool true butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // ეს იმ შემთხვევაში, თუ სტატისტიკოსები შეხედავენ რომელი შეყვანაა მაღალი და შეაქვს შესაბამისი მნიშვნელობა "ღილაკზე დაჭერით" // ცვლადში, ეს ცვლადი კარნახობს მოძრაობის მიმართულებას, თუ (butup == true) {buttonpressed = DIRUP; // Serial.println ("UP pressed"); // Serial.println (ღილაკზე დაჭერილი); butup = ყალბი; ტონი (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOWN pressed"); // Serial.println (ღილაკზე დაჭერილი); butdown = false; ტონი (SND, 1500, 10); }
თუ (butleft == ჭეშმარიტი)
{buttonpressed = DIRLEFT; // Serial.println ("მარცხნივ დაჭერილი"); // Serial.println (ღილაკზე დაჭერილი); butleft = ყალბი; ტონი (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("RIGHT pressed"); // Serial.println (ღილაკზე დაჭერილი); მართალი = ყალბი; ტონი (SND, 1500, 10); }}
// -------------------------- დახაზეთ ჩვენების რუტინები ------------------ -----------------
void updateDisplay () // დახაზეთ ქულები და მონახაზი
{// Serial.println ("ეკრანის განახლება");
display.fillRect (0, 0, ჩვენება. სიგანე ()-1, 8, შავი);
display.setTextSize (0); display.setTextColor (WHITE); // დახაზეთ ქულები display.setCursor (2, 1); display.print ("ქულა:"); ჩვენება. ბეჭდვა (სიმებიანი (playcore, DEC)); display.setCursor (66, 1); display.print ("მაღალი:"); ჩვენება. ბეჭდვა (სიმებიანი (მაღალი ქულა, DEC)); // დახაზეთ სათამაშო არე // pos 1x, 1y, 2x, 2y, ფერადი ჩვენება. drawrawline (0, 0, 127, 0, WHITE); // ძალიან ზედა საზღვრის ჩვენება. drawLine (63, 0, 63, 9, WHITE); // ანგარიში სეპარატორის ჩვენება. drawrawline (0, 9, 127, 9, WHITE); // ტექსტის საზღვრის ქვემოთ display.drawLine (0, 63, 127, 63, WHITE); // ქვედა საზღვრის ჩვენება. drawLine (0, 0, 0, 63, WHITE); // მარცხენა საზღვრის ჩვენება. drawLine (127, 0, 127, 63, WHITE); // მარჯვენა საზღვარი
}
// --------------------------------------- განაახლეთ სათამაშო არე ---------- --------------------
void updateGame () // ეს განაახლებს თამაშის არეალის ჩვენებას
{display.clearDisplay ();
display.drawPixel (scranPosX, scranPosY, WHITE);
scranAte = scranFood ();
// გველის რუტინის შემოწმება
if (outOfArea () || selfCollision ())
{gameOver (); }
// გველის ჩვენება
for (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // დაამატეთ გველს დამატებითი პიქსელი, თუ (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = გველი X; snakePosY [snakeSize-1] = გველიY; }
შეცვლა (ღილაკზე დაჭერილი) // იყო გველი მიმართულება
{საქმე DIRUP: snakeY- = 1; შესვენება; საქმე DIRDOWN: snakeY+= 1; შესვენება; საქმე გადასატანი: გველი X- = 1; შესვენება; საქმე DIRRIGHT: snakeX+= 1; შესვენება; } snakePosX [0] = snakeX; snakePosY [0] = snakeY; updateDisplay (); ჩვენება. ჩვენება (); // --------------------- მოათავსეთ სკრანი -------------------
void placeScran ()
{scranPosX = შემთხვევითი (worldMinX+1, worldMaxX-1); scranPosY = შემთხვევითი (worldMinY+1, worldMaxY-1); } // ------------------------ აკონტროლეთ წერტილი ---------------- bool scranFood () {if (snakeX == scranPosX && snakeY == scranPosY) {playcore = სათამაშო ქულა+10; ტონი (SND, 2000, 10); updateDisplay (); placeScran (); დაბრუნება 1; } else {დაბრუნება 0; }} // --------------------- ტერიტორიის გარეთ ---------------------- bool outOfArea () {დაბრუნება გველი X = worldMaxX || გველი Y = worldMaxY; } // ---------------------- თამაში დასრულდა ----------------------- --- void gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; rectY1 = 28; rectX2 = 58; rectY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); ტონი (SND, 2000, 50); display.print ("GAME"); ტონი (SND, 1000, 50); display.print ("OVER"); თუ (რეიტინგი> = უმაღლესი ქულა) // შეამოწმეთ, ნაჩვენებია თუ არა ქულა მაღალ ქულაზე {ქულა /ქულა; // single if statment განახლება მაღალი ქულა} for (int i = 0; i <= 16; i ++) // ეს არის თამაშის გარშემო rectanlges {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println ("თუ მარყუჟი"); ჩვენება. ჩვენება (); rectX1- = 2; // გადაადგილება 2 პიქსელით rectY1- = 2; rectX2+= 4; // გადაიტანეთ 2 პიქსელზე მეტი ბოლო წერტილიდან rectY2+= 4; ტონი (SND, i*200, 3); } display.display (); // ეკრანის წაშლა დიდების შემდეგ rectX1 = 0; // სწორი ხაზის საწყისი პოზიციის დადგენა rectY1 = 0; rectX2 = 0; rectY2 = 63; for (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; ჩვენება. ჩვენება (); } display.clearDisplay (); სათამაშო ქულა = 0; // გადააყენეთ გველი და მოთამაშის დეტალები snakeSize = 1; snakeX = ჩვენება. სიგანე ()/2; გველი Y = ჩვენება. სიმაღლე ()/2; waitForPress (); // დაელოდეთ მოთამაშეს თამაშის დაწყებას} // ------------------------- დაელოდეთ პრესის მარყუჟს ---------- --------------- void waitForPress () {bool ელოდება = 0; // მარყუჟი მთავრდება მაშინ როდესაც ეს არის ნამდვილი ჩვენება. ClearDisplay (); ხოლო (ლოდინი == 0) {drawALineForMe (WHITE); // დახაზეთ შემთხვევითი თეთრი ხაზი drawALineForMe (შავი); // დახაზეთ შემთხვევითი შავი ხაზი ისე, რომ ეკრანი მთლად არ ავსებდეს თეთრ ეკრანს.fillRect (19, 20, 90, 32, შავი); // ცარიელი ფონი ტექსტის ჩვენებისთვის. setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // უფრო დიდი შრიფტის ჩვენება. println ("გველი"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // border Snake display.drawRect (19, 20, 90, 32, WHITE); // სასაზღვრო ყუთი - 3 ჩვენება. setCursor (28, 42); display.setTextSize (0); // შრიფტი ნორმალურ ჩვენებაზე. println ("დააჭირეთ ნებისმიერ ღილაკს"); ჩვენება. ჩვენება (); ლოდინი = digitalRead (INTPIN); // შეამოწმეთ გასაღები დაჭერილი ლოდინი შეიცვლება 1 დამთავრებული ღილაკზე დაჭერით = 0; // ღილაკის გადატვირთვა დააჭირეთ}} // -------------------- დახაზეთ შემთხვევითი ხაზის შეყვანის ფერი uint8_t -------------- ----- ბათილად drawALineForMe (uint8_t clr) {uint8_t ხაზი 1X, ხაზი 1Y, ხაზი 2X, ხაზი 2Y = 0; // დააყენეთ შემთხვევითი კოორდინატები ხაზისთვის, შემდეგ დახაზეთ ის // ცვლადი არანაკლებ არც მეტი ხაზი 1X = შემთხვევითი (worldMinX+1, worldMaxX-1); line1Y = შემთხვევითი (worldMinY+1, worldMaxY-1); line2X = შემთხვევითი (worldMinX+1, worldMaxX-1); line2Y = შემთხვევითი (worldMinY+1, worldMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ----------------------------------------- შეჯახების გამოვლენა -------- -----------------------
for (byte i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {დაბრუნება 1; ტონი (SND, 2000, 20); ტონი (SND, 1000, 20); } დაბრუნება 0; }
//-------------------------------- ᲐᲬᲧᲝᲑᲐ--------------- ------------------------------------
void setup () {დაგვიანებით (100); // უბრალოდ მიეცით პერსონალს "ჩატვირთვის" შანსი // Serial.begin (9600); // გააუქმეთ ეს თუ გინდათ რომ ნახოთ სერიული შედეგები display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); // დაიწყეთ სუფთა ჩვენებით display.setTextColor (WHITE); // შექმენით ტექსტის ფერის ბრუნვის ზომა და ა.შ. display.setRotation (0); display.setTextWrap (ყალბი); ჩვენება.დიმი (0); // დისპლეის დაყენება brighness pinMode (INTPIN, INPUT); // დააყენეთ სწორი პორტები შეყვანის pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // ეს არის შეწყვეტილი ბრძანება, რომელიც „აჩერებს“arduino– ს ინფორმაციის შესასწავლად // command- function- pin-function to execute-condition on pin attachInterrupt (digitalPinToInterrupt (INTPIN), interruptpressed, RISING); // Serial.println ("კონფიგურაცია გავიდა"); waitForPress (); // აჩვენეთ გველის დაწყების ეკრანი placeScran (); // განათავსეთ საჭმლის პირველი ნაჭერი} // --------------------- მთავარი მარყუჟი ----------------- ---------------------- ბათილი მარყუჟი () {updateGame (); // ეს ფუნქცია არის ის, რაც ატარებს მთავარ კოდს}
ნაბიჯი 3:
გირჩევთ:
NeoPixels Matrix : გველი თამაში: 4 ნაბიჯი
NeoPixels Matrix : გველი თამაში: ჯერ კიდევ გახსოვთ გველის თამაში, რომელსაც ბავშვობაში ვთამაშობდით ჩვენს სათამაშო ყუთზე ან მობილურზე? დღეს ჩვენ ვისწავლით თუ როგორ უნდა გავაკეთოთ გველის თამაში 8*8 NeoPixels მატრიქსით. ჩვენ ვირჩევთ Arduino uno როგორც საკონტროლო ცენტრს და Joystick ბრეაკოუტ მოდულს, რათა ვითანამშრომლოთ
გველი: უსარგებლო მანქანა: 5 ნაბიჯი
გველი: უსარგებლო მანქანა: იცით, როდესაც ბავშვობაში იყავით და გველის თამაშობდით თქვენს ნოკიაზე? რაღაც მომენტში გველი დაიწყებდა საკუთარი კუდის დევნას და ეს მაშინ, როცა იცოდი, რომ თამაში დასრულდებოდა. ჩვენ გადავწყვიტეთ რობოტი გაგვეკეთებინა, მხოლოდ თამაში არასოდეს
სიმონ თამაში - სახალისო თამაში!: 5 ნაბიჯი
სიმონ თამაში - სახალისო თამაში!: ცნობა: აქ გრძელი შაბათ -კვირის შემდეგ, თქვენ ნამდვილად უნდა შეეცადოთ დაასრულოთ ყველა ის ამოცანა და სამუშაო, რომელზედაც თქვენ ხართ პასუხისმგებელი. დროა ჩვენც მოვამზადოთ ტვინი, არა? გარდა იმ მოსაწყენი და უაზრო თამაშებისა, არის თამაში სახელწოდებით Simon Game
Aruduino LED თამაში სწრაფი დაწკაპუნებით ორი მოთამაშის თამაში: 8 ნაბიჯი
Aruduino LED თამაში სწრაფი დაწკაპუნებით ორი მოთამაშის თამაში: ეს პროექტი შთაგონებულია @HasonAlkeim– ით. თუ თქვენ მზად ხართ ღრმად შეხედოთ აქ არის ბმული, რომლის ნახვა შეგიძლიათ https://www.instructables.com/id/Arduino-Two-Player-Fast-Button-Clicking-Game/. ეს თამაში არის Alkeim's– ის გაუმჯობესებული ვერსია. Ეს არის
სამეურვეო თამაში სეგა სატურნის თამაში კომპიუტერზე: 6 ნაბიჯი
სამეურვეო თამაში Sega Saturn თამაში კომპიუტერზე: მე ვარ Sega Saturn კონსოლის დიდი ფანი და ბევრი თამაშის სათაურების კოლექცია. მე ფლობდი იაპონიის შავ და თეთრ მოდელს. და ორივე მწყობრიდან გამოდის. ასე რომ, მე მოუთმენლად ველოდები ინტერნეტში Sega Saturn- ის ემულატორს და შევხვდები GigiGigi Saturn- ს