How To Monitor Feedback Of A Linear Actuator Part 1

Comment surveiller la rétroaction d'un actionneur linéaire (partie 1)

Adam Morissette
Adam Morissette
PA Engineer

Dans le guide d'aujourd'hui, nous allons voir comment déterminer la force appliquée par un actionneur linéaire en surveillant le courant consommé. Ce guide, plus avancé, nécessitera des étapes de codage, d'étalonnage et de programmation complexes. Nous aborderons la surveillance d'une entrée analogique et son utilisation. Pour ce projet, nous utiliserons une MegaMoto Plus , un actionneur linéaire (nous utilisons notre mini-actionneur PA-14 ), un Arduino Uno et une alimentation d'au moins 12 V.



Pour commencer, il faut réaliser le câblage pour tout connecter. Commencez par brancher la MegaMoto sur l'Arduino. Pour cela, placez-la simplement sur l'Uno. Connectez ensuite un fil entre la borne BAT+ de la MegaMoto et la broche Vin de l'Uno.



Il faut maintenant connecter les fils des actionneurs linéaires aux bornes A et B de la MegaMoto, puis connecter l'alimentation 12 V à BAT+ et GND à BAT-. Il faudra également câbler deux boutons de commande en les reliant chacun à une broche libre et à GND. Nous recommandons de les connecter sur une platine d'expérimentation.



Il est maintenant temps de coder avec l'Arduino Uno. Nous souhaitons programmer les boutons pour qu'ils contrôlent l'extension et la rétraction de l'actionneur. Le courant sera surveillé dès l'extension de l'actionneur, ce qui nous permettra de vérifier s'il dépasse la limite de courant maximale. S'il dépasse cette limite, l'actionneur s'arrêtera automatiquement jusqu'à ce que vous choisissiez de le rétracter. Compte tenu du pic de courant important que subissent les moteurs des actionneurs lors de leur première mise sous tension, le code saisi démarrera la surveillance du courant après un court délai. Ce code permettra de savoir quand l'actionneur a atteint ses fins de course, c'est-à-dire lorsque le courant chute à 0.

 const int EnablePin = 8;

const int PWMPinA = 11;
const int PWMPinB = 3 ; // pins pour Megamoto

const int buttonLeft = 4;
const int buttonRight = 5;//boutons pour déplacer le moteur

const int CPin1 = A5; // rétroaction du moteur

int leftlatch = BAS ;
int rightlatch = LOW;//verrous de moteur (utilisés pour la logique du code)

int hitLimits = 0;//démarrer à 0
int hitLimitsmax = 10;//valeurs permettant de savoir si les limites de déplacement ont été atteintes

long lastfeedbacktime = 0; // doit être long, sinon il déborde
int firstfeedbacktimedelay = 750; // premier délai pour ignorer le pic actuel
int feedbacktimedelay = 50; //délai entre les cycles de rétroaction, à quelle fréquence vous souhaitez que le moteur soit vérifié
long currentTimefeedback = 0; // doit être long, sinon il déborde

int debounceTime = 300; //quantité de boutons anti-rebond, des valeurs inférieures rendent les boutons plus sensibles
long lastButtonpress = 0; // minuterie pour anti-rebond
long currentTimedebounce = 0;

int CRaw = 0; // valeur d'entrée pour les lectures actuelles
int maxAmps = 0; // limite de déclenchement

bool dontExtend = false;
booléen firstRun = vrai;
bool fullyRetracted = false;//logique du programme

configuration vide()
{
Serial.begin(9600);
pinMode(EnablePin, OUTPUT);
pinMode(PWMPinA, SORTIE);
pinMode(PWMPinB, OUTPUT);//Définir les sorties du moteur
pinMode(boutonGauche, ENTRÉE);
pinMode(boutonDroit, ENTRÉE);//boutons

digitalWrite(boutonGauche, HAUT);
digitalWrite(buttonRight, HIGH);//activer les pullups internes
pinMode(CPin1, INPUT);//définir l'entrée de rétroaction

currentTimedebounce = millis();
currentTimefeedback = 0;//Définir les heures initiales

maxAmps = 15;// RÉGLER LE COURANT MAXIMUM ICI

}//fin de la configuration

boucle vide()
{
latchButtons();//vérifier les boutons, voir si nous devons nous déplacer

moveMotor();//vérifier les verrous, déplacer le moteur vers l'intérieur ou vers l'extérieur

}//fin de la boucle principale

void latchButtons()
{
si (digitalRead(buttonLeft)==LOW)//gauche est en avant
{
currentTimedebounce = millis() - lastButtonpress;// vérifier le temps écoulé depuis la dernière pression
si (currentTimedebounce > debounceTime && dontExtend == false)//une fois que vous avez déclenché dontExtend, ignorez toutes les pressions vers l'avant
{
leftlatch = !leftlatch;// si le moteur est en mouvement, arrêtez-vous, s'il est arrêté, commencez à bouger
firstRun = true;// définir l'indicateur firstRun pour ignorer le pic actuel
fullyRetracted = false; // une fois que vous avancez, vous n'êtes pas complètement rétracté
lastButtonpress = millis();//enregistre l'heure de la dernière pression sur le bouton
retour;
}//fin si
}//fin btnLEFT

si (digitalRead(buttonRight)==LOW)//droite est à l'envers
{
currentTimedebounce = millis() - lastButtonpress;// vérifier le temps écoulé depuis la dernière pression

si (currentTimedebounce > debounceTime)
{
rightlatch = !rightlatch;// si le moteur est en mouvement, arrêtez-vous, s'il est arrêté, commencez à bouger
firstRun = true;// définir l'indicateur firstRun pour ignorer le pic actuel
lastButtonpress = millis();//enregistre l'heure de la dernière pression sur le bouton
retour; }//fin si
}//fin btnRIGHT
}//fin des latchButtons

void moveMotor()
{
si (leftlatch == HIGH) motorForward(255); //vitesse = 0-255
si (leftlatch == LOW) motorStop();
si (rightlatch == HIGH) motorBack(255); //vitesse = 0-255
si (rightlatch == LOW) motorStop();

}//fin du déplacement du moteur

void motorForward(int vitesse)
{
while (dontExtend == false && leftlatch == HIGH)
{
digitalWrite(EnablePin, HAUT);
analogWrite(PWMPinA, vitesse);
analogWrite(PWMPinB, 0);//déplacer le moteur
if (firstRun == true) delay(firstfeedbacktimedelay); // délai plus long pour ignorer le pic actuel
else delay(feedbacktimedelay); //petit délai pour atteindre la vitesse

obtenir un retour d'information();
firstRun = faux;

latchButtons();//vérifier à nouveau les boutons
}//fin pendant que

}//fin du moteur en avant

void motorBack (vitesse int)
{
tandis que (rightlatch == HAUT)
{
digitalWrite(EnablePin, HAUT);
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, speed);//déplacer le moteur
si (firstRun == true) delay(firstfeedbacktimedelay);// délai plus long pour ignorer le pic actuel
else delay(feedbacktimedelay); //petit délai pour atteindre la vitesse
obtenir un retour d'information();

firstRun = faux;

latchButtons();//vérifier à nouveau les boutons

}//fin pendant que

dontExtend = false;//permettre au moteur de s'étendre à nouveau, après avoir été rétracté

}//fin du moteurRetour

void motorStop()
{
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, 0);

digitalWrite(EnablePin, BAS);
firstRun = true;//une fois le moteur arrêté, réactivez firstRun pour tenir compte des pics de courant de démarrage

}//fin de courseMoteur

void getFeedback()
{
CRaw = analogRead(CPin1); // Lire le courant

si (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;
else hitLimits = 0; // vérifier si le moteur est aux limites et si le courant s'est arrêté

si (hitLimits == hitLimitsmax && rightlatch == HAUT)
{
rightlatch = LOW; // arrêter le moteur
entièrement rétracté = vrai ;
}//fin si

sinon si (hitLimits == hitLimitsmax && leftlatch == HIGH)
{
leftlatch = LOW;//arrêter le moteur
hitLimits = 0;
}//fin si

si (CRaw > maxAmps)
{
dontExtend = vrai;
leftlatch = LOW; // arrêt si le retour est supérieur au maximum
}//fin si

lastfeedbacktime = millis();//stocke l'heure précédente de réception des commentaires
}//fin de getFeedback



Avec ce code de base, vous devriez être en mesure de surveiller efficacement le retour d'information de votre actionneur linéaire. Dans la partie 2, nous approfondirons le fonctionnement du code et vous expliquerons comment le modifier à votre guise. Nous espérons que cet article vous a été utile. Restez connectés pour la partie 2 dans les semaines à venir. Pour commander des unités utilisées dans cet exemple ou pour en savoir plus sur nos produits, n'hésitez pas à nous contacter .