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

Pan-Tilt Multi Servo Control: 11 βήματα (με εικόνες)
Pan-Tilt Multi Servo Control: 11 βήματα (με εικόνες)

Βίντεο: Pan-Tilt Multi Servo Control: 11 βήματα (με εικόνες)

Βίντεο: Pan-Tilt Multi Servo Control: 11 βήματα (με εικόνες)
Βίντεο: 1. Ξεκινώντας με QLC +. Εργαλεία και λειτουργίες 2024, Ιούλιος
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Σε αυτό το σεμινάριο, θα διερευνήσουμε τον τρόπο ελέγχου πολλών servos χρησιμοποιώντας Python σε Raspberry Pi. Ο στόχος μας θα είναι ένας μηχανισμός PAN/TILT για να τοποθετήσουμε μια κάμερα (ένα PiCam).

Εδώ μπορείτε να δείτε πώς θα λειτουργήσει το τελικό μας έργο:

Δοκιμή βρόχου ελέγχου Servo Control:

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

Βήμα 1: BoM - Bill of Material

Κύρια μέρη:

  1. Raspberry Pi V3 - 32,00 $
  2. Μονάδα βίντεο 5 Megapixels 1080p Sensor OV5647 Mini Camera - 13,00 $
  3. TowerPro SG90 9G 180 μοίρες Micro Servo (2 Χ)- 4,00 δολάρια ΗΠΑ
  4. Mini Pan/ Tilt Camera Platform Anti -Vibration Camera Mount w/ 2 Servos (*) - US $ 8,00
  5. Αντίσταση 1K ohm (2X) - Προαιρετικό
  6. Διάφορα: μεταλλικά μέρη, μπάντες κλπ (σε περίπτωση που θα κατασκευάσετε τον μηχανισμό Pan/Tilt σας)

(*) μπορείτε να αγοράσετε μια πλήρη πλατφόρμα Pan/Tilt με τα servos ή να δημιουργήσετε τη δική σας.

Βήμα 2: Πώς λειτουργεί το PWM

Το Raspberry Pi δεν έχει αναλογική έξοδο, αλλά μπορούμε να το προσομοιώσουμε, χρησιμοποιώντας μια προσέγγιση PWM (Pulse Width Modulation). Αυτό που θα κάνουμε είναι να δημιουργήσουμε ένα ψηφιακό σήμα με σταθερή συχνότητα, όπου θα αλλάξουμε το πλάτος της αμαξοστοιχίας παλμών, αυτό που θα "μεταφραστεί" ως ένα "μέσο" επίπεδο τάσης εξόδου όπως φαίνεται παρακάτω:

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

Μπορούμε να χρησιμοποιήσουμε αυτό το "μέσο" επίπεδο τάσης για να ελέγξουμε μια φωτεινότητα LED, για παράδειγμα:

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

Σημειώστε ότι αυτό που έχει σημασία εδώ δεν είναι η ίδια η συχνότητα, αλλά ο "Κύκλος Καθήκοντος", δηλαδή η σχέση μεταξύ του χρόνου που οι παλμοί είναι "υψηλοί" διαιρούμενοι με την περίοδο κύματος. Για παράδειγμα, ας υποθέσουμε ότι θα δημιουργήσουμε συχνότητα παλμών 50Hz σε ένα από τα Raspberry Pi GPIO. Η περίοδος (p) θα είναι η αντίστροφη συχνότητα ή 20ms (1/f). Εάν θέλουμε το LED μας με ένα "μισό" φωτεινό, πρέπει να έχουμε έναν κύκλο λειτουργίας 50%, αυτό σημαίνει έναν "παλμό" που θα είναι "Υψηλός" για 10ms.

Αυτή η αρχή θα είναι πολύ σημαντική για εμάς, να ελέγξουμε τη θέση σερβο, αφού ο "Κύκλος Καθήκοντος" καθορίσει τη θέση σερβο όπως φαίνεται παρακάτω:

Servo

Βήμα 3: Εγκατάσταση του Hw

Εγκατάσταση του Hw
Εγκατάσταση του Hw
Εγκατάσταση του Hw
Εγκατάσταση του Hw

Τα servos θα συνδεθούν με εξωτερική τροφοδοσία 5V, έχοντας το pin των δεδομένων τους (στην περίπτωσή μου, την κίτρινη καλωδίωσή τους) συνδεδεμένο με το Raspberry Pi GPIO όπως παρακάτω:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pan Servo

Μην ξεχάσετε να συνδέσετε τα GND μαζί ==> Raspberry Pi - Servos - Εξωτερικό τροφοδοτικό)

Μπορείτε να έχετε ως επιλογή, μια αντίσταση 1K ohm μεταξύ του Raspberry Pi GPIO και του πείρου εισαγωγής δεδομένων διακομιστή. Αυτό θα προστατεύσει το RPi σας σε περίπτωση προβλήματος σερβο.

Βήμα 4: Βαθμονόμηση Servos

Βαθμονόμηση Servos
Βαθμονόμηση Servos
Βαθμονόμηση Servos
Βαθμονόμηση Servos
Βαθμονόμηση Servos
Βαθμονόμηση Servos

Το πρώτο πράγμα που πρέπει να κάνετε είναι να επιβεβαιώσετε τα κύρια χαρακτηριστικά των servos σας. Στην περίπτωσή μου, χρησιμοποιώ ένα Power Pro SG90.

Από το φύλλο δεδομένων του, μπορούμε να εξετάσουμε:

  • Εύρος: 180ο
  • Τροφοδοσία: 4.8V (εξωτερικό 5VDC ως τροφοδοτικό USB λειτουργεί μια χαρά)
  • Συχνότητα λειτουργίας: 50Hz (Περίοδος: 20 ms)
  • Πλάτος παλμού: από 1ms έως 2ms

Θεωρητικά, το σερβο θα είναι έτοιμο

  • Αρχική θέση (0 μοίρες) όταν εφαρμόζεται ένας παλμός 1ms στο τερματικό δεδομένων του
  • Ουδέτερη θέση (90 μοίρες) όταν εφαρμόζεται παλμός 1,5 ms στο τερματικό δεδομένων του
  • Τελική θέση (180 μοίρες) όταν εφαρμόζεται ένας παλμός 2 ms στο τερματικό δεδομένων του

Για να προγραμματίσετε μια θέση σερβο χρησιμοποιώντας Python θα είναι πολύ σημαντικό να γνωρίζετε τον αντίστοιχο "Κύκλο καθηκόντων" για τις παραπάνω θέσεις, ας κάνουμε έναν υπολογισμό:

  • Αρχική θέση ==> (0 μοίρες) Πλάτος παλμού ==> 1ms ==> Κύκλος εργασίας = 1ms/20ms ==> 2,0%
  • Ουδέτερη θέση (90 μοίρες) Πλάτος παλμού 1,5 ms ==> Κύκλος λειτουργίας = 1,5ms/20ms ==> 7,5%
  • Τελική θέση (180 μοίρες) Πλάτος παλμού 2 ms ==> Κύκλος λειτουργίας = 2ms/20ms ==> 10%

Επομένως, ο Κύκλος Καθήκοντος θα πρέπει να ποικίλει από 2 έως 10 %.

Ας δοκιμάσουμε τα servos ξεχωριστά. Για αυτό, ανοίξτε το τερματικό Raspberry και ξεκινήστε τον επεξεργαστή κελύφους Python 3 ως "sudo" (εξαιτίας αυτού θα πρέπει να είστε "υπερ -χρήστης" για χειρισμό με GPIO):

sudo python3

Στο Python Shell

>>

Εισαγάγετε τη μονάδα RPI. GPIO και ονομάστε την GPIO:

εισαγωγή RPi. GPIO ως GPIO

