Πίνακας περιεχομένων:

Arduino: Pinball Machine: 8 βήματα (με εικόνες)
Arduino: Pinball Machine: 8 βήματα (με εικόνες)

Βίντεο: Arduino: Pinball Machine: 8 βήματα (με εικόνες)

Βίντεο: Arduino: Pinball Machine: 8 βήματα (με εικόνες)
Βίντεο: CS50 2014 - Week 7 2024, Νοέμβριος
Anonim
Image
Image

Καθώς πάντα αγαπούσα τόσο τα φλίπερ, όσο και τα ηλεκτρονικά, αποφάσισα να φτιάξω τη δική μου φλιπερομηχανή. Επέλεξα το Arduino για προγραμματισμό και ηλεκτρονικά, επειδή είναι μια εξαιρετικά προσβάσιμη πλατφόρμα που είναι ταυτόχρονα συμπαγής και εύκολη στη χρήση.

Σε αυτόν τον οδηγό θα εξηγήσω τη διαδικασία ανάπτυξής μου, οπότε ίσως κάποιος από εσάς ενθουσιώδεις θα μπορούσε να δημιουργήσει κάτι παρόμοιο.

Βήμα 1: Χτίζοντας την υπόθεση

Χτίζοντας την υπόθεση
Χτίζοντας την υπόθεση

Ας ξεκινήσουμε με την περίπτωση του φλίπερ. Έφτιαξα μια αρκετά απλή κατασκευή. Έκοψα μια κάτω πλάκα και χρησιμοποίησα 4 μικροσκοπικούς ξύλινους στύλους στις γωνίες για να συνδέσω τα κομμάτια του τοίχου. Το μέγεθος της θήκης σας είναι δική σας επιλογή, επέλεξα να το κάνω λίγο μικρότερο από ένα αυθεντικό φλιπεράκι, καθώς δεν σχεδίαζα να προσθέσω κάποια εξαιρετικά θεαματικά έξτρα για να γεμίσει ο χώρος. Χρησιμοποίησα και βίδες και κόλλα για να κάνω τη θήκη όσο πιο σταθερή γίνεται. Στο πίσω μέρος άνοιξα δύο τρύπες στο κομμάτι του δαπέδου για τα δύο πόδια που θα δώσουν στο φλιπεράκι την εικονική κλίση. Και πάλι, το ύψος των ποδιών εξαρτάται από εσάς. Όσο πιο ψηλά κάνετε τα πόδια, τόσο πιο γρήγορα θα κυλήσει η μπάλα (προς τα κάτω).

Βήμα 2: Κατασκευή του Flipper Mechanic

Κατασκευή του Flipper Mechanic
Κατασκευή του Flipper Mechanic

Καθώς ήθελα να περιορίσω το κόστος αυτού του έργου, αποφάσισα να φτιάξω πλήρως μηχανικά βατραχοπέδιλα αντί για ηλεκτρονικά. Εάν ενδιαφέρεστε για τα ηλεκτρονικά βατραχοπέδιλα, μπορείτε να χρησιμοποιήσετε μια κατασκευή που είναι κάπως η ίδια, αλλά με μια λεγόμενη «ηλεκτρομαγνητική βαλβίδα» συνδεδεμένη με αυτήν (οι ηλεκτρομαγνητικές βαλβίδες με αρκετή ισχύ για τον έλεγχο των βατραχοπέδιλων ήταν πολύ ακριβές για μένα).

Ξεκίνησα ανοίγοντας δύο τρύπες στο κάτω μέρος για το σημείο περιστροφής και των δύο βατραχοπέδιλων. Άνοιξα τις τρύπες (κατά τη γνώμη μου) λίγο πολύ μεταξύ τους, και αυτό έκανε το παιχνίδι να είναι λίγο πολύ εύκολο στο τέλος. Προσοχή, λοιπόν, μην τοποθετείτε τα βατραχοπέδιλα πολύ κοντά το ένα στο άλλο, εκτός αν θέλετε ένα εύκολο στυλ παιχνιδιού.

Έκανα επίσης δύο τρύπες και στα δύο πλευρικά τοιχώματα παράλληλα με τις τρύπες του πτερυγίου. Αυτές οι οπές πρέπει να χρησιμοποιηθούν για τα δύο κουμπιά ανατροπής.

Χρησιμοποίησα ελατήρια για να τραβήξω τα βατραχοπέδιλα στην αρχική τους θέση και έκανα μια περιστρεφόμενη κατασκευή ανάμεσα στα βατραχοπέδιλα και τα κουμπιά για να τα κάνω να περιστρέφονται όταν πιέζονται τα κουμπιά. Για να σταματήσουν τα ελατήρια να τραβήξουν πολύ πίσω τα βατραχοπέδιλα, τοποθέτησα δύο βίδες για να συγκρατήσω τα βατραχοπέδιλα στην αρχική τους θέση.

Βήμα 3: Τοποθέτηση των τοίχων

