How to Control Your Actuator Using an Ultra-Sonic Sensor

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

Josh Nigh
Josh Nigh
PA Engineer

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.

Passez au niveau supérieur pour le contrôle de votre vérin linéaire avec nos microcontrôleurs Arduino !

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

 

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

Étape 1 : Câblage du vérin

 

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

 

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.

Étape 3 : Modifier le code

 

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.

 

Notre PA-04-HS intègre un capteur à effet Hall !

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.