Comment contrôler votre actionneur à l'aide d'un capteur ultrasonique

Comment contrôler votre actionneur à l'aide d'un capteur à ultrasons

Josh Nigh
Josh Nigh
PA Engineer

Parfois, lorsque nous créons un projet utilisant un actionneur linéaire, nous cherchons à résoudre un problème qui serait insoluble sans les avantages offerts par ces mécanismes. D'autres fois, nous tentons de simplifier une tâche en l'automatisant. Mais de temps à autre, nous créons quelque chose simplement par plaisir. Ce projet en fait partie.

Passez à la vitesse supérieure en matière de contrôle des actionneurs linéaires grâce à nos microcontrôleurs Arduino !

Dans cet article, nous verrons comment utiliser un capteur ultrasonique pour mesurer la course d'un actionneur linéaire et modifier automatiquement la position de ce dernier. Bien que ce système n'ait pas été conçu pour une application spécifique, ses possibilités sont infinies.

 

Voici ce dont vous aurez besoin

 

Pour la commande, nous utilisons une carte Arduino Uno avec un contrôleur de moteur MegaMoto. Notre actionneur est le PA-04-12-400-HS-24VDC. Il est important que l' actionneur dispose d'un retour d'information afin que l'Arduino puisse surveiller sa position ; tout système de retour d'information pour actionneur linéaire convient, par exemple un potentiomètre. Le potentiomètre serait moins précis, mais aurait l'avantage de ne pas nécessiter de procédure de remise à zéro après une coupure de courant. Le code devra également être modifié.

 

Étape 1 : Câblage

Step 1: Actuator Wiring

 

Le câblage de ce projet est très simple. Nous n'utiliserons ici qu'un seul des deux capteurs à effet Hall du PA-04-HS ; peu importe lequel (broche 4 ou 5). Le brochage ci-dessous correspond au connecteur Molex à 6 broches fourni avec le PA-04-HS :

Actuator’s 6-pin connector to Arduino/MegaMoto

 

Connecteur à 6 broches de l'actionneur pour Arduino/MegaMoto

  • Broche 3 à 5 V
  • Broche 2 à la masse
  • Broche 1 vers broche 2 de l'Arduino
  • Broche 4 à A sur le MegaMoto
  • Broche 5 vers B sur le MegaMoto

 

Capteur ultrasonique pour Arduino/Megamoto

  • VCC à 5V
  • GND à GND
  • Trigonométrie jusqu'à la broche 8
  • Écho vers la broche 7

 

Alimentation MegaMoto

  • + à V+
  • - à V-

 

Étape 2 : Programmation de l’Arduino

Le code utilisé dans ce tutoriel est une version modifiée de celui présenté dans un autre article, « Capteurs à effet Hall 1 : Contrôle de position ». N'hésitez pas à consulter ce tutoriel pour mieux comprendre comment nous utilisons le capteur à effet Hall pour le contrôle de position ! Le capteur ultrasonique fonctionne en émettant un signal ultrasonique déclenché par une broche GPIO de l'Arduino. Ce signal est réfléchi par un objet et détecté par le récepteur. Lorsque le récepteur détecte le signal, il envoie une impulsion à l'Arduino. Grâce à cette impulsion, nous pouvons calculer la distance parcourue par un actionneur linéaire en mesurant le temps entre l'émission et la réception, puis utiliser une formule pour convertir cette mesure en pouces.