Καθορίστε ποια σχήματα αρίθμησης PIN θέλετε να χρησιμοποιήσετε (BCM ή BOARD). Έκανα αυτήν τη δοκιμή με το BOARD, οπότε οι καρφίτσες που χρησιμοποίησα ήταν οι φυσικές ακίδες (GPIO 17 = Pin 11 και GPIO 27 Pin 13). Wasταν εύκολο για μένα να τα αναγνωρίσω και να μην κάνω λάθη κατά τη διάρκεια της δοκιμής (Στο τελικό πρόγραμμα θα χρησιμοποιήσω το BCM). Επιλέξτε αυτό που προτιμάτε:

GPIO.setmode (GPIO. BOARD)

Ορίστε τον σερβο -πείρο που χρησιμοποιείτε:

tiltPin = 11

Εάν αντί αυτού, έχετε χρησιμοποιήσει το σχήμα BCM, οι τελευταίες 2 εντολές θα πρέπει να αντικατασταθούν από:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Τώρα, πρέπει να καθορίσουμε ότι αυτός ο πείρος θα είναι "έξοδος"

GPIO.setup (tiltPin, GPIO. OUT)

Και, ποια θα είναι η συχνότητα που δημιουργείται σε αυτόν τον πείρο, που για το σερβο μας θα είναι 50Hz:

κλίση = GPIO. PWM (tiltPin, 50)

Τώρα, ας αρχίσουμε να δημιουργούμε ένα σήμα PWM στην ακίδα με έναν αρχικό κύκλο λειτουργίας (θα το διατηρήσουμε "0"):

κλίση = εκκίνηση (0)

Τώρα, μπορείτε να εισαγάγετε διαφορετικές τιμές κύκλου λειτουργίας, παρατηρώντας την κίνηση του σερβο. Ας ξεκινήσουμε με το 2% και βλέπουμε τι συμβαίνει (βλέπουμε ότι το σερβο πηγαίνει σε "μηδενική θέση"):

κλίση. ChangeDutyCycle (2)

Στην περίπτωσή μου, το servo πήγε σε μηδενική θέση, αλλά όταν άλλαξα τον κύκλο λειτουργίας σε 3% παρατήρησα ότι το σερβο παρέμεινε στην ίδια θέση, αρχίζοντας να κινούμαι με κύκλους λειτουργίας μεγαλύτερους από 3%. Έτσι, το 3% είναι η αρχική μου θέση (ο βαθμοί). Το ίδιο συνέβη με το 10%, το σερβο μου πήγε πάνω από αυτήν την τιμή, φτάνοντας το τέλος του στο 13%. Έτσι, για το συγκεκριμένο σερβο, το αποτέλεσμα ήταν:

  • 0 βαθμός ==> κύκλος εργασίας 3%
  • 90 μοίρες ==> κύκλος εργασίας 8%
  • 180 μοίρες ==> κύκλος λειτουργίας 13%

Αφού ολοκληρώσετε τις δοκιμές σας, πρέπει να σταματήσετε το PWM και να καθαρίσετε τα GPIO:

κλίση = στάση ()

GPIO.cleanup ()

Η παραπάνω οθόνη εκτύπωσης τερματικού εμφανίζει το αποτέλεσμα και για τα δύο servos μου (που έχει παρόμοια αποτελέσματα). Το εύρος σας μπορεί να είναι διαφορετικό.

Βήμα 5: Δημιουργία σεναρίου Python

Δημιουργία σεναρίου Python
Δημιουργία σεναρίου Python

Οι εντολές PWM που πρέπει να σταλούν στο σερβο μας είναι σε "κύκλους λειτουργίας" όπως είδαμε στο τελευταίο βήμα. Συνήθως όμως, πρέπει να χρησιμοποιούμε τη "γωνία" σε μοίρες ως παράμετρο για τον έλεγχο ενός σερβο. Έτσι, πρέπει να μετατρέψουμε τη "γωνία" που είναι μια πιο φυσική μέτρηση σε εμάς στον κύκλο εργασίας, όπως είναι κατανοητή από το Pi μας.

Πως να το κάνεις? Πολύ απλό! Γνωρίζουμε ότι το εύρος κύκλου λειτουργίας κυμαίνεται από 3% έως 13% και αυτό ισοδυναμεί με γωνίες που θα κυμαίνονται από 0 έως 180 μοίρες. Επίσης, γνωρίζουμε ότι αυτές οι παραλλαγές είναι γραμμικές, οπότε μπορούμε να κατασκευάσουμε ένα αναλογικό σχήμα όπως φαίνεται παραπάνω. Έτσι, δεδομένης μιας γωνίας, μπορούμε να έχουμε έναν αντίστοιχο κύκλο εργασίας:

κύκλο εργασιών = γωνία/18 + 3

Κρατήστε αυτόν τον τύπο. Θα το χρησιμοποιήσουμε στον επόμενο κώδικα.

Ας δημιουργήσουμε ένα σενάριο Python για την εκτέλεση των δοκιμών. Βασικά, θα επαναλάβουμε αυτό που κάναμε πριν στο Python Shell:

από την ώρα εισαγωγή ύπνου

εισαγωγή RPi. GPIO ως GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, angle): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18 + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () if _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()

Ο πυρήνας του παραπάνω κώδικα είναι η συνάρτηση setServoAngle (σερβο, γωνία). Αυτή η συνάρτηση λαμβάνει ως ορίσματα, έναν αριθμό σερβο GPIO και μια τιμή γωνίας στο σημείο που πρέπει να τοποθετηθεί ο σερβο. Μόλις η είσοδος αυτής της συνάρτησης είναι "γωνία", πρέπει να τη μετατρέψουμε σε κύκλο λειτουργίας σε ποσοστό, χρησιμοποιώντας τον τύπο που αναπτύχθηκε προηγουμένως.

Όταν εκτελείται το σενάριο, πρέπει να εισαγάγετε ως παραμέτρους, servo GPIO και γωνία.

Για παράδειγμα:

sudo python3 angleServoCtrl.py 17 45

Η παραπάνω εντολή θα τοποθετήσει το σερβο που είναι συνδεδεμένο στο GPIO 17 με 45 μοίρες σε "ανύψωση". Μια παρόμοια εντολή θα μπορούσε να χρησιμοποιηθεί για τον έλεγχο Pan Servo (θέση σε 45 μοίρες σε "αζιμούθιο"):

sudo python angleServoCtrl.py 27 45

Μπορείτε να κατεβάσετε το αρχείο angleServoCtrl.py από το GitHub μου

Βήμα 6: Ο μηχανισμός Pan-Tilt

Ο μηχανισμός Pan-Tilt
Ο μηχανισμός Pan-Tilt

Το σερβο "Pan" θα μετακινήσει "οριζόντια" την κάμερά μας ("γωνία αζιμουθίου") και το σερβο "Tilt" θα το μετακινήσει "κάθετα" (γωνία ανύψωσης).

Η παρακάτω εικόνα δείχνει πώς λειτουργεί ο μηχανισμός Pan/Tilt:

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

Κατά τη διάρκεια της ανάπτυξής μας δεν θα φτάσουμε στα "άκρα" και θα χρησιμοποιήσουμε τον μηχανισμό μας Pan/Tilt από 30 έως 150 μοίρες μόνο. Αυτό το εύρος θα είναι αρκετό για χρήση με κάμερα.

Βήμα 7: Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή

Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή
Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή
Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή
Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή
Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή
Ο μηχανισμός Pan -Tilt - Μηχανική κατασκευή

Ας συναρμολογήσουμε τώρα τα 2 servos μας ως μηχανισμό Pan/Tilt. Μπορείτε να κάνετε 2 πράγματα εδώ. Αγοράστε έναν μηχανισμό πλατφόρμας Pan-Tilt όπως αυτός που φαίνεται στο τελευταίο βήμα ή φτιάξτε τον δικό σας σύμφωνα με τις ανάγκες σας.

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

Βήμα 8: Ηλεκτρική συναρμολόγηση ταψιού/κλίσης

Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt
Ηλεκτρική συναρμολόγηση Pan/Tilt

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

  1. Απενεργοποιήστε το Pi σας.
  2. Κάντε όλες τις ηλεκτρικές συνδέσεις.
  3. Ελέγξτε το ξανά.
  4. Ενεργοποιήστε πρώτα το Pi σας.
  5. Εάν όλα είναι εντάξει, τροφοδοτήστε τα servos σας.

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

Βήμα 9: Το σενάριο Python

Ας δημιουργήσουμε ένα Python Script για τον έλεγχο και των δύο servos ταυτόχρονα:

από τον χρόνο εισαγωγής ύπνου

εισαγωγή RPi. GPIO ως GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gray ==> PAN def setServoAngle (servo, angle): assert angle> = 30 and angle 90 (middle point) ==> 150 setServoAngle (κλίση, int (sys.argv [2])) # 30 ==> 90 (μεσαίο σημείο) ==> 150 GPIO.cleanup ()

Όταν εκτελείται το σενάριο, πρέπει να εισαγάγετε ως παραμέτρους, Γωνία περιστροφής και Γωνία κλίσης. Για παράδειγμα:

sudo python3 servoCtrl.py 45 120

Η παραπάνω εντολή θα τοποθετήσει τον μηχανισμό Pan/Tilt με 45 μοίρες σε "αζιμούθιο" (Pan angle) και 120 μοίρες "ανύψωσης" (Tilt Angle). Σημειώστε ότι εάν δεν εισαχθούν παράμετροι, η προεπιλογή θα είναι και οι δύο, γωνίες κλίσης και κλίσης που θα ρυθμιστούν έως και 90 μοίρες.

Παρακάτω μπορείτε να δείτε μερικές δοκιμές:

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

Μπορείτε να κατεβάσετε το αρχείο servoCtrl.py από το GitHub μου.

Βήμα 10: Δοκιμή βρόχου διακομιστών

Ας δημιουργήσουμε τώρα ένα Python Script για να δοκιμάσουμε αυτόματα όλο το φάσμα των servos:

από τον χρόνο εισαγωγής ύπνου

εισαγωγή RPi. GPIO ως GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gray ==> PAN def setServoAngle (σερβο, γωνία): επιβεβαιώστε τη γωνία> = 30 και τη γωνία <= 150 pwm = GPIO. PWM (σερβο, 50) pwm.start (8) dutyCycle = angle / 18. + 3 pwm. ChangeDutyCycle (dutyCycle) ύπνος (0.3) pwm.stop () αν _name_ == '_main_': για i σε εύρος (30, 160, 15): setServoAngle (τηγάνι, i) setServoAngle (κλίση, i) για i in εύρος (150, 30, -15): setServoAngle (τηγάνι, i) setServoAngle (κλίση, i) setServoAngle (τηγάνι, 100) setServoAngle (κλίση, 90) GPIO.cleanup ()

Το πρόγραμμα θα εκτελέσει αυτόματα ένα βρόχο από 30 έως 150 μοίρες και στις δύο γωνίες.

Κάτω από το αποτέλεσμα:

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

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

Μπορείτε να κατεβάσετε τον παραπάνω κωδικό, servoTest.py από το GitHub μου.

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

συμπέρασμα
συμπέρασμα

Όπως πάντα, ελπίζω ότι αυτό το έργο μπορεί να βοηθήσει άλλους να βρουν τον δρόμο τους στον συναρπαστικό κόσμο των ηλεκτρονικών!

Για λεπτομέρειες και τελικό κωδικό, επισκεφθείτε το αποθετήριο GitHub: RPi-Pan-Tilt-Servo-Control

Για περισσότερα έργα, επισκεφθείτε το ιστολόγιό μου: MJRoBot.org

Παρακάτω μια ματιά στο επόμενο σεμινάριό μου:

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

Saludos από τον νότο του κόσμου!

Τα λέμε στο επόμενο διδακτικό μου!

Σας ευχαριστώ, Μαρσέλο

Συνιστάται: