สารบัญ:

Arduino: เครื่องพินบอล: 8 ขั้นตอน (พร้อมรูปภาพ)
Arduino: เครื่องพินบอล: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino: เครื่องพินบอล: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino: เครื่องพินบอล: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Mini Pinball 07: Designing the PCB 2024, มิถุนายน
Anonim
Image
Image

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

ในคู่มือนี้ ฉันจะอธิบายขั้นตอนการพัฒนาของฉัน ดังนั้นบางทีหนึ่งในผู้ที่ชื่นชอบของคุณอาจสร้างบางสิ่งที่เหมือนกัน

ขั้นตอนที่ 1: สร้างเคส

การสร้างเคส
การสร้างเคส

เริ่มจากกรณีของเครื่องพินบอลกัน ฉันสร้างโครงสร้างที่ค่อนข้างง่าย ฉันเลื่อยแผ่นด้านล่างออก และใช้เสาไม้เล็กๆ 4 อันตรงมุมเพื่อเชื่อมชิ้นผนัง ขนาดของเคสของคุณคือทางเลือกของคุณเอง ฉันเลือกที่จะทำให้มันเล็กกว่าเครื่องพินบอลดั้งเดิมเล็กน้อย เนื่องจากฉันไม่ได้วางแผนที่จะเพิ่มสิ่งพิเศษสุดตระการตาเพื่อเติมเต็มพื้นที่ ฉันใช้ทั้งสกรูและกาวเพื่อทำให้เคสมั่นคงที่สุด ที่ด้านหลังฉันเจาะรูสองรูในชิ้นส่วนพื้นสำหรับขาทั้งสองข้าง ซึ่งจะทำให้เครื่องพินบอลมีความเอียงที่เป็นสัญลักษณ์ อีกครั้งความสูงของขาขึ้นอยู่กับคุณ ยิ่งคุณทำให้ขาสูงเท่าไหร่ ลูกก็จะยิ่งกลิ้ง (ลง) เร็วขึ้นเท่านั้น

ขั้นตอนที่ 2: การสร้างช่างตีนกบ

การสร้างช่างตีนกบ
การสร้างช่างตีนกบ

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

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

ฉันยังเจาะสองรูที่ผนังทั้งสองข้างขนานกับรูตีนกบ รูเหล่านี้ใช้สำหรับปุ่มตีนกบสองปุ่ม

ฉันใช้สปริงดึงตีนกบกลับเข้าที่เดิม และทำโครงสร้างหมุนไปมาระหว่างครีบและปุ่มต่างๆ เพื่อให้หมุนเมื่อกดปุ่ม เพื่อป้องกันไม่ให้สปริงดึงตีนกบกลับไปไกลเกินไป ฉันจึงใส่สกรูสองตัวเพื่อยึดตีนกบในตำแหน่งเดิม

ขั้นตอนที่ 3: การวางกำแพง

การวางกำแพง
การวางกำแพง

ฉันวางกำแพงสองสามกำแพงเพื่อเปลี่ยนเส้นทางพินบอลไปทางครีบ พวกเขาทำง่ายมาก เพียงเจาะ 3 รูที่ด้านล่างของเคส แล้วดันหมุดไม้สามอันเข้าไป พันหนังยางรอบหมุดแล้วเสร็จ

ขั้นตอนที่ 4: การเพิ่มบล็อคคะแนน

การเพิ่มบล็อคคะแนน
การเพิ่มบล็อคคะแนน
การเพิ่มบล็อคคะแนน
การเพิ่มบล็อคคะแนน

บล็อคคะแนนเป็นส่วนที่สำคัญที่สุดอย่างหนึ่งของเครื่องพินบอล ดังนั้นตรวจสอบให้แน่ใจว่าคุณทำส่วนนี้ถูกต้อง ฉันสร้างบล็อคคะแนนสามช่วงสำหรับเครื่องพินบอลของฉัน แต่ทั้งหมดนี้ขึ้นอยู่กับคุณ

ฉันเลื่อยไม้กวาดชิ้นเล็กๆ แล้วพันลวดทองแดงไว้รอบๆ Arduino จะให้พลังงานแก่ลวดทองแดงนี้อย่างต่อเนื่องด้วย 5V ฉันบัดกรีสปริงปากกาสี่ตัวที่ด้านข้างเพื่อให้สัมผัสกับลูกบอลได้ดีขึ้น

วิธีการทำงานของบล็อคคะแนน คือ ลูกบอลจะสร้างวงจรที่นำไปสู่พินอินพุตบน Arduino สิ่งที่ฉันทำคือติดเทปอลูมิเนียมฟอยล์ที่ด้านล่างของเคส (ห้ามแตะทองแดง) แล้วต่อฟอยล์เข้ากับหมุดบน Arduino เมื่อใดก็ตามที่ลูกบอลกระทบทั้งทองแดงและอลูมิเนียม วงจรจะสมบูรณ์ และ Arduino จะรับสัญญาณ

ฉันเชื่อมต่อบล็อคคะแนนทั้งหมดเข้าด้วยกันโดยใช้ฟอยล์อลูมิเนียม แต่จำไว้ว่าด้านที่เหนียวจะไม่นำไฟฟ้า

ขั้นตอนที่ 5: การเพิ่ม Game Over Contact

การเพิ่ม Game Over Contact
การเพิ่ม Game Over Contact

ที่ด้านล่างของเครื่องพินบอล ระหว่างครีบ ฉันได้เพิ่มเกมผ่านการสัมผัส เมื่อใดก็ตามที่ลูกบอลโดนหน้าสัมผัสนี้ ผู้เล่นจะเสียลูกบอล โครงสร้างที่ฉันทำนั้นเหมือนกับบล็อคคะแนนมาก เฉพาะที่นี่เท่านั้นที่ฉันใช้สกรูสองตัวและแผ่นอลูมิเนียมฟอยล์อีกครั้งที่ด้านล่าง

ขั้นตอนที่ 6: เจาะรูเคเบิล

เจาะรูเคเบิล
เจาะรูเคเบิล
เจาะรูเคเบิล
เจาะรูเคเบิล
เจาะรูเคเบิล
เจาะรูเคเบิล

ก่อนที่เราจะเริ่มเดินสายทุกอย่างจนถึง Arduino เราต้องเจาะรูสองสามรูสำหรับสายเคเบิลก่อน ฉันเจาะรูหนึ่งรูผ่านแผ่นอะลูมิเนียมฟอยล์ทั้งสองชิ้น ดังนั้นหนึ่งรูในแผ่นอะลูมิเนียมฟอยล์ใกล้กับบล็อคคะแนน และอีกหนึ่งรูในฟอยล์อะลูมิเนียมใกล้กับเกมมากกว่าการสัมผัส

นอกจากนี้ ฉันยังเจาะรูที่ด้านล่างซ้าย ระหว่างผนัง สำหรับสายเคเบิลที่นำไปสู่เซอร์โวบอลเกทพิเศษ

ควรมีรูสำหรับสายเคเบิลที่เชื่อมต่อกับ LCD ที่ด้านล่าง

ขั้นตอนที่ 7: การเดินสายไฟทุกอย่างขึ้น

เดินสายทุกอย่างขึ้น
เดินสายทุกอย่างขึ้น
เดินสายทุกอย่างขึ้น
เดินสายทุกอย่างขึ้น

ฉันสร้างแผนผังนี้เพื่อให้เห็นภาพรวมที่ดีขึ้นว่าสายเคเบิลทั้งหมดควรไปที่ใด กากบาทเป็นจุดที่สายเคเบิลเชื่อมต่อ ฉันพยายามประสานให้มากที่สุดเพื่อให้ทุกอย่างมีเสถียรภาพและเชื่อถือได้มากขึ้น การเดินสายไฟจะใช้เวลาสักครู่ แต่หลังจากนี้เสร็จสิ้น คุณก็เกือบเสร็จแล้ว!

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

อัปโหลดรหัสต่อไปนี้ไปยัง Arduino ของคุณเพื่อทำให้เครื่องพินบอลของคุณใช้งานได้จริง!

// รวมไลบรารีสำหรับจอแอลซีดี

#รวม #รวม

// เริ่มต้นหมุดข้อมูล LCD

LiquidCrystal LCD (7, 8, 9, 10, 11, 12);

// สร้างเซอร์โว

เซอร์โว ballGateServo;

// สร้างตัวแปรสำหรับพินที่เราใช้