La position de l'actionneur est déterminée en comptant le nombre d'impulsions émises par le capteur à effet Hall (ceci est décrit plus en détail dans l'article mentionné précédemment). La course, exprimée en pouces, est calculée en déterminant le nombre d'impulsions par pouce émis par notre actionneur, puis en divisant le nombre d'impulsions par ce nombre. La conversion en pouces des mesures du capteur ultrasonique et du capteur à effet Hall simplifie et clarifie considérablement le code. Ainsi, nous indiquons à l'Arduino : « Si l'objet se trouve à x pouces, étendez l'actionneur de x pouces. » Le code ci-dessous vous permettra de mettre en œuvre le modèle de commande de distance par actionneur linéaire sur l'un de nos actionneurs PA-04-12-400-HS-24VDC. L'étape suivante abordera les modifications possibles du code.

[code]
/* Ce code permet de mesurer la distance d'un objet et de positionner la course d'un actionneur linéaire en conséquence. * Les composants requis sont une carte Arduino Uno, un contrôleur PobotPower MegaMoto et un capteur ultrasonique. * Écrit par Progressive Automations le 02/02/2021 */ #define PWMA0 6
#définir PWMB0 5
#define enable0 13 //broches pour MegaMoto #define hall0 2 //broches d'interruption pour les capteurs à effet Hall #define echoPin 7 //broche d'écho du capteur ultrasonique
#define trigPin 8 //sortie du capteur ultrasonique float duration, distance; int enable = 0; //broche d'activation pour megaMoto int count[] = {0};
int currentPos = 0; // position actuelle
seuil entier = 100; // tolérance de position
int destination = 0; bool forwards = false;
bool backwards = false; // états du moteur void setup() { pinMode(PWMA0, OUTPUT); pinMode(PWMB0, OUTPUT); // configuration des sorties PWM pinMode(enable0, OUTPUT); digitalWrite(enable0, LOW); // activation et extinction de la carte pinMode(hall0, INPUT); digitalWrite(hall0, LOW); // configuration du capteur Hall, niveau bas pour le démarrage sur front montant attachInterrupt(0, speed0, RISING); // activation des interruptions à effet Hall pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); //homeActuator(); // rétraction complète de l'actionneur Serial.println("READY"); } // fin de la configuration void loop() {
getDistance(); // Mesure la distance de l'objet par rapport au capteur ultrasonique
position_actuelle = count[0]; si (distance < 13) //ignorer la valeur si supérieure à la longueur du trait
{
destination = distance * 275; //transformer la distance mesurée (en pouces) en position de course souhaitée (en impulsions)
} if ((destination>= (currentPos - threshold)) && (destination <= (currentPos + threshold))) stopMoving();//arrêter l'actionneur s'il est à la position souhaitée else if (destination> currentPos) goForwards(); else if (destination < currentPos) goBackwards(); Serial.print("Comptes : "); Serial.println(count[0]); Serial.print("Position actuelle : "); Serial.println(currentPos); Serial.print("Destination : "); Serial.println(destination); }//fin de la boucle void speed0() { //Serial.println("Mise à jour de 1 position"); if (forwards == true) count[0]++; //si déplacement vers l'avant, ajouter les comptes else if (backwards == true) count[0]--; //si déplacement vers l'arrière, soustraire les comptes
}//fin de speed0 /*void ReadInputs() { sw[0] = digitalRead(switch0), sw[1] = digitalRead(switch1);//vérifier les commutateurs currentPos = count[0];
}//fin des entrées de lecture
*/
void goForwards()
{ forwards = true; backwards = false; //Serial.println("Déplacement vers l'avant"); digitalWrite(enable0, HIGH);//activation de la carte //Serial.print(" Vitesses "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]); //Serial.print(" Comptes "), Serial.println(count[0]); analogWrite(PWMA0, 255); analogWrite(PWMB0, 0);//application des vitesses
}//fin goForwards void goBackwards()
{ forwards = false; backwards = true; //Serial.println("Déplacement en marche arrière"); digitalWrite(enable0, HIGH);//activation de la carte //Serial.print(" Vitesses "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]); //Serial.print(" Comptes "), Serial.println(count[0]); analogWrite(PWMA0, 0); analogWrite(PWMB0, 255);//application des vitesses
}//fin goBackwards void stopMoving()
{ forwards = false; backwards = false; Serial.println("Arrêté"); analogWrite(PWMA0, 0); analogWrite(PWMB0, 0);//mettre les vitesses à 0 delay(10); digitalWrite(enable0, LOW);//désactiver la carte
}//fin stopMoving void getDistance()
{
digitalWrite(trigPin, LOW); delayMicroseconds(10); digitalWrite(trigPin, HIGH);
délaiMicrosecondes(10); digitalWrite(trigPin, LOW); durée = pulseIn(echoPin, HIGH); distance = durée/58,2/2,5;
Serial.print("Distance :"); Serial.println(distance);
void homeActuator() // Rétracter complètement l'actionneur et remettre le compteur à 0
{ goBackwards(); delay(25000);//changez cette valeur pour le temps nécessaire à l'actionneur pour se rétracter complètement count[0] = {0};
}
[/code]

Étape 3 : Modification du code

La valeur du seuil détermine la précision avec laquelle la position de l'actionneur doit correspondre à la lecture du capteur ultrasonique. L'augmenter diminue la précision, et la diminuer a l'effet inverse. En fixant cette valeur à 100, on indique à l'Arduino de ne pas déplacer l'actionneur tant que les impulsions des capteurs à effet Hall et ultrasonique sont à moins de 100 impulsions l'une de l'autre. Une valeur trop basse peut entraîner des mouvements saccadés et fréquents de l'actionneur, celui-ci cherchant à atteindre la position exacte.

Step 3: Modifying the Code

 

Modifiez cette valeur pour qu'elle corresponde à la course de votre actionneur (ou à une valeur supérieure de 2,5 cm). L'Arduino ignorera ainsi les valeurs trop élevées.

 

Modifiez cette valeur en fonction du nombre d'impulsions par pouce de votre actionneur.

 

Notre PA-04-HS est équipé d'un capteur à effet Hall intégré !

Conclusion

Nous espérons sincèrement que ce projet vous sera utile, ou du moins intéressant ! N'hésitez pas à le modifier et à vous l'approprier. Comme toujours, nous serions ravis de découvrir vos projets, qu'ils soient basés sur cette idée ou qu'ils utilisent nos produits pour créer quelque chose de différent ! Vous pouvez également nous contacter par courriel à l'adresse sales@progressiveautomations.com ou par téléphone au 1-800-676-6123.