Πίνακας περιεχομένων:
- Βήμα 1: Λίστα εξαρτημάτων
- Βήμα 2: Συναρμολόγηση
- Βήμα 3:
- Βήμα 4: Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο εξασφάλισα το σερβίρισμα ρολού. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos
- Βήμα 5: Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο εξασφάλισα το σερβίρισμα ρολού. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο MG995 Servos
- Βήμα 6: Συνδέσεις
- Βήμα 7: Σύνδεση με IC ρυθμιστή τάσης 7805
- Βήμα 8: Κωδικοποίηση
- Βήμα 9: Όταν συνδέονται όλα τα εξαρτήματα, μοιάζει με αυτήν την εικόνα
- Βήμα 10: Τώρα εισάγετε όλα τα υλικά βάσης μέσα στο δοχείο τροφίμων
- Βήμα 11: Όταν όλα τα καλώδια και τα εξαρτήματα τοποθετηθούν μέσα σε ένα τρόφιμο, τότε μπορείτε να εφαρμόσετε κολλητικό όπλο στη βάση του αφρού
- Βήμα 12: Συμπέρασμα
Βίντεο: Gimbal Motion Control: 12 Βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:32
Γεια σε όλους, το όνομά μου είναι 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
Βήμα 5: Στη συνέχεια, χρησιμοποιώντας την ίδια μέθοδο εξασφάλισα το σερβίρισμα ρολού. τα ανταλλακτικά είναι ειδικά σχεδιασμένα για να ταιριάζουν εύκολα στο 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
Αυτό το διάγραμμα κυκλώματος είναι για τη σύνδεση του ρυθμιστή τάσης 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 για ομαλές κινήσεις. Επομένως, σκεφτείτε αυτό το έργο μόνο για εκπαιδευτικούς σκοπούς.
Αυτό θα ήταν όλο για αυτό το σεμινάριο, ελπίζω να το απολαύσατε και να μάθατε κάτι νέο. Μη διστάσετε να κάνετε οποιαδήποτε ερώτηση στην παρακάτω ενότητα σχολίων και μην ξεχάσετε να ελέγξετε τις συλλογές έργων
Συνιστάται:
Gimbal Stabilizer Project: 9 βήματα (με εικόνες)
Μάθετε πώς να φτιάχνετε ένα gimbal 2 αξόνων για την κάμερα δράσης σας Στη σημερινή κουλτούρα όλοι λατρεύουμε την εγγραφή βίντεο και την καταγραφή των στιγμών, ειδικά όταν είστε δημιουργός περιεχομένου όπως εγώ, σίγουρα έχετε αντιμετωπίσει το ζήτημα της τόσο τρανταχτό βίντεο
Πλατφόρμα γυροσκοπίου/ κάμερα Gimbal: 5 βήματα (με εικόνες)
Πλατφόρμα γυροσκοπίου/ κάμερα Gimbal: Αυτό το διδακτικό δημιουργήθηκε για να εκπληρώσει την απαίτηση έργου του Makecourse στο Πανεπιστήμιο της Νότιας Φλόριντα (www.makecourse.com)
Τρισδιάστατη εκτυπωμένη κάμερα Gimbal (Διαγωνισμός Tinkercad): 6 βήματα
3D Printed Camera Gimbal (Διαγωνισμός Tinkercad): Γεια σας, αυτό είναι ένα gimbal κάμερας που σχεδίασα στο Tinkercad. Το κύριο gimbal φτιάχτηκε από This Jar Handle και ένα gimbal / γυροσκόπιο πέντε δαχτυλιδιών το οποίο δεν φαίνεται να βρίσκω πια. Το σχέδιο Tinkercad μπορείτε να το βρείτε εδώ. Αυτό σχεδιάστηκε για να λειτουργήσει σε μια εξουσία
ITTT Rolando Ritzen - Motion Control Arcade Glove: 5 Βήματα
ITTT Rolando Ritzen - Motion Control Arcade Glove: Eans handschoen die je kan gebruiken als motion controller voor on -rail shooters. Το έργο τέχνης είναι αυτό που επιτρέπει τον έλεγχο της κίνησης, συμπεριλαμβανομένου του ελέγχου. (Je schiet door te " finger bangen ")
Slider Motion Control για Time Lapse Rail: 10 βήματα (με εικόνες)
Ρυθμιστικό ελέγχου κίνησης για ράγα Time Lapse: Αυτό το οδηγό εξηγεί πώς να κινηθείτε μια ράγα time lapse χρησιμοποιώντας ένα μοτέρ βηματισμού που οδηγείται από ένα Arduino. Θα επικεντρωθούμε κυρίως στον ελεγκτή κίνησης που κινεί το μοτέρ βηματισμού, υποθέτοντας ότι έχετε ήδη μια ράγα που θέλετε να οδηγήσετε. Για παράδειγμα, όταν δεν