int gameoverPin = 6; int scorePin = 5; int speakerPin = 4; int ballGateServoPin = 3;

// เริ่มต้นตัวแปรการเล่นเกมสำหรับเครื่องพินบอล

คะแนน int = 0; คะแนนสูงสุด int = 500; bool highscoreReached = เท็จ; ลูก int = 3; int gameoverTimer = 0; int gameoverTimerDuration = 100; bool gameoverTriggered = false;

//รันโค้ดนี้หนึ่งครั้งที่เฟรมแรก

การตั้งค่าเป็นโมฆะ () {// ตั้งค่า pinMode สำหรับพินที่เราใช้ pinMode (gameoverPin, INPUT); pinMode(scorePin, INPUT);

// เริ่มต้น LCD โดยให้ความกว้างและความสูง

lcd.begin(16, 2);

// ติดเซอร์โวบอลเกทเข้ากับพินที่เหมาะสม

ballGateServo.attach (ballGateServoPin);

// รีเซ็ตเกทเซอร์โวไปที่ตำแหน่งเริ่มต้น

ballGateServo.write(0); }

// รันโค้ดนี้ทุกๆ เฟรม

วงเป็นโมฆะ () {// จับอินพุตพิน int gameoverState = digitalRead (gameoverPin); int scoreState = digitalRead (scorePin);

// เพิ่มคะแนนหากได้รับอินพุต

ถ้า (scoreState) { โทน (speakerPin, 1000); คะแนน += 10; } อื่น ๆ { noTone(4); }

// ลบออกจากลูกบอลถ้า gameover pit ถูกทริกเกอร์

ถ้า (gameoverState และ !gameoverTriggered) { ลูก -= 1; gameoverTriggered = จริง; gameoverTimer = gameoverTimer Duration; }

// เริ่มจับเวลาเกมโอเวอร์ทันทีที่ลูกบอลไม่ได้สัมผัสตัวเกมโอเวอร์

if (!gameoverState) { ถ้า (gameoverTimer >= 1) { gameoverTimer - = 1; } อื่น ๆ { gameoverTriggered = false; } }

// กะพริบข้อความ gameover ไปที่ LCD แล้วรีเซ็ตคะแนนและลูก

ถ้า (ลูก <= 0) { lcd.setCursor(0, 0); สำหรับ (int i = 5; i>= 1; i--) { lcd.clear(); ล่าช้า (250); lcd.print("จบเกม"); lcd.setCursor(0, 1); lcd.print("ลองอีกครั้ง?"); ล่าช้า (250); } lcd.clear(); คะแนน = 0; ballGateServo.write(0); คะแนนสูงสุดถึง = เท็จ; ลูก = 3; }

ถ้า (คะแนน > คะแนนสูงสุด และ !highscoreReached) {

lcd.setCursor(0, 0); สำหรับ (int i = 5; i >= 1; i--) { lcd.clear(); ล่าช้า (250); lcd.print("คะแนนสูงสุดใหม่"); lcd.setCursor(0, 1); lcd.print("เสียชีวิตอย่างกะทันหัน!"); ล่าช้า (250); } lcd.clear(); ลูก = 1; ballGateServo.write (120); คะแนนสูงสุด = คะแนน; คะแนนสูงสุดถึง = จริง; }

// อัปเดตคะแนนสูงสุดหากคะแนนปัจจุบันสูงกว่า

ถ้า (คะแนน > คะแนนสูงสุด) { คะแนนสูงสุด = คะแนน; }

// ตั้งค่าเคอร์เซอร์เป็นบรรทัด 0

lcd.setCursor(0, 0); // พิมพ์คะแนนปัจจุบัน (สูง) ไปที่จอแอลซีดีหาก (คะแนน <= 0) { lcd.print ("คะแนนสูงสุด: " + สตริง (คะแนนสูงสุด) + " "); } อื่น ๆ { lcd.print ("คะแนน: " + สตริง (คะแนน) + " "); }

// ตั้งเคอร์เซอร์ไปที่บรรทัด 1

lcd.setCursor(0, 1);

// พิมพ์จำนวนลูกบอลปัจจุบันไปยังจอแอลซีดี

lcd.print("Balls:" + String(balls)); }

แนะนำ: