Parfois, lorsque nous réalisons un projet avec un vérin linéaire, nous cherchons à résoudre un problème qui serait insoluble sans les avantages qu’offrent ces mécanismes. D’autres fois, nous voulons simplement faciliter une tâche en l’automatisant. Et de temps en temps, nous créons quelque chose juste parce que nous le pouvons. C’est l’un de ces projets.
Dans cet article, nous allons voir comment utiliser un capteur à ultrasons pour mesurer la distance d’un objet et l’exploiter afin de modifier automatiquement la position de la course de l’actionneur. Même si ce projet n’a pas été conçu pour une application spécifique, les possibilités sont infinies.
Voici ce dont vous aurez besoin
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Capteur à ultrasons
- 1 x PA-04-12-400-HS-24VDC (peut être n’importe quel actionneur avec une rétroaction à effet Hall)
- 1 x PS-20-24 (ou toute alimentation 24VDC d’au moins 6 A)
Pour le contrôle, nous utilisons un Arduino Uno avec un pilote moteur MegaMoto. Notre actionneur est le PA-04-12-400-HS-24VDC. Il est important que l’actionneur ait une forme de rétroaction pour que l’Arduino puisse surveiller sa position – tout système de rétroaction pour vérin linéaire peut fonctionner, par exemple un retour par potentiomètre serait également efficace ici. Le potentiomètre serait moins précis, mais présenterait l’avantage de ne pas nécessiter de procédure d’homing après une coupure d’alimentation. Le code devra également être modifié.
Étape 1 : Câblage

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 :

Connecteur 6 broches du vérin vers Arduino/MegaMoto
- Broche 3 vers 5 V
- Broche 2 vers GND
- Broche 1 vers la broche 2 de l’Arduino
- Broche 4 vers A sur le MegaMoto
- Broche 5 vers B sur le MegaMoto
Capteur à ultrasons vers Arduino/Megamoto
- VCC vers 5 V
- GND vers GND
- Trig vers la broche 8
- Echo vers la broche 7
MegaMoto vers l’alimentation
- + vers V+
- - vers V-
Étape 2 : Programmer l’Arduino
Le code utilisé dans ce tutoriel est une version modifiée de celui que nous avons utilisé dans un autre article, Hall Effect Sensors 1 : Position Control. 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 à ultrasons fonctionne en émettant un ping ultrasonique déclenché par une des broches GPIO de l’Arduino. Ce ping est ensuite réfléchi par un objet et détecté par le récepteur. Lorsque le récepteur détecte le ping, il envoie une impulsion à l’Arduino. Grâce à cela, nous pouvons établir un calcul pour déterminer la distance destinée à un vérin linéaire en mesurant le temps entre l’émission et la réception, puis utiliser une formule pour convertir cette mesure en pouces.
Nous déterminons la position de l’actionneur en comptant le nombre d’impulsions émises par le capteur à effet Hall (cela est décrit plus en détail dans l’article mentionné ci-dessus). Nous pouvons déterminer la position de la course en pouces en trouvant combien d’impulsions par pouce émet notre actionneur, puis en divisant notre nombre d’impulsions par cette valeur. Le fait de convertir en pouces à la fois la lecture du capteur à ultrasons et celle du capteur à effet Hall rend le code beaucoup plus clair et simple. À partir de là, nous indiquons essentiellement à l’Arduino : « si l’objet est à x pouces, étends le vérin de x pouces ». Téléverser le code ci-dessous vous permettra d’appliquer ce modèle de distance contrôlée par vérin linéaire à l’un de nos actionneurs PA-04-12-400-HS-24VDC. À l’étape suivante, nous passerons en revue les modifications possibles du code.
[code]
/* The purpose of this code it to be able to measure the distance of an object and position the stroke of a linear acuator accordingly.
* The required components are an Arduion Uno, a PobotPower MegaMoto Driver, and an Ultra sonic sensor.
* Written by Progressive Automations 2/02/21
*/
#define PWMA0 6
#define PWMB0 5
#define enable0 13 //pins for MegaMoto
#define hall0 2 //interrupt pins for hall effect sensors
#define echoPin 7 //echo pin on ultra sonic sensor
#define trigPin 8 //output on ultra sonic sensor
float duration, distance;
int enable = 0; //enable pin for megaMoto
int count[] = {0};
int currentPos = 0;//current position
int threshold = 100;//position tolerance
int destination = 0;
bool forwards = false;
bool backwards = false;// motor states
void setup() {
pinMode(PWMA0, OUTPUT);
pinMode(PWMB0, OUTPUT);//set PWM outputs
pinMode(enable0, OUTPUT);
digitalWrite(enable0, LOW);//set enable and turn board OFF
pinMode(hall0, INPUT);
digitalWrite(hall0, LOW);//set hall, set low to start for rising edge
attachInterrupt(0, speed0, RISING); //enable the hall effect interupts
pinMode(trigPin,OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
//homeActuator();//fully retracts actuator
Serial.println("READY");
}//end setup
void loop() {
getDistance();//measure distance of object from ultra sonic sensor
currentPos = count[0];
if(distance < 13) //ignore value if greater than stroke length
{
destination = distance * 275; //translate measured distance (in inches) to desired stroke position (in pulses)
}
if ((destination >= (currentPos - threshold)) && (destination <= (currentPos + threshold))) stopMoving();//stop acuator if it is in the desired position
else if (destination > currentPos) goForwards();
else if (destination < currentPos) goBackwards();
Serial.print("Counts: "); Serial.println(count[0]);
Serial.print("currentPos: "); Serial.println(currentPos);
Serial.print("Destination: "); Serial.println(destination);
}//end loop
void speed0() {
//Serial.println("Update 1");
if (forwards == true) count[0]++; //if moving forwards, add counts
else if (backwards == true) count[0]--; //if moving back, subtract counts
}//end speed0
/*void ReadInputs() {
sw[0] = digitalRead(switch0), sw[1] = digitalRead(switch1);//check switches
currentPos = count[0];
}//end read inputs
*/
void goForwards()
{
forwards = true;
backwards = false;
//Serial.println("Moving forwards");
digitalWrite(enable0, HIGH);//enable board
//Serial.print(" Speeds "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]);
//Serial.print(" Counts "), Serial.println(count[0]);
analogWrite(PWMA0, 255);
analogWrite(PWMB0, 0);//apply speeds
}//end goForwards
void goBackwards()
{
forwards = false;
backwards = true;
//Serial.println("Moving backwards");
digitalWrite(enable0, HIGH);//enable board
//Serial.print(" Speeds "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]);
//Serial.print(" Counts "), Serial.println(count[0]);
analogWrite(PWMA0, 0);
analogWrite(PWMB0, 255);//apply speeds
}//end goBackwards
void stopMoving()
{
forwards = false;
backwards = false;
Serial.println("Stopped");
analogWrite(PWMA0, 0);
analogWrite(PWMB0, 0);//set speeds to 0
delay(10);
digitalWrite(enable0, LOW);//disable board
}//end stopMoving
void getDistance()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(10);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2/2.5;
Serial.print("Distance:"); Serial.println(distance);
}
void homeActuator() //fully retract actuator and set count to 0
{
goBackwards();
delay(25000);//change this value to the amount of time it takes for the actuator to fully retract
count[0] = {0};
}
[/code]
Étape 3 : Modifier le code
La valeur du seuil détermine à quel point la position de l’actionneur doit correspondre à la lecture du capteur à ultrasons. L’augmenter diminuera la précision, la diminuer aura l’effet inverse. En réglant cette valeur sur 100, nous indiquons essentiellement à l’Arduino de ne pas déplacer l’actionneur tant que les impulsions des capteurs à effet Hall et à ultrasons restent dans une plage de 100 impulsions l’une de l’autre. Si cette valeur est trop basse, l’actionneur peut effectuer des mouvements saccadés fréquents en tentant d’atteindre la position exacte.

Modifiez cette valeur selon la longueur de course de votre vérin (ou d’un pouce de plus). Cela indiquera à l’Arduino d’ignorer les valeurs trop élevées.

Modifiez cette valeur selon le nombre d’impulsions/pouce de votre vérin.

Conclusion
Nous espérons sincèrement que ce projet vous sera utile – ou au moins intéressant ! N’hésitez pas à le modifier et à vous l’approprier. Comme toujours, nous serions ravis de découvrir vos projets associés, que vous repreniez cette idée ou que vous créiez quelque chose de différent avec nos produits ! Vous pouvez aussi nous joindre par e‑mail à sales@progressiveautomations.com et par téléphone au 1‑800‑676‑6123.