Google+ Ηλεκτρολόγος μηχανικός: Έλεγχος stepper μοτέρ μέσω του serial interface του arduino και της βιβλιοθήκης AccelStepper
Προσοχή: Οι οδηγίες που δίνονται στο παρόν blog πρέπει να εφαρμόζονται από άτομα με εξουσιοδότηση από τον νόμο για την πραγματοποίηση ηλεκτρολογικών εργασιών καθώς και τις απαραίτητες γνώσεις. Μη τήρηση των κανόνων ασφαλείας ενδέχεται να εγκυμονεί κινδύνους για όσους πραγματοποιούν τις εργασίες, αλλά και για το κοινό.

Έλεγχος stepper μοτέρ μέσω του serial interface του arduino και της βιβλιοθήκης AccelStepper

Η βιβλιοθήκη για τα βηματικά μοτέρ που έρχεται μαζί με το περιβάλλον ανάπτυξης του arduino δεν έχει πολλές δυνατότητες ελέγχου. Μια πολύ καλή βιβλιοθήκη με πολλές δυνατότητες ελέγχου είναι η AccelStepper της εταιρίας airspayce  που μπορεί κανείς να την κατεβάσει ελεύθερα από το internet και να την εγκαταστήσει.

Με την βιβλιοθήκη AccelStepper μπορούμε να ελέγξουμε πάνω από ένα μοτέρ ταυτόχρονα από το arduino, κάτι που δεν υποστηρίζει η βασική βιβλιοθήκη. Επίσης σπουδαίο χαρακτηριστικό είναι ο έλεγχος επιτάχυνσης και επιβράδυνσης.

Ένα δοκιμαστικό πρόγραμμα σε λειτουργία φαίνεται στο παρακάτω video.

                                         Βηματικό bipolar μοτέρ


Ο controller - οδηγός και το βηματικό μοτέρ είναι από χαλασμένο εκτυπωτή.
Ο οδηγός δέχεται στις εισόδους Ι01,Ι11 για την πρώτη (Η) γέφυρα και τις εισόδους Ι02,Ι2 για την δεύτερη (Η) γέφυρα για τον έλεγχο της έντασης του ρεύματος σύμφωνα με τον παρακάτω πίνακα.
ΑΜ2170 ελεγκτής βηματικού μοτέρ.
Έλεγχος αμπέρ μέσω εισόδων του οδηγού. 
Μέσω του serial interface που διαθέτει το arduino δίνουμε από τον Η/Υ τις τρεις παραμέτρους ελέγχου: Βήματα που θέλουμε να κινηθεί (θετικό ή αρνητικό, αριστερά ή δεξιά), μέγιστη ταχύτητα (σε βήματα το δευτερόλεπτο) που θέλουμε να πιάσει και επιτάχυνση-επιβράδυνση (σε βήματα ανά δευτερόλεπτο στο τετράγωνο).
Αν δώσουμε 6 ή 9 νούμερα, χωριζόμενα με κόμμα ή άλλο μη αριθμητικό χαρακτήρα και μετά ENTER το μοτέρ θα πραγματοποιήσει στην σειρά δυο ή τρεις διαφορετικές κινήσεις ειδοποιώντας μας στην οθόνη ποιες είναι αυτές.
Δεν επιτρέπεται αρνητικό νούμερο (ή μηδέν) στην ταχύτητα και την επιτάχυνση γι αυτό και μέσω του προγράμματος αποφεύγεται αυτό το ενδεχόμενο.

Το βηματικό μοτέρ του video χρειάζεται 200 βήματα για ένα πλήρη κύκλο γι αυτό και κάνει έναν πλήρη κύκλο όταν του δίνουμε να πραγματοποιήσει 200 βήματα.

Ακολουθεί το πρόγραμμα ελέγχου που μπορεί ο καθένας με αντιγραφή - επικόλληση (copy - paste) να το περάσει στο περιβάλλον ανάπτυξης κώδικα του Arduino.


// Έλεγχος bipolar stepper μοτέρ με τον οδηγό ΑΜ2170 της ΑΜtek από

// το serial interface δίνοντας 3 νούμερα:
// αριθμός βημάτων, μέγιστη ταχύτητα, επιτάχυνση(+επιβράδυνση).
// http://greekelectrician.blogspot.gr/

#include <AccelStepper.h>


// Ορισμός pin του ΑΜ2170 που συνδέονται στο arduino uno

#define I01 5
#define I11 6
#define phase1 7
#define I02 8
#define I12 9
#define phase2 10

// Ορισμός του μοτέρ και των pin που συνδέεται.

AccelStepper stepper (2,phase1,phase2); // FULL2WIRE = 2 (2 pins) στα 7 και 10

int vimata; // Από -32768 έως 32767

float taxitita; //βήματα το sec
float epitaxinsi; // βήματα το sec^2
   
void setup()
{
    Serial.begin(9600);

    //  Ορισμοί εξόδων

    pinMode(I01, OUTPUT);
    pinMode(I11, OUTPUT);
    pinMode(I02, OUTPUT);
    pinMode(I12, OUTPUT);

    //   Αρχικοποίηση  

    digitalWrite(I01, LOW);
    digitalWrite(I11, HIGH);
    digitalWrite(I02, LOW);
    digitalWrite(I12, HIGH);

    Serial.println("\nDose (+-)vimata,taxitita,epitaxinsi(ENTER)\n");

}

void loop()

{
  // Αν υπάρχουν διαθέσιμα νούμερα διαβασέτα:
  while (Serial.available() > 0)
  {
    // έλεγχος για τα επόμενα 3 έγκυρα νούμερα από την σειριακή είσοδο:
    vimata = Serial.parseInt();
    taxitita = Serial.parseFloat();
    epitaxinsi = Serial.parseFloat();

    taxitita = abs(taxitita); // όχι αρνητική

    epitaxinsi = abs(epitaxinsi); //όχι αρνητική
    if (taxitita == 0) taxitita = 0.1; //όχι μηδέν
    if (epitaxinsi == 0) epitaxinsi = 0.01; // όχι μηδέν

    // εμφάνιση στην οθόνη του Η/Υ

    Serial.print("vimata\t\t=\t");
    Serial.println(vimata,DEC);
    Serial.print("taxitita\t=\t");
    Serial.println(taxitita,2);
    Serial.print("epitaxinsi\t=\t");
    Serial.println(epitaxinsi,2);
     
    stepper.setMaxSpeed(taxitita);
    stepper.setAcceleration(epitaxinsi);
    stepper.move(vimata);
     
    while(stepper.distanceToGo() != 0)
    stepper.run();
     
    Serial.println("\n\nTelos kinisis\nDose (+-)vimata,taxitita,epitaxinsi(ENTER)\n");
  }
}

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

Διαβάζω όλα τα σχόλια