Όλα ξεκίνησαν όταν ο συγγραφέας αγόρασε μια ενδιαφέρουσα συσκευή στη δευτερογενή αγορά - Smart Response XE (
Αυτές οι συσκευές διακόπηκαν πριν από αρκετά χρόνια, και όσα σχολεία αγόρασαν για $100-$200 το καθένα εμφανίζονται τώρα στο eBay για $10 ή λιγότερο. Το υλικό εκεί είναι πολύ κατάλληλο για geeky πειράματα:
- Πληκτρολόγιο 60 πλήκτρων
- οθόνη με ανάλυση 384×136, 2 bit ανά pixel - παρόμοια με BC, CGA, αλλά 4 όχι χρώματα, αλλά διαβαθμίσεις φωτεινότητας
- μικροελεγκτής ATmega128RFA1 (μνήμη flash 128 kB, ROM 4 kB, RAM 16 kB, πομποδέκτης 802.15.4)
- εξωτερική (σε σχέση με τον μικροελεγκτή, όχι ολόκληρη τη συσκευή) μνήμη flash 1 megabit (128 kilobyte) με διασύνδεση SPI
- θήκη για 4 στοιχεία ΑΑΑ.
Από το όνομα του μικροελεγκτή είναι ξεκάθαρο ότι ανήκει στην οικογένεια AVR, πράγμα που σημαίνει ότι η συμβατότητα της συσκευής με Arduino είναι κάτι παραπάνω από ασήμαντο έργο...
Από τις ειδήσεις και μετά
Αλλά ο συγγραφέας ενδιαφέρεται περισσότερο για την ευκαιρία να μην παίξει στη συσκευή, αλλά να μελετήσει:
- μνήμη flash με σειριακή διεπαφή SPI
- bootloaders για AVR
- πρότυπο 802.15.4
Ο συγγραφέας ξεκίνησε γράφοντας
Αυτό αρκεί για να ανεβάσετε τον bootloader του Arduino, αλλά όχι το σκίτσο - η σειριακή θύρα δεν είναι συνδεδεμένη εκεί, επομένως δεν μπορείτε να κάνετε χωρίς να ανοίξετε τη θήκη. Επίσης, οι γραμμές TX0 και RX0 της πρώτης σειριακής θύρας συνδυάζονται με τις γραμμές ψηφοφορίας της μήτρας του πληκτρολογίου, δηλαδή αυτές που μετρούν τα πλήκτρα λειτουργιών στα πλάγια της οθόνης. Αλλά τι μπορείτε να κάνετε - ο συγγραφέας δημιούργησε αυτό:
Έφερε τις γραμμές JTAG εκεί και τώρα δεν χρειάζεται να ανοίξετε τη θήκη της μπαταρίας. Και για να μπορούν να ανεβαίνουν σκίτσα, συνέδεσα και τις δύο σειριακές θύρες στον ίδιο σύνδεσμο, προσθέτοντας επίσης διακόπτη, γιατί με τις μπαταρίες τοποθετημένες, είναι φυσικά αδύνατο να απενεργοποιηθεί η συσκευή με οποιονδήποτε άλλο τρόπο.
Χρειάστηκε αρκετός χρόνος για να δουλέψετε με ένα κολλητήρι, ένα βοηθητικό μαχαίρι και ένα πιστόλι κόλλας. Γενικά, η μεταφόρτωση σκίτσων "over the air" είναι πολύ πιο βολική· πρέπει επειγόντως να εφεύρουμε κάτι για αυτό.
Το Arduino IDE χρησιμοποιεί το πρόγραμμα για να ανεβάσει σκίτσα
Αφού δοκίμασε διάφορους τρόπους για να ξεπεράσει αυτό το πρόβλημα, ο συγγραφέας κατέληξε στο εξής. Η συσκευή διαθέτει μνήμη flash 128 KB με διασύνδεση SPI - λαμβάνουμε δεδομένα μέσω των καλωδίων (θυμηθείτε ότι ο συγγραφέας έχει ήδη μία συσκευή με υποδοχή στο πλάι), χρησιμοποιούμε αυτήν τη μνήμη ως buffer και στέλνουμε τα δεδομένα μέσω του ασύρματου κανάλι σε άλλη συσκευή. Γεια σας από το Cybiko.
Μετά την εγγραφή του κώδικα για εργασία με το ραδιοφωνικό κανάλι, καθώς και της γραμματοσειράς, ο φορτωτής έγινε μεγαλύτερος από 4 kilobyte. Επομένως, η τιμή HFUSE έπρεπε να αλλάξει από 0xDA σε 0xD8. Τώρα ο bootloader μπορεί να έχει μήκος έως και 8 kilobyte και η αρχική διεύθυνση είναι τώρα 0x1E000. Αυτό αντικατοπτρίζεται στο Makefile, αλλά θα πρέπει επίσης να λαμβάνεται υπόψη κατά τη συμπλήρωση
Ο πομποδέκτης 802.15.4 στο ATmega128RFA1 έχει σχεδιαστεί αρχικά για να λειτουργεί χρησιμοποιώντας το πρωτόκολλο
Αποδείχθηκε ότι τα κανάλια 15 και 26 είναι λιγότερο επιρρεπή σε παρεμβολές από WiFi. Ο συγγραφέας επέλεξε το δεύτερο από αυτά. Αποποίηση ευθύνης: ο μεταφραστής δεν γνωρίζει εάν επιτρέπεται να απλοποιήσει το ZigBee με αυτόν τον τρόπο. Μήπως θα έπρεπε να κάνουμε λίγο παραπάνω προγραμματισμό και να τον εφαρμόσουμε πλήρως;
Στην πρώτη συσκευή, είναι απαραίτητο να εφαρμοστεί μια μηχανή πεπερασμένης κατάστασης που μεταδίδει δεδομένα μέσω του πρωτοκόλλου STK500. Ως επί το πλείστον, τα μηνύματα που μεταδίδονται και λαμβάνονται είναι αυτάρκη, αλλά ορισμένα συνδέονται με αυτά που πέρασαν από το κανάλι νωρίτερα. Δίνεται περιγραφή του διαλόγου
Ένα σημαντικό στοιχείο αυτού του διαλόγου είναι η μετάδοση πακέτων που προορίζονται να εγγραφούν στη μνήμη flash της συσκευής προορισμού. Για απλούς μικροελεγκτές της οικογένειας AVR, το μέγεθος σελίδας είναι 128 byte, αλλά για το ATmega128RFA1 είναι 256. Και για τη μνήμη flash που συνδέεται μέσω του πρωτοκόλλου SPI, είναι το ίδιο. Το πρόγραμμα στην πρώτη συσκευή, όταν ανεβάζει ένα σκίτσο, δεν το μεταφέρει αμέσως στη δεύτερη, αλλά το γράφει σε αυτή τη μνήμη. Όταν το Arduino IDE ελέγχει την ορθότητα της καταχώρησης, αποστέλλεται ό,τι γράφτηκε εκεί. Τώρα πρέπει να μεταδώσουμε τα ληφθέντα δεδομένα μέσω ραδιοφωνικού καναλιού στη δεύτερη συσκευή. Ταυτόχρονα, η εναλλαγή από τη λήψη σε μετάδοση και επιστροφή συμβαίνει αρκετά συχνά. Το πρωτόκολλο STK500 αδιαφορεί για τις καθυστερήσεις, αλλά δεν ανέχεται την απώλεια δεδομένων (περίεργο, αλλά ειπώθηκε παραπάνω ότι οι καθυστερήσεις επηρεάζουν και τη μεταφορά δεδομένων). Και οι απώλειες κατά την ασύρματη μετάδοση είναι αναπόφευκτες. Το ATmega128RFA1 έχει ενσωματωμένη εφαρμογή υλικού επαναλαμβανόμενων αιτημάτων όταν υπάρχουν αμφιβολίες για την ορθότητα της μεταφοράς, αλλά ο συγγραφέας αποφάσισε να εφαρμόσει το ίδιο σε λογισμικό. Ανέπτυξε ένα πρωτόκολλο στο οποίο ρέουν πολύ περισσότερα δεδομένα με έναν τρόπο από τον άλλο.
Δεν είναι τέλειο, αλλά λειτουργεί. Η σελίδα των 256 byte χωρίζεται σε τέσσερα τμήματα, καθένα από τα οποία μεταδίδεται μέσω του αέρα ως πακέτο. Ένα πακέτο μπορεί να χωρέσει έως και 125 byte δεδομένων συν ένα byte για το μήκος και δύο byte για το CRC. Έτσι, θραύσματα μήκους 64 byte μαζί με αριθμούς σελίδων και τμημάτων (από το 0 έως το 3) τοποθετούνται εκεί. Η συσκευή λήψης έχει μια μεταβλητή που της επιτρέπει να παρακολουθεί πόσα τμήματα έχουν ληφθεί και όταν φτάσουν και τα τέσσερα, η συσκευή αποστολής λαμβάνει επιβεβαίωση ότι έχει ληφθεί ολόκληρη η σελίδα. Καμία επιβεβαίωση (το CRC δεν ταιριάζει) - στείλτε ξανά ολόκληρη τη σελίδα. Η ταχύτητα είναι ακόμη μεγαλύτερη από ό,τι κατά τη μετάδοση μέσω καλωδίου. Βλέπω:
Αλλά γενικά, θα ήταν απαραίτητο να παρέχεται ένας βολικός τρόπος σύνδεσης του καλωδίου στις συσκευές για τη μεταφόρτωση σκίτσων και μέσω αυτού. Για παράδειγμα, τοποθετήστε μέσα σε έναν τέτοιο μετατροπέα διασύνδεσης στο CP2102, όπως στη φωτογραφία, και κολλήστε τον στην πλακέτα ώστε να μπορεί να αντέξει τη δύναμη κατά τη σύνδεση και την αποσύνδεση του καλωδίου Micro USB.
Διαθέτει επίσης σταθεροποιητή 3,3 volt (και πώς να τον χρησιμοποιήσετε σε συσκευή με τροφοδοτικό 6 volt - αν έχει μόνο τον ίδιο σταθεροποιητή και μπορείτε να προσθέσετε δύο διόδους για να επιλέξετε αυτόματα ποια από αυτές θα τροφοδοτήσει τη συσκευή) . Και οι τρεις λυχνίες LED πρέπει να αποκολληθούν από την πλακέτα μετατροπέα διασύνδεσης, διαφορετικά θα φορτώσουν επιπλέον τις μπαταρίες όταν τις λειτουργούν και επίσης θα παρεμποδίσουν την τηλεπαραλαβή του πληκτρολογίου και θα λειτουργήσουν με μνήμη flash με διασύνδεση SPI.
Η επιδίωξη ενός στόχου αποδείχθηκε ακόμη πιο ενδιαφέρουσα από την επίτευξή του (και δεν χρειάζεται αυτό το αστείο για το λεωφορείο). Ο συγγραφέας έμαθε πολλά για τους φορτωτές εκκίνησης AVR, τη μνήμη flash SPI, το πρωτόκολλο STK500 και το πρότυπο 802.15.4.
Όλος ο άλλος κώδικας εκτός από τη βιβλιοθήκη που περιγράφεται παραπάνω είναι −
Πηγή: www.habr.com