Την περασμένη εβδομάδα, έχτισα ένα κύβο LED Πώς να φτιάξετε ένα παλλόμενο Arduino LED Cube που μοιάζει να έρχεται από το μέλλον Πώς να φτιάξετε ένα παλλόμενο Arduino LED Cube που μοιάζει να έρχεται από το μέλλον Εάν έχετε dabbled με κάποια αρχάριους Arduino έργα, αλλά ψάχνουν για κάτι λίγο μόνιμο και σε ένα ολόκληρο άλλο επίπεδο φοβερό, τότε ο ταπεινός κύβος LED 4 x 4 x 4 είναι ... Διαβάστε περισσότερα - 64 LEDs που μπορείτε να προγραμματίσετε για να φτιάξετε φανταστικά φουτουριστικά φώτα - και εγώ Ελπίζω να το κάνατε και εγώ, γιατί είναι ένα σπουδαίο έργο για να σας παρακινήσει και να επεκτείνετε τις γνώσεις Arduino. Σας αφήσαμε με μερικές βασικές εφαρμογές για να σκεφτείτε, αλλά σήμερα θα παρουσιάσω μερικά ακόμη κομμάτια λογισμικού που έκανα για τον κύβο, μαζί με εξηγήσεις κώδικα. Σκοπός αυτού είναι τόσο να σας δώσουμε κάποιες πιο φανταστικές εικόνες για να τρέξετε, αλλά και να μάθετε για ορισμένους από τους περιορισμούς προγραμματισμού του κύβου και να μάθετε μερικές νέες έννοιες προγραμματισμού στη διαδικασία.
Αυτή είναι μια αρκετά προηγμένη κωδικοποίηση. πρέπει πραγματικά να έχετε διαβάσει όλα τα προηγούμενα μαθήματα Arduino και τον οδηγό Arduino του αρχαρίου πριν να προσαρμόσετε τον κωδικό που παρέχεται.
Εφαρμογή 1: Μίνι φίδι
Αντί να τρέξω μια σειρά ακολουθιών μοτίβων όπως το φίδι, ήθελα να προγραμματίσω ένα φίδι - ένα τεχνικό που θα έκανε τις δικές του τυχαίες επιλογές και θα ήταν εντελώς απρόβλεπτη. Περιορίζεται μόνο σε 2 τμήματα, τα οποία θα εξηγήσω αργότερα, και μπορείτε να δείτε το demo παρακάτω. Κατεβάστε τον πλήρη κωδικό εδώ.
Όταν πρόκειται για 3D χώρο, χρειάζεστε 3 συντεταγμένες για ένα μόνο σημείο: X, Y και Z.
Ωστόσο, στον κύβο μας, τα επίπεδα Χ και Ζ αντιπροσωπεύονται από ακίδες LED, ενώ το Υ χαρτογραφείται απευθείας στα καθοδικά επίπεδα. Για να διευκολύνω την εργασία με αυτές τις συντεταγμένες και να υπολογίσω την κίνηση γύρω από τον κύβο, δημιούργησα έναν νέο τύπο δεδομένων (χρησιμοποιώντας struct) για να αντιπροσωπεύει ένα μόνο σημείο στον κύβο - το οποίο ονόμασα "xyz". Αποτελείται από δύο ακέραιους αριθμούς: "xz" και "y". Με αυτή τη δομή, τότε θα μπορούσα να αντιπροσωπεύσω μια κατεύθυνση, που υποδεικνύεται παρακάτω στο ειδικό μας σύστημα συντεταγμένων (xz, y):
Y κίνηση (πάνω, κάτω) : (xz, y + 1), (xz, y-1)
Z κίνηση (προς τα εμπρός, προς τα πίσω) : (xz-1, y), (xz + 1, y)
X κίνηση (αριστερά, δεξιά) : (xz + 4, y), (xz-4, y)
Για παράδειγμα, για να μετακινήσουμε τη LED στη θέση (0, 0) μία προς τα αριστερά, εφαρμόζουμε (xz + 4, y) και καταλήγουμε με (0, 4) .
Υπάρχουν ορισμένα όρια που τίθενται στην κίνηση - δηλαδή ότι οι συντεταγμένες Υ μπορούν να είναι μόνο δυνατές από 0 έως 3 (το 0 είναι το κατώτατο στρώμα, το 3 είναι το επάνω μέρος) και οι συντεταγμένες XZ μπορούν να είναι μόνο 0 έως 15 . Ένα επιπλέον όριο τίθεται στην κίνηση Z για να αποφευχθεί το "άλμα" από το πίσω προς το μπροστινό μέρος του κύβου και αντίστροφα. Σε αυτή την περίπτωση, χρησιμοποιούμε τη λειτουργία modulus για να δοκιμάσουμε πολλαπλάσια των 4 και να αρνηθούμε αυτή την προσπάθεια κίνησης. Αυτή είναι η λογική που εκπροσωπείται στην έγκυρη συνάρτηση (), η οποία επιστρέφει ένα αληθές εάν η προτεινόμενη κατεύθυνση είναι μια αποδεκτή κίνηση, και ψευδώς διαφορετικά. Πρόσθεσα μια άλλη λειτουργία για να ελέγξω μια αντίστροφη κατεύθυνση - δηλαδή, αν το φίδι κατευθύνεται προς μία κατεύθυνση, δεν θέλουμε να πάει πίσω στον εαυτό του, ακόμα κι αν διαφορετικά είναι μια έγκυρη τοποθεσία για να μετακινηθεί - και ένα move (), η οποία παίρνει μια συντεταγμένη, μια κατεύθυνση και επιστρέφει τη νέα συντεταγμένη.
Οι τύποι δεδομένων XYZ, οι έγκυρες (), οι μετακινήσεις () και οι αντίστροφοι () μπορούν να βρεθούν στο αρχείο xyz.h στις λήψεις. Αν αναρωτιέστε γιατί τέθηκε αυτό σε ένα χωριστό αρχείο αντί του κύριου αρχείου του προγράμματος, οφείλεται σε κάποιους περίπλοκους κανόνες compiler του Arduino που εμποδίζουν τις λειτουργίες από την επιστροφή προσαρμοσμένων τύπων δεδομένων . πρέπει να τοποθετούνται στο δικό τους αρχείο και στη συνέχεια να εισάγονται στην αρχή του κύριου αρχείου.
Πίσω στο κύριο αρχείο χρόνου εκτέλεσης, μια σειρά οδηγιών αποθηκεύει όλες τις πιθανές κινήσεις που μπορεί να κάνει το φίδι. μπορούμε απλά να επιλέξουμε ένα τυχαίο μέλος πίνακα για να πάρουμε μια νέα κατεύθυνση. Οι μεταβλητές δημιουργούνται επίσης για την αποθήκευση της τρέχουσας θέσης (τώρα), της προηγούμενης κατεύθυνσης και της προηγούμενης θέσης . Ο υπόλοιπος κώδικας θα πρέπει να είναι αρκετά προφανής για εσάς. απλά για βρόχους, και ενεργοποίηση και απενεργοποίηση των LED. Στον κύριο βρόχο, ελέγξουμε αν η προτεινόμενη κατεύθυνση είναι έγκυρη και αν είναι τότε πηγαίνουμε έτσι. Αν όχι, επιλέγουμε μια νέα κατεύθυνση.
Το μόνο πράγμα που πρέπει να επισημάνω στον κύριο βρόχο είναι μερικοί έλεγχοι για να διορθώσω ένα σφάλμα που βρήκα με τη χρήση πολυπλεξίας: αν η νέα θέση βρισκόταν στο ίδιο καθοδικό επίπεδο ή στην ίδια καρφίτσα ανόδου, η απενεργοποίηση του προηγούμενου LED θα οδηγούσε και στις δύο εξόδους. Είναι επίσης σε αυτό το σημείο που συνειδητοποίησα ότι ξεπερνούσα ένα φιδάκι 2 τμημάτων θα ήταν αδύνατο με την τρέχουσα εφαρμογή μου: προσπαθήστε να ανάψετε 3 LED σε μια διάταξη γωνίας. Δεν μπορείτε, επειδή με 2 στρώματα και 2 λυχνίες LED ενεργοποιημένες, 4 LED θα ανάψουν, όχι 3. Αυτό είναι εγγενές ζήτημα με τον περιορισμένο πολυπλεγμένο σχεδιασμό του κύβου, αλλά μην ανησυχείτε: απλά πρέπει να χρησιμοποιήσουμε τη δύναμη της εμμονής της όρασης να ξαναγράψει τη μέθοδο κλήρωσης.
Η επιμονή της όρασης σημαίνει ότι όταν το φως φτάνει στα μάτια μας διαδοχικά - γρηγορότερα από ό, τι μπορούμε να το επεξεργαστούμε - φαίνεται να είναι μια ενιαία εικόνα. Στην περίπτωσή μας, αντί να σχεδιάσουμε και τα τέσσερα επίπεδα ταυτόχρονα, θα πρέπει να σχεδιάσουμε την πρώτη, να την απενεργοποιήσουμε, να σχεδιάσουμε τη δεύτερη και να την απενεργοποιήσουμε: γρηγορότερα από ό, τι μπορούμε να πούμε ότι οποιαδήποτε αλλαγή συμβαίνει ακόμη. Αυτή είναι η αρχή με την οποία εργάζονται οι συγγραφείς μηνυμάτων, όπως αυτό:
Νέα μέθοδος Draw χρησιμοποιώντας την εμμονή του οράματος
Πρώτα από τότε, μια νέα ρουτίνα κλήρωσης. Δημιούργησα μια δισδιάστατη συστοιχία 4 x 16 bit (αλήθεια ή ψευδής) για να είναι μια κυριολεκτική αναπαράσταση της κατάστασης του LED κύβου. Η ρουτίνα εφελκυσμού θα εφαρμόσει την επιμονή της όρασης απλώς μεταθέτοντας πάνω από αυτό και ξεπλένοντας κάθε στρώμα στον κύβο για μια σύντομη στιγμή. Θα συνεχίσει να συντάσσεται στην τρέχουσα κατάσταση μέχρι να περάσει ο χρόνος ανανέωσης, οπότε θα περάσουμε τον έλεγχο πίσω στον κύριο βρόχο (). Έχω αποθηκεύσει αυτό το τμήμα του κώδικα σε αυτό το αρχείο LED_cube_POV, οπότε αν θέλετε απλά να πηδήξετε στον προγραμματισμό των δικών σας παιχνιδιών και έτσι τότε μην διστάσετε να το χρησιμοποιήσετε ως βάση.
Εφαρμογή 2: Παιχνίδι της Ζωής
Προς το παρόν, ας το αναπτύξουμε σε μια βασική έκδοση του παιχνιδιού της ζωής του Conway. Για όσους από εσάς δεν είστε εξοικειωμένοι (δοκιμάστε το Googling για να βρείτε ένα φοβερό animation αυγών του Πάσχα), το Παιχνίδι της Ζωής είναι ένα παράδειγμα κυτταρικών αυτομάτων που δημιουργούν ένα συναρπαστικό μοτίβο αναδυόμενης συμπεριφοράς δίνοντας μόνο λίγους απλούς κανόνες.
http://www.youtube.com/watch?v=XcuBvj0pw-E
Αυτό είναι, παραδείγματος χάριν, πώς τα μυρμήγκια φαίνεται να κινούνται με τη νοημοσύνη και το μυαλό των κυψελών, παρά το βιολογικό γεγονός ότι στην πραγματικότητα ακολουθούν απλώς βασικούς ορμονικούς κανόνες. Εδώ είναι ο πλήρης κωδικός για λήψη: πατήστε το κουμπί επαναφοράς για να επανεκκινήσετε. Αν βρεθείτε να παίρνετε το ίδιο μοτίβο ξανά και ξανά, προσπαθήστε να κρατήσετε πατημένο το κουμπί υπόλοιπο για μεγαλύτερο χρονικό διάστημα.
http://www.youtube.com/watch?v=iBnL8pulJ
Εδώ είναι οι κανόνες του παιχνιδιού της ζωής:
- Οποιοδήποτε ζωντανό κύτταρο με λιγότερους από δύο ζωντανούς γείτονες πεθαίνει, σαν να προκαλείται από υποπληθυσμό.
- Κάθε ζωντανό κύτταρο με δύο ή τρεις ζωντανούς γείτονες ζει στην επόμενη γενιά.
- Οποιοδήποτε ζωντανό κύτταρο με περισσότερους από τρεις ζωντανούς γείτονες πεθαίνει, σαν να με υπερπληθυσμό.
- Οποιοδήποτε νεκρό κύτταρο με ακριβώς τρεις ζωντανούς γείτονες γίνεται ζωντανό κύτταρο, σαν να έχει αναπαραχθεί.
Εκτελέστε τον κώδικα. Θα παρατηρήσετε ότι μέσα σε 5 έως 10 "γενιές", τα αυτοματα έχουν πιθανώς να ξεκουραστούν, σταθεροποιώντας σε μια συγκεκριμένη θέση. Μερικές φορές αυτό το σταθερό μοτίβο θα αλλάξει θέση και θα μετακινηθεί γύρω από το διοικητικό συμβούλιο. Σε σπάνιες περιπτώσεις, μπορεί να έχουν εξαλειφθεί εντελώς. Αυτός είναι ο περιορισμός μόνο του να έχουν 4x4x4 LEDs, αλλά είναι μια καλή άσκηση μάθησης ούτως ή άλλως.
Για να εξηγήσετε τον κώδικα:
- Μπορεί να μην είστε εξοικειωμένοι με τη λειτουργία memcpy () . Έχω χρησιμοποιήσει αυτό για να αποθηκεύσετε την προηγούμενη κατάσταση παιχνιδιού, καθώς οι συστοιχίες δεν μπορούν απλώς να αντιστοιχιστούν μεταξύ τους σαν κανονικές μεταβλητές - πρέπει να αντιγράψετε τον χώρο μνήμης (στην περίπτωση αυτή 64 bit).
- η συνάρτηση howManyNeighbours () θα πρέπει να είναι αυτονόητη, αλλά σε περίπτωση που δεν είναι - αυτή η μέθοδος παίρνει μια μόνο συντεταγμένη και τρέχει μέσω κάθε πιθανού γείτονα (την ίδια σειρά οδηγιών που χρησιμοποιήσαμε προηγουμένως σε εφαρμογή φιδιών), για να ελέγξουμε αν είναι έγκυρες . Έπειτα, ελέγχει αν τα LED των γειτόνων ήταν "σε" στην προηγούμενη κατάσταση του παιχνιδιού και μετράει πόσα υπάρχουν.
- Η κύρια λειτουργία αυτής της εφαρμογής Game of Life είναι η progressGame (), η οποία εφαρμόζει τους κανόνες των αυτόματων παιχνιδιών στην τρέχουσα κατάσταση του παιχνιδιού.
Βελτιώσεις : Έχω περάσει πάρα πολύ καιρό σε αυτό μέχρι τώρα, αλλά ίσως θελήσετε να δοκιμάσετε να προσθέσετε έναν έλεγχο που επαναφέρει αυτόματα τον πίνακα μετά από πέντε ή περισσότερες γενιές του ίδιου μοτίβου. τότε παρακαλώ επιτρέψτε μου να ξέρω! Θα πρότεινα επίσης να προσπαθήσω να προσθέσω τη μεθοδολογία POV στο παιχνίδι φιδιών για να ελπίζω να φτιάξω ένα μακρύτερο φίδι.
Αυτό είναι από μένα σήμερα. Μπορώ να επανεξετάσω κάποιες άλλες εφαρμογές Arduino LED cube αργότερα, αλλά ελπίζω ότι θα πρέπει να είστε σε θέση να τροποποιήσετε τον κώδικα μου και να δημιουργήσετε τους δικούς σας κανόνες παιχνιδιών: ας γνωρίζουμε τι βγαίνετε στα σχόλια, έτσι μπορούμε όλοι να κατεβάσουμε τις δημιουργίες σας! Όπως πάντα, θα είμαι εδώ για να απαντήσω στις ερωτήσεις σας και να υπερασπιστώ τις φρικτές ικανότητες κωδικοποίησης.
Image Credit: καρτεσιανές συντεταγμένες - χρήστης Wikimedia Sakurambo