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

Μέρος 3: GPIO: ARM Assembly: Line Follower: TI-RSLK: 6 Steps
Μέρος 3: GPIO: ARM Assembly: Line Follower: TI-RSLK: 6 Steps

Βίντεο: Μέρος 3: GPIO: ARM Assembly: Line Follower: TI-RSLK: 6 Steps

Βίντεο: Μέρος 3: GPIO: ARM Assembly: Line Follower: TI-RSLK: 6 Steps
Βίντεο: you can become a GIGACHAD assembly programmer in 10 minutes (try it RIGHT NOW) 2024, Δεκέμβριος
Anonim
Image
Image
Το Υλικό
Το Υλικό

Γεια σας. Αυτή είναι η επόμενη δόση όπου συνεχίζουμε να χρησιμοποιούμε ARM Assembly (αντί για γλώσσα υψηλότερου επιπέδου). Η έμπνευση για αυτό το Instructable είναι το Lab 6 του Texas Instruments Robotics System Learning Kit, ή TI-RSLK.

Θα χρησιμοποιήσουμε τον μικροελεγκτή από το κιτ, τον πίνακα ανάπτυξης MSP432 LaunchPad, αλλά ίσως βρείτε κάτι χρήσιμο για εξαγωγή από αυτό το Instructable, ακόμη και αν δεν χρησιμοποιείτε το LaunchPad ή ακολουθείτε το T. I. διδακτέα ύλη.

Ξεκινήσαμε με ένα Instructable που εισάγει τη ARM Assembly, το περιβάλλον ανάπτυξης και τον τρόπο δημιουργίας ενός έργου.

Το επόμενο Instructable on ARM Assembly παρουσίασε τον τρόπο αλληλεπίδρασης με την είσοδο/έξοδο (GPIO).

Στη συνέχεια, επεκτείναμε τις γνώσεις μας και εισαγάγαμε λειτουργίες, ελέγχοντας LED και διακόπτες.

Τώρα με αυτό το Instructable, μπορούμε να χρησιμοποιήσουμε όσα μάθαμε για να κάνουμε κάτι πιο διασκεδαστικό, πιο χρήσιμο: να εντοπίσουμε μια γραμμή.

Αυτό μπορεί να μας βοηθήσει αργότερα όταν κατασκευάζουμε ένα ρομπότ που ακολουθεί γραμμές.

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

Βήμα 1: Το υλικό

Το Υλικό
Το Υλικό
Το Υλικό
Το Υλικό
Το Υλικό
Το Υλικό

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

Για αυτό το Instructable, θα χρησιμοποιήσουμε τη σειρά αισθητήρων ανάκλασης από την Pololu, καθώς έρχεται ως μέρος του TI-RSLK (το κιτ ρομπότ). Είναι αυτό που χρησιμοποιείται στο μάθημα και στο εργαστήριο 6 του προγράμματος σπουδών.

Εάν δεν το έχετε, μπορείτε να χρησιμοποιήσετε οποιονδήποτε ανιχνευτή IR (ή σειρά αυτών) που εξάγει ένα ψηφιακό σήμα, Υ HIGHΗΛΟ ή ΧΑΜΗΛΟ, για παρουσία και απουσία.

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

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

Εάν ναι, τότε εάν το ρομπότ δεν είναι απευθείας ενσωματωμένο στη γραμμή, τότε θα πρέπει να επιστρέψει μια έξοδο ότι η γραμμή είναι ευρύτερη από ό, τι θα έπρεπε (επειδή είμαστε υπό γωνία).

Για καλύτερη εξήγηση των παραπάνω, ρίξτε μια ματιά στο έγγραφο Lab 6.

Για βοήθεια στην καλωδίωση / σύνδεση του αισθητήρα στην πλακέτα ανάπτυξης MSP432 LaunchPad, ακολουθούν μερικές χρήσιμες οδηγίες.

Έχω προσθέσει επίσης τις ίδιες (παρόμοιες;) οδηγίες pdf σε αυτό το βήμα.

Εάν διαβάσετε προσεκτικά τα έγγραφα Pololu, εξηγούν τον λόγο για την "παράκαμψη 3.3V", που θα θέλετε να κάνετε άλματα εάν χρησιμοποιείτε 3.3V αντί για 5V.

Δεδομένου ότι δεν κατασκευάζουμε ακόμα το ρομπότ, αλλά αντ 'αυτού μαθαίνουμε μόνο για τη συναρμολόγηση ARM και επίσης πώς να αλληλεπιδρούμε με κομμάτια (υποσυστήματα) του ρομπότ, δεν χρειάζεται να ακολουθούμε κατά γράμμα τις παραπάνω οδηγίες.

Προς το παρόν, η σύνδεση του πίνακα αισθητήρων γραμμής βράζει/μειώνεται στα ακόλουθα:

  • συνδέστε 3,3V και GND από την πλακέτα MSP432 στη συστοιχία αισθητήρων.
  • συνδέστε έναν ακροδέκτη θύρας (προτείνω P5.3) από το MSP432 στον ακροδέκτη ενεργοποίησης LED στη συστοιχία αισθητήρα γραμμής. Αυτός ο πείρος στον αισθητήρα είναι μεταξύ 3,3V και GND.
  • συνδέστε και τους οκτώ ακίδες/δυαδικά ψηφία μιας μεμονωμένης θύρας (προτείνω P7.0 έως P7.7) στις οκτώ ακίδες του πίνακα αισθητήρων με την ένδειξη "1" έως "8". Αυτές είναι οι γραμμές που θα πάνε Υ HIGHΗΛΗ ή ΧΑΜΗΛΗ ανάλογα με το τι αισθάνονται.

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

Έτσι, με όλα τα συνδεδεμένα, είμαστε έτοιμοι να μπούμε στο λογισμικό.

Βήμα 2: Ακολουθεί γραμμή

Γραμμή που ακολουθεί
Γραμμή που ακολουθεί
Γραμμή που ακολουθεί
Γραμμή που ακολουθεί

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

  • Το Determine είναι το ρομπότ που βρίσκεται στο κέντρο ή παρασύρεται προς τη μία πλευρά.
  • Είναι το ρομπότ ευθυγραμμισμένο προς την κατεύθυνση της γραμμής ή είναι υπό γωνία.

Κάθε ένας από τους ανιχνευτές της συστοιχίας παρέχει ουσιαστικά ένα κομμάτι πληροφοριών, είτε Υ HIGHΗΛΗ είτε ΧΑΜΗΛΗ.

Η ιδέα είναι να συνδυάσετε όλα αυτά τα δυαδικά ψηφία σε έναν αριθμό ή ένα μοτίβο δυαδικών ψηφίων και να χρησιμοποιήσετε αυτό το μοτίβο για να λάβετε αποφάσεις (προκειμένου να κινηθείτε σωστά).

Βήμα 3: Πριν μπορέσουμε πραγματικά να ξεκινήσουμε…

.. πρέπει να μάθουμε κάτι νέο για τον προγραμματισμό συναρμολόγησης ARM. Και δεν εννοώ απλώς μια άλλη οδηγία. Αυτά τείνουν να είναι δευτερεύοντα.

Μέχρι τώρα δεν έχουμε χρησιμοποιήσει τη "στοίβα" στα προγράμματά μας.

Έχουμε στηριχθεί στη χρήση των περισσότερων από τους βασικούς καταχωρητές CPU παγκοσμίως σε διαφορετικές υπορουτίνες.

Το μόνο που κάναμε ήταν να αποθηκεύσουμε και να επαναφέρουμε τη διεύθυνση LR (καταχωρητής συνδέσμων) για μια συνάρτηση - αυτή που κάλεσε πολλές άλλες συναρτήσεις. (Χρησιμοποιώ "λειτουργία" και "υπορουτίνα" εναλλακτικά εδώ).

Αυτό που κάναμε δεν είναι καλό. Τι γίνεται αν θέλουμε να φωλιάσουμε άλλες λειτουργίες; Τι γίνεται αν έχουμε περισσότερα από ένα επίπεδα φωλιάσματος;

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

Τώρα λοιπόν ρίχνουμε μια ματιά στη «στοίβα».

Βήμα 4: Η στοίβα

Ακολουθεί υλικό ανάγνωσης που εξηγεί τη στοίβα.

Είμαι μεγαλύτερος υποστηρικτής μερικών ιδεών:

  • μόνο όση θεωρία απαιτείται, προχωρήστε γρήγορα στην πρακτική
  • μάθετε όπως χρειάζεται, επικεντρωθείτε στο να κάνετε πραγματικά κάτι και όχι απλώς άσκοπες ασκήσεις ή παραδείγματα.

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

Ουσιαστικά, χρειαζόμαστε μόνο οδηγίες:

PUSH {λίστα εγγραφών}

POP {λίστα καταχώρησης}

Or, στην περίπτωσή μας, συγκεκριμένα:

PUSH {LR}

POP {LR}

Έτσι, μια λειτουργία συναρμολόγησης/υπορουτίνα θα μοιάζει με αυτό:

funcLabel:.asmfunc

PUSH {LR}; αυτή θα πρέπει πιθανώς να είναι μία από τις πρώτες οδηγίες κατά την είσοδο. ? κάντε περισσότερο κώδικα εδώ..? μπλα μπλα μπλα…; εντάξει, τελειώσαμε με τη λειτουργία, είμαστε έτοιμοι να επιστρέψουμε στη λειτουργία κλήσης POP {LR}. αυτό επαναφέρει τη σωστή διεύθυνση επιστροφής πίσω στην κλήση. λειτουργία. BX LR; επιστροφή.endasmfunc

Το βίντεο περνά μέσα από ένα ζωντανό παράδειγμα πολλών ένθετων λειτουργιών.

Βήμα 5: Το Λογισμικό

Το συνημμένο αρχείο με την ένδειξη "MSP432_Chapter …" έχει πολλές καλές πληροφορίες για τις θύρες του MSP432 και από αυτό το έγγραφο λαμβάνουμε τις ακόλουθες θύρες, καταχωρητές, διευθύνσεις κ.λπ. Ωστόσο, είναι λίγο χρονολογημένο. Ωστόσο, δεν είδα τις αναλυτικές διευθύνσεις που αναφέρονται για τη θύρα 5 και άνω. (μόνο "εναλλακτικές λειτουργίες"). Αλλά είναι ακόμα χρήσιμο.

Θα χρησιμοποιήσουμε δύο θύρες. Ρ5, Ρ7, Ρ1 και Ρ2.

Η έξοδος P5.3 (ένα μόνο bit) θα είναι ο έλεγχος της λειτουργίας IR LED στον αισθητήρα. Χρησιμοποιούμε το P5.3 επειδή είναι ένας εκτεθειμένος πείρος στην ίδια κεφαλίδα με τις άλλες συνδέσεις MSP432 που πηγαίνουν στον πίνακα αισθητήρων.

Τα P7.0 έως P7.7 θα είναι οι οκτώ είσοδοι που συλλέγουν τα δεδομένα από τον αισθητήρα. αυτό που «βλέπει».

Το P1.0 είναι το ενιαίο κόκκινο LED και θα μπορούσαμε να το χρησιμοποιήσουμε για να μας δώσουμε κάποιες ενδείξεις των δεδομένων.

Τα P2.0, P2.1, P2.2 είναι το LED RGB και μπορούμε επίσης να το χρησιμοποιήσουμε, με τις διαφορετικές δυνατότητες χρώματος, για να μας δώσουν ένδειξη των δεδομένων του αισθητήρα.

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

Απλώς διαθέτετε τμήμα δήλωσης για τις θύρες και τα κομμάτια κλπ.

Θα έχετε μια "κύρια" ενότητα.

Θα πρέπει να υπάρχει ένας βρόχος, όπου διαβάζουμε συνεχώς τα δεδομένα από το P7, λαμβάνουμε απόφαση για αυτά τα δεδομένα και ανάβουμε ανάλογα τα δύο LED.

Εδώ είναι και πάλι οι διευθύνσεις του Port Register:

  • GPIO P1: 0x4000 4C00 + 0 (ακόμη και διευθύνσεις)
  • GPIO P2: 0x4000 4C00 + 1 (περιττές διευθύνσεις)
  • GPIO P3: 0x4000 4C00 + 20 (ακόμη και διευθύνσεις)
  • GPIO P4: 0x4000 4C00 + 21 (περιττές διευθύνσεις)
  • GPIO P5: 0x4000 4C00 + 40 (ακόμη και διευθύνσεις)
  • GPIO P6: 0x4000 4C00 + 41 (περιττές διευθύνσεις)
  • GPIO P7: 0x4000 4C00 + 60 (ακόμη και διευθύνσεις)
  • GPIO P8: 0x4000 4C00 + 61 (περιττές διευθύνσεις)
  • GPIO P9: 0x4000 4C00 + 80 (ακόμη και διευθύνσεις)
  • GPIO P10: 0x4000 4C00 + 81 (περιττές διευθύνσεις)

Αυτό που είναι έντονο είναι αυτό που θα χρησιμοποιήσουμε για αυτό το Instructable.

Βήματα προγράμματος για την ανάγνωση ανιχνευτών IR

Το παρακάτω είναι psuedo-code για τη σύνταξη του προγράμματος σε C, αλλά εξακολουθεί να είναι χρήσιμο και θα το ακολουθήσουμε πολύ προσεκτικά στην έκδοση συναρμολόγησης του προγράμματος.

κύριο πρόγραμμα0) Αρχικοποίηση // θυρών ενώ (1) {1) Ρυθμίστε το P5.3 υψηλό (ενεργοποιήστε το IR LED) 2) Κάντε το P7.0 έξοδο και ρυθμίστε το ψηλά (φόρτιση του πυκνωτή) 3) Περιμένετε 10 εμάς, Clock_Delay1us (10) · 4) Κάντε το P7.0 μια είσοδο 5) Εκτελέστε αυτόν τον βρόχο 10, 000 φορές α) Διαβάστε το P7.0 (μετατρέπει την τάση στο P7.0 σε δυαδικό) β) Δυαδικό έξοδο σε P1.0 (σας επιτρέπει να δείτε δυαδικό σε πραγματικό χρόνο) 6) Ρυθμίστε το P5.3 χαμηλό (απενεργοποιήστε το LED IR, εξοικονόμηση ενέργειας) 7) Περιμένετε 10 ms, Clock_Delay1ms (10). } // επανάληψη (πίσω στο while ())

Βήμα 6: Ας βελτιώσουμε τον κώδικα

Ο σκοπός ή η χρήση της συστοιχίας IR Pololu IR είναι να ανιχνεύσει μια γραμμή και να μάθει εάν το ρομπότ (μέλλον) είναι άμεσα κεντραρισμένο στη γραμμή ή εκτός της μιας πλευράς. Επίσης, δεδομένου ότι η γραμμή έχει ένα συγκεκριμένο πάχος, εάν η συστοιχία αισθητήρων είναι άμεσα κάθετη στη γραμμή, ο αριθμός των αισθητήρων Ν θα έχει διαφορετική ένδειξη από τους υπόλοιπους, ενώ αν η συστοιχία LED IR είναι σε κάποια γωνία (όχι κάθετη), τότε Τα ζεύγη N+1 ή N+2 IR LED/ανιχνευτή θα πρέπει τώρα να δίνουν διαφορετική ένδειξη.

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

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

Το βίντεο περιλαμβάνει όλες τις λεπτομέρειες. Επισυνάπτεται επίσης ο τελικός κωδικός.

Αυτό ολοκληρώνει τη σειρά ARM Assembly που σχετίζεται με το GPIO. Ελπίζουμε να επιστρέψουμε με περισσότερη Συνέλευση ARM αργότερα.

Σας ευχαριστώ.

Συνιστάται: