Προγραμματισμός και έλεγχος του Servo Motor SG90 με το Arduino UNO

Τι είναι το Servo Motor

Το servo motor είναι ένας απλός μηχανισμός με εσωτερικά γρανάζια που μπορεί να χρησιμοποιηθεί σε αρκετά Arduino Projects. Ο προγραμματισμός ενός servo γίνεται χρησιμοποιώντας την γλώσσα Wiring και το Arduino IDE. Πάμε λοιπόν να δούμε τι είναι το servo motor, πώς μπορούμε να το προγραμματίσεις και να έχουμε τον έλεγχο του ώστε να χρησιμοποιηθεί μαζί με άλλα εξαρτήματα στα projects.

Δημιουργούμε ένα απλό project χρησιμοποιώντας ένα Arduino με το breadboard και ένα servo motor με κύριο στόχο να μάθουμε πώς μπορούμε να χειριστούμε το servo μέσω του προγραμματισμού.

Εφαρμογές Χρήσης

Ανεξάρτητα με το μέγεθος και το κόστος του Arduino Servo, ο έλεγχος (control) του μηχανισμού είναι ο ίδιος και είναι σχετικά εύκολος. Πριν αναλύσουμε το άρθρο, θα αναφέρουμε μερικές περιπτώσεις που μπορεί να χρησιμοποιηθεί αυτός ο απλός μηχανισμός και την λογική πίσω από αυτό.

Κίνηση σε Ρομποτικό Εξοπλισμό

Τα Ρομποτικά Χέρια (Robotic Arms) και Ρομποτικά Πόδια (Robotic Legs) που έχουν δημιουργηθεί μπορεί να μην χρησιμοποιούν πλαστικά servo motors, όπως αυτό που θα δείξουμε στην συνέχεια, αλλά η λογική πίσω από τον σχεδιασμό τους είναι η ίδια. Υπάρχει ο ελεγκτής (το arduino) και με κάποιο ηλεκτρικό σήμα, μεταφέρει στο μηχανισμό την πληροφορία που δεν είναι τίποτα άλλο παρά τις μοίρες που πρέπει να περιστραφεί ή τα cm που πρέπει να κινηθεί.

Το αεροπλάνο χρησιμοποιεί servo motors για να μετακινήσει με ακρίβεια ένα μέρος από τα πτερύγια του. Ένα radar χρησιμοποιεί servo motors για να περιστρέφεται.

Arduino Servo Motor Radar Project
Servo Control στο Rudder, Elevator των αεριπλάνων

Ρομποτική Αρπάγη (Robotic Gripper)

Η Ρομποτική Αρπάγη ή αλλιώς Robotic Gripper είναι ο μηχανισμός εκείνος που επιτρέπει σε ένα ρομποτικό σύστημα να πιάσει ή “γραπώσει” ένα αντικείμενο. Σίγουρα παίζει ρόλο το μέγεθος και το βάρος του αντικειμένου. Όταν το βάρος είναι τέτοιο που υπερβαίνει τις δυνατότητες των απλών servo μηχανισμών, χρησιμοποιούμε υδραυλικά και δουλεύουμε με αυτό που αποκαλείται “πίεση” αντί του “γραναζιού” από τα οποία είναι φτιαγμένα τα servo motors.

Απλός μηχανισμός ρομποτικού χεριού με αρπάγη
Μηχανισμός Ρομποτικής Αρπάγης
3D Printed Ρομποτικό Χέρι με Αρπάγη

Εάν το βρήκες ενδιαφέρον, μπορείς να αγοράσεις την δική σου ρομποτική αρπάγη από το Grobotronics.

Απαιτούμενος Εξοπλισμός

Παρακάτω παραθέτουμε μία λίστα με τον απαραίτητο εξοπλισμό που απαιτείται για αυτό το Project και συνδέσμους από Ελληνικό κατάστημα. Τον εξοπλισμό μπορείς επίσης να τον βρεις και μέσω e-shop, όπως το ebay.com, amazon.com, banggood.com. Ωστόσο, αν δεν προσέξεις, η ποιότητα μπορεί να μην είναι η ίδια και οι συνδέσεις σε κάποιες από τις πλακέτες μπορεί να είναι διαφορετικές καθώς πρόκειται για απομιμήσεις και όχι αυθεντικό εξοπλισμό. Επιπλέον, θέλοντας να σε ενθαρρύνουμε, μπορείς πάντα να έχεις την φιλοσοφία του think out of the box εφόσον και αν φυσικά γνωρίζεις τι κάνεις. Δεν είσαι σίγουρος; Επικοινώνησε μαζί μας ή σχολίασε παρακάτω.

  1. Arduino UNO Board και καλώδιο σύνδεσης με τον Η/Υ
  2. Breadboard
  3. Servo Motor Micro SG90 (2.2kg.cm Plastic Gears)
  4. Καλώδια σύνδεσης M – M

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

Η ομάδα του FutureGeneration

Κέρδισε Προσφορές & Εκπτωτικό Κουπόνι

Το FutureGeneration συνεργάζεται με καταστήματα εντός και εκτός Ελλάδας, προσφέροντας σας έκπτωση με προσφορές στον παραπάνω και όχι μόνο εξοπλισμό!

Ανάλυση του Project

Σίγουρα ένα servo motor έχει μεγάλο νόημα να χρησιμοποιηθεί σε κάποιο πιο ολοκληρωμένο Project, όπως ένα Ρομποτικό χέρι. Ωστόσο, για χάρη της απλότητας, σε αυτό το άρθρο θα δούμε τον βασικό μηχανισμό για το πώς μπορεί κάποιος να χειριστεί και να χρησιμοποιήσει το servo.

Ο στόχος του Project είναι να συνδέσουμε το Servo Motor με το Arduino διαμέσου της breadboard (αν και αυτό δεν είναι απαραίτητο) και με απλό κώδικα που θα αναλύσουμε αργότερα να καταφέρουμε να κάνουμε κάποιες κινήσεις στο servo.

Παρακάτω μπορείς να δεις το Servo Motor που θα χρησιμοποιήσουμε. Συνήθως έρχεται μαζί με κάποια πλαστικά γρανάζια που μπορούν να συνδεθούν στο πάνω μέρος του servo και να βιδωθούν ώστε να σταθεροποιηθούν εκεί.

Servo Motor SG90
Connection Diagram για το Servo Motor SG90

Συνδεσμολογία (Connection Diagram & Wiring)

Πριν περάσουμε στον προγραμματισμό του arduino και κάνουμε upload το arduino code, όπως θα δεις στην συνέχεια, θα πρέπει να κάνουμε τις απαραίτητες συνδέσεις σύμφωνα με τα παρακάτω διαγράμματα σύνδεσης (connection diagrams).

Το Servo Motor έχει 3 καλώδια σύνδεσης με το Arduino:

  • το καλώδιο γείωσης (ground wire) το οποίο συνήθως είναι μαύρο (black) ή καφέ (brown)
  • το καλώδιο τροφοδοσίας (power wire) το οποίο συνήθως είναι κόκκινο (red) και χρησιμοποιεί τάση περίπου στα 5V
  • το καλώδιο PWM σήματος (PWM wire) το οποίο συνήθως είναι κίτρινο (yellow) ή πορτοκαλί (orange) ή άσπρο (white)

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

Τα καλώδια Male to Male (M – M) θα τα χρησιμοποιήσουμε για να συνδέσουμε τις θηλυκές υποδοχές του servo motor με το breadboard καθώς και το breadboard με το Arduino, όπως αυτό φαίνεται στο παρακάτω διάγραμμα.

.

Διάγραμμα σύνδεσης του Arduino με Breadboard και με Servo Motor (connection diagram)

Εκτελώντας την παραπάνω συνδεσμολογία θα πρέπει το αποτέλεσμα να μοιάζει όπως το παρακάτω.

Σύνδεση Arduino με Breadboard και Servo Motor

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

Αρχικά, πρέπει να συνδέσουμε το πρόγραμμα μας με την βιβλιοθήκη Servo

#include <Servo.h>

Ορίζουμε σε πιο ψηφιακό Pin είναι συνδεδεμένο το Servo μας. Θυμήσου πως αναφερόμαστε στο καλώδιο του σήματος (PWM wire) που συνήθως είναι κίτρινο (yellow) ή πορτοκαλί (orange) ή άσπρο (white). Στο παράδειγμα μας το έχουμε συνδέσει στο ψηφιακό Pin 9. Επιπλέον, η μεταβλητή servo χρησιμοποιείται για να μπορέσουμε να δώσουμε στο servo μοίρες και αυτό να κινηθεί, όπως θα δούμε και παρακάτω. Τέλος, η μεταβλητή angle χρησιμοποιείται και αναπαριστά τις μοίρες που θέλουμε να γυρίσει το servo (αρχικά είναι 0 μοίρες).

int servoPin = 9;
Servo servo;
int angle = 0;

Η setup συνάρτηση θα εκτελεστεί μία και μόνο φορά, όταν δηλαδή το Arduino μας συνδεθεί στην τροφοδοσία. Το μόνο που χρειάζεται να κάνουμε είναι να συνδέσουμε το pin 9 που ορίσαμε παραπάνω με την μεταβλητή servo, όπως και αυτή ορίστηκε παραπάνω. Έτσι, όταν στην συνέχεια αναφερόμαστε στην μεταβλητή servo, ξέρουμε ότι αναφερόμαστε στο pin 9, δηλαδή στο servo μηχανισμό μας.

void setup() {
   servo.attach(servoPin);
}

Τέλος, η loop συνάρτηση που εκτελείται συνέχεια κάνει δύο πράγματα. Το πρώτο for αρχίζει από 0 μέχρι 180 με μια παύση 15ms και σε κάθε βήμα το servo κινείται στις μοίρες, όπως αυτές είναι ορισμένες από την μεταβλητή angle. Πάμε να δούμε τις πρώτες 5 επαναλήψεις.

Περιστροφή από 0 σε 180 μοίρες
  • Επανάληψη 1: Η τιμή της angle είναι 0 και εκτελείται servo.write(0), άρα το servo δεν μετακινείται καθόλου. Παύση για 15ms.
  • Επανάληψη 2: Η τιμή της angle είναι 1 και εκτελείται servo.write(1), άρα το servo μετακινείται 1 μοίρα. Παύση για 15ms.
  • Επανάληψη 3: Η τιμή της angle είναι 2 και εκτελείται servo.write(2), άρα το servo μετακινείται 1 επιπλεον μοίρα (συνολικά 2). Παύση για 15ms.
  • Επανάληψη 4: Η τιμή της angle είναι 3 και εκτελείται servo.write(3), άρα το servo μετακινείται 1 επιπλεον μοίρα (συνολικά 3). Παύση για 15ms.
  • Επανάληψη 5: Η τιμή της angle είναι 4 και εκτελείται servo.write(4), άρα το servo μετακινείται 1 επιπλεον μοίρα (συνολικά 4). Παύση για 15ms.
  • Συνεχίζεται μέχρι η τιμή της angle να γίνει 179, γιατί η συνθήκη είναι angle < 180 και οχι angle <= 180.
Περιστροφή από 180 σε 0 μοίρες

Έχοντας φτάσει στο 179 γυρίζουμε προς τα πίσω στο 0 με την ίδια λογική. Οι πρώτες επαναλήψεις φαίνονται παρακάτω.

  • Επανάληψη 1: Η τιμή της angle είναι 179 και εκτελείται servo.write(179), άρα το servo μετακινείται 1 μοίρα προς την αντίστροφη κατεύθυνση τώρα. Παύση για 15ms.
  • Επανάληψη 2: Η τιμή της angle είναι 178 και εκτελείται servo.write(178), άρα το servo μετακινείται 1 επιπλέον μοίρα προς την αντίστροφη κατεύθυνση τώρα (συνολικά 2 μοίρες). Παύση για 15ms.
  • Επανάληψη 3: Η τιμή της angle είναι 177 και εκτελείται servo.write(177), άρα το servo μετακινείται 1 επιπλέον μοίρα προς την αντίστροφη κατεύθυνση τώρα (συνολικά 2 μοίρες). Παύση για 15ms.
  • Επανάληψη 4: Η τιμή της angle είναι 176 και εκτελείται servo.write(176), άρα το servo μετακινείται 1 επιπλέον μοίρα προς την αντίστροφη κατεύθυνση τώρα (συνολικά 2 μοίρες). Παύση για 15ms.
  • Επανάληψη 5: Η τιμή της angle είναι 175 και εκτελείται servo.write(175), άρα το servo μετακινείται 1 επιπλέον μοίρα προς την αντίστροφη κατεύθυνση τώρα (συνολικά 2 μοίρες). Παύση για 15ms.
  • Συνεχίζεται μέχρι η τιμή της angle να γίνει 1, γιατί η συνθήκη είναι angle > 0 και όχι angle >= 0.
void loop() {
    for(angle =0; angle < 180; angle++) {
        servo.write(angle);
        delay(15);
    }
    for(angle = 180; angle > 0; angle–) {
        servo.write(angle);
        delay(15);
    }
}

Παρακάτω μπορείς να βρεις ολόκληρο τον κώδικα.

/*****************************************************
* Simple sketch for Servo Motors
*
* Contact: help@futuregeneration.gr
* Author: FutureGeneration
*****************************************************/
 
#include <Servo.h>
 
int servoPin = 9;
Servo servo;
int angle = 0;

void setup() {
   servo.attach(servoPin);
}

void loop() {
    for(angle =0; angle < 180; angle++) {
        servo.write(angle);
        delay(15);
    }
    for(angle = 179; angle > 0; angle–) {
        servo.write(angle);
        delay(15);
    }
}

Περισσότερες πληροφορίες για την βιβλιοθήκη Sweep μπορείς να βρεις στην επίσημη ιστοσελίδα του Arduino.

Συχνά Προβλήματα

Το servo motor μπορεί να είναι ασταθές όταν το Arduino έχει συνδεθεί σε εξωτερική τροφοδοσία ή κάποιες συγκεκριμένες USB θύρες. Αυτό συμβαίνει γιατί το servo κυρίως όταν ξεκινά να κάνει κάποια κίνηση τραβάει αρκετό ρεύμα και αυτό έχει ως συνέπεια το Arduino να υπολειτουργεί.

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

Προσθήκη πυκνωτή για σταθεροποίηση της τάσης.

Εάν ο πυκνωτής έχει ασύμμετρες άκρες, η μεγαλύτερη άκρη είναι η ΘΕΤΙΚΗ (+) και η άλλη η ΑΡΝΗΤΙΚΗ (-). Η θετική άκρη πρέπει να συνδεθεί στα 5V.

Key Takeaways

  • Ο έλεγχος του servo (servo motor control) χρησιμοποιείται σε πάρα πολλές εφαρμογές στην ρομποτική, όπως στις αυτοβιομηχανίες.
  • Τα Servo Motor έχουν 3 καλώδια, την τροφοδοσία, την γείωση και το καλώδιο με το σήμα.
  • Δεν χρειάζονται κάποιον επιπλέον driver ή board για να τα ελέγξουμε. Μπορούμε να το κάνουμε κατευθείαν από το Arduino μας.

Υποβολή απάντησης