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

Arduino UNO Logic Sniffer: 8 βήματα (με εικόνες)
Arduino UNO Logic Sniffer: 8 βήματα (με εικόνες)

Βίντεο: Arduino UNO Logic Sniffer: 8 βήματα (με εικόνες)

Βίντεο: Arduino UNO Logic Sniffer: 8 βήματα (με εικόνες)
Βίντεο: Marlin Firmware 2.0.x Explained 2024, Ιούλιος
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

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

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

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

Συνοψίζοντας, ο λογικός μου αναλυτής θα:

  • Έχετε ένα κανάλι,
  • Να έχει γραφική διεπαφή,
  • Επικοινωνήστε με τη διεπαφή μέσω USB,
  • Τρέξτε σε έναν πίνακα Arduino UNO.

Θα έχει τελικά βάθος μνήμης 800 δειγμάτων και μπόρεσε να καταγράψει με επιτυχία ένα μήνυμα U200 115200 bauds (δεν το δοκίμασα πραγματικά σε υψηλότερες ταχύτητες).

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

Προμήθειες

Wantedθελα να διατηρήσω τον αναλυτή όσο το δυνατόν πιο απλό, απαιτώντας έτσι πολύ λίγο υλικό.

Θα χρειαστείτε:

  • Ένας πίνακας Arduino UNO (ή ισοδύναμος εφόσον βασίζεται στο MCU ATMEGA328P),
  • Ενας υπολογιστής,
  • Κάτι για εντοπισμό σφαλμάτων (ένας άλλος πίνακας Arduino UNO λειτουργεί καλά για να κάνει κάποιες δοκιμές).

Μπορείτε να βρείτε εδώ τον κώδικα τόσο για το Arduino UNO όσο και για τη διεπαφή ιστού. Θα χρειαστείτε επίσης το λογισμικό p5.serialcontrol και το λογισμικό PulseView.

Βήμα 1: Αρχή εργασίας

Αρχή λειτουργίας
Αρχή λειτουργίας

Η ιδέα είναι απλή. Επιλέγετε τις ρυθμίσεις λήψης και κάνετε κλικ στο "απόκτηση". Η διεπαφή ιστού θα τα στείλει στο λογισμικό p5.serialcontrol, το οποίο μας επιτρέπει να χρησιμοποιούμε τη σειριακή διεπαφή από ένα πρόγραμμα περιήγησης, καθώς δεν μπορεί να έχει άμεση πρόσβαση σε αυτό. Το λογισμικό p5.serialcontrol στη συνέχεια μεταδίδει τις πληροφορίες στον πίνακα Arduino UNO, ο οποίος καταγράφει τα δεδομένα και τα στέλνει πίσω στη διεπαφή μέσω της ίδιας διαδρομής.

Ανετα! Λοιπόν … Δεδομένου ότι δεν είμαι πολύ καλός στον προγραμματισμό διεπαφών ανθρώπου/μηχανής ή στις τεχνολογίες ιστού, το δικό μου είναι σίγουρα λίγο άσχημο και αμαξίδιο. Αλλά μου επιτρέπει να ξεκινήσω μια καταγραφή και να ανακτήσω τα δεδομένα μου πίσω, για αυτό έχουν σχεδιαστεί, οπότε πιστεύω ότι είναι ωραία. Για πιο σοβαρή εργασία ανάλυσης, εισάγω τα αρχεία μου στο PulseView, το οποίο είναι εύκολο στη χρήση και προσφέρει ένα καλό σύνολο χαρακτηριστικών και αποκωδικοποιητών πρωτοκόλλων, όπως θα δούμε αργότερα.

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

Βήμα 2: Arduino UNO Sketch

Arduino UNO Sketch
Arduino UNO Sketch

Έγραψα και συνέταξα το σκίτσο με το Arduino IDE. Ξεκίνησα αρχικά με τη ρύθμιση του Χρονοδιακόπτη σε λειτουργία "Κανονική" γράφοντας στους καταχωρητές TCCR1A και TCCR1B στη ρύθμιση (). Έκανα μερικές λειτουργίες για να διευκολύνω λίγο τη χρήση του στο μέλλον, όπως αυτή για να ορίσετε τη διαίρεση ρολογιού που ονομάζεται "setTim1PSC ()". Έγραψα επίσης λειτουργίες για την ενεργοποίηση και απενεργοποίηση της μονάδας λήψης εισόδου Timer1 και διακοπών υπερχείλισης.

