İçindekiler:

Cyclone LED Arcade Oyunu: 4 Adım
Cyclone LED Arcade Oyunu: 4 Adım

Video: Cyclone LED Arcade Oyunu: 4 Adım

Video: Cyclone LED Arcade Oyunu: 4 Adım
Video: Cyclone Game 2024, Eylül
Anonim
Image
Image
Fikstürde Yükle
Fikstürde Yükle

Bu projenin amacı, çocuklar için etkileşimli ve eğlenceli olacak bir Arduino kullanarak basit bir oyun yaratmaktı. Cyclone atari oyununun gençken en sevdiğim atari oyunlarından biri olduğunu hatırlıyorum, bu yüzden onu kopyalamaya karar verdim. Bu, bir Arduino, ayrı ayrı adreslenebilir LED'ler dizisi ve bir butondan oluşan çok basit bir projedir.

Oyunun amacı, belirtilen (kırmızı) LED'e ulaştığında bisiklet ışığını durdurmaktır. Başarılı olursa, zorluk seviyesi artacaktır. Başarısız olursa, ışık döngüsü mevcut zorluk seviyesinde yeniden başlar.

Bu talimat, kodlamamın özü için büyük bir kaynaktı.

Adım 1: Sarf Malzemelerini Toplayın

  • Ana bileşenler:

    • Arduino (Bir UNO kullandım)
    • Ayrı ayrı adreslenebilir LED dizisi (bağlantıyı kullandım)
    • Basma düğmesi (bağlantıyı kullandım)
    • Baskılı devre kartı (PCB) veya devre tahtası
    • Güç Kaynağı (İki ayrı güç kaynağı kullandım, yaratıcıysanız bir tanesini alabilirsiniz)

      • LED'ler için 5V 3A
      • Arduino için 9V 1A
  • Çerçeve:

    • Elektronik muhafaza (Goodwill'den bir ahşap lamba armatürünü değiştirdim)
    • LED muhafaza (Standart duvar saatinizi değiştirdim ve delik işaretleri olarak dakika tanımlayıcılarını kullanarak delikler açtım. Delmeyi kolaylaştırmak için mümkünse ahşap bir saat kullanın.)
    • Düğme muhafazası (ben dirsek PVC boru kullandım)
  • Araçlar / Diğer Malzemeler:

    • Devreniz için yedek kablolama
    • 10K (anahtar için aşağı çekme direnci) ve 470 ohm (LED'lerdeki veri kablosu için) dirençler
    • LED'lerinizi yerleştirmek için delikler oluşturmak ve armatürünüzde kabloları geçirmek için gerekli delikleri açmak için matkap.
    • Devrenizi bir PCB'ye lehimlemek için havya
    • LED'leri armatürünüze sabitlemek için sıcak tutkal tabancası
    • Velcro veya çerçeveyi bir arada tutmanın bazı yolları
    • Tellerin geçmesi için açılan delikler için isteğe bağlı contalar

2. Adım: Kodu Yükleyin

"FastLED" kitaplığını indirip eklediğinizden emin olun

Kodun özü (boş döngü) iki durumdan oluşur: yüksek basma düğmesi (Oyunu Sonlandır) ve düşük basma düğmesi (Oynuyor). Kullanıcı düğmeye bastığında, ışığın durduğu LED adresi, merkez LED'in adresi ile karşılaştırılır. Aynı değilse, tüm ışıklar iki kez kırmızı yanıp söner ve mevcut seviye yeniden başlar. Aynıysa, cylon (FastLED kitaplık komut dosyası) iki kez çalışır, zorluk seviyesi artar ve oynatma devam eder. Oyuncu son seviyeyi geçtiğinde, cylon sekizinci kez koşar ve oyun 1. seviyede yeniden başlar.

// Siklon Oyunu

#include "FastLED.h" //50'ye kadar #define NUM_LEDS 40 #define CENTER_LED 21 #define DATA_PIN 7 #define LED_TYPE WS2811 #define COLOR_ORDER RGB //aralığı 0-64 #define PARLAKLIK 50 //Zorluk seviyelerinin tanımı #define EASY 1 #define MEDIUM 2 #define HARD 3 #define ON_SPEED 4 #define SONIC_SPEED 5 #define ROCKET_SPEED 6 #define LIGHT_SPEED 7 #define MISSION_IMPOSSIBLE 8 //Başlangıç zorluğu int zorluk = 1; // Led dizisini tanımlayın CRGB ledleri[NUM_LEDS]; // Oyuncu bu raundu kazandı mı? Bu etiket zorluk parametreleri için kullanılır. bool wonThisRound = yanlış; // Dönen ışığın başlangıç konumu int LEDaddress = 0; // Oyun çalışıyor mu? bool Oynama = doğru; // Bu ilk galibiyet mi? bool CycleEnded = true; // Düğme ayrıntıları const int buttonPin = 9; int düğmeDurumu = 0; // led kütüphanesini ve arduino fonksiyonlarını sıfırla void setup() { FastLED.addLeds(leds, NUM_LEDS); FastLED.setBrightness(PARLAKLIK); pinMode(buttonPin, INPUT); Seri.başla(9600); } // Et ve patates //İki Mod - Oyun Oynama ve Oyunu Bitir void loop() { // OYUNU SONLANDIR buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { Playing = false; //Kullanıcı düğmeye bastı ve kazanan adresteki LED durdu. for (int i = 0; i < NUM_LEDS; i++) { led'ler = CRGB::Siyah; } ledler[CENTER_LED] = CRGB::Kırmızı; led'ler[LEDadresi] = CRGB::Yeşil; FastLED.show(); if (CycleEnded = true) { int diff = abs(CENTER_LED - LEDaddress); // Yanan led ile merkez led arasındaki mesafeyi bulur if (diff == 0) { wonThisRound = true; //Oyuncu seviyeyi başarıyla geçti if (difficulty != MISSION_IMPOSSIBLE) { for (int i = 0; i < 2; i++) { cylon(); } } if (zorluk == MISSION_IMPOSSIBLE) { for (int i = 0; i < 8; i++) { cylon(); } zorluk = 0; } zorluk artışı(); wonThisRound = yanlış; } başka { gecikme(1000); for (int i = 0; i < 2; i++) { flash(); } } CycleEnded = false; } LEDadresi = 0; gecikme(250); buttonState = digitalRead(buttonPin); if (buttonState == LOW) { Playing = true; } } //PLAYING if(Playing) { for (int i = 0; i < NUM_LEDS; i++) { led'ler = CRGB::Black; //Tüm ledleri kapatır } ledler[CENTER_LED] = CRGB::Kırmızı; //Merkez led rengini yeşil ledlere ayarlar[LEDadresi] = CRGB::Yeşil; //Cyling led rengini kırmızıya ayarlar FastLED.show(); //Işık döngüsü LEDadresi'ni başlatır++; //(LEDadresi == NUM_LEDS) { LEDadresi = 0; } gecikme(getTime(zorluk)); buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { Playing = false; CycleEnded = true; } } } //Seviye Parametreleri int getTime(int diff) // Zorluk bazında ledli hareket için zaman gecikmesini döndürür { int timeValue = 0; geçiş (fark) { durum KOLAY: timeValue = 100; kırmak; durum ORTA: timeValue = 80; kırmak; durum ZOR: timeValue = 60; kırmak; durum ON_SPEED: timeValue = 40; kırmak; durum SONIC_SPEED: timeValue = 30; kırmak; durum ROCKET_SPEED: timeValue = 20; kırmak; durum LIGHT_SPEED: timeValue = 13; kırmak; case MISSION_IMPOSSIBLE: timeValue = 7; } timeValue geri;// Gecikme miktarını döndür } //Kazanma zorluğu arttırma parametreleri void boostDifficulty() { if (difficulty != MISSION_IMPOSSIBLE && wonThisRound) { zorluk++; } } //Kayıp LED Gösterisi void flash() { fill_solid(led'ler, NUM_LEDS, CRGB::Kırmızı); FastLED.show(); gecikme(500); fill_solid(led'ler, NUM_LEDS, CRGB::Siyah); FastLED.show(); gecikme(500); } //Won LED Show void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds.nscale8(250); } } void cylon() { statik uint8_t hue = 0; Seri.print("x"); // Önce led'i bir yöne kaydırın for(int i = 0; i = 0; i--) { // i'inci led'i kırmızı ledlere ayarlayın = CHSV(hue++, 255, 255); // Ledleri göster FastLED.show(); // ledleri gösterdiğimize göre, i'nci led'i siyaha sıfırlayın // ledler = CRGB::Black; karartma(); // Dönüp dolaşmadan önce biraz bekleyip tekrar yapalım delay(10); } }

3. Adım: Fikstürde Kurun

Fikstürde Yükle
Fikstürde Yükle
Fikstürde Yükle
Fikstürde Yükle

Bu bölümde ayrıntılara girmeyeceğim. Bu kısım hakkında gitmenin binlerce farklı yolu var ve bence beğendiğiniz gibi görünmesi için yaratıcı olmalısınız. Bununla birlikte, matkap işaretleri olarak kullanabileceğim küçük göstergelere sahip olduğundan, saat LED'leri yerleştirmek için oldukça uygundu. Ayrıca cam kapak da bunu masa olarak kullanmamı sağlıyor.

Velcro, LED armatürünü elektronik muhafaza armatürüne sabitlemek için de çok kullanışlıydı. Arduino'da da cırt cırt kullandım. Bu, kodu değiştirmek istersem Arduino'yu çıkarmayı çok kolaylaştırdı.

Önerilen: