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

Διακόπτες Arduino και Thumbwheel: 9 βήματα
Διακόπτες Arduino και Thumbwheel: 9 βήματα

Βίντεο: Διακόπτες Arduino και Thumbwheel: 9 βήματα

Βίντεο: Διακόπτες Arduino και Thumbwheel: 9 βήματα
Βίντεο: Thumbwheel Switch - Hexadecimal to BCD converter, its Function & Testing #hexadecimal #miniproject 2024, Ιούλιος
Anonim
Διακόπτες Arduino και Thumbwheel
Διακόπτες Arduino και Thumbwheel

Σε αυτό το άρθρο εξετάζουμε τη χρήση διακόπτες ώθησης/τροχού αντίχειρα με τα συστήματά μας Arduino. Ακολουθούν μερικά παραδείγματα που προέρχονται από το PMD Way.

Βήμα 1:

Εικόνα
Εικόνα

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

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

Βήμα 2:

Εικόνα
Εικόνα

Έχουμε κοινά στα αριστερά, στη συνέχεια επαφές για 1, 2, 4 και 8. Εάν εφαρμόσετε μια μικρή τάση (ας πούμε 5V) στο κοινό, η τιμή του διακόπτη μπορεί να μετρηθεί προσθέτοντας τις τιμές των επαφών που βρίσκονται στο Υ HIGHΗΛΗ ΚΑΤΑΣΤΑΣΗ. Για παράδειγμα, εάν επιλέξετε 3 - οι επαφές 1 και 2 θα έχουν κοινή τάση. Οι τιμές μεταξύ μηδέν και εννέα μπορούν να αναπαρασταθούν ως τέτοιες στον πίνακα.

Βήμα 3:

Εικόνα
Εικόνα

Μέχρι τώρα θα πρέπει να συνειδητοποιήσετε ότι θα ήταν εύκολο να διαβάσετε την αξία ενός διακόπτη - και έχετε δίκιο, είναι. Μπορούμε να συνδέσουμε 5V στα κοινά, τις εξόδους σε ψηφιακές ακίδες εισόδου των πλακετών μας Arduino, και στη συνέχεια να χρησιμοποιήσουμε το digitalRead () για να καθορίσουμε την τιμή κάθε εξόδου. Στο σκίτσο χρησιμοποιούμε κάποια βασικά μαθηματικά για να μετατρέψουμε την τιμή BCD σε δεκαδικό αριθμό. Ας το κάνουμε λοιπόν τώρα.

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

Βήμα 4:

Τώρα είναι απλό να συνδέσετε τις εξόδους με την ένδειξη 1, 2, 4 και 8 σε (για παράδειγμα) ψηφιακούς ακροδέκτες 8, 9, 10 και 11. Συνδέστε το 5V στο διακόπτη ‘C’ και το GND στο… GND. Στη συνέχεια, πρέπει να έχουμε ένα σκίτσο που μπορεί να διαβάσει τις εισόδους και να μετατρέψει την έξοδο BCD σε δεκαδικό. Εξετάστε το ακόλουθο σκίτσο:

/ * Χρησιμοποιεί αριθμητική ασπίδα οθόνης SAA1064 https://www.gravitech.us/7segmentshield.html Χρησιμοποιεί σειριακή οθόνη εάν δεν έχετε την ασπίδα SAA1064 */#include "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // συμμετοχή i2c bus (διεύθυνση προαιρετική για κύρια) καθυστέρηση (500). pinMode (q1, INPUT); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' pinMode (q4, INPUT); // thumbwheel '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // στέλνει ακέραιο 'Count' στην ασπίδα Gravitech SAA1064 {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Χιλιάδες, Εκατοντάδες, Δεκάδες, Βάση. Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Χιλιάδες = Καταμέτρηση/1000; Εκατοντάδες = (Καταμέτρηση- (Χιλιάδες*1000))/100; Δεκάδες = (Καταμέτρηση-((Χιλιάδες*1000)+(Εκατοντάδες*100)))/10; Βάση = Καταμέτρηση-((Χιλιάδες*1000)+(Εκατοντάδες*100)+(Δεκάδες*10)); Wire.write (αναζήτηση [Βάση]); Wire.write (αναζήτηση [Tens]); Wire.write (αναζήτηση [Εκατοντάδες]); Wire.write (αναζήτηση [Χιλιάδες]); Wire.endTransmission (); καθυστέρηση (10)? } int readSwitch () {int σύνολο = 0; εάν (digitalRead (q1) == HIGH) {σύνολο+= 1; } if (digitalRead (q2) == HIGH) {σύνολο+= 2; } if (digitalRead (q4) == HIGH) {σύνολο+= 4; } if (digitalRead (q8) == HIGH) {σύνολο+= 8; } σύνολο επιστροφής. } void loop () {dispSAA1064 (readSwitch ()); // στέλνει την τιμή του διακόπτη στην ασπίδα οθόνης Serial.println (readSwitch ()); // στέλνει την τιμή μεταγωγής στο σειριακό πλαίσιο ελέγχου}

Η συνάρτηση readSwitch () είναι το κλειδί. Υπολογίζει την τιμή του διακόπτη προσθέτοντας την αριθμητική αναπαράσταση κάθε εξόδου διακόπτη και επιστρέφει το σύνολο ως αποτέλεσμα. Για αυτό το παράδειγμα χρησιμοποιήσαμε μια αριθμητική ασπίδα οθόνης που ελέγχεται από το NXP SAA1064.

Βήμα 5:

Image
Image

Η συνάρτηση readSwitch () είναι το κλειδί. Υπολογίζει την τιμή του διακόπτη προσθέτοντας την αριθμητική αναπαράσταση κάθε εξόδου διακόπτη και επιστρέφει το σύνολο ως αποτέλεσμα. Για αυτό το παράδειγμα χρησιμοποιήσαμε μια αριθμητική ασπίδα οθόνης που ελέγχεται από το NXP SAA1064.

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

Βήμα 6:

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

Ορίστε λοιπόν. Θα τα χρησιμοποιούσατε πραγματικά σε ένα έργο; Για ένα ψηφίο - ναι. Για τέσσερις? Μάλλον όχι-ίσως θα ήταν ευκολότερο να χρησιμοποιήσετε ένα 12ψήφιο πληκτρολόγιο. Υπάρχει μια ιδέα…

Βήμα 7: Πολλαπλοί διακόπτες

Εικόνα
Εικόνα

Τώρα θα εξετάσουμε πώς να διαβάζουμε τέσσερα ψηφία - και να μην σπαταλάμε όλες αυτές τις ψηφιακές ακίδες στη διαδικασία. Αντ 'αυτού, θα χρησιμοποιήσουμε το Microchip MCP23017 16-bit expander IC που επικοινωνεί μέσω του διαύλου I2C. Διαθέτει δεκαέξι ψηφιακές ακίδες εισόδου/εξόδου που μπορούμε να χρησιμοποιήσουμε για να διαβάσουμε την κατάσταση κάθε διακόπτη.

Πριν προχωρήσετε, σημειώστε ότι απαιτούνται κάποιες υποτιθέμενες γνώσεις για αυτό το άρθρο - το δίαυλο I2C (μέρη ένα και δύο) και το MCP23017. Αρχικά θα περιγράψουμε τις συνδέσεις υλικού και στη συνέχεια το σκίτσο του Arduino. Θυμηθείτε το σχηματικό σχήμα που χρησιμοποιείται για το παράδειγμα μεμονωμένου διακόπτη.

Όταν ο διακόπτης συνδέθηκε απευθείας με το Arduino, διαβάζουμε την κατάσταση κάθε ακίδας για να καθορίσουμε την τιμή του διακόπτη. Θα το κάνουμε ξανά, σε μεγαλύτερη κλίμακα χρησιμοποιώντας το MCP23017. Εξετάστε το διάγραμμα pinout:

Βήμα 8:

Έχουμε 16 ακίδες, οι οποίες επιτρέπουν τη σύνδεση τεσσάρων διακοπτών. Τα κοινά για κάθε διακόπτη εξακολουθούν να συνδέονται με 5V και κάθε επαφή διακόπτη εξακολουθεί να έχει μια αντίσταση αναδίπλωσης 10k στο GND. Στη συνέχεια συνδέουμε τους 1, 2, 4, 8 ακίδες του ψηφίου ένα στο GPBA0 ~ 3. ψηφία δύο 1, 2, 4, 8 στο GPA4 ~ 7 · ψηφία τριών, 1, 2, 4, 8 σε GPB0 ~ 3 και ψηφία τεσσάρων 1, 2, 4, 8 σε GPB4 ~ 7.

Τώρα πώς διαβάζουμε τους διακόπτες; Όλα αυτά τα καλώδια μπορεί να σας κάνουν να νομίζετε ότι είναι δύσκολο, αλλά το σκίτσο είναι αρκετά απλό. Όταν διαβάζουμε την τιμή των GPBA και B, επιστρέφεται ένα byte για κάθε τράπεζα, με το πιο σημαντικό bit πρώτα. Κάθε τέσσερα bit θα ταιριάζει με τη ρύθμιση του διακόπτη που είναι συνδεδεμένος με τις αντίστοιχες ακίδες εισόδου/εξόδου. Για παράδειγμα, εάν ζητήσουμε τα δεδομένα και για τις δύο τράπεζες ΙΟ και οι διακόπτες έχουν οριστεί σε 1 2 3 4 - η τράπεζα Α θα επιστρέψει 0010 0001 και η τράπεζα Β θα επιστρέψει 0100 0011.

Χρησιμοποιούμε κάποιες λειτουργίες μετατόπισης bit για να χωρίσουμε κάθε τέσσερα bit σε ξεχωριστή μεταβλητή - κάτι που μας αφήνει με την τιμή κάθε ψηφίου. Για παράδειγμα, για να διαχωρίσουμε την τιμή του διακόπτη τέσσερα, μετατοπίζουμε τα δυαδικά ψηφία από την τράπεζα Β >> 4. Αυτό ωθεί την τιμή του διακόπτη τρία προς τα έξω και τα κενά δυαδικά ψηφία στα αριστερά γίνονται μηδέν.

Για να διαχωρίσουμε την τιμή για τον διακόπτη τρία, χρησιμοποιούμε μια ένωση bitwise & - η οποία αφήνει την τιμή του διακόπτη τρία. Η εικόνα δείχνει μια ανάλυση των τιμών του δυαδικού διακόπτη - δείχνει τις ακατέργαστες τιμές byte GPIOA και B, στη συνέχεια δυαδική τιμή κάθε ψηφίου και δεκαδική τιμή.

Βήμα 9:

Ας δούμε λοιπόν το σκίτσο επίδειξης:

/ * Παράδειγμα 40α-Διαβάστε τέσσερις διακόπτες BCD ώθησης μέσω MCP23017, εμφανίζονται σε SAA1064/4ψήφια οθόνη LED 7 τεμαχίων */// MCP23017 καρφίτσες 15 ~ 17 στο GND, η διεύθυνση λεωφορείου I2C είναι 0x20 // SAA1064 I2C διεύθυνση λεωφορείου 0x38 # περιλαμβάνει "Wire.h" // για ορισμούς ψηφίων LED int ψηφία [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; byte GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064 () {// setup 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // Έξοδος 12mA, χωρίς κενό ψηφίου Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // εκκίνηση διαύλου I2C initSAA1064 (); } void loop () {// διαβάστε τις εισόδους της τράπεζας A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1)? GPIOA = Wire.read (); // αυτό το byte περιέχει τα δεδομένα μεταγωγής για τα ψηφία 1 και 2 // διαβάστε τις εισόδους της τράπεζας B Wire.beginTransmission (0x20). Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1)? GPIOB = Wire.read (); // αυτό το byte περιέχει τα δεδομένα μεταγωγής για τα ψηφία 3 και 4 // εξαγωγή τιμής για κάθε διακόπτη // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // αποστολή όλων των δεδομένων GPIO και μεμονωμένων διακοπτών στη σειριακή οθόνη // για εντοπισμό σφαλμάτων και για λόγους ενδιαφέροντος Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("ψηφίο 1 ="); Serial.println (dig1, BIN); Serial.print ("ψηφίο 2 ="); Serial.println (dig2, BIN); Serial.print ("ψηφίο 3 ="); Serial.println (dig3, BIN); Serial.print ("ψηφίο 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("ψηφίο 1 ="); Serial.println (dig1, DEC); Serial.print ("ψηφίο 2 ="); Serial.println (dig2, DEC); Serial.print ("ψηφίο 3 ="); Serial.println (dig3, DEC); Serial.print ("ψηφίο 4 ="); Serial.println (dig4, DEC); Serial.println (); // αποστολή τιμής διακόπτη στην οθόνη LED μέσω SAA1064 Wire.beginTransmission (0x38). Wire.write (1); Wire.write (ψηφία [dig4]); Wire.write (ψηφία [dig3]); Wire.write (ψηφία [dig2]); Wire.write (ψηφία [dig1]); Wire.endTransmission (); καθυστέρηση (10)? καθυστέρηση (1000)? }

Και για τους μη πιστούς … μια επίδειξη βίντεο.

Ορίστε λοιπόν. Τέσσερα ψηφία αντί για ένα και πάνω από το δίαυλο I2C διατηρώντας τις ψηφιακές ακίδες εισόδου/εξόδου Arduino. Χρησιμοποιώντας οκτώ MCP23017 θα μπορούσατε να διαβάσετε 32 ψηφία ταυτόχρονα. Διασκεδάστε κάνοντας το!

Μπορείτε να παραγγείλετε διακόπτες BCD και δεκαδικούς σε διάφορα μεγέθη από το PMD Way, με δωρεάν παράδοση σε όλο τον κόσμο.

Αυτή η ανάρτηση σας έφερε το pmdway.com - τα πάντα για κατασκευαστές και λάτρεις των ηλεκτρονικών ειδών, με δωρεάν παράδοση σε όλο τον κόσμο.

Συνιστάται: