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

Πλήρης περιστροφική λύση Arduino: 5 βήματα
Πλήρης περιστροφική λύση Arduino: 5 βήματα

Βίντεο: Πλήρης περιστροφική λύση Arduino: 5 βήματα

Βίντεο: Πλήρης περιστροφική λύση Arduino: 5 βήματα
Βίντεο: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Ιούλιος
Anonim
Πλήρης περιστροφική λύση Arduino
Πλήρης περιστροφική λύση Arduino

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

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

Βήμα 1: Περιστροφικοί κωδικοποιητές στο εσωτερικό

Περιστροφικοί κωδικοποιητές στο εσωτερικό
Περιστροφικοί κωδικοποιητές στο εσωτερικό
Περιστροφικοί κωδικοποιητές στο εσωτερικό
Περιστροφικοί κωδικοποιητές στο εσωτερικό
Περιστροφικοί κωδικοποιητές στο εσωτερικό
Περιστροφικοί κωδικοποιητές στο εσωτερικό

Το περιστροφικό μέρος του κωδικοποιητή έχει τρεις ακίδες (και δύο ακόμη για το προαιρετικό τμήμα διακόπτη). Το ένα είναι κοινό σημείο (μαύρο GND), τα άλλα δύο είναι για τον καθορισμό της κατεύθυνσης όταν γυρίζει το κουμπί (συχνά ονομάζονται μπλε CLK και κόκκινο DT). Και τα δύο αυτά είναι προσαρτημένα σε έναν πείρο εισόδου PULLUP του μικροελεγκτή, καθιστώντας το επίπεδο HIGH ως την προεπιλεγμένη τους ένδειξη. Όταν το κουμπί στρέφεται προς τα εμπρός (ή δεξιόστροφα), πρώτα το μπλε CLK πέφτει στο επίπεδο LOW και μετά ακολουθεί το κόκκινο DT. Γυρίζοντας περαιτέρω, το μπλε CLK ανεβαίνει ξανά στο HIGH, τότε καθώς το κοινό μπάλωμα GND αφήνει και τις δύο ακίδες σύνδεσης, το κόκκινο DT ανεβαίνει επίσης στο HIGH. Συμπληρώνοντας έτσι ένα πλήρες τσιμπούρι FWD (ή δεξιόστροφα). Το ίδιο συμβαίνει και προς την άλλη κατεύθυνση BWD (ή αριστερόστροφα), αλλά τώρα το κόκκινο πέφτει πρώτο και το μπλε ανεβαίνει πίσω τελευταία όπως φαίνεται στις εικόνες δύο επιπέδων αντίστοιχα.

Βήμα 2: Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς

Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς
Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς
Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς
Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς
Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς
Αθλιότητα που προκαλεί πραγματικό πόνο σε πολλούς

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

Βήμα 3: Λύση Πεπερασμένης Κατάστασης Μηχανής (FSM)

Λύση Πεπερασμένης Κατάστασης Μηχανής (FSM)
Λύση Πεπερασμένης Κατάστασης Μηχανής (FSM)

Η εικόνα δείχνει τον πλήρη χώρο κατάστασης των πιθανών αλλαγών επιπέδου για τις δύο ακίδες (μπλε CLK και κόκκινο DT), τόσο για σωστές όσο και για ψευδείς αναπηδήσεις. Με βάση αυτό το μηχάνημα κατάστασης μπορεί να προγραμματιστεί μια πλήρης λύση που λειτουργεί πάντα 100% ακριβής. Επειδή δεν απαιτούνται καθυστερήσεις φιλτραρίσματος σε αυτήν τη λύση, είναι επίσης η ταχύτερη δυνατή. Ένα άλλο πλεονέκτημα του διαχωρισμού του χώρου κατάστασης των καρφιτσών από τον τρόπο λειτουργίας είναι ότι μπορεί κανείς να εφαρμόσει τις λειτουργίες δημοσκόπησης ή διακοπής κατά βούληση. Η ψηφοφορία ή οι διακοπές μπορούν να ανιχνεύσουν αλλαγές επιπέδου στις ακίδες και μια ξεχωριστή ρουτίνα θα υπολογίσει τη νέα κατάσταση με βάση την τρέχουσα κατάσταση και τα πραγματικά γεγονότα των αλλαγών επιπέδου.

Βήμα 4: Κωδικός Arduino

Κωδικός Arduino
Κωδικός Arduino

Ο παρακάτω κωδικός μετράει τα τσιμπούρια FWD και BWD στη σειριακή οθόνη και ενσωματώνει επίσης την προαιρετική λειτουργία διακόπτη.

// Peter Csurgay 2019-04-10

// Καρφίτσες του περιστροφικού αντιστοιχισμένου στις θύρες Arduino

#define SW 21 #define CLK 22 #define DT 23

// Τρέχουσα και προηγούμενη τιμή του μετρητή που ρυθμίζεται από το περιστροφικό

int curVal = 0; int prevVal = 0;

// Επτά καταστάσεις FSM (μηχανή πεπερασμένης κατάστασης)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

void setup () {

Serial.begin (250000); Serial.println ("Έναρξη …"); // Το επίπεδο HIGH θα είναι προεπιλεγμένο για όλες τις ακίδες pinMode (SW, INPUT_PULLUP). pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Τόσο το CLK όσο και το DT θα ενεργοποιήσουν διακοπές για όλες τις αλλαγές επιπέδου attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE). attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Χειρισμός του προαιρετικού διακόπτη ενσωματωμένου σε ορισμένους περιστροφικούς κωδικοποιητές εάν (digitalRead (SW) == LOW) {Serial.println ("Pressed"); ενώ (! digitalRead (SW)); } // Οποιαδήποτε αλλαγή στην τιμή του μετρητή εμφανίζεται στο Serial Monitor if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Μεταβάσεις κατάστασης μηχανής για αλλαγές στο επίπεδο CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; αλλιώς εάν (κατάσταση == SCLK_10) κατάσταση = SCLK_00; αλλιώς εάν (κατάσταση == SDT_10) κατάσταση = SDT_00; } else {if (κατάσταση == SCLK_01) κατάσταση = IDLE_11; αλλιώς εάν (κατάσταση == SCLK_00) κατάσταση = SCLK_10; αλλιώς εάν (κατάσταση == SDT_00) κατάσταση = SDT_10; else if (κατάσταση == SDT_01) {κατάσταση = IDLE_11; curVal--; }}}

// Μεταβάσεις κατάστασης μηχανής για αλλαγές επιπέδου DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; αλλιώς εάν (κατάσταση == SDT_01) κατάσταση = SDT_00; αλλιώς εάν (κατάσταση == SCLK_01) κατάσταση = SCLK_00; } else {if (κατάσταση == SDT_10) κατάσταση = IDLE_11; αλλιώς εάν (κατάσταση == SDT_00) κατάσταση = SDT_01; αλλιώς εάν (κατάσταση == SCLK_00) κατάσταση = SCLK_01; else if (κατάσταση == SCLK_10) {κατάσταση = IDLE_11; curVal ++; }}}

Βήμα 5: Άψογη ενσωμάτωση

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

Συνιστάται: