Εμφάνιση αποτελεσμάτων : 1 έως 5 από 5

Θέμα: arduino servo

  1. #1
    Μέλος
    Όνομα
    giorgosm3
    Εγγραφή
    Dec 2011
    Περιοχή
    kavala
    Μηνύματα
    32

    Προεπιλογή arduino servo

    καλήμερα θέλω να κάνω το σερβομοτερ να λειτουργεί όποτε θέλω εγώ με εντολή και στην εντολή for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
    delay(15); θέλω να δουλεύει για ένα λεπτό και μετά να πηγαίνει στη θέση for(pos = 0; pos < 400; pos += 1) // goes from 0 degrees to 180 degrees
    delay(15); τη βοήθεια σας ευχαριστώ
    ο κωδικός που έχω είναι
    #include <Servo.h>

    Servo myservo; // create servo object to control a servo
    // a maximum of eight servo objects can be created

    int pos = 0; // variable to store the servo position

    void setup()
    {
    myservo.attach(2); // attaches the servo on pin 9 to the servo object
    }


    void loop()
    {
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(15); // waits 15ms for the servo to reach the position
    {
    for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
    delay(15); // waits 15ms for the servo to reach the position
    }
    }

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Νίκος
    Εγγραφή
    Feb 2014
    Περιοχή
    Μοσχάτο
    Μηνύματα
    607

    Προεπιλογή

    Δεν κατάλαβα τίποτα.
    Ο κώδικας που παραθέτεις παρόλο που κάνει complile είναι κουκουρούκου, ...
    Θα πρότεινα να ασχοληθείς λίγο με την γλώσσα προγραμματισμού και την δομή της... Ορίζεις επανάληψη, αλλά δεν επαναλαμβάνεις τίποτα. Αλλάζεις μια μεταβλητή απο 0 εως 180 με βήμα το 1, αλλά τελικά χρησιμοποιείς 2 μόνο τιμές απο τις 180 που αλλάζεις... την 0 και την 181

    0 Not allowed! Not allowed!
    Mastroxalastis / Μαστροχαλαστής
    https://www.youtube.com/channel/UCOWjSR-OOc-ZBCT61EX_lJg

  3. #3
    Μέλος
    Όνομα
    giorgosm3
    Εγγραφή
    Dec 2011
    Περιοχή
    kavala
    Μηνύματα
    32

    Προεπιλογή

    Γι αυτό θέλω βοήθεια να καταλαβω

    0 Not allowed! Not allowed!

  4. #4
    Μέλος
    Όνομα
    Καλαρακης Μιχαλης
    Εγγραφή
    Jan 2011
    Περιοχή
    Ηρακλειο
    Μηνύματα
    2.043


    0 Not allowed! Not allowed!

  5. #5
    Μέλος Το avatar του χρήστη Fire Doger
    Όνομα
    Στέφανος
    Εγγραφή
    Jan 2015
    Περιοχή
    .
    Μηνύματα
    1.519

    Προεπιλογή

    Ας ξεκινήσουμε απ' τα βασικά.
    Το servo σου αν το ξεκοιλιάσεις θα βρεις ένα ολοκληρωμένο μέσα. Αυτό το ολοκληρωμένο παίρνει 1 σήμα και το μετατρέπει σε θέση στο μοτέρ, άρα δεν σε νοιάζει η θεωρία ελέγχου κίνησης αλλά τι εντολές θέλει το ολοκληρωμένο.
    Το ολοκληρωμένο έχει 1 πιν signal, σε αυτό εφαρμόζεις ένα PWM σταθερής συχνότητας (50Hz) μεταβλητού duty cycle. Το duty cycle το μεταφράζει σε θέση όπως φαίνεται στην εικόνα παρακάτω.

    Τώρα ας μιλήσουμε για τον μΕ, το arduino σου δίνει κάποια pin που τα βαφτίζει pwm, αυτά τα pin είναι συνδεδεμένα με Timers, οι timers δουλεύουν παράλληλα με την CPU, άρα η δυνατότητα που σου δίνουν είναι να βάλεις κάποιες ρυθμίσεις σε αυτούς και αυτοί να αλλάζουν κατάσταση στα PWM pin στα οποία είναι συνδεδεμένοι χωρίς να χρειάζεται να ξανακάνει κάτι η CPU. (Όπως γράφεις analogwrite και μετά κάνεις κάτι άλλο αλλά το pwm συνεχίζει).

    Μόλις γράψεις εσύ κάποια θέση τότε ξεκινάει το αντίστοιχο pwm και το ολοκληρωμένο μέσα στο servo ξεκινάει να πάει το μοτέρ σε αυτήν την θέση.
    Δεν υπάρχει κανένας περιορισμός στο ποια θέση ήσουν και σε ποια θέση θέλεις να πας. Μπορείς να είσαι στην θέση 0 και να το πας στην θέση 180 με την μια, δεν χρειάζεται να το πας βήμα βήμα.

    Ας πάρουμε τώρα την επανάληψη. πχ for(int i=0; i<100; i++) [ i++ είναι το ίδιο με i+=1 ]
    αυτό τι λέει: Έχουμε έναν μετρητή τύπου int με όνομα "i", η αρχική τιμή του μετρητή είναι 0. Όσο ο μετρητής είναι μικρότερος απ' το 100 επανέλαβε. Στο τέλος κάθε επανάληψης αύξησε τον μετρητή κατά 1. Άρα θα κάνει 100 επαναλήψεις και οι τιμές του μετρητή θα πάνε από 0 έως 99, όταν γίνει 100 ο μετρητής δεν θα εκτελεστεί ο κώδικας μέσα στην επανάληψη.
    Άρα άμα θέλω να πάω τον servo βήμα βήμα από 0 μέχρι 180 μοίρες θα βάλω μια επανάληψη με μετρητή να ξεκινάει απ' το 0, να γίνετε η επανάληψη όσο ο μετρητής είναι μικρότερος από 181 και να αυξάνεται με βήμα 1. Για να παίρνει ο μετρητής τις τιμές 0 έως 180.

    for(pos = 0; pos < 181; pos++)

    Μέσα στην επανάληψη θα
    χρησιμοποιούμε την τιμή του μετρητή ως θέση στον σερβο.

    for(pos = 0; pos < 181; pos++){
    myservo.write(pos);
    }

    Η επανάληψη απλώς βάζει ρυθμίσεις στον Timer, εφόσον το σήμα είναι 20ms φαίνεται λογικό το να πρέπει να περιμένουμε τουλάχιστον 20ms για να πάρει το ολοκληρωμένο στον servo το παλμουδάκι πριν του στείλουμε το καινούριο. Άρα και το ποιο γρήγορο μοτέρ στον κόσμο να έχεις πρέπει να περιμένεις έτσι ώστε να φτάσει η πληροφορία στο ολοκληρωμένο του servo.

    for(pos = 0; pos < 181; pos++){
    myservo.write(pos);
    delay(20);
    }

    Βέβαια επίσης παρατηρούμε πως τα 18ms είναι νεκρός χρόνος, οι ρυθμίσεις έχουν ληφθεί από το ολοκληρωμένο στην πίπτουσα παρυφή του παλμού, αλλά χρειάζεται κάποιον χρόνο για να την επεξεργαστεί και να την εφαρμόσει στο μοτέρ και το μοτέρνα πάει σε αυτήν την θέση. Για αυτό σου λέει περίμενε και 18ms για να είναι σίγουρο ότι θα είναι έτοιμο να λάβει το επόμενο πακέτο. Αν εσύ περιμένεις 20ms (18 τα νεκρά + 2ms που θέλει ο παλμός) τότε σίγουρα θα έχει ξεκινήσει και 2ο πακέτο με τις προηγούμενες ρυθμίσεις επειδή έχεις χάσει χρόνο στις εντολές οπότε ξεκινάς να ρυθμίζεις το επόμενο πακέτο πιο νωρίς για να φύγει στην ώρα του. Κανονικά η βιβλιοθήκη θα πρέπει να το λαμβάνει υπόψιν και να μην στέλνει πακέτα αν ο χρήστης έκανε μλκια και τα στέλνει πολύ νωρίς (δεν έχω ψάξει αν το κάνει) οπότε βάζεις την ρύθμιση που σου δίνει το παράδειγμα και αν δεις κάτι περίεργο παίζεις λίγο με την τιμή.

    for(pos = 0; pos < 181; pos++){
    myservo.write(pos);
    delay(15);
    }

    Αν θέλεις πχ να κάνει 180 μοίρες σε 1 λεπτό πχ τότε μπορείς
    α) να στείλεις 180 και να πάει αμέσως στο 180
    β) να στείλεις μικρά βηματάκια και να ολοκληρωθεί η κίνηση σε 1 λεπτό

    Το α) είναι εύκολο, πάμε να δούμε το β)
    Έχεις 180 βήματα και 1000ms.
    Εμείς ξέρουμε ότι ο παλμός θέλει 20ms, άρα 1000/20 μπορούμε να αλλάξουμε 50 βήματα σε 1sec.
    180/50 =3.6
    Άρα θα αυξάνουμε κατά 3.6 σε κάθε νέα ρύθμιση για 50 ρυθμίσεις.

    myservo.write(0);
    delay(20); //Μηδενίζουμε αν χρειάζεται

    for(int i=1; i<51; i++){
    int pos = i*3.6;
    myservo.write(pos);
    delay(20);
    }

    Στην επανάληψη ξεκινάω απ' το 1 και σταματάω στο 50 για να έχω βολικές τιμές για τον πολλαπλασιασμό.

    Φυσικά και δεν είναι ο καλύτερος τρόπος να το κάνεις, εξαρτάτε γιατί θέλεις να καθυστερεί 1 λεπτό να πάει.

    *Το 400 στην επανάληψή σου δεν ξέρω τι κάνει.
    **Την βασική C βαριέμαι να την εξηγώ, δες παραδείγματα στο google.

    1 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. Servo (MG995) κάνει επανεκκίνηση το arduino
    By Fire Doger in forum Μικροελεγκτές
    Απαντήσεις: 10
    Τελευταίο Μήνυμα: 01-05-16, 23:00
  2. Servo 6v σε 7.4
    By giannhsitia in forum Ηλεκτρονικά
    Απαντήσεις: 10
    Τελευταίο Μήνυμα: 15-04-16, 18:06
  3. Βοήθεια με arduino και servo
    By nicolouris in forum Μικροελεγκτές
    Απαντήσεις: 10
    Τελευταίο Μήνυμα: 05-01-16, 00:46
  4. Οδήγηση servo ηλεκτροβάνας με arduino
    By Holy Driver in forum Κυκλώματα για Auto & Moto
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 31-08-13, 17:38
  5. Arduino "μεγάλα" Servo
    By CivilSitis in forum Μικροελεγκτές
    Απαντήσεις: 11
    Τελευταίο Μήνυμα: 02-09-12, 20:04

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας