- Επιλογή των τμημάτων για ρομπότ Self Balancing
- Τρισδιάστατη εκτύπωση και συναρμολόγηση του ρομποτικού μας Self Balancing
- Διάγραμμα κυκλώματος
- Κωδικός ρομπότ Self Balancing
- Εργασία του ρομπότ Arduino Self Balancing
Αφού εμπνεύστηκα από τους κινητήρες RYNO και άλλα αυτο-ισορροπημένα σκούτερ από την Segway, πάντα ήθελα να φτιάξω κάτι το δικό μου Arduino Segway Robot. Σκέφτηκα για λίγο, αποφάσισα να φτιάξω ένα ρομπότ Self Balancing χρησιμοποιώντας το Arduino. Με αυτόν τον τρόπο θα μπορούσα να κατανοήσω την υποκείμενη ιδέα πίσω από όλα αυτά τα σκούτερ και επίσης να μάθω πώς λειτουργεί ο αλγόριθμος PID.
Μόλις άρχισα να χτίζω, συνειδητοποίησα ότι αυτό το bot είναι λίγο δύσκολο να χτιστεί. Υπάρχουν τόσες πολλές επιλογές για να διαλέξετε και ως εκ τούτου οι σύγχυση ξεκινούν από τη σωστή μορφή επιλέγοντας τους κινητήρες και παραμένουν μέχρι να συντονιστούν οι τιμές PID. Και υπάρχουν τόσα πολλά πράγματα που πρέπει να λάβετε υπόψη, όπως τύπος μπαταρίας, θέση μπαταρίας, τιμόνι τροχού, τύπος οδηγού κινητήρα, διατήρηση του CoG (Κέντρο βάρους) και πολλά άλλα.
Αλλά επιτρέψτε μου να σας το σπάσω, μόλις το φτιάξετε θα συμφωνήσετε ότι δεν είναι τόσο δύσκολο όσο ακούγεται. Ας το παραδεχτούμε, σε αυτό το σεμινάριο θα τεκμηριώσω την εμπειρία μου στην κατασκευή του ρομποτικού αυτοεξισορρόπησης. Ίσως να είστε ένας απόλυτος αρχάριος που μόλις ξεκινάει ή μπορεί να έχει προσγειωθεί εδώ μετά από μια μακρά απογοήτευση του να μην πάρει το bot σας στη δουλειά. Αυτό το μέρος στοχεύει να είναι ο τελικός προορισμός σας. Ας ξεκινήσουμε λοιπόν……
Επιλογή των τμημάτων για ρομπότ Self Balancing
Πριν σας πω όλες τις επιλογές για την κατασκευή του bot επιτρέψτε μου να αναφέρω τα αντικείμενα που έχω χρησιμοποιήσει σε αυτό το αυτο-εξισορροπημένο πρόγραμμα ρομπότ
- Arduino UNO
- Κινητήρες DC με γρανάζια (κίτρινο χρώμα) - 2Nos
- Μονάδα οδηγού κινητήρα L298N
- MPU6050
- Ένα ζευγάρι τροχών
- Μπαταρία ιόντων λιθίου 7.4V
- Σύνδεση καλωδίων
- 3D τυπωμένο σώμα
Μπορείτε να συνδυάσετε και να επιλέξετε οποιοδήποτε από τα παραπάνω εξαρτήματα με βάση τη διαθεσιμότητα για να φτιάξετε το δικό σας ρολόι αυτο-εξισορρόπησης, απλώς βεβαιωθείτε ότι τα στοιχεία πληρούν τα ακόλουθα κριτήρια.
Ελεγκτής: Ο ελεγκτής που έχω χρησιμοποιήσει εδώ είναι το Arduino UNO, γιατί γιατί είναι απλά εύκολο στη χρήση. Μπορείτε επίσης να χρησιμοποιήσετε ένα Arduino Nano ή Arduino mini, αλλά θα σας συνιστούσα να παραμείνετε στο UNO, καθώς μπορούμε να το προγραμματίσουμε απευθείας χωρίς εξωτερικό υλικό.
Κινητήρες: Η καλύτερη επιλογή κινητήρα που μπορείτε να χρησιμοποιήσετε για ένα αυτο-εξισορροπημένο ρομπότ, χωρίς αμφιβολία θα είναι ο κινητήρας Stepper. Για να διατηρήσω τα πράγματα απλά, έχω χρησιμοποιήσει έναν κινητήρα DC. Ναι, δεν είναι υποχρεωτικό να έχεις ένα stepper. το bot λειτουργεί καλά με αυτούς τους φθηνούς, κοινώς διαθέσιμους κινητήρες DC κιτ χρώματος.
Πρόγραμμα οδήγησης κινητήρα: Εάν έχετε επιλέξει τους κινητήρες συνεχούς ρεύματος όπως ο δικός μου, τότε μπορείτε είτε να χρησιμοποιήσετε τη μονάδα οδήγησης L298N σαν εμένα, ή ακόμη και ένα L293D να λειτουργεί καλά. Μάθετε περισσότερα σχετικά με τον έλεγχο του κινητήρα DC χρησιμοποιώντας τα L293D και Arduino.
Τροχοί: Μην υποτιμάτε αυτά τα παιδιά. Είχα μια δύσκολη στιγμή να καταλάβω ότι το πρόβλημα ήταν με τους τροχούς μου. Έτσι, βεβαιωθείτε ότι οι τροχοί σας έχουν καλή πρόσφυση στο πάτωμα που χρησιμοποιείτε. Παρακολουθήστε προσεκτικά, η λαβή σας δεν πρέπει ποτέ να αφήνει τους τροχούς σας να γλιστρήσουν στο πάτωμα.
Επιταχυνσιόμετρο και γυροσκόπιο: Η καλύτερη επιλογή του επιταχυνσιόμετρου και του γυροσκοπίου για το bot σας θα είναι το MPU6050. Επομένως, μην επιχειρήσετε να δημιουργήσετε ένα με ένα κανονικό επιταχυνσιόμετρο όπως το ADXL345 ή κάτι τέτοιο, απλά δεν θα λειτουργήσει. Θα μάθετε γιατί στο τέλος αυτού του άρθρου. Μπορείτε επίσης να δείτε το ειδικό μας άρθρο σχετικά με τη χρήση του MPU6050 με το Arduino.
Μπαταρία: Χρειαζόμαστε μια μπαταρία όσο το δυνατόν πιο ελαφριά και η τάση λειτουργίας πρέπει να είναι μεγαλύτερη από 5V, ώστε να μπορούμε να τροφοδοτούμε άμεσα το Arduino μας χωρίς μονάδα ενίσχυσης. Έτσι, η ιδανική επιλογή θα είναι μια μπαταρία πολυμερούς λιθίου 7.4V. Εδώ, δεδομένου ότι είχα μια μπαταρία ιόντων λιθίου 7.4V άμεσα διαθέσιμη, το έχω χρησιμοποιήσει. Αλλά θυμηθείτε ότι ένα Li-po είναι πλεονεκτικό από το Li-ion.
Πλαίσιο: Ένα άλλο μέρος όπου δεν πρέπει να συμβιβαστείτε είναι με το σασί σας. Μπορείτε να χρησιμοποιήσετε χαρτόνι, ξύλο, πλαστικό οτιδήποτε είστε καλός. Αλλά, βεβαιωθείτε ότι το πλαίσιο είναι ανθεκτικό και δεν πρέπει να κουνηθεί όταν το bot προσπαθεί να ισορροπήσει. Έχω σχεδιάσει με δικό του σασί στο Solidworks συμπεράνοντας από τα άλλα bots και το 3D τυπώσαμε. Εάν έχετε εκτυπωτή, μπορείτε επίσης να εκτυπώσετε το σχέδιο, τα αρχεία σχεδίασης θα επισυναφθούν στην επικείμενη επικεφαλίδα.
Τρισδιάστατη εκτύπωση και συναρμολόγηση του ρομποτικού μας Self Balancing
Εάν έχετε αποφασίσει να εκτυπώσετε τρισδιάστατα το ίδιο πλαίσιο που χρησιμοποιώ για να δημιουργήσω το bot μου, τότε τα αρχεία STL μπορούν να ληφθούν από το thingiverse. Έχω προσθέσει επίσης τα αρχεία σχεδίασης μαζί του, ώστε να μπορείτε επίσης να τα τροποποιήσετε σύμφωνα με τις προτιμήσεις του προσωπικού σας.
Τα ανταλλακτικά δεν έχουν δομές προεξοχής, ώστε να μπορείτε εύκολα να τα εκτυπώσετε χωρίς υποστηρίγματα και μια πλήρωση 25% θα λειτουργήσει καλά. Τα σχέδια είναι αρκετά απλά και κάθε βασικός εκτυπωτής πρέπει να μπορεί να το χειρίζεται με ευκολία. Χρησιμοποίησα το λογισμικό Cura για να κόψω το μοντέλο και να εκτυπώσω χρησιμοποιώντας το Tevo Tarantula μου, η ρύθμιση φαίνεται παρακάτω.
Θα πρέπει να εκτυπώσετε το μέρος του αμαξώματος καθώς και τέσσερα μέρη στήριξης του κινητήρα. Η συναρμολόγηση είναι αρκετά ευθεία προς τα εμπρός. Χρησιμοποιήστε παξιμάδια και μπουλόνια 3 mm για να στερεώσετε τον κινητήρα και τις σανίδες στη θέση τους. Μετά τη συναρμολόγηση θα πρέπει να φαίνεται κάτι τέτοιο όπως φαίνεται στην παρακάτω εικόνα.
Η πραγματική σχεδίαση σχεδιάστηκε με τη μονάδα δίσκου L298N στο κάτω ράφι το Arduino και την μπαταρία πάνω του όπως φαίνεται παραπάνω. Εάν ακολουθείτε την ίδια σειρά μπορείτε να βιδώσετε απευθείας την πλακέτα μέσω των οπών που παρέχονται και να χρησιμοποιήσετε μια συρματόσχοινο για την μπαταρία Li-po. Αυτή η διάταξη πρέπει επίσης να λειτουργεί, εκτός από τους σούπερ απλούς τροχούς που έπρεπε να αλλάξω αργότερα.
Στο bot μου, έχω αλλάξει τη θέση της μπαταρίας και του Arduino UNO board για ευκολία προγραμματισμού και έπρεπε επίσης να παρουσιάσω έναν τελικό πίνακα για την ολοκλήρωση των συνδέσεων. Έτσι το bot μου δεν φαινόταν όπως σχεδίαζα στο αρχικό στάδιο. Αφού ολοκληρώσαμε τις δοκιμές προγραμματισμού καλωδίωσης και τα πάντα, το ρομπότ μου δύο τροχών μοιάζει τελικά με αυτό
Διάγραμμα κυκλώματος
Η πραγματοποίηση συνδέσεων για αυτό το ρομπότ Self Balancing με βάση το Arduino είναι πολύ απλή. Αυτό είναι ένα ρομπότ αυτοεξισορρόπησης που χρησιμοποιεί Arduino και MPU6050, οπότε έχουμε να συνδέσουμε το MPU6050 με το Arduino και να συνδέσουμε τους κινητήρες μέσω της μονάδας οδηγού Motor. Ολόκληρη η εγκατάσταση τροφοδοτείται από την μπαταρία ιόντων λιθίου 7,4V. Το διάγραμμα κυκλώματος για το ίδιο φαίνεται παρακάτω.
Η μονάδα οδήγησης Arduino και L298N Motor τροφοδοτείται απευθείας μέσω του πείρου Vin και του τερματικού 12V αντίστοιχα. Ο ενσωματωμένος ρυθμιστής στην πλακέτα Arduino θα μετατρέψει την είσοδο 7,4V σε 5V και το ATmega IC και MPU6050 θα τροφοδοτείται από αυτό. Οι κινητήρες DC μπορούν να λειτουργήσουν από τάση 5V έως 12V. Αλλά θα συνδέσουμε το θετικό καλώδιο 7,4V από την μπαταρία στον ακροδέκτη εισόδου 12V της μονάδας οδηγού κινητήρα. Αυτό θα κάνει τους κινητήρες να λειτουργούν με 7.4V. Ο παρακάτω πίνακας θα αναφέρει τον τρόπο με τον οποίο η μονάδα οδήγησης κινητήρα MPU6050 και L298N συνδέεται με το Arduino.
Καρφίτσα συστατικού |
Arduino Pin |
MPU6050 |
|
Vcc |
+ 5V |
Εδαφος |
Gnd |
SCL |
Α5 |
SDA |
Α4 |
ΙΝΤ |
Δ2 |
L298Ν |
|
ΣΕ 1 |
Δ6 |
ΙΝ2 |
Δ9 |
ΙΝ3 |
Δ10 |
IN4 |
Δ11 |
Το MPU6050 επικοινωνεί με τη διεπαφή Arduino μέσω I2C, οπότε χρησιμοποιούμε τους ακροδέκτες SPI A4 και A5 του Arduino. Οι κινητήρες DC συνδέονται στους ακροδέκτες PWM D6, D9 D10 και D11 αντίστοιχα. Πρέπει να τα συνδέσουμε με τους ακροδέκτες PWM επειδή θα ελέγχουμε την ταχύτητα του κινητήρα DC μεταβάλλοντας τον κύκλο λειτουργίας των σημάτων PWM. Εάν δεν είστε εξοικειωμένοι με αυτά τα δύο στοιχεία, συνιστάται να διαβάσετε το σεμινάριο οδηγού MPU6050 Interfacing και L298N Motor.
Κωδικός ρομπότ Self Balancing
Τώρα πρέπει να προγραμματίσουμε τον πίνακα Arduino UNO για να εξισορροπήσουμε το ρομπότ. Εδώ συμβαίνει όλη η μαγεία. η ιδέα πίσω από αυτό είναι απλή. Πρέπει να ελέγξουμε εάν το bot κλίνει προς τα εμπρός ή προς τα πίσω χρησιμοποιώντας το MPU6050 και στη συνέχεια αν κλίνει προς τα εμπρός πρέπει να περιστρέψουμε τους τροχούς προς τα εμπρός και αν κλίνει προς τα πίσω πρέπει να περιστρέψουμε τους τροχούς στην αντίστροφη κατεύθυνση.
Ταυτόχρονα, πρέπει επίσης να ελέγξουμε την ταχύτητα με την οποία περιστρέφονται οι τροχοί, εάν το bot είναι ελαφρώς αποπροσανατολισμένο από την κεντρική θέση, οι τροχοί περιστρέφονται αργά και η ταχύτητα αυξάνεται καθώς απομακρύνεται περισσότερο από την κεντρική θέση. Για να επιτύχουμε αυτήν τη λογική χρησιμοποιούμε τον αλγόριθμο PID, ο οποίος έχει την κεντρική θέση ως σημείο ρύθμισης και το επίπεδο αποπροσανατολισμού ως έξοδο.
Για να μάθουμε την τρέχουσα θέση του bot χρησιμοποιούμε το MPU6050, το οποίο είναι ένας συνδυασμός επιταχυνσιόμετρου 6 αξόνων και αισθητήρα γυροσκοπίου. Για να αποκτήσουμε μια αξιόπιστη τιμή θέσης από τον αισθητήρα πρέπει να χρησιμοποιήσουμε την τιμή τόσο του επιταχυνσιόμετρου όσο και του γυροσκοπίου, επειδή οι τιμές από το επιταχυνσιόμετρο έχουν προβλήματα θορύβου και οι τιμές από το γυροσκόπιο τείνουν να μετακινούνται με το χρόνο. Πρέπει λοιπόν να συνδυάσουμε και τα δύο και να πάρουμε την αξία του yaw pitch και roll του ρομπότ μας, από το οποίο θα χρησιμοποιήσουμε μόνο την αξία του yaw.
Ακούγεται λίγο κεφάλι να ξετυλίγεται σωστά; Αλλά μην ανησυχείτε, χάρη στην κοινότητα Arduino διαθέτουμε εύκολα βιβλιοθήκες που μπορούν να εκτελέσουν τον υπολογισμό PID και επίσης να πάρουν την αξία του yaw από το MPU6050. Η βιβλιοθήκη αναπτύχθηκε από το br3ttb και το jrowberg αντίστοιχα. Πριν προχωρήσετε, κατεβάστε τις βιβλιοθήκες τους από τον ακόλουθο σύνδεσμο και προσθέστε τις στον κατάλογο lib Arduino.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Τώρα, που έχουμε προσθέσει τις βιβλιοθήκες στο Arduino IDE μας. Ας ξεκινήσουμε τον προγραμματισμό για το ρομπότ Self Balancing. Όπως πάντα, ο πλήρης κωδικός για το ρομπότ εξισορρόπησης MPU6050 δίνεται στο τέλος αυτής της σελίδας, εδώ εξηγώ απλώς τα πιο σημαντικά αποσπάσματα του κώδικα. Όπως είπαμε νωρίτερα, ο κώδικας είναι χτισμένος πάνω από τον κώδικα παραδείγματος MPU6050, απλώς πρόκειται να βελτιστοποιήσουμε τον κώδικα για το σκοπό μας και να προσθέσουμε την PID και την τεχνική ελέγχου για το ρομπότ αυτο εξισορρόπησης.
Πρώτα συμπεριλαμβάνουμε τις βιβλιοθήκες που απαιτούνται για να λειτουργήσει αυτό το πρόγραμμα. Περιλαμβάνουν την ενσωματωμένη βιβλιοθήκη I2C, τη βιβλιοθήκη PID και τη βιβλιοθήκη MPU6050 που μόλις κατεβάσαμε.
# συμπερίληψη "I2Cdev.h" #include
Στη συνέχεια δηλώνουμε τις μεταβλητές που απαιτούνται για τη λήψη των δεδομένων από τον αισθητήρα MPU6050. Διαβάζουμε τόσο τις τιμές διανύσματος βαρύτητας όσο και τις τεταρτοταγείς τιμές και στη συνέχεια υπολογίζουμε την τιμή του yaw pitch και roll του bot. Το float array ypr θα έχει το τελικό αποτέλεσμα.
// Έλεγχος MPU / κατάσταση vars bool dmpReady = false; // Ορίστε αληθές εάν το DMP init ήταν επιτυχές uint8_t mpuIntStatus; // κατέχει πραγματικό byte κατάστασης διακοπής από το MPU uint8_t devStatus; // κατάσταση επιστροφής μετά από κάθε λειτουργία της συσκευής (0 = επιτυχία ,! 0 = σφάλμα) uint16_t packetSize; // αναμενόμενο μέγεθος πακέτου DMP (η προεπιλογή είναι 42 bytes) uint16_t fifoCount; // μέτρηση όλων των byte που βρίσκονται αυτήν τη στιγμή στο FIFO uint8_t fifoBuffer; // FIFO storage buffer // προσανατολισμός / κίνηση vars Quaternion q; // τεταρτημόριο δοχείο VectorFloat βαρύτητα; // βαρύτητα διάνυσμα float ypr; // δοχείο yaw / pitch / roll και διάνυσμα βαρύτητας
Στη συνέχεια έρχεται το πολύ σημαντικό τμήμα του κώδικα, και εδώ θα αφιερώσετε πολύ χρόνο στο συντονισμό για το σωστό σύνολο τιμών. Εάν το ρομπότ σας είναι κατασκευασμένο με πολύ καλό κέντρο βάρους και τα εξαρτήματα είναι συμμετρικά διατεταγμένα (το οποίο στις περισσότερες περιπτώσεις δεν είναι), τότε η τιμή του σημείου ρύθμισής σας θα είναι 180. Διαφορετικά, συνδέστε το bot σας στη σειριακή οθόνη Arduino και γείρετε μέχρι βρείτε μια καλή θέση εξισορρόπησης, διαβάστε την τιμή που εμφανίζεται στη σειριακή οθόνη και αυτή είναι η τιμή του σημείου ρύθμισης. Η τιμή των Kp, Kd και Ki πρέπει να συντονιστεί σύμφωνα με το bot σας. Κανένα δύο πανομοιότυπα bots δεν θα έχουν τις ίδιες τιμές Kp, Kd και Ki, ώστε να μην ξεφεύγει από αυτό. Παρακολουθήστε το βίντεο στο τέλος αυτής της σελίδας για να πάρετε μια ιδέα για τον τρόπο προσαρμογής αυτών των τιμών.
/ ********* Συντονίστε αυτές τις 4 τιμές για το BOT ********* / double setpoint = 176; // ορίστε την τιμή όταν το bot είναι κάθετο στο έδαφος χρησιμοποιώντας σειριακή οθόνη. // Διαβάστε την τεκμηρίωση του έργου στο circuitdigest.com για να μάθετε πώς να ορίζετε αυτές τις τιμές διπλά Kp = 21; // Ορίστε αυτό το πρώτο διπλό Kd = 0,8; // Ορίστε αυτό το δευτερεύον διπλό Ki = 140; // Τέλος ορίστε αυτό / ****** Ρύθμιση λήξης τιμών ********* /
Στην επόμενη γραμμή αρχικοποιούμε τον αλγόριθμο PID περνώντας τις μεταβλητές εισόδου input, output, set point, Kp, Ki και Kd. Από αυτά έχουμε ήδη ορίσει τις τιμές των σημείων ρύθμισης Kp, Ki και Kd στο παραπάνω απόσπασμα κώδικα. Η τιμή της εισόδου θα είναι η τρέχουσα τιμή του yaw που διαβάζεται από τον αισθητήρα MPU6050 και η τιμή της εξόδου θα είναι η τιμή που υπολογίζεται από τον αλγόριθμο PID. Έτσι, βασικά, ο αλγόριθμος PID θα μας δώσει μια τιμή εξόδου που θα πρέπει να χρησιμοποιηθεί για να διορθώσει την τιμή εισόδου να είναι κοντά στο καθορισμένο σημείο.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Μέσα στη λειτουργία κενής ρύθμισης αρχικοποιούμε το MPU6050 ρυθμίζοντας το DMP (Digital Motion Processor). Αυτό θα μας βοηθήσει να συνδυάσουμε τα δεδομένα του Επιταχυνσιόμετρου με τα δεδομένα Γυροσκοπίου και να προσφέρουμε μια αξιόπιστη τιμή Yaw, Pitch and Roll. Δεν θα πάμε πολύ βαθιά σε αυτό, καθώς θα είναι πολύ πέρα από το θέμα. Εν πάση περιπτώσει, ένα τμήμα κώδικα που πρέπει να αναζητήσετε στη λειτουργία ρύθμισης είναι οι τιμές μετατόπισης γύρου. Κάθε αισθητήρας MPU6050 έχει τις δικές του τιμές offset, μπορείτε να χρησιμοποιήσετε αυτό το σκίτσο Arduino για να υπολογίσετε την τιμή μετατόπισης του αισθητήρα σας και να ενημερώσετε ανάλογα τις ακόλουθες γραμμές στο πρόγραμμά σας.
// προμηθεύστε τα δικά σας γυροσκοπικά όφσετ εδώ, κλιμακωτά για ελάχιστη ευαισθησία mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Πρέπει επίσης να προετοιμάσουμε τους ψηφιακούς ακροδέκτες PWM που χρησιμοποιούμε για να συνδέσουμε τους κινητήρες μας. Στην περίπτωσή μας είναι D6, D9, D10 και D11. Έτσι, αρχικοποιούμε αυτές τις καρφίτσες καθώς οι ακίδες εξόδου τις καθιστούν ΧΑΜΗΛΕΣ από προεπιλογή.
// Αρχικοποιήστε το pinMode pin outpu Motor (6, OUTPUT). pinMode (9, ΕΞΟΔΟΣ); pinMode (10, ΕΞΟΔΟΣ); pinMode (11, ΕΞΟΔΟΣ); // Από προεπιλογή απενεργοποιήστε και τους δύο κινητήρες analogWrite (6, LOW). analogWrite (9, ΧΑΜΗΛΗ); analogWrite (10, ΧΑΜΗΛΗ); analogWrite (11, LOW);
Μέσα στη λειτουργία του κύριου βρόχου ελέγχουμε αν τα δεδομένα από το MPU6050 είναι έτοιμα για ανάγνωση. Εάν ναι, το χρησιμοποιούμε για να υπολογίσουμε την τιμή PID και στη συνέχεια να εμφανίσουμε την τιμή εισόδου και εξόδου του PID στη σειριακή οθόνη, για να ελέγξουμε μόνο πώς αποκρίνεται το PID. Στη συνέχεια, με βάση την τιμή της παραγωγής, αποφασίζουμε αν το bot πρέπει να κινηθεί προς τα εμπρός ή προς τα πίσω ή να σταματήσει.
Εφόσον υποθέτουμε ότι το MPU6050 θα επιστρέψει 180 όταν το bot είναι όρθιο. Θα λάβουμε θετικές τιμές διόρθωσης όταν το bot πέφτει προς τα εμπρός και θα έχουμε αρνητικές τιμές εάν το bot πέφτει προς τα πίσω. Επομένως, ελέγχουμε αυτήν την κατάσταση και καλούμε τις κατάλληλες λειτουργίες για να μετακινήσουμε το bot μπροστά ή πίσω.
ενώ (! mpuInterrupt && fifoCount <packetSize) { // χωρίς δεδομένα mpu - εκτέλεση υπολογισμών PID και έξοδος στους κινητήρες pid.Compute (); // Εκτυπώστε την τιμή εισόδου και εξόδου στη σειριακή οθόνη για να ελέγξετε πώς λειτουργεί. Serial.print (εισαγωγή); Serial.print ("=>"); Serial.println (έξοδος); if (input> 150 && input <200) {// Εάν το Bot πέφτει εάν (έξοδος> 0) // Πτώση προς τα εμπρός προς τα εμπρός (); // Περιστρέψτε τους τροχούς προς τα εμπρός εάν (έξοδος <0) // Πτώση προς τα πίσω Αντίστροφη (); // Περιστρέψτε τους τροχούς προς τα πίσω } αλλιώς // Εάν το Bot δεν πέφτει Stop (); // Κρατήστε τους τροχούς ακίνητους }
Η μεταβλητή εξόδου PID αποφασίζει επίσης πόσο γρήγορα πρέπει να περιστραφεί ο κινητήρας. Εάν το bot πρόκειται να πέσει, τότε κάνουμε μικρή διόρθωση περιστρέφοντας αργά τον τροχό. Εάν αυτές οι μικρές διορθώσεις δεν λειτουργούν και ακόμα εάν το bot πέσει κάτω αυξάνουμε την ταχύτητα του κινητήρα. Η τιμή της ταχύτητας περιστροφής των τροχών θα αποφασιστεί από τον αλγόριθμο PI. Σημειώστε ότι για τη συνάρτηση Reverse έχουμε πολλαπλασιάσει την τιμή της εξόδου με -1, ώστε να μπορούμε να μετατρέψουμε την αρνητική τιμή σε θετική.
void Forward () // Κωδικός για περιστροφή του τροχού προς τα εμπρός { analogWrite (6, έξοδος); analogWrite (9,0); analogWrite (10, έξοδος); analogWrite (11,0); Serial.print ("F"); // Πληροφορίες εντοπισμού σφαλμάτων } void Reverse () // Κωδικός για περιστροφή του τροχού προς τα πίσω { analogWrite (6,0); analogWrite (9, έξοδος * -1); analogWrite (10,0); analogWrite (11, έξοδος * -1); Serial.print ("R"); } void Stop () // Κωδικός για να σταματήσετε και τους δύο τροχούς { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Εργασία του ρομπότ Arduino Self Balancing
Μόλις είστε έτοιμοι με το υλικό, μπορείτε να ανεβάσετε τον κωδικό στην πλακέτα Arduino. Βεβαιωθείτε ότι οι συνδέσεις είναι σωστές, δεδομένου ότι χρησιμοποιούμε μπαταρία ιόντων λιθίου, απαιτείται μεγάλη προσοχή. Ελέγξτε λοιπόν για βραχυκυκλώματα και βεβαιωθείτε ότι οι ακροδέκτες δεν θα έρθουν σε επαφή ακόμη και αν το bot σας εμφανίσει μικρές κρούσεις. Ενεργοποιήστε τη μονάδα σας και ανοίξτε τη σειριακή οθόνη σας, εάν το Arduino σας μπορούσε να επικοινωνήσει με το MPU6050 με επιτυχία και εάν όλα λειτουργούν όπως αναμένεται, θα πρέπει να δείτε την ακόλουθη οθόνη.
Εδώ βλέπουμε τις τιμές εισόδου και εξόδου του αλγορίθμου PID στη μορφή input => output . Εάν το bot είναι τέλεια ισορροπία, η τιμή της παραγωγής θα είναι 0. Η τιμή εισόδου είναι η τρέχουσα τιμή από τον αισθητήρα MPU6050. Το αλφάβητο "F" αντιπροσωπεύει ότι το bot κινείται προς τα εμπρός και το "R" αντιπροσωπεύει ότι το bot αντιστρέφεται.
Κατά τη διάρκεια των αρχικών σταδίων του PID, προτείνω να αφήσετε το καλώδιο Arduino συνδεδεμένο στο bot, ώστε να μπορείτε να παρακολουθείτε εύκολα τις τιμές εισόδου και εξόδου και επίσης θα είναι εύκολο να διορθώσετε και να ανεβάσετε το πρόγραμμά σας για τιμές Kp, Ki και Kd. Το παρακάτω βίντεο δείχνει την πλήρη λειτουργία του bot και δείχνει επίσης πώς να διορθώσετε τις τιμές PID σας.
Ελπίζω ότι αυτό θα σας βοηθήσει να δημιουργήσετε το δικό σας ρομπότ αυτοεξισορρόπησης εάν έχετε κάποιο πρόβλημα να το κάνετε στη δουλειά, και αφήστε τις ερωτήσεις σας στην παρακάτω ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ για περισσότερες τεχνικές ερωτήσεις. Αν θέλετε περισσότερη διασκέδαση, μπορείτε επίσης να χρησιμοποιήσετε την ίδια λογική για να δημιουργήσετε ένα ρομπότ εξισορρόπησης μπάλας.