Photo of MegaMoto Plus H-bridge for Arduino Model: LC-80 by Progressive Automations

Μέρος I: Πώς να παρακολουθείτε την ανάδραση ενός γραμμικού ενεργοποιητή;

Anna Sapiga
Anna Sapiga
PA Engineer

Στον σημερινό οδηγό, θα δούμε πώς να υπολογίζετε πόση δύναμη ασκεί ένας γραμμικός ενεργοποιητής παρακολουθώντας την ποσότητα Ρεύματος που χρησιμοποιεί. Αυτός θα είναι ένας από τους πιο προχωρημένους οδηγούς μας και θα απαιτήσει πιο σύνθετη κωδικοποίηση, βαθμονόμηση και προγραμματισμό. Θα καλύψουμε την παρακολούθηση του αναλογικού εισόδου και πώς αξιοποιεί τις συναρτήσεις της. Για αυτό το έργο, θα χρησιμοποιήσουμε ένα MegaMoto Plus, έναν γραμμικό ενεργοποιητή (χρησιμοποιούμε τον PA-14 mini actuator μας), ένα Arduino Uno και ένα τροφοδοτικό τουλάχιστον 12V.

Photo of PA-14 mini actuator, an Arduino Uno and a power supply

Για αρχή, θα χρειαστεί να κάνουμε την καλωδίωση ώστε να συνδέσουμε όλα τα μέρη μεταξύ τους. Ξεκινήστε συνδέοντας το MegaMoto στο Arduino, απλώς τοποθετώντας το MegaMoto πάνω στο Uno. Έπειτα, συνδέστε ένα καλώδιο από το τερματικό BAT+ του MegaMoto στο pin Vin του Uno.

Photo of MegaMoto Plus H-bridge for Arduino Model: LC-80 by Progressive Automations


Τώρα πρέπει να συνδέσουμε τα καλώδια των γραμμικών ενεργοποιητών στα τερματικά A και B του MegaMoto και να συνδέσουμε την τροφοδοσία 12V στο BAT+ και το GND στο BAT-. Θα χρειαστεί επίσης να συνδέσουμε δύο κουμπιά ελέγχου, καθένα μεταξύ ενός αχρησιμοποίητου pin και GND. Συνιστούμε να συνδέσετε τα κουμπιά πάνω σε breadboard.

Photo of the linear actuators wires connecting to the A and B terminals on the MegaMoto and connect the 12V power source to BAT+ and GND to BAT


Ήρθε η ώρα για λίγη κωδικοποίηση με το Arduino Uno. Θέλουμε να προγραμματίσουμε τα κουμπιά ώστε να ελέγχουν πότε ο ενεργοποιητής θα επεκτείνεται και θα συστέλλεται. Η παρακολούθηση του Ρεύματος θα ξεκινά μόλις ο ενεργοποιητής επεκτείνεται και αυτό θα μας επιτρέψει να δούμε αν ξεπερνά το μέγιστο όριο Ρεύματος ή όχι. Αν ξεπεράσει το όριο, ο ενεργοποιητής θα σταματήσει αυτόματα μέχρι να επιλέξετε να τον ανασύρετε. Δεδομένου ότι οι κινητήρες μέσα στους ενεργοποιητές εμφανίζουν υψηλή αιχμή Ρεύματος κατά την πρώτη τροφοδοσία, ο κώδικας που θα εισάγουμε θα έχει μια σύντομη καθυστέρηση πριν ξεκινήσει την παρακολούθηση του Ρεύματος. Αυτός ο κώδικας θα μπορεί να διαβάζει πότε ο ενεργοποιητής έφτασε τους τερματικούς διακόπτες του, δηλαδή όταν το Ρεύμα πέφτει στο 0.

const int EnablePin = 8;
const int PWMPinA = 11;
const int PWMPinB = 3; // pins for Megamoto
const int buttonLeft = 4;
const int buttonRight = 5;//buttons to move the motor
const int CPin1 = A5; // motor feedback

int leftlatch = LOW;
int rightlatch = LOW;//motor latches (used for code logic)
int hitLimits = 0;//start at 0
int hitLimitsmax = 10;//values to know if travel limits were reached
longlastfeedbacktime = 0; // must be long, else it overflows
int firstfeedbacktimedelay = 750; //first delay to ignore current spik
int feedbacktimedelay = 50; //delay between feedback cycles, how often you want the motor to be checked
currentTimefeedback = 0; // must be long, else it overflows unceTime = 300; //amount to debounce buttons, lower values makes the buttons more sensitivelong lastButtonpress = 0; // timer for debouncing
long currentTimedebounce = 0;
int CRaw = 0; // input value for current readings
int maxAmps = 0; // trip limit
bool dontExtend = false;
bool firstRun = true;
bool fullyRetracted = false;//program logic
void setup()
{
Serial.begin(9600);
pinMode(EnablePin, OUTPUT);
pinMode(PWMPinA, OUTPUT);
pinMode(PWMPinB, OUTPUT);//Set motor outputs
pinMode(buttonLeft, INPUT);
pinMode(buttonRight, INPUT);//buttons
digitalWrite(buttonLeft, HIGH);
digitalWrite(buttonRight, HIGH);//enable internal pullups
pinMode(CPin1, INPUT);//set feedback input
currentTimedebounce = millis();
currentTimefeedback = 0;//Set initial times
maxAmps = 15;// SET MAX CURRENT HERE
}//end setup
void loop()
{
latchButtons();//check buttons, see if we need to move
moveMotor();//check latches, move motor in or out
}//end main loop
void latchButtons()
{
if (digitalRead(buttonLeft)==LOW)//left is forwards
{
currentTimedebounce = millis() - lastButtonpress;// check time since last press
if (currentTimedebounce > debounceTime && dontExtend == false)//once you've tripped dontExtend, ignore all forwards presses
{
leftlatch = !leftlatch;// if motor is moving, stop, if stopped, start movingfirstRun = true;// set firstRun flag to ignore current spike
fullyRetracted = false; // once you move forwards, you are not fully retracted
lastButtonpress = millis();//store time of last button press
return;
}//end if
}//end btnLEFT
if (digitalRead(buttonRight)==LOW)//right is backwards
{
currentTimedebounce = millis() - lastButtonpress;// check time since last press
if (currentTimedebounce > debounceTime)
{
rightlatch = !rightlatch;// if motor is moving, stop, if stopped, start moving
firstRun = true;// set firstRun flag to ignore current spike
lastButtonpress = millis();//store time of last button press
return;
}//end if
}//end btnRIGHT
}//end latchButtons
void moveMotor()
{
if (leftlatch == HIGH) motorForward(255); //speed = 0-255
if (leftlatch == LOW) motorStop();
if (rightlatch == HIGH) motorBack(255); //speed = 0-255
if (rightlatch == LOW) motorStop();
}//end moveMotor
void motorForward(int speeed)
{
while (dontExtend == false && leftlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, speeed);
analogWrite(PWMPinB, 0);//move motor
if (firstRun == true) delay(firstfeedbacktimedelay); // bigger delay to ignore current spike
else delay(feedbacktimedelay); //small delay to get to speed
getFeedback();
firstRun = false;
latchButtons();//check buttons again
}//end while
}//end motorForward

void motorBack (int speeed)
{
while (rightlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, speeed);//move motor
if (firstRun == true) delay(firstfeedbacktimedelay);// bigger delay to ignore current spike
else delay(feedbacktimedelay); //small delay to get to speed
getFeedback();
firstRun = false;
latchButtons();//check buttons again
}//end while
dontExtend = false;//allow motor to extend again, after it has been retracted
}//end motorBack
void motorStop()
{
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, 0);
digitalWrite(EnablePin, LOW);
firstRun = true;//once the motor has stopped, reenable firstRun to account for startup current spikes
}//end stopMotor

void getFeedback()
{
CRaw = analogRead(CPin1); // Read current
if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;
else hitLimits = 0; // check to see if the motor is at the limits and the current has stopped
if (hitLimits == hitLimitsmax && rightlatch == HIGH)
{
rightlatch = LOW; // stop motor
fullyRetracted = true;
}//end if
else if (hitLimits == hitLimitsmax && leftlatch == HIGH)
{
leftlatch = LOW;//stop motor
hitLimits = 0;
}//end if
if (CRaw > maxAmps)
{
dontExtend = true;
leftlatch = LOW; //stop if feedback is over maximum
}//end if
lastfeedbacktime = millis();//store previous time for receiving feedback
}//end getFeedback


Το νέο και βελτιωμένο PA-01 mini actuator (αναβάθμιση του PA-14) είναι το τρέχον μοντέλο που προσφέρουμε με ποικιλία πρόσθετων πλεονεκτημάτων. Για μια σύγκριση, δείτε τους πίνακες παρακάτω και αναβαθμίστε με σιγουριά!

 

PA-01

PA-14

Επιλογές δυναμικού Φορτίου

16, 28, 56, 112, 169, 225 lbs

35, 50, 75, 110, 150 lbs

Μέγιστο Φορτίο

225 lbs

150 lbs

Μέγιστη Ταχύτητα

3.54 "/sec

2.00"/sec

Βαθμός προστασίας IP

IP65

IP54

Επιλογές Διαδρομής

1" έως 40"

1" έως 40"

Ανάδραση φαινομένου Hall

Προαιρετικά

Όχι

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