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

XYZ Point Scanner Using Salvaged Rotary Encoders: 5 βήματα
XYZ Point Scanner Using Salvaged Rotary Encoders: 5 βήματα

Βίντεο: XYZ Point Scanner Using Salvaged Rotary Encoders: 5 βήματα

Βίντεο: XYZ Point Scanner Using Salvaged Rotary Encoders: 5 βήματα
Βίντεο: How to use linear encoders with Arduino. hardware, code, and demo. 2024, Νοέμβριος
Anonim
XYZ Point Scanner Using Salvaged Rotary Encoders
XYZ Point Scanner Using Salvaged Rotary Encoders

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

Πρόσφατα αγόρασα έναν νέο 3D εκτυπωτή για το σπίτι μου και τι θα μπορούσε να τον συγχαρώ καλύτερα από έναν τρισδιάστατο σαρωτή! Αυτό το έργο μου έδωσε επίσης την τέλεια ευκαιρία να χρησιμοποιήσω τον τρισδιάστατο εκτυπωτή μου για την κατασκευή των απαιτούμενων εξαρτημάτων.

Προμήθειες

Οπτικοί κωδικοποιητές και αντίστοιχοι οπτικοί αισθητήρες

Arduino UNO

προαιρετική ασπίδα πρωτοτύπων

ράγες χαλύβδινων ράβδων

πρόσβαση σε έναν εκτυπωτή 3D

Βήμα 1: Οι οπτικοί κωδικοποιητές

Οι οπτικοί κωδικοποιητές
Οι οπτικοί κωδικοποιητές
Οι οπτικοί κωδικοποιητές
Οι οπτικοί κωδικοποιητές
Οι οπτικοί κωδικοποιητές
Οι οπτικοί κωδικοποιητές

Σχεδόν κάθε περιστροφικός κωδικοποιητής θα μπορούσε να χρησιμοποιηθεί για αυτό το έργο, αρκεί να σας παρέχει έναν σχετικά υψηλό αριθμό «κλικ» ανά mm. Προφανώς διαφορετικοί κωδικοποιητές θα απαιτούν κατάλληλη λύση στερέωσης.

Χρησιμοποίησα έναν μετρητή συνέχειας για να εντοπίσω το διάγραμμα καλωδίωσης για τους αισθητήρες φωτογραφιών.

Βήμα 2: Τμήματα εκτυπωμένων 3D

Τρισδιάστατα εκτυπωμένα ανταλλακτικά
Τρισδιάστατα εκτυπωμένα ανταλλακτικά
Τρισδιάστατα εκτυπωμένα ανταλλακτικά
Τρισδιάστατα εκτυπωμένα ανταλλακτικά

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

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

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

Βήμα 3: Διάγραμμα καλωδίωσης

Διάγραμμα συνδεσμολογίας
Διάγραμμα συνδεσμολογίας

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

Αποφάσισα για 5mA για τις διόδους εκπομπής σειράς, στον συγκεκριμένο κωδικοποιητή η πτώση τάσης στις διόδους είναι 3,65V. Χρησιμοποιώ μια τροφοδοσία 5V από το Arduino, που αφήνει 1,35V για την αντίσταση, στα 5mA αυτό είναι 270 ohm.

10k ohm επιλέχθηκε για τα pull-ups καθώς οι φωτοδιόδους μπορούν να βυθίσουν μόνο ένα μικρό ρεύμα, 10k ohm χρησιμοποιήθηκαν επίσης για το κουμπί. Υπάρχει ένα κουμπί διαθέσιμο για χρήση στον πίνακα πρωτοτύπων που είναι ήδη συνδεδεμένος στη γείωση, απλώς δώστε του μια αντίσταση έλξης και συνδέστε το στον επιθυμητό πείρο εισόδου.

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

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

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

Πρώτον, θέλουμε μόνο να επεξεργαστούμε δεδομένα κατεύθυνσης ΑΝ υπήρξε αλλαγή στη θέση κωδικοποιητή.

αλλαγές = new_value ^ αποθηκευμένη τιμή.

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

Κατά τη ρύθμισή μου, η ανάλυση μου είναι 24 κλικ ανά 1 εκατοστό.

Αυτό μας αφήνει μερικά σενάρια.

Το S1 είναι σταθερό 0 και το S2 εναλλάσσεται από το 0 στο 1

Το S1 είναι σταθερό 0 και το S2 εναλλάσσεται από το 1 στο 0

Το S1 είναι σταθερό 1 και το S2 εναλλάσσεται από το 0 στο 1

Το S1 είναι σταθερό 1 και το S2 εναλλάσσεται από το 1 στο 0

Το S2 είναι σταθερό 0 και το S1 εναλλάσσεται από το 0 στο 1

Το S2 είναι σταθερό 0 και το S1 εναλλάσσεται από το 1 στο 0

Το S2 είναι σταθερό 1 και το S1 εναλλάσσεται από το 0 στο 1

Το S2 είναι σταθερό 1 και το S1 εναλλάσσεται από το 1 στο 0

Αυτές οι συνθήκες γίνονται καλύτερα κατανοητές στους παραπάνω πίνακες αλήθειας, επίσης κάθε συνθήκη αποδίδει μια «κατεύθυνση», που ονομάζεται αυθαίρετα 0 ή 1.

Τα διαγράμματα μας δίνουν δύο ζωτικές ενδείξεις:

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

2) το ίδιο το γράφημα είναι απλώς το XOR των σημάτων S1 και S2. (το άλλο γράφημα είναι το ΟΧΙ αυτού).

Τώρα η κατανόηση του κώδικα είναι απλή.

// διαβάστε παράλληλα στο PORT // θυμηθείτε ότι τα γειτονικά ζεύγη ανήκουν στην ίδια κατάσταση κωδικοποιητή = PINB & 0x3f; // ποιες καρφίτσες έχουν αλλάξει αν υπάρχει διαφορά = κράτημα ^ // Γειτονικά σήματα S1 και S2 για να λάβετε τον πίνακα αλήθειας // ο πρώτος τρόπος είναι να δημιουργήσετε ένα αντίγραφο της τρέχουσας κατάστασης // και να το μετακινήσετε προς τα δεξιά κατά ένα bit lookup = state >> 1; // τώρα τα δυαδικά ψηφία είναι ευθυγραμμισμένα για την κατάσταση XOR dir = lookup ^. // θυμηθείτε, ο πίνακας πρέπει να αντιστραφεί εάν ένα // από τις εισόδους παρέμεινε σταθερό, δεν χρειαζόμαστε μια δήλωση IF // για αυτό. Επί του παρόντος, το επιθυμητό bit κατεύθυνσης // είναι το δεξί bit κάθε ζεύγους στη μεταβλητή 'dir' // το αριστερό bit δεν έχει νόημα // η μεταβλητή 'diff' έχει το bit που άλλαξε 'set' // οπότε είτε έχουμε "01" ή "10" // XOR αυτό με το byte "dir" θα // αντιστρέψει ή όχι το σημαντικό νόημα. dir ^= diff? // τώρα ενημέρωση κράτησης μεταβλητή κράτηση = κατάσταση; // εάν οποιοδήποτε bit έχει αλλάξει για αυτόν τον κωδικοποιητή εάν (diff & 0x03) {// καθορίστε την κατεύθυνση εάν (dir & 0x01) {// με βάση το λογισμικό σας και την καλωδίωση είτε ++ είτε ---z; } else {++ z; }} // ditto για τα υπόλοιπα if (diff & 0x0c) {if (dir & 0x04) {++ y; } else {--y; }} if (diff & 0x30) {if (dir & 0x10) {--x; } else {++ x; }}

Όταν πατηθεί το κουμπί στέλνουμε την τρέχουσα τιμή XYZ σε ένα τερματικό πρόγραμμα.

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

Τα δεδομένα αποστέλλονται ως ακατέργαστες μετρήσεις. Θα μπορούσατε να κάνετε τα μαθηματικά και να στείλετε τα δεδομένα σε mm ή ίντσες κλπ. Βρίσκω ότι οι πρώτες τιμές είναι εξίσου καλές επειδή μπορούμε να κλιμακώσουμε το αντικείμενο αργότερα στο λογισμικό.

Βήμα 5: Πρώτη σάρωση

Πρώτη σάρωση
Πρώτη σάρωση
Πρώτη σάρωση
Πρώτη σάρωση
Πρώτη σάρωση
Πρώτη σάρωση
Πρώτη σάρωση
Πρώτη σάρωση

Η συγκέντρωση των σημείων είναι μια αργή διαδικασία, τοποθετώ τον αισθητήρα στην επάνω αριστερή γωνία και επαναφέρω το Arduino.

Αυτό μηδενίζει τη θέση ως σπίτι.

Στη συνέχεια, μετακινήστε τον αισθητήρα στη θέση του στόχου, κρατήστε τον σταθερό και πατήστε το κουμπί "στιγμιότυπο".

Για αυτό το αρκετά μεγάλο δείγμα πήρα μόνο points 140 πόντους, οπότε η λεπτομέρεια δεν είναι μεγάλη για το τελικό προϊόν.

Αποθηκεύστε τα δεδομένα σε ένα αρχείο. PCD και προσθέστε την κεφαλίδα

#. PCD v.7 - Μορφή αρχείου Data Cloud DataVERSION.7 ΠΕΔΙΑ x y z ΜΕΓΕΘΟΣ 4 4 4 ΤΥΠΟΣ F F F COUNT 1 1 1 ΠΛΑΤΟΣ (ο αριθμός των πόντων σας) ΥIGHΟΣ 1 ΑΠΟEWΗ 0 0 0 1 0 0 0 ΣΗΜΕΙΩΝ (ο αριθμός των πόντων σας)

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

Πάνω από τις τελείες μπορούν να φανούν στο freeCad, στη συνέχεια εξάγονται από το freeCad ως αρχείο. PLY.

Ανοίξτε το. PLY στο MeshLab και εμφανίστε το αντικείμενο. Εγινε!!

Συνιστάται: