สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
เนื่องจากฉันรักทั้งเครื่องพินบอลและอุปกรณ์อิเล็กทรอนิกส์มาตลอด ฉันจึงตัดสินใจสร้างเครื่องพินบอลของตัวเอง ฉันเลือก Arduino สำหรับการเขียนโปรแกรมและอุปกรณ์อิเล็กทรอนิกส์ เพราะเป็นแพลตฟอร์มที่เข้าถึงได้ง่ายซึ่งมีทั้งกะทัดรัดและใช้งานง่าย
ในคู่มือนี้ ฉันจะอธิบายขั้นตอนการพัฒนาของฉัน ดังนั้นบางทีหนึ่งในผู้ที่ชื่นชอบของคุณอาจสร้างบางสิ่งที่เหมือนกัน
ขั้นตอนที่ 1: สร้างเคส
เริ่มจากกรณีของเครื่องพินบอลกัน ฉันสร้างโครงสร้างที่ค่อนข้างง่าย ฉันเลื่อยแผ่นด้านล่างออก และใช้เสาไม้เล็กๆ 4 อันตรงมุมเพื่อเชื่อมชิ้นผนัง ขนาดของเคสของคุณคือทางเลือกของคุณเอง ฉันเลือกที่จะทำให้มันเล็กกว่าเครื่องพินบอลดั้งเดิมเล็กน้อย เนื่องจากฉันไม่ได้วางแผนที่จะเพิ่มสิ่งพิเศษสุดตระการตาเพื่อเติมเต็มพื้นที่ ฉันใช้ทั้งสกรูและกาวเพื่อทำให้เคสมั่นคงที่สุด ที่ด้านหลังฉันเจาะรูสองรูในชิ้นส่วนพื้นสำหรับขาทั้งสองข้าง ซึ่งจะทำให้เครื่องพินบอลมีความเอียงที่เป็นสัญลักษณ์ อีกครั้งความสูงของขาขึ้นอยู่กับคุณ ยิ่งคุณทำให้ขาสูงเท่าไหร่ ลูกก็จะยิ่งกลิ้ง (ลง) เร็วขึ้นเท่านั้น
ขั้นตอนที่ 2: การสร้างช่างตีนกบ
เนื่องจากฉันต้องการจำกัดค่าใช้จ่ายของโปรเจ็กต์นี้ ฉันจึงตัดสินใจสร้างตีนกบแบบกลไกทั้งหมดแทนแบบอิเล็กทรอนิกส์ หากคุณสนใจครีบไฟฟ้า คุณสามารถใช้โครงสร้างที่ค่อนข้างเหมือนกัน แต่มี "โซลินอยด์" ที่เชื่อมต่ออยู่ด้วย (โซลินอยด์ที่มีกำลังเพียงพอในการควบคุมครีบนั้นแพงเกินไปสำหรับฉัน)
ฉันเริ่มต้นด้วยการเจาะสองรูที่ด้านล่างเพื่อหาจุดหมุนของครีบทั้งสอง ฉันเจาะรู (ในความคิดของฉัน) ใกล้กันเกินไปเล็กน้อย และทำให้เกมนี้ง่ายเกินไปในตอนท้าย ดังนั้น ระวังอย่าวางครีบใกล้กันเกินไป นอกเสียจากว่าคุณต้องการรูปแบบการเล่นที่ง่าย
ฉันยังเจาะสองรูที่ผนังทั้งสองข้างขนานกับรูตีนกบ รูเหล่านี้ใช้สำหรับปุ่มตีนกบสองปุ่ม
ฉันใช้สปริงดึงตีนกบกลับเข้าที่เดิม และทำโครงสร้างหมุนไปมาระหว่างครีบและปุ่มต่างๆ เพื่อให้หมุนเมื่อกดปุ่ม เพื่อป้องกันไม่ให้สปริงดึงตีนกบกลับไปไกลเกินไป ฉันจึงใส่สกรูสองตัวเพื่อยึดตีนกบในตำแหน่งเดิม
ขั้นตอนที่ 3: การวางกำแพง
ฉันวางกำแพงสองสามกำแพงเพื่อเปลี่ยนเส้นทางพินบอลไปทางครีบ พวกเขาทำง่ายมาก เพียงเจาะ 3 รูที่ด้านล่างของเคส แล้วดันหมุดไม้สามอันเข้าไป พันหนังยางรอบหมุดแล้วเสร็จ
ขั้นตอนที่ 4: การเพิ่มบล็อคคะแนน
บล็อคคะแนนเป็นส่วนที่สำคัญที่สุดอย่างหนึ่งของเครื่องพินบอล ดังนั้นตรวจสอบให้แน่ใจว่าคุณทำส่วนนี้ถูกต้อง ฉันสร้างบล็อคคะแนนสามช่วงสำหรับเครื่องพินบอลของฉัน แต่ทั้งหมดนี้ขึ้นอยู่กับคุณ
ฉันเลื่อยไม้กวาดชิ้นเล็กๆ แล้วพันลวดทองแดงไว้รอบๆ Arduino จะให้พลังงานแก่ลวดทองแดงนี้อย่างต่อเนื่องด้วย 5V ฉันบัดกรีสปริงปากกาสี่ตัวที่ด้านข้างเพื่อให้สัมผัสกับลูกบอลได้ดีขึ้น
วิธีการทำงานของบล็อคคะแนน คือ ลูกบอลจะสร้างวงจรที่นำไปสู่พินอินพุตบน Arduino สิ่งที่ฉันทำคือติดเทปอลูมิเนียมฟอยล์ที่ด้านล่างของเคส (ห้ามแตะทองแดง) แล้วต่อฟอยล์เข้ากับหมุดบน Arduino เมื่อใดก็ตามที่ลูกบอลกระทบทั้งทองแดงและอลูมิเนียม วงจรจะสมบูรณ์ และ Arduino จะรับสัญญาณ
ฉันเชื่อมต่อบล็อคคะแนนทั้งหมดเข้าด้วยกันโดยใช้ฟอยล์อลูมิเนียม แต่จำไว้ว่าด้านที่เหนียวจะไม่นำไฟฟ้า
ขั้นตอนที่ 5: การเพิ่ม 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)); }