Τι είναι Servo


Servo είναι ένας γενικός όρος για ένα σύστημα ελέγχου κλειστού βρόχου.
Ένα σύστημα κλειστού βρόχου χρησιμοποιεί ένα σήμα ανάδρασης για να ρυθμίσει την ταχύτητα και την κατεύθυνση ενός κινητήρα και για να επιτύχει το επιθυμητό αποτέλεσμα, για παράδειγμα την τοποθέτηση του κινητήρα σε συγκεκριμένη θέση.
Στην αγορά υπάρχουν σερβοκινητήρες πολλών ειδών και μεγεθών, εδώ αναφερόμαστε σε αυτούς που χρησιμοποιούνται στο μοντελισμό και στην ρομποτική. Αυτοί οι σερβοκινητήρες λειτουργούν επίσης με την παραπάνω αρχή. Περιέχουν έναν μικρό κινητήρα DC συνδεδεμένο στον άξονα εξόδου μέσω των γραναζιών, ένα μηχανικό μειωτήρα δηλαδή, ώστε να εξασφαλίζει μεγάλη ροπή με λίγες στροφές στο σερβοκινητήρα. Ο άξονας εξόδου κινεί έναν βραχίονα που είναι συνδεδεμένος με ένα ποτενσιόμετρο (pot) το οποίο είναι τμήμα από το ηλεκτρονικό κύκλωμα ελέγχου (servo driver). Στο παρακάτω σχήμα φαίνεται το λειτουργικό διάγραμμα ενός σερβοκινητήρα.

 

Σχηματικό διάγραμμα σερβοκινητήρα


 

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

 


 

Εσωτερικό σερβοκινητήρα


 


 Πώς λειτουργεί ο σερβοκινητήρας

Στο σχήμα διακρίνετε ένα σερβοκινητήρα. Αυτός συνδέεται με τρεις αγωγούς. Τη γείωση GND, την τάση 5V που είναι συνήθως 5 έως 7 βολτ, και το control που είναι το σήμα ελέγχου.

 


 

Σύνδεση σερβοκινητήρα


 

Μπορείτε να ελέγξετε τον σερβοκινητήρα στέλνοντας μια σειρά παλμών στη γραμμή ελέγχου. Ένας συμβατικός αναλογικός σερβοκινητήρας, όπως π.χ. ο MG995, αναμένει να λαμβάνει παλμό περίπου κάθε 20 χιλιοστά του δευτερολέπτου (δηλαδή το σήμα πρέπει να έχει συχνότητα 50Hz).

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


 

Οδήγηση σερβοκινητήρα


 


 Εφαρμογή


Ήρθε η στιγμή για να δούμε πως συνδέεται και πώς λειτουργεί ένας σερβοκινητήρας.
Θα χρειαστούν κάποια υλικά:


1. Ένα σερβοκινητήρας π.χ. MG995 

Σερβοκινητήρας MG995


 


 2. Μια πλακέτα Arduino UNO ή συμβατό

Arduino UNO


 3. Μια πλακέτα  Arduino UNO κενή επάνω στην οποία θα γίνει το κύκλωμα των συνδέσεων και στη συνέχεια θα κουμπώσει στην πλακέτα του Arduino.


 

 


 

Arduino Sield


 

 

 


4. Ένα τροφοδοτικό 5-7V DC για να τροφοδοτήσει το σερβοκινητήρα.
5. Ένα ποτενσιόμετρο 10Κ

Θα χρειαστούν επίσης κάποια εργαλεία (κολλητήρι κοφτάκι κλπ), μερικά μέτρα καλώδιο λεπτό και λίγη εμπειρία κατασκευών.
Για να προγραμματίσετε το σύστημα και να λειτουργήσει θα πρέπει να έχετε εγκατεστημένο το Ardouino IDE και μικρή εμπειρία μαζί του. Τόσο το υλικό όσο και το λογισμικό είναι OPEN, βλέπε
https://el.wikipedia.org/wiki/Υλισμικό_ανοικτής_πηγής
https://el.wikipedia.org/wiki/Λογισμικό_ανοικτού_κώδικα


 

 

Κατασκευή

Στην κενή πλακέτα Arduino UNO κατασκευάζω το κύκλωμα σύνδεσης των υλικών. Ένα παράδειγμα συνδεσμολογίας βλέπετε στο https://www.arduino.cc/en/Tutorial/Knob στο οποίο έχω κάνει τις απαραίτητες τροποποιήσεις.
Στη φωτογραφία που ακολουθεί βλέπετε τελειωμένη την κατασκευή. Εδώ χρησιμοποιώ δύο σερβοκινητήρες και δύο ποτενσιόμετρα, γιατί η κατασκευή έχει και μελλοντική χρήση. Οι σερβοκινητήρες είναι τοποθετημένοι έτσι ώστε οι κινήσεις να γίνονται σε δύο κάθετα μεταξύ τους επίπεδα. Αυτή τη λεπτομέρεια θα την χρησιμοποιήσουμε σε επόμενη κατασκευή μας.

Στο τέλος του άρθρου σας έχω ένα βίντεο όπου βλέπετε την κατασκευή σε λειτουργία.

 

Η κατασκευή


Το κάθε ποτενσιόμετρο έχει τρία pin. Τα δύο ακραία συνδέονται στη γείωση GND και στα 5V αντίστοιχα. Ανάλογα με τη θέση περιστροφής του ποτενσιόμετρου το μεσαίο θα έχει δυναμικό μεταξύ 0 και 5V. Το μεσαίο pin του ποτενσιόμετρου συνδέεται στην αναλογική είσοδο Α0 του Arduino. Οι τιμές που θα διαβάζει το πρόγραμμα για την είσοδο Α0 θα είναι μεταξύ 0 και 1023.
Ο σερβοκινητήρας χρειάζεται συνήθως περισσότερο ρεύμα από αυτό μπορεί να δώσει η τροφοδοσία του Arduino από μια USB θύρα. Για το λόγο αυτό χρησιμοποιούμε το πρόσθετο τροφοδοτικό. Η γείωση αυτού του τροφοδοτικού θα συνδεθεί με το GND του Arduino. Καλό θα είναι μεταξύ της γείωσης και του θετικού του τροφοδοτικού να συνδεθεί ένας πυκνωτής 1000μF, που θα εξασφαλίζει τη μεγάλη απαίτηση σε ρεύμα κατά την εκκίνηση του κινητήρα.
Οι σερβοκινητήρες έχουν τρία καλώδια: ρεύμα, γείωση και σήμα. Το καλώδιο τροφοδοσίας είναι συνήθως κόκκινο και θα πρέπει να συνδεθεί στο 5-7V του τροφοδοτικού. Το καλώδιο γείωσης είναι συνήθως μαύρο ή καφέ και θα πρέπει να συνδεθεί σε μια ακίδα γείωσης στην πλακέτα Arduino. Η ακίδα σήματος είναι συνήθως κίτρινη, πορτοκαλί ή λευκή και θα πρέπει να συνδεθεί με μια ψηφιακή ακίδα στην πλακέτα Arduino. Στη δική μας κατασκευή θα συνδεθεί στο ψηφιακό pin 4.

 

Προγραμματισμός


Το πρόγραμμα που σας παρουσιάζω κινεί δύο σερβοκινητήρες με τη χρήση δύο ποτενσιόμετρων όπως δείχνει και το video. Η κατασκευή έγινε με δύο μηχανισμούς σερβοκινητήρων γιατί θα χρησιμοποιηθεί και σε επόμενο πείραμα.
Το Arduino UNO δίνει τη δυνατότητα για παραγωγή PWM σήματος στα pin 3,5,6,9,10 και 11. Εμείς χρησιμοποιούμε τη βιβλιοθήκη Servo.h για να απλοποιήσουμε τον προγραμματισμό για την παραγωγή του PWM σήματος, επίσης με τον τρόπο που χειρίζεται αυτή η βιβλιοθήκη την παραγωγή PWM σήματος μπορούμε χρησιμοποιήσουμε όλα τα ψηφιακά pin για την δημιουργία PWM σήματος.

/*

έλεγχος της θέσης δύο σερβοκινητήρων με τη χρήση δύο μεταβλητών αντιστάσεων – ποτενσιομέτρων

Μανώλης Αριστοβουλίδης 10/2021

*/

 

#include <Servo.h>

 

Servo servo1; // δημιουργία ενός servo object για τον έλεγχο του servo

Servo servo2;

 

int potpin1 = A0; // αναλογικό pin για τη σύνδεση ποτενσιομέτρου

int potpin2 = A1; // αναλογικό pin για τη σύνδεση ποτενσιομέτρου

int val1; // μεταβλητή για την ανάγνωση της τιμής του αναλογικό pin

int val2; // μεταβλητή για την ανάγνωση της τιμής του αναλογικό pin

 

void setup() {

servo1.attach(4); // κάνει προσάρτηση του servo στο pin 4 του servo object

servo2.attach(5); //κάνει προσάρτηση του servo στο pin 5 του servo object

 

Serial.begin(9600); //αρχικοποιεί τη σειριακή επικοινωνία

}

 

void loop() {

val1 = analogRead(potpin1); // διαβάζει την αναλογική τιμή (τιμές μεταξύ 0 και 1023)

val2 = analogRead(potpin2); // διαβάζει την αναλογική τιμή (τιμές μεταξύ 0 και 1023)

val1 = map(val1, 0, 1023, 0, 180); // μεταροπή σε κλίμακα για το servo (τιμές μεταξύ 0 και 180)

val2 = map(val2, 0, 1023, 0, 180); // μεταροπή σε κλίμακα για το servo (τιμές μεταξύ 0 και 180)

servo1.write(val1); // ρυθμίζει τη θέση του servo στην τιμή της κλίμακας

servo2.write(val2); // ρυθμίζει τη θέση του servo στην τιμή της κλίμακας

 

Serial.print("val1 : ");

Serial.print(val1);

Serial.print(" - val2 : ");

Serial.println(val2);

 

delay(20); // περιμένει για την ολοκλήρωση της κίνησης του servo

}

 

 

Τον κώδικα μπορείτε να τον κατεβάσετε από εδώ http://www.avlos.gr/index.php/el/lipsis/download/16-servo-knob

 

Στο video που ακολουθεί βλέπετε το μηχανισμό σε λειτουργία https://youtu.be/BCxv9VGqhQk