panospapazoglou.gr

Arduino

 

Ανάπτυξη παιχνιδιού και handheld κονσόλας

Σε προηγούμενη ανάρτηση, είδαμε την πρώτη δοκιμή της μονόχρωμης οθόνης OLED με ανάλυση 128x64 pixel και διάσταση 0.96’’. Σε αυτή την εφαρμογή, θα αναπτύξουμε μια handheld κονσόλα, στην οποία θα δοκιμάσουμε μια παραλλαγή του παιχνιδιού Pong, που παρουσιάστηκε στο Processing.

Η κονσόλα διαθέτει δύο κουμπιά κίνησης της ρακέτας (αριστερά και δεξιά), καθώς και ένα Joystick για τις ίδιες λειτουργίες. Επίσης, περιλαμβάνει ένα ακόμα κουμπί για μελλοντική χρήση, καθώς και δύο διακόπτες για ON/OFF λειτουργία από μπαταρία και έλεγχο φωτισμού των πλήκτρων αντίστοιχα. Φυσικά, η λειτουργία μπορεί να υποστηριχθεί με τροφοδοσία USB.





Η κίνηση της ρακέτας αλλά και η απόκριση των κουμπιών/Joystick είναι ομαλή, επειδή γίνεται συνεχής έλεγχος της κατάστασής τους στη συνάρτηση loop(). Από την άλλη μεριά, η φυσική κατασκευή απαιτεί την κοπή και το τρύπημα ξύλου, την επεξεργασία plexiglass, την τοποθέτηση βιδών, καθώς και την κόλληση των καλωδίων.

Όπως επίσης θα διαπιστώσετε, ο κώδικας επιδέχεται αρκετές βελτιώσεις (π.χ. αλλαγή ταχύτητας μπάλας ανάλογα το score).

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



 































































Κώδικας εφαρμογής

 

Σχόλια για προχωρημένους

Οι πιο προχωρημένοι, μπορούν να χρησιμοποιήσουν την τεχνική των διακοπών (interrupt), προκειμένου να υλοποιήσουν την απόκριση της εφαρμογής στο πάτημα των κουμπιών. Η τεχνική των διακοπών χρησιμοποιείται σε προχωρημένες εφαρμογές και όταν υπάρχει φόρτος εκτέλεσης κώδικα, ενώ υπάρχει η απαίτηση για γρήγορη απόκριση σε χειρισμούς του χρήστη και εξωτερικά γεγονότα. Αν δεν υπάρχει υπολογιστικός φόρτος, τότε η παραπάνω διαδικασία μπορεί να αντικατασταθεί από απλό συνεχή έλεγχο μέσα στη συνάρτηση loop().

Η τεχνική αυτή, υποστηρίζεται από τον μικροελεγκτή και σε συγκεκριμένους ακροδέκτες. Στο Arduino UNO/Nano, χρησιμοποιούνται οι ψηφιακοί ακροδέκτες 2 και 3, οι οποίοι αντιστοιχούν στις διακοπές INT0 και INT1. Στον κώδικα που είναι διαθέσιμος για κατέβασμα στο τέλος αυτής της σύντομης ενότητας, εκτελούνται συγκεκριμένες συναρτήσεις, ανάλογα με το κουμπί που πατήθηκε.

Για αυτή την υλοποίηση, θα πρέπει αρχικά μέσα στο setup() να γίνει αντιστοίχιση ακροδέκτη με συνάρτηση. Γράφοντας attachInterrupt(0,right,LOW); «συνδέεται» η κατάσταση του ακροδέκτη D2 (INT0) με την κλήση της συνάρτησης right(). Έτσι, η συνάρτηση εκτελείται αυτόματα όταν η κατάσταση του ακροδέκτη έρθει σε στάθμη LOW (και μόνο τότε), ανεξάρτητα από τις εντολές που εκτελούνται εκείνη τη στιγμή στο πρόγραμμα. Όταν όμως, το πλήκτρο δεν είναι πατημένο, ο αντίστοιχος ακροδέκτης έρχεται αυτόματα σε κατάσταση HIGH, λόγω της ενεργοποίησης των εσωτερικών Pull-Up αντιστάσεων.

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

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

Κώδικας δοκιμής για προχωρημένους


Web design and Copyright © Dr. Panayotis (Panos) Papazoglou