Πρόσθεσα τον πίνακα "δείγματα", ο οποίος θα κρατήσει τα δεδομένα που αποκτήθηκαν. Είναι ένας παγκόσμιος πίνακας που έθεσα σε "πτητικό" για να αποτρέψει τον μεταγλωττιστή να κάνει βελτιστοποιήσεις και να το θέσει σε flash, όπως έκανε κατά τη διάρκεια των πρώτων μου συλλογών. Το όρισα ως πίνακα "uint16_t", καθώς το Timer1 είναι επίσης 16bit, με μήκος 810. Σταματάμε την καταγραφή σε 800 τιμές, αλλά καθώς η δοκιμή γίνεται εκτός των διακοπών για προφανείς λόγους ταχύτητας, επέλεξα να κρατήσω 10 περισσότερες τιμές για την αποφυγή υπερχείλισης. Με μερικές επιπλέον μεταβλητές για τον υπόλοιπο κώδικα, το σκίτσο χρησιμοποιεί 1313 byte (88%) μνήμης, αφήνοντας μας 235 byte δωρεάν μνήμης RAM. Βρισκόμαστε ήδη σε υψηλή χρήση μνήμης και δεν ήθελα να προσθέσω περισσότερη χωρητικότητα δείγματος, καθώς θα μπορούσε να προκαλέσει περίεργες συμπεριφορές λόγω πολύ μικρού χώρου μνήμης.

Στην προσπάθειά μου να αυξήσω πάντα την ταχύτητα εκτέλεσης, χρησιμοποίησα δείκτες συναρτήσεων αντί για εντολές εντός των διακοπών, για να μειώσω τον χρόνο εκτέλεσής τους στο ελάχιστο. Ο πείρος σύλληψης θα είναι πάντα ο αριθμός 8 του Arduino UNO, καθώς είναι ο μόνος συνδεδεμένος στη μονάδα λήψης εισόδου του Timer1.

Η διαδικασία λήψης εμφανίζεται στην παραπάνω εικόνα. Ξεκινά όταν το Arduino UNO λαμβάνει ένα έγκυρο πλαίσιο δεδομένων UART, το οποίο περιέχει τις επιθυμητές ρυθμίσεις λήψης. Στη συνέχεια, επεξεργαζόμαστε αυτές τις ρυθμίσεις διαμορφώνοντας τους σωστούς καταχωρητές για λήψη στο επιλεγμένο άκρο και χρησιμοποιώντας τη σωστή διαίρεση ρολογιού. Στη συνέχεια, ενεργοποιούμε τη διακοπή PCINT0 (αλλαγή πείρου) για τον εντοπισμό της πρώτης άκρης σήματος. Όταν το λάβουμε, επαναφέρουμε την τιμή Timer1, απενεργοποιούμε τη διακοπή PCINT0 και ενεργοποιούμε τη διακοπή ICU (Input Capture Unit). Από εκείνη τη στιγμή, οποιαδήποτε πτώση/άνοδος του άκρου στο σήμα (ανάλογα με τη διαμόρφωση που έχει επιλεγεί), θα ενεργοποιήσει τη μονάδα καταγραφής εισόδου, εξοικονομώντας έτσι μια χρονική σήμανση αυτού του συμβάντος στον καταχωρητή ICR1 και εκτελώντας μια διακοπή. Σε αυτήν τη διακοπή, βάζουμε την τιμή μητρώου ICR1 στον πίνακα "δείγματα" και αυξάνουμε τον δείκτη για την επόμενη λήψη. Όταν ο Χρονοδιακόπτης1 ή ο πίνακας υπερχειλίσει, απενεργοποιούμε τη διακοπή λήψης και στέλνουμε τα δεδομένα πίσω στη διεπαφή ιστού μέσω του UART.

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

Έτσι, όπως ίσως έχετε παρατηρήσει, δεν συλλαμβάνουμε πραγματικά κάθε δείγμα σε καθορισμένα χρονικά διαστήματα, αλλά καταγράφουμε τη στιγμή όπου συμβαίνει μια μετάβαση σήματος. Αν είχαμε καταγράψει ένα δείγμα σε κάθε κύκλο ρολογιού, ακόμη και με την υψηλότερη διαίρεση ρολογιού, θα είχαμε γεμίσει το buffer σε περίπου 0,1 δευτερόλεπτα, υποθέτοντας ότι χρησιμοποιούσαμε τον τύπο uint8_t, ο οποίος είναι ο μικρότερος στη μνήμη χωρίς να χρησιμοποιούμε δομές.

Βήμα 3: Διασύνδεση Ιστού και P5.js

Διασύνδεση Ιστού και P5.js
Διασύνδεση Ιστού και P5.js

Όπως υποδηλώνει ο τίτλος, η διεπαφή ιστού δημιουργήθηκε με τη βοήθεια του p5.js. Για όσους δεν το γνωρίζουν ήδη, σας συνιστώ ανεπιφύλακτα να πάτε να ελέγξετε τον ιστότοπο, καθώς είναι μια πραγματικά καλή βιβλιοθήκη. Βασίζεται στην Επεξεργασία, είναι εύκολο στη χρήση, σας επιτρέπει να έχετε καλά αποτελέσματα πολύ γρήγορα και είναι καλά τεκμηριωμένο. Για όλους αυτούς τους λόγους επέλεξα αυτήν τη βιβλιοθήκη. Χρησιμοποίησα επίσης τη βιβλιοθήκη quicksettings.js για τα μενού, τη grafica.js για να σχεδιάσω τα δεδομένα μου και τη βιβλιοθήκη p5.serialport για επικοινωνία με το Arduino UNO.

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

Βήμα 4: Ρύθμιση συστήματος

Το πρώτο πράγμα είναι να κατεβάσετε τον Arduino UNO και τον κωδικό διασύνδεσης εδώ, αν δεν το έχετε κάνει ήδη. Στη συνέχεια, μπορείτε να επαναπρογραμματίσετε τον πίνακα Arduino UNO με το σκίτσο "UNO_LS.ino" μέσω του Arduino IDE.

Θα έπρεπε να έχετε κατεβάσει το λογισμικό p5.serialcontrol από το αποθετήριο github. Πρέπει να πάρετε το αρχείο zip που ταιριάζει με το λειτουργικό σας σύστημα (το δοκίμασα μόνο στα Windows). Εξαγάγετε το zip σε ένα φάκελο, ξεκινήστε το εκτελέσιμο που βρίσκεται σε αυτόν και αφήστε το έτσι. Μην προσπαθήσετε να συνδεθείτε σε οποιαδήποτε σειριακή θύρα, απλώς αφήστε την να λειτουργεί στο παρασκήνιο, θα χρησιμοποιηθεί ως ρελέ.

Ανοίξτε το φάκελο "Διασύνδεση". Θα πρέπει να βρείτε ένα αρχείο με το όνομα "index.html". Ανοίξτε το στο πρόγραμμα περιήγησής σας, είναι η διεπαφή ιστού.

Και αυτό είναι! Δεν χρειάζεται να κάνετε λήψη επιπλέον βιβλιοθηκών, όλα πρέπει να περιλαμβάνονται στο πακέτο που παρείχα.

Βήμα 5: Σύνδεση, διαμόρφωση και απόκτηση

Σύνδεση, διαμόρφωση και απόκτηση
Σύνδεση, διαμόρφωση και απόκτηση

Για να συνδέσετε τη διεπαφή με την πλακέτα Arduino UNO, απλώς επιλέξτε την αντίστοιχη θύρα στη λίστα και πατήστε το κουμπί "Άνοιγμα". Εάν η λειτουργία ήταν επιτυχής, το μήνυμα "κατάσταση" θα πρέπει να εμφανίζει κάτι σαν "COMX άνοιξε".

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

Η δεύτερη ρύθμιση είναι η διαίρεση του ρολογιού. Θα σας δώσει την ανάλυση στην οποία θα μπορείτε να συλλάβετε το σήμα. Μπορείτε να επιλέξετε να ορίσετε τον συντελεστή διαίρεσης είτε με "8", "64", "256" και "1024". Ο πίνακας Arduino UNO χρησιμοποιεί χαλαζία 16MHz για να χρονομετρήσει τον μικροελεγκτή, οπότε η συχνότητα δειγματοληψίας θα είναι "16MHz/συντελεστής διαίρεσης". Να είστε προσεκτικοί με αυτήν τη ρύθμιση, καθώς θα καθορίσει επίσης για πόσο χρονικό διάστημα θα μπορείτε να καταγράψετε ένα σήμα. Δεδομένου ότι ο χρονοδιακόπτης1 είναι χρονόμετρο 16bit, ο χρόνος σύλληψης που επιτρέπεται πριν από την υπερχείλιση θα είναι "(2^16)*(συντελεστής διαίρεσης)/16MHz". Ανάλογα με τη ρύθμιση που επιλέξατε, θα κυμαίνεται μεταξύ ms 33ms και 4.2s. Κρατήστε την επιλογή σας στο μυαλό σας, θα την χρειαστείτε αργότερα.

Η τελευταία ρύθμιση είναι ο διακόπτης θορύβου. Δεν έκανα πολλές δοκιμές σε αυτό και δεν θα το χρειαστείτε στο 99% των περιπτώσεων, οπότε αφήστε το ανεξέλεγκτο. Για όσους εξακολουθούν να είναι περίεργοι για αυτό, μπορείτε να αναζητήσετε τον ακυρωτή θορύβου στην ενότητα Χρονοδιακόπτης/Μετρητής1 του φύλλου δεδομένων του ATMEGA328P.

Μην ξεχάσετε να συνδέσετε τον ακροδέκτη 8 της πλακέτας Arduino UNO στο σήμα σας και συνδέστε τις γείωσης για να έχετε την ίδια αναφορά τάσης τόσο για το κύκλωμα δοκιμής όσο και για τον λογικό αναλυτή. Εάν χρειάζεστε απομόνωση εδάφους ή πρέπει να μετρήσετε σήματα με επίπεδα διαφορετικά από 5V, πιθανότατα θα χρειαστεί να προσθέσετε έναν οπτο-απομονωτή στο κύκλωμά σας.

Μόλις όλα έχουν ρυθμιστεί σωστά, μπορείτε να πατήσετε το κουμπί "Απόκτηση".

Βήμα 6: Καταγραφή αποτελεσμάτων και εξαγωγή δεδομένων CSV

Καταγραφή αποτελεσμάτων και εξαγωγή δεδομένων CSV
Καταγραφή αποτελεσμάτων και εξαγωγή δεδομένων CSV

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

Η πλοκή σας δίνει μόνο μια προεπισκόπηση και δεν διαθέτει εργαλεία ανάλυσης δεδομένων. Έτσι, για να πραγματοποιήσετε περαιτέρω ανάλυση των δεδομένων σας, θα πρέπει να τα εισαγάγετε στο PulseView.

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

Τώρα ανοίξτε το PulseView. Στην επάνω γραμμή μενού, κάντε κλικ στο "Άνοιγμα" (εικονίδιο φακέλου) και επιλέξτε "Εισαγωγή τιμών διαχωρισμένων με κόμμα …". Επιλέξτε το αρχείο csv που δημιουργήθηκε προηγουμένως και περιέχει τα δεδομένα σας.

Θα εμφανιστεί ένα μικρό παράθυρο. Αφήστε τα πάντα όπως είναι, απλά πρέπει να τροποποιήσετε τη ρύθμιση "Δείγμα" σύμφωνα με τον συντελεστή διαίρεσης ρολογιού που έχει επιλεγεί για τη λήψη. Η συχνότητα δειγματοληψίας σας θα είναι "16MHz/(συντελεστής διαίρεσης)". Στη συνέχεια, κάντε κλικ στο "Ok", το σήμα σας θα εμφανιστεί στην οθόνη.

Βήμα 7: Ανάλυση σήματος PulseView

Ανάλυση σήματος PulseView
Ανάλυση σήματος PulseView

Το PulseView διαθέτει πολλούς αποκωδικοποιητές πρωτοκόλλων. Για πρόσβαση σε αυτά, κάντε κλικ στο "Προσθήκη αποκωδικοποιητή πρωτοκόλλου" στην επάνω γραμμή μενού (το πιο σωστό εργαλείο). Για το πείραμά μου, μόλις έστειλα ένα απλό μήνυμα UART στα 9600 bauds, οπότε έψαξα για "UART".

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

Βήμα 8: Συμπέρασμα

συμπέρασμα
συμπέρασμα

Ακόμα κι αν το έργο ήταν, στην αρχή, ένα πείραμα, είμαι ευχαριστημένος με τα αποτελέσματα που πήρα. Iμουν σε θέση να δοκιμάσω σήματα UART έως και 115200 bauds στη λειτουργία "Και των δύο" χωρίς κανένα πρόβλημα, και κατάφερα ακόμη και να φτάσω μέχρι τα 230400 bauds στη λειτουργία ακμής "Falling". Μπορείτε να δείτε τη δοκιμαστική μου ρύθμιση στην παραπάνω εικόνα.

Η εφαρμογή μου έχει πολλά μειονεκτήματα, ξεκινώντας από το γεγονός ότι μπορεί να καταγράψει μόνο ένα σήμα τη φορά, αφού μόνο ο ακροδέκτης 8 του Arduino UNO είναι "ικανός για καταγραφή εισόδου". Αν ψάχνετε για έναν λογικό αναλυτή Arduino με περισσότερα κανάλια, πηγαίνετε να ελέγξετε αυτό του Catoblepas.

Δεν μπορείτε να περιμένετε από ένα Arduino UNO να μπορεί να καταγράφει σήματα με υψηλές συχνότητες (μερικά MHz), καθώς είναι χρονισμένο μόνο στα 16MHz (αν το έκανε κάποιος, θα με ενδιέφερε να δω τη μέθοδό του). Ωστόσο, είμαι ακόμα εντυπωσιασμένος από τα αποτελέσματα που μπορούμε να βγάλουμε από αυτόν τον μικροελεγκτή ATMEGA328P.

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

Wasταν το πρώτο μου εκπαιδευτικό και νομίζω ότι ήταν μακρύ. Ελπίζω ότι ήταν μια ενδιαφέρουσα ανάγνωση για εσάς.

Ενημερώστε με αν βρείτε λάθη ή εάν έχετε οποιαδήποτε ερώτηση!

Συνιστάται: