Infinite Runner με AVR

Ήθελα να φτιάξω ένα παιχνίδι τύπου Infinite Runner. Αλλά αφού τα infinite runners σε software είναι πολύ mainstream και είχα αρκετά LED, αποφάσισα να φτιάξω έναν σε “hardware”.


Έφτιαξα μια οθόνη χρησιμοποιώντας μωβ LED και για είσοδο έβαλα 3 κουμπιά. Τα δύο κουμπιά είναι για την κίνηση της “κουκίδας” του παίχτη πάνω-κάτω και το τρίτο είναι για reset. Όλα ελέγχονται από ένα μικτροελεγκτή AVR Atmega8.

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

Πως το έκανα

Για την υλοποίηση της οθόνης χρησιμοποίησα 35 LED τοποθετημένα σε 5 γραμμές και 7 στήλες. Επιλέγουμε ένα “pixel” της οθόνης θέτωντας την κάθοδο της γραμμής του LOW ενώ των άλλων γραμμών σε HIGH. Μετά, εάν πρέπει να φωτίσουμε το pixel, θέτουμε την άνοδο της στήλης του HIGH, ενώ οι άλλες στήλες είναι σε LOW. Μετά από αυτό, περιμένουμε για κάποιο χρονικό διάστημα ώστε να προλάβει να παραχθεί αρκετό φως και επαναλαμβάνουμε την διαδικασία για όλα τα υπόλοιπα pixel. Με αυτό τον τρόπο χρειαζόμαστε 7+5 = 12 pinx. Εάν ελέγχαμε κάθε pixel ανεξάρτητα, θα χρειαζόμασταν 7×5=35 pins!

Τα κουμπιά είναι υλοποιημένα κλασσικά με αντιστάσεις pull-up.

Όλη η κατασκευή αποτελείται από δύο πλακέτες, η μια πάνω στην άλλη και συνδεδεμένη με pcb pins. Το πάνω board έχει τα LED και τα κουμπιά. Στο κάτω είναι ο Atmega8, ένας connnector για την τροφοδοσία και ένα In-System Programming header.

Το λογισμικό είναι γραμμένο σε C για AVR. Ανανεώνουμε την οθόνη στον κύριο βρόγχο επανάληψης του προγράμματος και έχουμε μια διακοπή χρόνου για τον βρόχο επανάληψης του παιχνιδιού και polling εισόδου.

Ακολουθεί ένα βίντεο με εμένα να παίζω