Mundarija:
Video: Arduino OLED ilon o'yini: 3 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
Salom va xush kelibsiz, biz OLED o'yinini qanday yaratish va o'rgatish bo'yicha ko'rsatmalarni qabul qilamiz, bu loyiha biz birinchi o'yinimizni arduino, soooo bilan o'tkazmoqchi bo'lganimizda sodir bo'ldi, biz nokia klassik iloniga qaraganda qaerdan boshlash kerakligini o'yladik. hech bo'lmaganda ilon klon:)).
Sizga nima kerak bo'ladi
Ta'minotlar
Arduino UNO yoki klon
OLED displey
4 ta diod
500-1k qarshilik
4 ta boshqaruv tugmasi
Passiv piezo signal
ixtiyoriy
Lehimsiz non paneli
E'tibor bering, bu havolalar faqat misol
1 -qadam: O'chirish davri
Yuqoridagi rasmda siz bizning sxemamizni ko'rishingiz mumkin, biz arduino d3 pinini uzilish so'rovi sifatida ishlatamiz, shunda arduino d4 d5 d6 d7 bo'lgan tekshirgich kirishini o'qishga ustuvor ahamiyat beradi. O'chirishning asosiy printsipi shundaki, yo'nalish tugmasi 5v balandlikda bosiladi, bu esa uzilish so'rov pinini (d3 binafsha sim) va unga mos keladigan yo'nalish pinini ishga tushiradi, uzilish funktsiyasi yangilanish yo'nalishi funktsiyasini chaqiradi va bu kod ilonni shunga mos ravishda harakatlantiradi. 9 -pin ovoz pimi sifatida ishlatiladi, chunki u PWM (~ impuls kengligi modulyatsiyasi) bo'lib, u + pinli 5V piezoga to'g'ridan -to'g'ri ulanadi va - 0v/tuproqqa qaytadi.
(Arduino uno va d2 va d3 klonlarining ma'lumotlari uzilish so'rov pinlari vazifasini bajarishi mumkin).
Yo'nalish pinlari:
d4 ORANGE yuqoriga
d5 pastga PINK
d6 chap ko'k
d7 o'ng BROWN
d9 ovozi kulrang
Har bir tugmachada 5V kuchlanishli kirish va birinchi navbatda arduino -dagi tegishli raqamli kirishga ulangan chiqish bor, har bir tugmaning xuddi shunday chiqishi o'z diodiga ulanadi, biz diodlardan kuchlanishni to'xtatish uchun foydalanamiz. boshqa tugmalar va ularni faollashtirish. Katod (-) barcha 4 diodning uchida biz d3 ga ulanadigan chiqish joyini yaratish uchun ularni birlashtiramiz, keyin esa qarshilik orqali 0v/ergacha arduino pimlarini pastga tortamiz, shunda suzuvchi pinlarni qoldirmaymiz. faollashtirilgan.
(Ma'lumot uchun suzuvchi pin xayoliy kuchlanishni qabul qilishi va g'ayrioddiy xatti -harakatlarga olib kelishi mumkin)
Displeyni boshqarish uchun 2 ta analog pin ishlatiladi, bu arduino apparat i2c pinlari.
A5 SCL YELLOW ga ulangan
A4 SDA GREEN -ga ulangan
Arduinodan +5v va 0v (er) chiqishi usb yoki telefon zaryadlovchisidan quvvat oladigan butun zanjir uchun quvvat manbai sifatida ishlatiladi.
2 -qadam: Kod
// ------------------------ ANJAWARE YILAN O'YINLARI Tarmoqli odamlarning yordami bilan --------------- -------
#qo'shing
#include // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // displey to'plami (kengligi, balandligi) Adafruit_SSD1306 displeyi (128, 64); // kirish pimlarini aniqlang, bu ular hech qachon o'zgarmasligi uchun arduino -dagi pinlar #aniqlang #INTPIN 3 -ni aniqlang // faqat 2 va 3 -pinlar UNO -da o'zaro bog'langan pin bo'lishi mumkin #UPPIN 4 -ni aniqlang // bu tegishli kalitga ulangan pinlar #define DWNPIN 5 #define LFTPIN 6 #RHTPIN 7ni belgilang #SND 9 ni aniqlang // yo'nalishlarni belgilang #DIRUPni belgilang 1 // bu qiymatlarni "ilon" qanday qaror qabul qiladi- #DIRDOWN 2 ni belgilang // ilonning qaysi yo'nalishda yurishini # DIRLEFT 3 ni aniqlang #DIRRIGHT 4 ni aniqlang
// tugmachaning o'zgaruvchilarini o'rnating
// volitile cos biz uni interupt bilan yangilashimiz kerak, shuning uchun har qanday tsikl qiymati bo'lishi mumkin
// hech qachon 4 dan yuqori emas, shuning uchun resurslarni tejash uchun faqat 8bit int kerak uint8_t buttonpressed = 0; bool butup = 0; bool butdown = 0; // biz buni "aniqlash" uchun rostlash uchun ishlatamiz bool butleft = 0; bool butright = 0;
// ilon ints
baytli snakePosX [30]; // ilon tanasi qilish uchun massiv bayt snakePosY [30];
int snakeX = 30; // ilon boshining holati
int ilonY = 30; int snakeSize = 1; // ilon kattaligi soni massiv kattaligi bilan cheklangan
// dunyo ints
uint8_t worldMinX = 0; // ular o'yin maydonining chegaralarini belgilaydi
uint8_t worldMaxX = 128; uint8_t worldMinY = 10; uint8_t worldMaxY = 63;
// skranni (ovqatni) va skranning holatini to'plang
bool scranAte = 0; uint8_t scranPosX = 0; uint8_t scranPosY = 0;
// o'zgaruvchilarni baholaydi
uzoq o'yin reytingi = 0; uzoq yuqori ball = 30; // boshlang'ich nuqta sifatida 3 ball yig'ing
// --------------------------- kuchlanish uzilishida interupt shunday qiladi ------------ -------------
void interruptpressed () {delay (150); // "sakrash" himoyasini qo'shish uchun biroz kechikish updatedirection (); } // ------------------ tugmachasini bosib yo'nalish qiymatini yangilang ---------------- void updatedirection () { // Serial.println ("yo'nalishni yangilash"); butup = digitalRead (UPPIN); // qaysi kirish balandligini tekshiring va tegishli bool true ni belgilang butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // bular, agar statementlar qaysi kirish yuqori bo'lganini ko'rib chiqsa va "tugma bosilgan" // o'zgaruvchiga tegishli qiymatni kiritsa, bu o'zgaruvchi harakat yo'nalishini belgilaydi, agar (butup == rost) {buttonpressed = DIRUP; // Serial.println ("yuqoriga bosildi"); // Serial.println (tugma bosilgan); butup = noto'g'ri; ohang (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOWN bosildi"); // Serial.println (tugma bosilgan); butdown = noto'g'ri; ohang (SND, 1500, 10); }
agar (chap == rost)
{tugma bosilgan = DIRLEFT; // Serial.println ("ChAP bosildi"); // Serial.println (tugma bosilgan); butleft = noto'g'ri; ohang (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println ("O'ngga bosilgan"); // Serial.println (tugma bosilgan); butright = noto'g'ri; ohang (SND, 1500, 10); }}
// -------------------------- displey tartibini chizish ------------------ -----------------
void updateDisplay () // ballar va konturlarni chizish
{// Serial.println ("Displeyni yangilash");
display.fillRect (0, 0, display.width ()-1, 8, BLACK);
display.setTextSize (0); display.setTextColor (oq); // chizish ballari display.setCursor (2, 1); display.print ("Hisob:"); display.print (String (playscore, DEC)); display.setCursor (66, 1); display.print ("Yuqori:"); display.print (String (yuqori ball, DEC)); // o'yin maydonini chizish // pos 1x, 1y, 2x, 2y, rangli displey.drawLine (0, 0, 127, 0, oq); // juda yuqori chegara displeyi.drawLine (63, 0, 63, 9, WHITE); // ball ajratgichi display.drawLine (0, 9, 127, 9, WHITE); // matn chegarasi ostida display.drawLine (0, 63, 127, 63, WHITE); // pastki chegara displeyi.drawLine (0, 0, 0, 63, oq); // chap chegara displeyi.drawLine (127, 0, 127, 63, WHITE); // o'ng chegara
}
// ----------------------------------- o'yin maydonini yangilash ---------- --------------------
void updateGame () // bu o'yin maydoni displeyini yangilaydi
{displey.clearDisplay ();
display.drawPixel (scranPosX, scranPosY, WHITE);
scranAte = scranFood ();
// ilon tartibini tekshiring
if (outOfArea () || selfCollision ())
{ O'yin tamom(); }
// ilonni ko'rsatish
uchun (int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = snakePosY [i-1]; } // ilonga qo'shimcha piksel qo'shing, agar (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = snakeX; snakePosY [snakeSize-1] = ilonY; }
kalit (tugma bosilgan) // ilon yo'nalishi edi
{holat DIRUP: ilonY- = 1; tanaffus; ish DIRDOWN: ilonY+= 1; tanaffus; DIRLEFT holati: snakeX- = 1; tanaffus; holat DIRRIGHT: snakeX+= 1; tanaffus; } snakePosX [0] = snakeX; snakePosY [0] = ilonY; updateDisplay (); display.display (); skanerni joylashtiring -------------------
bo'sh joyScran ()
{scranPosX = tasodifiy (worldMinX+1, worldMaxX-1); scranPosY = tasodifiy (worldMinY+1, worldMaxY-1); } // ------------------------ SCRAN ATE POINT UP ---------------- bool scranFood () {agar (snakeX == scranPosX && snakeY == scranPosY) {playscore = playscore+10; ohang (SND, 2000, 10); updateDisplay (); joyScran (); qaytarish 1; } boshqa {qaytarish 0; }} // --------------------- maydon tashqarisida ---------------------- bool outOfArea () {qaytish snakeX = worldMaxX || ilonY = worldMaxY; } //---------------------- O'yin tamom----------------------- --- void gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; to'g'riY1 = 28; rectX2 = 58; to'g'riY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); ohang (SND, 2000, 50); display.print ("O'YIN"); ohang (SND, 1000, 50); display.print ("OVER"); if (pley -off> = yuqori ball) // yuqori ballardan yuqori ballni tekshiring {highscore = playscore; // bitta bo'lsa, statment yuqori ballni yangilash uchun} (int i = 0; i <= 16; i ++) // bu o'yin atrofida {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE) ustidan to'g'ri chiziqlar chizish uchun; Serial.println ("agar pastadir"); display.display (); to'g'riX1- = 2; // 2 pikselga siljitish rektY1- = 2; rectX2+= 4; // oxirgi nuqtadan 2 piksel ustidan siljitish rektY2+= 4; ohang (SND, i*200, 3); } display.display (); // rectX1 = 0 ustidan mashhurlikdan keyin ekranni tozalash; // rektY1 = 0 qatorining boshlang'ich pozitsiyasini o'rnating; rectX2 = 0; to'g'riY2 = 63; uchun (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); o'yin skorlari = 0; // ilon va o'yinchi tafsilotlarini tiklash snakeSize = 1; snakeX = display.width ()/2; snakeY = displey.height ()/2; waitForPress (); // o'yinchi o'yin boshlanishini kutib turing} // ------------------------- bosish tsiklini kuting ---------- -------------- void waitForPress () {bool kutish = 0; // loop tugagandan so'ng tugaydi, bu haqiqiy display.clearDisplay (); while (kutish == 0) {drawALineForMe (WHITE); // tasodifiy oq chiziq chizish drawALineForMe (Qora); // ekran oq displeyni to'liq to'ldirmasligi uchun tasodifiy qora chiziq chizish.fillRect (19, 20, 90, 32, BLACK); // matn ko'rsatish uchun bo'sh fon.setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // katta shrift displeyi.println ("YILAN"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // chegara Snake display.drawRect (19, 20, 90, 32, oq); // chegara qutisi - 3 display.setCursor (28, 42); display.setTextSize (0); // shrift normal displeyga qaytariladi.println ("istalgan tugmani bosing"); display.display (); kutish = digitalRead (INTPIN); // tugma bosilganda kutish 1 tugashga o'zgarishini tekshiring = 0; // qayta o'rnatish tugmachasini bosing}} // -------------------- chizish tasodifiy kiruvchi rang uint8_t -------------- ----- bekor chizishALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // chiziq uchun tasodifiy koordinatalarni o'rnating, so'ngra uni chizamiz // o'zgaruvchidan ko'p bo'lmagan line1X = tasodifiy (worldMinX+1, worldMaxX-1); line1Y = tasodifiy (worldMinY+1, worldMaxY-1); line2X = tasodifiy (worldMinX+1, worldMaxX-1); line2Y = tasodifiy (worldMinY+1, worldMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------- to'qnashuvni aniqlash -------- -----------------------
for (bayt i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {qaytish 1; ohang (SND, 2000, 20); ohang (SND, 1000, 20); } qaytarish 0; }
//-------------------------------- SOZLASH--------------- -------------------------------
void setup () {kechiktirish (100); // narsalarga "yuklash" imkoniyatini bering // Serial.begin (9600); // display.begin (SSD1306_SWITCHCAPVCC, 0x3C) ketma -ket chiqishini ko'rishni istasangiz, bu belgini olib tashlang; display.clearDisplay (); // toza displey bilan boshlang display.setTextColor (WHITE); // matn rangining aylanish hajmini sozlash va hokazo display.setRotation (0); display.setTextWrap (noto'g'ri); display.dim (0); // ekranning yorqinligini belgilash pinMode (INTPIN, INPUT); // pinMode (UPPIN, INPUT) kirishiga to'g'ri portlarni o'rnating; pinMode (DWNPIN, INPUT); pinMode (LFTPIN, Kirish); pinMode (RHTPIN, INPUT); // bu kirishni o'qish uchun arduino-ni to'xtatuvchi "interupt" buyrug'i // buyruq-funktsiya-pin-funktsiyasi pinni biriktirish shartini bajarish uchun (raqamliPinToInterrupt (INTPIN), uzilgan, RISING); // Serial.println ("O'rnatish o'tdi"); waitForPress (); // ilonni ishga tushirish ekranini ko'rsatish placeScran (); // ovqatning birinchi qismini joylashtiring} // --------------------- ASOSI LOOP ----------------- ---------------------- void loop () {updateGame (); // bu funksiya asosiy kodni olib yuradi}
3 -qadam:
Tavsiya:
3D bosma ilon roboti: 7 qadam (rasmlar bilan)
3D bosma ilon roboti: Men 3D printerni olganimda, u bilan nima qilishim mumkinligi haqida o'ylay boshladim. Men juda ko'p narsalarni chop etdim, lekin men 3D bosib chiqarish yordamida butun konstruktsiyani yaratmoqchi edim. Keyin robot hayvon yasash haqida o'yladim. Mening birinchi fikrim it yoki o'rgimchak yasash edi, lekin
NeoPixels matritsasi: ilon o'yini: 4 qadam
NeoPixels Matritsa: Ilon o'yini: Siz hali ham bolaligimizda o'yin qutisida yoki mobil telefonimizda o'ynagan ilon o'yinini eslaysizmi? Bugun biz 8*8 NeoPixels Matrix yordamida ilon o'yinini yasashni o'rganamiz. Biz Arduino uno -ni boshqaruv markazi va Joystick -ning uzilish moduli sifatida tanlaymiz
Ilon o'yini: 4 qadam
Ilon o'yini: Salom bolalar, bugun men sizga Python -da ilonlarning asosiy o'yinini ko'rsataman va bu ta'tilda do'stlaringizni hayratda qoldiraman. Bu juda oddiy, sizga faqat python 3 va pygame install kerak. Bu ko'rsatmaga men pygame -ni qanday o'rnatish haqida video qo'shdim. Keyin
C: 8 qadamda ilon o'yini
C: in Snake o'yini: ilon o'yini eski mobil telefonlarda mashhur bo'lib, uni c dasturi yordamida osonlikcha almashtirish mumkin edi. Ushbu loyihani yaratish uchun sizga c sintaksisi haqida asosiy tushuncha kerak. Misol: loop, while va hokazo uchun, bu turdagi o'yin loyihasini yaratish bilan sizning dasturchi
VGA monitoridagi Arduino ilon: 5 qadam
VGA monitorida Arduino ilon: Xo'sh … men Arduino sotib oldim. Dastlab, sarmoya qizimni dasturlashga qiziqishini uyg'otadigan narsaga asoslangan edi. Ma'lum bo'lishicha, bu narsa men uchun o'ynashdan ko'ra qiziqroq edi. LEDlarni yasash bilan o'ynaganimdan keyin