Τοποθέτηση των Τειχών
Τοποθέτηση των Τειχών

Τοποθέτησα δύο τοίχους για να ανακατευθύνω το φλίπερ προς τα βατραχοπέδιλα. Είναι πολύ απλά στην κατασκευή τους. Απλώς ανοίξτε 3 τρύπες στο κάτω μέρος της θήκης και σπρώξτε τρεις ξύλινες ακίδες. Τυλίξτε ένα λαστιχάκι γύρω από τις καρφίτσες και τελειώσατε.

Βήμα 4: Προσθήκη των μπλοκ βαθμολογίας

Προσθήκη μπλοκ βαθμολογίας
Προσθήκη μπλοκ βαθμολογίας
Προσθήκη μπλοκ βαθμολογίας
Προσθήκη μπλοκ βαθμολογίας

Τα μπλοκ βαθμολογίας είναι ένα από τα πιο κρίσιμα μέρη του φλίπερ, οπότε βεβαιωθείτε ότι το κάνετε αυτό σωστά. Έφτιαξα τρία μπλοκ βαθμολογίας για το φλιπεράκι μου, αλλά και πάλι όλα εξαρτώνται από εσάς.

Έκοψα ένα μικρό κομμάτι σκουπόξυλου και τύλιξα χάλκινο σύρμα γύρω του. Το arduino θα τροφοδοτεί αυτό το χάλκινο σύρμα συνεχώς με 5V. Κόλλησα τέσσερα ελατήρια στυλό στο πλάι για καλύτερη επαφή με την μπάλα.

Ο τρόπος με τον οποίο λειτουργούν τα μπλοκ βαθμολογίας είναι ότι η μπάλα ολοκληρώνει ένα κύκλωμα που οδηγεί σε έναν πείρο εισόδου στο Arduino. Αυτό που έκανα λοιπόν ήταν να κολλήσω κολλητικό αλουμινόχαρτο στο κάτω μέρος της θήκης (ΟΧΙ ΑΓΓΙΖΟΝΤΑΣ ΤΟ ΧΑΛΚΙ) και να σύρσω το αλουμινόχαρτο μέχρι ένα πείρο στο Arduino. Κάθε φορά που η μπάλα χτυπά και τον χαλκό και το αλουμίνιο, το κύκλωμα ολοκληρώνεται και το Arduino θα λαμβάνει σήμα.

Συνδέσα όλα τα μπλοκ βαθμολογίας μαζί χρησιμοποιώντας αλουμινόχαρτο, αλλά λάβετε υπόψη ότι η κολλώδης πλευρά ΔΕΝ μεταφέρει ηλεκτρική ενέργεια.

Βήμα 5: Προσθήκη του παιχνιδιού μέσω επαφής

Προσθήκη του παιχνιδιού μέσω επαφής
Προσθήκη του παιχνιδιού μέσω επαφής

Στο κάτω μέρος της φλίπερ, ανάμεσα στα βατραχοπέδιλα, πρόσθεσα ένα παιχνίδι μέσω επαφής. Κάθε φορά που η μπάλα χτυπά αυτή την επαφή, ο παίκτης χάνει μια μπάλα. Η κατασκευή που έκανα είναι πολύ ίδια με τα μπλοκ βαθμολογίας. Μόνο εδώ χρησιμοποίησα δύο βίδες, και πάλι ένα κομμάτι αλουμινόχαρτο στο κάτω μέρος.

Βήμα 6: Διάτρηση των οπών καλωδίων

Διάτρηση των καλωδίων
Διάτρηση των καλωδίων
Διάτρηση των καλωδίων
Διάτρηση των καλωδίων
Διάτρηση των καλωδίων
Διάτρηση των καλωδίων

Πριν ξεκινήσουμε να συνδέουμε τα πάντα μέχρι το Arduino, πρέπει πρώτα να ανοίξουμε μερικές τρύπες για τα καλώδια. Διάτρησα μια τρύπα και στα δύο κομμάτια αλουμινόχαρτου, οπότε μία τρύπα στο φύλλο αλουμινίου κοντά στα μπλοκ βαθμολογίας και μια τρύπα στο φύλλο αλουμινίου κοντά στο παιχνίδι μέσω επαφής.

Εκτός από αυτό, άνοιξα επίσης μια τρύπα στο κάτω αριστερό μέρος, ανάμεσα στους τοίχους, για το καλώδιο που οδηγούσε στην επιπλέον πύλη Servo.

Θα πρέπει επίσης να υπάρχει μια τρύπα για το καλώδιο συνδεδεμένο με την οθόνη LCD στο κάτω μέρος.

Βήμα 7: Καλωδίωση των πάντων

Καλωδίωση των πάντων επάνω
Καλωδίωση των πάντων επάνω
Καλωδίωση των πάντων επάνω
Καλωδίωση των πάντων επάνω

Έφτιαξα αυτό το σχηματικό για να έχω μια καλύτερη εικόνα για το πού πρέπει να πάνε όλα τα καλώδια. Οι σταυροί είναι τα σημεία όπου συνδέονται τα καλώδια. Προσπάθησα να κολλήσω όσο το δυνατόν περισσότερο για να κάνω τα πάντα λίγο πιο σταθερά και αξιόπιστα. Η καλωδίωση θα πάρει λίγο χρόνο, αλλά αφού ολοκληρωθεί αυτό, είστε σχεδόν εκεί!

Βήμα 8: Μεταφόρτωση του κώδικα

Ανεβάστε τον παρακάτω κώδικα στο Arduino σας για να ζωντανέψει το φλίπερ σας!

// Συμπεριλάβετε τη βιβλιοθήκη για το LCD

#συμπεριλάβω #συμπεριλάβω

// Αρχικοποιήστε τις καρφίτσες δεδομένων LCD

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

// Δημιουργήστε ένα σερβο

Servo ballGateServo;

// Δημιουργία μεταβλητών για τις καρφίτσες που χρησιμοποιούμε

int gameoverPin = 6; int scorePin = 5; int ηχείοPin = 4; int ballGateServoPin = 3;

// Αρχικοποίηση μεταβλητών παιχνιδιού για το φλίπερ

βαθμολογία int = 0; int highscore = 500; bool highscoreReached = false; int μπάλες = 3; int gameoverTimer = 0; int gameoverTimerDuration = 100; bool gameoverTriggered = false;

// εκτελέστε αυτόν τον κώδικα μία φορά στο πρώτο καρέ

void setup () {// Ορίστε το pinMode για τις ακίδες που χρησιμοποιούμε το pinMode (gameoverPin, INPUT). pinMode (scorePin, INPUT);

// Αρχικοποιήστε το LCD δίνοντας το πλάτος και το ύψος

lcd.αρχή (16, 2);

// Συνδέστε το σερβίς της μπάλας στην κατάλληλη ακίδα

ballGateServo.attach (ballGateServoPin);

// Επαναφέρετε το σερβο πύλης στην αρχική θέση

ballGateServo.write (0); }

// Εκτελέστε αυτόν τον κώδικα σε κάθε πλαίσιο

void loop () {// Αποτυπώστε τις εισόδους καρφιτσών στο gameoverState = digitalRead (gameoverPin); int scoreState = digitalRead (scorePin);

// Προσθέστε στη βαθμολογία εάν ληφθεί η είσοδος

if (scoreState) {τόνος (speakerPin, 1000); βαθμολογία += 10; } else {noTone (4); }

// Αφαιρέστε από τις μπάλες εάν ενεργοποιηθεί το pitover gameover

if (gameoverState και! gameoverTriggered) {balls -= 1; gameoverTriggered = true; gameoverTimer = gameoverTimerDuration; }

// Ξεκινήστε το χρονόμετρο gameover μόλις η μπάλα δεν αγγίξει την επαφή gameover

αν (! gameoverState) {if (gameoverTimer> = 1) {gameoverTimer -= 1; } else {gameoverTriggered = false; }}

// Αναβοσβήνει το κείμενο του παιχνιδιού στο LCD και επαναφέρετε το σκορ και τις μπάλες

if (μπάλες <= 0) {lcd.setCursor (0, 0); για (int i = 5; i> = 1; i--) {lcd.clear (); καθυστέρηση (250)? lcd.print ("GAME OVER"); lcd.setCursor (0, 1); lcd.print ("Προσπαθήστε ξανά;"); καθυστέρηση (250)? } lcd.clear (); βαθμολογία = 0; ballGateServo.write (0); highscoreReached = false; μπάλες = 3? }

εάν (βαθμολογία> υψηλό σκορ και! υψηλό σκορΠαρακτήθηκε) {

lcd.setCursor (0, 0); για (int i = 5; i> = 1; i--) {lcd.clear (); καθυστέρηση (250)? lcd.print ("NEW HIGHSCORE"); lcd.setCursor (0, 1); lcd.print ("Ξαφνικός Θάνατος!"); καθυστέρηση (250)? } lcd.clear (); μπάλες = 1? ballGateServo.write (120); highscore = σκορ? highscoreReached = true; }

// Ενημερώστε το σκορ αν η τρέχουσα βαθμολογία είναι υψηλότερη

αν (σκορ> υψηλό σκορ) {υψηλό σκορ = σκορ? }

// Ορίστε τον κέρσορα στη γραμμή 0

lcd.setCursor (0, 0); // Εκτυπώστε την τρέχουσα (υψηλή) βαθμολογία στο lcd if (σκορ <= 0) {lcd.print ("Highscore:" + String (highscore) + ""); } else {lcd.print ("Score:" + String (score) + ""); }

// Ορίστε τον κέρσορα στη γραμμή 1

lcd.setCursor (0, 1);

// Εκτυπώστε την τρέχουσα ποσότητα μπάλες στο LCD

lcd.print ("Μπάλες:" + Χορδή (μπάλες)); }

Συνιστάται: