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

Teil I: Wie man die Rückmeldung eines Linearantriebs überwacht?

Anna Sapiga
Anna Sapiga
PA Engineer

In der heutigen Anleitung werden wir besprechen, wie man herausfindet, wie viel Kraft ein Linearaktuator ausübt, indem man die Menge an Strom überwacht, die er verwendet. Dies wird eine unserer fortgeschritteneren Anleitungen sein und erfordert einige komplexe Programmierungen, Kalibrierungen und Einstellungen. Wir werden die Überwachung des analogen Eingangs und wie er seine Funktionen nutzt, behandeln. Für dieses Projekt verwenden wir einen MegaMoto Plus, einen Linearaktuator (wir verwenden unseren PA-14 Miniaktuator), ein Arduino Uno und ein Netzteil von mindestens 12 V.

Foto des PA-14 Miniaktuators, eines Arduino Uno und eines Netzteils

Um zu beginnen, müssen wir die Verkabelung vornehmen, um alles miteinander zu verbinden. Beginnen Sie damit, den MegaMoto mit dem Arduino zu verbinden, indem Sie den MegaMoto einfach auf den Uno legen. Verbinden Sie dann ein Kabel vom BAT+-Anschluss des MegaMoto mit dem Vin-Pin des Uno.

Foto der MegaMoto Plus H-Brücke für Arduino Modell: LC-80 von Progressive Automations


Jetzt müssen wir die Kabel der Linearaktuatoren mit den A- und B-Anschlüssen am MegaMoto verbinden und die 12V-Stromquelle an BAT+ und GND an BAT- anschließen. Wir müssen auch zwei Tasten für die Steuerung verkabeln, indem wir sie jeweils zwischen einem ungenutzten Pin und GND anschließen. Wir empfehlen, die Tasten auf ein Breadboard zu stecken.

Foto der Kabel der Linearaktuatoren, die an die A- und B-Anschlüsse des MegaMoto angeschlossen sind und die 12V-Stromquelle an BAT+ und GND an BAT anschließen.


Jetzt ist es Zeit für etwas Programmierung mit dem Arduino Uno. Wir möchten die Tasten so programmieren, dass sie steuern können, wann der Aktuator sich ausfahren und einfahren wird. Der Strom wird überwacht, sobald der Aktuator sich ausfährt, und dies ermöglicht es uns zu beobachten, ob er das maximale Stromlimit überschreitet oder nicht. Wenn er das Limit überschreitet, stoppt der Aktuator automatisch, bis Sie entscheiden, ihn einzufahren. Da die Motoren in den Aktuatoren beim ersten Einschalten einen großen Stromstoß haben, wird der Code, den wir eingeben, eine kurze Verzögerung haben, bevor er mit der Überwachung des Stroms beginnt. Dieser Code kann lesen, wenn der Aktuator seine Endschalter erreicht hat, was der Fall ist, wenn der Strom auf 0 fällt.

const int EnablePin = 8;
const int PWMPinA = 11;
const int PWMPinB = 3; // Pins für Megamoto
const int buttonLeft = 4;
const int buttonRight = 5;//Tasten zum Bewegen des Motors
const int CPin1 = A5; // Motorfeedback

int leftlatch = LOW;
int rightlatch = LOW;//Motorverriegelungen (für die Logik des Codes verwendet)
int hitLimits = 0;//beginnt bei 0
int hitLimitsmax = 10;//Werte, um zu wissen, ob die Reisegrenzen erreicht wurden

long lastfeedbacktime = 0; // muss lang sein, sonst überläuft es
int firstfeedbacktimedelay = 750; //erste Verzögerung, um den Stromstoß zu ignorieren
int feedbacktimedelay = 50; //Verzögerung zwischen Feedbackzyklen, wie oft Sie den Motor überprüfen möchten
currentTimefeedback = 0; // muss lang sein, sonst überläuft es
int debounceTime = 300; //Menge, um die Tasten zu entprellen, niedrigere Werte machen die Tasten empfindlicher
long lastButtonpress = 0; // Timer für Entprellen
long currentTimedebounce = 0;
int CRaw = 0; // Eingabewert für Strommessungen
int maxAmps = 0; // Auslöseschwelle
bool dontExtend = false;
bool firstRun = true;
bool fullyRetracted = false;//Programmlogik

void setup()
{
Serial.begin(9600);
pinMode(EnablePin, OUTPUT);
pinMode(PWMPinA, OUTPUT);
pinMode(PWMPinB, OUTPUT);//Motor-Ausgänge festlegen
pinMode(buttonLeft, INPUT);
pinMode(buttonRight, INPUT);//Tasten
digitalWrite(buttonLeft, HIGH);
digitalWrite(buttonRight, HIGH);//interne Pullups aktivieren
pinMode(CPin1, INPUT);//Feedback-Eingang festlegen
currentTimedebounce = millis();
currentTimefeedback = 0;//Anfangszeiten festlegen
maxAmps = 15;// MAXIMALEN STROM HIER FESTLEGEN
} //Ende Setup

void loop()
{
latchButtons();//Tasten überprüfen, sehen, ob wir uns bewegen müssen
moveMotor();//Verriegelungen überprüfen, Motor ein- oder ausfahren
} //Ende Hauptschleife

void latchButtons()
{
if (digitalRead(buttonLeft)==LOW)//links ist vorwärts
{
currentTimedebounce = millis() - lastButtonpress;// Zeit seit der letzten Betätigung überprüfen
if (currentTimedebounce > debounceTime && dontExtend == false)//sobald Sie dontExtend ausgelöst haben, ignorieren Sie alle Vorwärtsbetätigungen
{
leftlatch = !leftlatch;// wenn der Motor sich bewegt, stoppen, wenn er stoppt, anfangen zu bewegen
firstRun = true;// setze firstRun-Flag, um den Stromstoß zu ignorieren
fullyRetracted = false; // sobald Sie vorwärts bewegen, sind Sie nicht vollständig eingefahren
lastButtonpress = millis();//Zeit der letzten Betätigung speichern
return;
}//Ende wenn
}//Ende btnLEFT

if (digitalRead(buttonRight)==LOW)//rechts ist rückwärts
{
currentTimedebounce = millis() - lastButtonpress;// Zeit seit der letzten Betätigung überprüfen
if (currentTimedebounce > debounceTime)
{
rightlatch = !rightlatch;// wenn der Motor sich bewegt, stoppen, wenn er stoppt, anfangen zu bewegen
firstRun = true;// setze firstRun-Flag, um den Stromstoß zu ignorieren
lastButtonpress = millis();//Zeit der letzten Betätigung speichern
return;
}//Ende wenn
}//Ende btnRIGHT
} //Ende latchButtons

void moveMotor()
{
if (leftlatch == HIGH) motorForward(255); //Geschwindigkeit = 0-255
if (leftlatch == LOW) motorStop();
if (rightlatch == HIGH) motorBack(255); //Geschwindigkeit = 0-255
if (rightlatch == LOW) motorStop();
} //Ende moveMotor

void motorForward(int speeed)
{
while (dontExtend == false && leftlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, speeed);
analogWrite(PWMPinB, 0);//Motor bewegen
if (firstRun == true) delay(firstfeedbacktimedelay); // größere Verzögerung, um den Stromstoß zu ignorieren
else delay(feedbacktimedelay); //kleine Verzögerung, um die Geschwindigkeit zu erreichen
getFeedback();
firstRun = false;
latchButtons();//Tasten erneut überprüfen
}//Ende während
} //Ende motorForward

void motorBack (int speeed)
{
while (rightlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, speeed);//Motor bewegen
if (firstRun == true) delay(firstfeedbacktimedelay);// größere Verzögerung, um den Stromstoß zu ignorieren
else delay(feedbacktimedelay); //kleine Verzögerung, um die Geschwindigkeit zu erreichen
getFeedback();
firstRun = false;
latchButtons();//Tasten erneut überprüfen
}//Ende während
dontExtend = false;//Erlauben, dass der Motor wieder ausfährt, nachdem er eingefahren wurde
} //Ende motorBack

void motorStop()
{
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, 0);
digitalWrite(EnablePin, LOW);
firstRun = true;//sobald der Motor gestoppt ist, firstRun wieder aktivieren, um die Stromstoßspitzen zu berücksichtigen
} //Ende stopMotor

void getFeedback()
{
CRaw = analogRead(CPin1); // Strom lesen
if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;
else hitLimits = 0; // überprüfen, ob der Motor an den Grenzen ist und der Strom gestoppt hat
if (hitLimits == hitLimitsmax && rightlatch == HIGH)
{
rightlatch = LOW; // Motor stoppen
fullyRetracted = true;
}//Ende wenn
else if (hitLimits == hitLimitsmax && leftlatch == HIGH)
{
leftlatch = LOW;//Motor stoppen
hitLimits = 0;
}//Ende wenn
if (CRaw > maxAmps)
{
dontExtend = true;
leftlatch = LOW; //stoppen, wenn das Feedback über dem Maximum liegt
}//Ende wenn
lastfeedbacktime = millis();//vorherige Zeit für den Empfang von Feedback speichern
} //Ende getFeedback


Mit diesem grundlegenden Code werden Sie erfolgreich das Feedback Ihres Linearaktuators überwachen. In Teil II werden wir näher darauf eingehen, wie der Code funktioniert und wie Sie ihn nach Ihren Wünschen bearbeiten können. Wir hoffen, dass Sie diesen Beitrag hilfreich fanden und bleiben Sie dran für Teil II in den kommenden Wochen. Wenn Sie eine der Einheiten bestellen möchten, die wir in diesem Beispiel verwendet haben, oder mehr über unsere Produkte erfahren möchten, kontaktieren Sie uns.