สารบัญ:

เกมอาเขต Cyclone LED: 4 ขั้นตอน
เกมอาเขต Cyclone LED: 4 ขั้นตอน

วีดีโอ: เกมอาเขต Cyclone LED: 4 ขั้นตอน

วีดีโอ: เกมอาเขต Cyclone LED: 4 ขั้นตอน
วีดีโอ: Arduino Cyclone Arcade LED Chaser Game 2024, พฤศจิกายน
Anonim
Image
Image
ติดตั้งใน Fixture
ติดตั้งใน Fixture

จุดประสงค์ของโครงการนี้คือการสร้างเกมง่ายๆ โดยใช้ Arduino ที่จะโต้ตอบและสนุกสนานสำหรับเด็ก ๆ ฉันจำได้ว่าเกมอาเขต Cyclone เป็นหนึ่งในเกมอาร์เคดที่ฉันชอบเมื่อตอนที่ฉันยังเด็ก ดังนั้นฉันจึงตัดสินใจทำซ้ำ นี่เป็นโครงการที่เรียบง่ายมากที่ประกอบด้วย Arduino สตริงของไฟ LED ที่สามารถระบุตำแหน่งแยกกันได้ และปุ่มกด

เป้าหมายของเกมคือการหยุดไฟจักรยานเมื่อถึงไฟ LED (สีแดง) ที่ระบุ หากสำเร็จ ระดับความยากจะเพิ่มขึ้น หากไม่สำเร็จ รอบไฟจะรีสตาร์ทที่ระดับความยากในปัจจุบัน

คำแนะนำนี้เป็นแหล่งข้อมูลขนาดใหญ่สำหรับแกนหลักของการเข้ารหัสของฉัน

ขั้นตอนที่ 1: รวบรวมเสบียง

  • องค์ประกอบหลัก:

    • Arduino (ฉันใช้ UNO)
    • สตริงของไฟ LED ที่กำหนดแอดเดรสได้ทีละรายการ (ฉันใช้ลิงก์)
    • ปุ่มกด (ฉันใช้ลิงก์)
    • แผงวงจรพิมพ์ (PCB) หรือเขียงหั่นขนม
    • พาวเวอร์ซัพพลาย (ฉันใช้พาวเวอร์ซัพพลายสองอันแยกกัน คุณอาจใช้พาวเวอร์ซัพพลายหนึ่งตัวหากคุณมีความคิดสร้างสรรค์)

      • 5V 3A สำหรับ LEDs
      • 9V 1A สำหรับ Arduino
  • กรอบ:

    • ที่อยู่อาศัยอิเล็กทรอนิกส์ (ฉันแก้ไขโคมไฟไม้จากค่าความนิยม)
    • ตัวเรือน LED (ฉันแก้ไขนาฬิกาแขวนมาตรฐานและรูเจาะโดยใช้ตัวระบุนาทีเป็นเครื่องหมายบอกรู ใช้นาฬิกาไม้ถ้าเป็นไปได้เพื่อให้การเจาะง่ายขึ้น)
    • ตัวเรือนปุ่ม (ฉันใช้ท่อพีวีซีข้อศอก)
  • เครื่องมือ / วัสดุอื่น ๆ:

    • เดินสายสำรองสำหรับวงจรของคุณ
    • ตัวต้านทาน 10K (ตัวต้านทานแบบดึงลงสำหรับสวิตช์) และ 470 โอห์ม (สำหรับสายดาต้าบน LED)
    • เจาะเพื่อสร้างรูสำหรับใส่ LED ของคุณ และทำรูที่จำเป็นในฟิกซ์เจอร์ของคุณเพื่อส่งผ่านสายไฟ
    • หัวแร้งสำหรับบัดกรีวงจรของคุณกับ PCB
    • ปืนกาวร้อนสำหรับยึดไฟ LED กับโคมของคุณ
    • เวลโครหรือวิธีการยึดโครงเข้าด้วยกัน
    • ปะเก็นเสริมสำหรับรูเจาะสำหรับสายไฟที่จะผ่าน

ขั้นตอนที่ 2: อัปโหลดรหัส

ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลดและเพิ่มไลบรารี "FastLED"

แก่นของรหัส (วงเป็นโมฆะ) ประกอบด้วยสองสถานะ: ปุ่มกดสูง (จบเกม) และปุ่มกดต่ำ (กำลังเล่น) เมื่อผู้ใช้กดปุ่ม ไฟ LED ที่ไฟถูกหยุดจะถูกนำไปเปรียบเทียบกับที่อยู่ของ LED ตรงกลาง หากไม่เหมือนกัน ไฟทั้งหมดจะกะพริบเป็นสีแดงสองครั้งและระดับปัจจุบันจะเริ่มต้นใหม่ หากเหมือนกัน ไซลอน (สคริปต์ไลบรารี FastLED) จะทำงานสองครั้ง ระดับความยากจะเพิ่มขึ้น และเล่นต่อ เมื่อผู้เล่นเอาชนะด่านสุดท้าย ไซลอนจะทำงานเป็นครั้งที่แปดและเกมจะรีสตาร์ทที่ระดับ 1

//เกมไซโคลน

#include "FastLED.h" // สูงสุด 50 #define NUM_LEDS 40 #define CENTER_LED 21 #define DATA_PIN 7 #define LED_TYPE WS2811 #define COLOR_ORDER RGB //range 0-24 #define BRIGHTNESS 50 // คำจำกัดความของระดับความยาก #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 // ความยากลำบากในการเริ่มต้น = 1; // กำหนดอาร์เรย์ของไฟ LED ไฟ LED CRGB [NUM_LEDS]; // ผู้เล่นชนะในรอบนี้หรือไม่? แท็กนี้ใช้สำหรับพารามิเตอร์ความยาก บูล wonThisRound = false; // ตำแหน่งเริ่มต้นของไฟจักรยาน int LEDaddress = 0; // เกมกำลังทำงานอยู่เหรอ? bool เล่น = จริง; // นี่เป็นชัยชนะครั้งแรกเหรอ? bool CycleEnded = จริง; // รายละเอียดปุ่ม const int buttonPin = 9; int buttonState = 0; // เริ่มต้นไลบรารี led และฟังก์ชั่น arduino ถือเป็นโมฆะการตั้งค่า () { FastLED.addLeds (ไฟ LED, NUM_LEDS); FastLED.setBrightness(ความสว่าง); pinMode (ปุ่มพิน, อินพุต); Serial.begin(9600); } // เนื้อและมันฝรั่ง // สองโหมด - การเล่นและจบเกม void loop () { //END GAME buttonState = digitalRead (buttonPin); ถ้า (buttonState == สูง) { เล่น = เท็จ; // ผู้ใช้กดปุ่มและไฟ LED หยุดอยู่ที่ที่อยู่ที่ชนะ สำหรับ (int i = 0; i < NUM_LEDS; i++) { leds = CRGB::Black; } ไฟ LED[CENTER_LED] = CRGB::สีแดง; ไฟ LED [ที่อยู่ LED] = CRGB::สีเขียว; FastLED.show(); ถ้า (CycleEnded = true) { int diff = abs (CENTER_LED - LEDaddress); // ค้นหาระยะห่างระหว่างไฟ LED ที่สว่างและไฟ LED ตรงกลางหาก (diff == 0) { wonThisRound = true; // ผู้เล่นสามารถเอาชนะระดับได้สำเร็จหาก (ยาก != MISSION_IMPOSSIBLE) { สำหรับ (int i = 0; i <2; i++) { cylon(); } } if (ความยากลำบาก == MISSION_IMPOSSIBLE) { สำหรับ (int i = 0; i <8; i++) { cylon(); } ความยาก = 0; } เพิ่มความยากลำบาก (); wonThisRound = เท็จ; } อื่น ๆ { ล่าช้า (1000); สำหรับ (int i = 0; i <2; i++) { flash(); } } CycleEnded = เท็จ; } LEDaddress = 0; ล่าช้า (250); buttonState = digitalRead (ปุ่มพิน); ถ้า (buttonState == LOW) { Playing = true; } } // กำลังเล่นถ้า (กำลังเล่น) { สำหรับ (int i = 0; i < NUM_LEDS; i++) { leds = CRGB:: Black; //ปิดไฟ LED ทั้งหมด } ไฟ LED[CENTER_LED] = CRGB::Red; // ตั้งค่าสีนำตรงกลางเป็นไฟ LED สีเขียว [LEDaddress] = CRGB::Green; //ตั้งค่าสี led cyling เป็นสีแดง FastLED.show(); // เริ่มต้น LEDaddress วงจรไฟ ++; // ตั้งค่าวงจรแสงเป็นหนึ่งดวงในแต่ละครั้งหาก (LEDaddress == NUM_LEDS) { LEDaddress = 0; } ล่าช้า (getTime (ยาก)); buttonState = digitalRead (ปุ่มพิน); ถ้า (buttonState == สูง) { เล่น = เท็จ; CycleEnded = จริง; } } } // พารามิเตอร์ระดับ int getTime (int diff) // ส่งคืนการหน่วงเวลาสำหรับการเคลื่อนไหวแบบ led ตามความยากลำบาก { int timeValue = 0; สวิตช์ (แตกต่าง) { กรณีง่าย: timeValue = 100; หยุดพัก; กรณี MEDIUM: timeValue = 80; หยุดพัก; กรณียาก: timeValue = 60; หยุดพัก; กรณี ON_SPEED: timeValue = 40; หยุดพัก; กรณี SONIC_SPEED: timeValue = 30; หยุดพัก; กรณี ROCKET_SPEED: timeValue = 20; หยุดพัก; กรณี LIGHT_SPEED: timeValue = 13; หยุดพัก; กรณี MISSION_IMPOSSIBLE: timeValue = 7; } return timeValue;// คืนจำนวนการหน่วงเวลา } // ค่าความยากที่ชนะเพิ่มพารามิเตอร์ void เพิ่มDifficulty() { if (ยาก != MISSION_IMPOSSIBLE && wonThisRound) { ความยาก++; } } // LED ที่หายไป แสดงแฟลชเป็นโมฆะ () { fill_solid (ไฟ LED, NUM_LEDS, CRGB:: สีแดง); FastLED.show(); ล่าช้า (500); fill_solid(ไฟ LED, NUM_LEDS, CRGB::Black); FastLED.show(); ล่าช้า (500); } // ชนะ LED แสดงโมฆะ fadeall () { สำหรับ (int i = 0; i < NUM_LEDS; i ++) { leds .nscale8 (250); } } void cylon() { คงที่ uint8_t hue = 0; Serial.print("x"); // ขั้นแรกให้เลื่อน led ไปในทิศทางเดียวสำหรับ (int i = 0; i = 0; i--) {// ตั้งค่า i'th led เป็นไฟ led สีแดง = CHSV(hue++, 255, 255); // แสดงไฟ LED FastLED.show(); // ตอนนี้เราได้แสดงไฟ LED แล้ว ให้รีเซ็ต i'th led เป็นสีดำ // leds = CRGB::Black; เฟดดอลล์(); // รอสักครู่ก่อนที่เราจะวนซ้ำและทำอีกครั้งล่าช้า (10); } }

ขั้นตอนที่ 3: ติดตั้งใน Fixture

ติดตั้งใน Fixture
ติดตั้งใน Fixture
ติดตั้งใน Fixture
ติดตั้งใน Fixture

ฉันจะไม่ลงรายละเอียดในส่วนนี้ มีหลายพันวิธีในการดำเนินการในส่วนนี้ และฉันคิดว่าคุณควรมีความคิดสร้างสรรค์ในการทำให้มันออกมาเป็นอย่างที่คุณชอบ อย่างที่กล่าวไปแล้ว นาฬิกานั้นค่อนข้างสะดวกที่จะใช้สำหรับใส่หลอด LED เพราะมีตัวบ่งชี้นาทีที่ฉันสามารถใช้เป็นเครื่องหมายดอกสว่านได้ นอกจากนี้ ฝาแก้วยังช่วยให้ฉันใช้เป็นโต๊ะได้อีกด้วย

แถบตีนตุ๊กแกมีประโยชน์มากเช่นกันสำหรับการยึดอุปกรณ์ LED เข้ากับอุปกรณ์อิเล็กทรอนิกส์ ฉันยังใช้เวลโครบน Arduino สิ่งนี้ทำให้สะดวกมากในการดึง Arduino ออกหากฉันต้องการแก้ไขรหัส

แนะนำ: