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

Gimbal Motion Control: 12 Βήματα
Gimbal Motion Control: 12 Βήματα

Βίντεο: Gimbal Motion Control: 12 Βήματα

Βίντεο: Gimbal Motion Control: 12 Βήματα
Βίντεο: STOP USING GIMBALS (all the time) 2024, Ιούλιος
Anonim
Image
Image

Γεια σε όλους, το όνομά μου είναι Harji Nagi. Είμαι αυτή τη στιγμή φοιτητής δεύτερου έτους που σπουδάζει μηχανική ηλεκτρονικής και επικοινωνίας από το Pranveer Singh Institute of Technology, Kanpur (UP). Έχω έντονο ενδιαφέρον για τη ρομποτική, το arduino, την τεχνητή νοημοσύνη και τα αναλογικά ηλεκτρονικά.

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

Αποτελείται από 3 σερβοκινητήρες MG996R για τον έλεγχο 3 αξόνων και μια βάση στην οποία θα τοποθετηθεί ο αισθητήρας MPU6050, το Arduino και η μπαταρία. Χρησιμοποιείται για τη σταθεροποίηση της κάμερας χωρίς κραδασμούς. Ένα τζάμπα 3 αξόνων διασφαλίζει ότι η κίνηση της κάμερας σταθεροποιείται ακόμα κι αν αυτός που την κρατά ανεβοκατεβαίνει, αριστερά και δεξιά, μπροστά και πίσω. Αυτό είναι αυτό που αναφέρουμε ως σταθεροποίηση του χτυπήματος, του βήματος και του ρολού.

Βήμα 1: Λίστα εξαρτημάτων

Η λίστα των συστατικών είναι:

1) Arduino Uno

2) Μπαταρία 8V, 1,5 Amp για τροφοδοσία Arduino Uno

3) 7805 Ρυθμιστής τάσης Ic ή μπορείτε να χρησιμοποιήσετε μετατροπέα κάδου

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Jumper Wires

Άλλοι εξοπλισμοί:

1) Συγκολλητικό σίδερο

2) Όπλο κόλλας

3) Τρυπάνι

4) Δοχείο τροφίμων

Αντί να χρησιμοποιώ breadborad, έχω χρησιμοποιήσει μια μικρή κάρτα coustom perf για θετική και αρνητική σύνδεση διαύλου

Βήμα 2: Συναρμολόγηση

Συναρμολόγηση
Συναρμολόγηση
Συναρμολόγηση
Συναρμολόγηση

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

Πρώτα έφτιαξα ένα DIY βραχίονα σε σχήμα L για να τοποθετήσω σερβοκινητήρα με τη βοήθεια αφρού.

Βήμα 3:

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

Η συναρμολόγηση του gimbal ήταν αρκετά εύκολη. Ξεκίνησα με την εγκατάσταση του σερβο Yaw, του αισθητήρα MPU 6050 και του διακόπτη ON-OFF. Χρησιμοποιώντας μπουλόνια και παξιμάδια το στερέωσα στη βάση

Βήμα 4: Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο εξασφάλισα το σερβίρισμα ρολού. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos

Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο, εξασφάλισα το Roll Servo. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos
Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο, εξασφάλισα το Roll Servo. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos

Βήμα 5: Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο εξασφάλισα το σερβίρισμα ρολού. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos

Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο, εξασφάλισα το Roll Servo. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos
Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο, εξασφάλισα το Roll Servo. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos

Βήμα 6: Συνδέσεις

Συνδέσεις
Συνδέσεις

Στο διάγραμμα κυκλώματος μπορείτε να χρησιμοποιήσετε είτε μετατροπέα buck είτε ρυθμιστή IC 7805 Voltage για να μετατρέψετε 8V σε 5 V. Ο μικροελεγκτής στον οποίο δίνεται το διάγραμμα κυκλώματος είναι Arduino Nano, μπορείτε επίσης να χρησιμοποιήσετε Arduino Uno, Arduino Mega.

Οι ακίδες SCL και SDA του MPU 6050 είναι συνδεδεμένες με Arduino Analog pin A5 και A4. (Οι ακίδες SCL και SDA μπορεί να διαφέρουν, οπότε ανατρέξτε στο φύλλο δεδομένων για τις ακίδες SCl και SDA για άλλους μικροελεγκτές)

Βήμα 7: Σύνδεση με IC ρυθμιστή τάσης 7805

Σύνδεση με IC ρυθμιστή τάσης 7805
Σύνδεση με IC ρυθμιστή τάσης 7805

Αυτό το διάγραμμα κυκλώματος είναι για τη σύνδεση του ρυθμιστή τάσης 7805, συνδέστε την μπαταρία 8v στο Vin και θα λάβετε τάση εξόδου 5v.

Βήμα 8: Κωδικοποίηση

Πρέπει να συμπεριλάβετε τις ακόλουθες βιβλιοθήκες:

1) #includeClick Heret για λήψη αρχείου zip

2) #includeΚάντε κλικ εδώ για λήψη αρχείου zip

Μετά τη λήψη του αρχείου zip, προσθέστε βιβλιοθήκη zip στο σκίτσο arduino

Για τον Κώδικα

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code βασισμένο στο παράδειγμα MPU6050_DMP6 από τη βιβλιοθήκη i2cdevlib του Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */// I2Cdev και MPU6050 πρέπει να εγκατασταθούν ως βιβλιοθήκες, αλλιώς το.cpp/.h αρχεία // και για τις δύο τάξεις πρέπει να βρίσκονται στη διαδρομή συμπερίληψης του έργου σας #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // δεν είναι απαραίτητο εάν χρησιμοποιείτε το αρχείο MotionApps / Απαιτείται βιβλιοθήκη Arduino Wire εάν η εφαρμογή I2Cdev I2CDEV_ARDUINO_WIRE // χρησιμοποιείται στο I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // class default I2C address is 0x68 // specific πέρασε ως παράμετρος εδώ // AD0 low = 0x68 (προεπιλογή για SparkFun breakout και InvenSense πίνακα αξιολόγησης) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- χρήση για AD0 high // Ορίστε τους 3 σερβοκινητήρες Servo servo0; Servo servo1; Servo servo2; επιπλέουν σωστά? int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // χρησιμοποιήστε την καρφίτσα 2 στο Arduino Uno & τους περισσότερους πίνακες bool blinkState = false; // MPU control/status vars bool dmpReady = false; // ορίστε true αν το DMP init ήταν επιτυχές uint8_t mpuIntStatus. // κατέχει πραγματικό byte κατάστασης διακοπής από MPU uint8_t devStatus. // επιστροφή κατάστασης μετά από κάθε λειτουργία συσκευής (0 = επιτυχία,! 0 = σφάλμα) uint16_t packetSize; // αναμενόμενο μέγεθος πακέτου DMP (προεπιλογή είναι 42 byte) uint16_t fifoCount; // αρίθμηση όλων των byte που υπάρχουν στο FIFO uint8_t fifoBuffer [64]; // Ρυθμιστικό αποθήκευσης FIFO // προσανατολισμός/κινήσεις vars Quaternion q; // [w, x, y, z] quaternion container VectorInt16 aa; // [x, y, z] μετρήσεις αισθητήρα accel VectorInt16 aaReal; // [x, y, z] μετρήσεις αισθητήρα accel χωρίς βαρύτητα VectorInt16 aaWorld; // [x, y, z] μετρήσεις αισθητήρα accel παγκόσμιου πλαισίου VectorFloat gravity; // [x, y, z] βαρύτητα διάνυσμα float euler [3]; // [psi, theta, phi] Euler angle container float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container και gravity vector // δομή πακέτου για την επίδειξη τσαγιού InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // =============================================== ================ // === ΡΟΥΤΙΝΑ ΑΝΙΧΝΕΥΣΗΣ ΔΙΑΚΟΠΗΣ === // ==================== =========================================== πτητικό bool mpuInterrupt = false // υποδεικνύει εάν ο πείρος διακοπής MPU έχει πάει πολύ void dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === ΑΡΧΙΚΗ ΡΥΘΜΙΣΗ === // ===================== ========================================== void setup () {// συμμετοχή στο δίαυλο I2C (η βιβλιοθήκη I2Cdev δεν το κάνει αυτόματα) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // ρολόι I2C 400kHz. Σχολιάστε αυτήν τη γραμμή εάν αντιμετωπίζετε δυσκολίες στη σύνταξη #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // αρχικοποίηση σειριακής επικοινωνίας // (115200 επιλέχθηκε επειδή απαιτείται για την έξοδο Teapot Demo, αλλά είναι // εξαρτάται από εσάς ανάλογα με το έργο σας) Serial.begin (38400); ενώ (! Σειριακό)? // περιμένετε την απαρίθμηση του Λεονάρντο, άλλοι συνεχίζουν αμέσως // αρχικοποιούν τη συσκευή //Serial.println(F("Έναρξη συσκευών I2C … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // προμηθεύστε τις δικές σας αντισταθμίσεις γύρου εδώ, κλιμακωμένες για ελάχιστη ευαισθησία mpu.setXGyroOffset (17). mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 εργοστασιακή προεπιλογή για το δοκιμαστικό μου τσιπ // βεβαιωθείτε ότι λειτούργησε (επιστρέφει 0 αν ναι) εάν (devStatus == 0) {// ενεργοποιήσετε το DMP, τώρα που είναι έτοιμο // Serial.println (F ("Enabling DMP… ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // ορίστε τη σημαία DMP Ready έτσι ώστε η κύρια λειτουργία βρόχου () να γνωρίζει ότι είναι εντάξει να τη χρησιμοποιήσετε //Serial.println(F("DMP έτοιμη! Αναμονή για την πρώτη διακοπή … ")) dmpReady = true; // λάβετε το αναμενόμενο μέγεθος πακέτου DMP για μεταγενέστερη σύγκριση packetSize = mpu.dmpGetFIFOPacketSize (); } else {// ERROR! // 1 = η αρχική φόρτωση μνήμης απέτυχε // 2 = Οι ενημερώσεις διαμόρφωσης DMP απέτυχαν // (αν πρόκειται να σπάσει, συνήθως ο κωδικός θα είναι 1) // Serial.print (F ("DMP Initialization failed (code")); //Serial.print(devStatus); //Serial.println (F (")")); } // Ορίστε τις ακίδες στις οποίες είναι συνδεδεμένοι οι 3 σερβοκινητήρες servo0.attach (10); servo1.attach (9); servo2.attach (8); } // ============================================== ================= // === ΚΕΝΤΡΙΚΟ ΠΡΟΓΡΑΜΜΑ LOOP === // =================== ============================================ void loop () { / / εάν ο προγραμματισμός απέτυχε, μην προσπαθήσετε να κάνετε τίποτα εάν (! dmpReady) επιστρέψει. // περιμένετε για διακοπή MPU ή επιπλέον πακέτα (α) διαθέσιμα ενώ (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// επαναφορά για να συνεχίσουμε καθαρά mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO overflow!"); // διαφορετικά, ελέγξτε για διακοπή έτοιμων δεδομένων DMP (αυτό πρέπει να συμβαίνει συχνά)} αλλιώς εάν (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// περιμένετε για το σωστό διαθέσιμο μήκος δεδομένων, θα πρέπει να είναι ΠΟΛΥ σύντομη αναμονή (διαθέσιμο / (αυτό μας επιτρέπει να διαβάζουμε αμέσως περισσότερα χωρίς να περιμένουμε διακοπή) fifoCount -= packetSize; // Λάβετε τιμές Yaw, Pitch and Roll.dmpGetYawPitchRoll (ypr, & q, & βαρύτητα); // Yaw, Pitch, Roll τιμές - Ακτίνια σε βαθμούς ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Παράλειψη 300 μετρήσεων (διαδικασία αυτο-βαθμονόμησης) εάν (j <= 300) {correct = ypr [0]; // Το Yaw ξεκινά σε τυχαία τιμή, έτσι σύλληψη της τελευταίας τιμής μετά από 300 αναγνώσεις j ++;} // Μετά από 300 αναγνώσεις αλλιώς {ypr [0] = ypr [0] - σωστό; // Ρυθμίστε το Yaw στο 0 deg - αφαιρέστε την τελευταία τυχαία τιμή Yaw από την τιμή της τρέχουσας τιμής για να κάνετε το Ναι 0 βαθμού εσ int servo1Value = χάρτης (ypr [1], -90, 90, 0, 180); int servo2Value = χάρτης (ypr [2], -90, 90, 180, 0); // Ελέγξτε τα servos σύμφωνα με τον προσανατολισμό MPU6050 servo0.write (servo0Value). servo1.write (servo1Value); servo2.write (servo2Value); } #τέλος εαν } }

Τέλος, χρησιμοποιώντας τη συνάρτηση εγγραφής, στέλνουμε αυτές τις τιμές στα servos ως σήματα ελέγχου. Φυσικά, μπορείτε να απενεργοποιήσετε το σερβο Yaw αν θέλετε απλώς σταθεροποίηση για τον άξονα Χ και Υ και να χρησιμοποιήσετε αυτήν την πλατφόρμα ως gimbal κάμερας

Βήμα 9: Όταν συνδέονται όλα τα εξαρτήματα, μοιάζει με αυτήν την εικόνα

Όταν όλα τα εξαρτήματα είναι συνδεδεμένα, μοιάζει παρόμοια με αυτήν την εικόνα
Όταν όλα τα εξαρτήματα είναι συνδεδεμένα, μοιάζει παρόμοια με αυτήν την εικόνα

Βήμα 10: Τώρα εισάγετε όλα τα υλικά βάσης μέσα στο δοχείο τροφίμων

Τώρα εισάγετε όλα τα βασικά στοιχεία μέσα στο δοχείο τροφίμων
Τώρα εισάγετε όλα τα βασικά στοιχεία μέσα στο δοχείο τροφίμων

Βήμα 11: Όταν όλα τα καλώδια και τα εξαρτήματα τοποθετηθούν μέσα σε ένα τρόφιμο, τότε μπορείτε να εφαρμόσετε κολλητικό όπλο στη βάση του αφρού

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

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

Παρακαλώ σημειώστε αυτό μακριά από καλό gimbal κάμερας. Οι κινήσεις δεν είναι ομαλές γιατί αυτά τα servos δεν προορίζονται για τέτοιο σκοπό. Οι γνήσιοι κάμερες πραγματικής κάμερας χρησιμοποιούν έναν ειδικό τύπο κινητήρα BLDC για ομαλές κινήσεις. Επομένως, σκεφτείτε αυτό το έργο μόνο για εκπαιδευτικούς σκοπούς.

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

Συνιστάται: