Parfois, lorsque nous créons un projet utilisant un actionneur linéaire , nous cherchons à résoudre un problème impossible à résoudre sans les avantages de ces mécanismes. D'autres fois, nous cherchons à simplifier une tâche en l'automatisant. Mais de temps à autre, nous créons quelque chose simplement parce que nous le pouvons. Ce projet est l'un de ces projets.
Dans cet article, nous verrons comment utiliser un capteur à ultrasons pour mesurer la distance linéaire d'un objet et modifier automatiquement la position de la course de l'actionneur. Bien que ce capteur n'ait pas été conçu pour une application spécifique, les possibilités sont infinies.
Voici ce dont vous aurez besoin
- 1 x bouclier de pilote de moteur RobotPower MegaMoto
- 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 24 V CC d'une capacité d'au moins 6 ampères)
Pour le contrôle, nous utilisons un Arduino Uno avec un pilote de moteur MegaMoto. Notre actionneur est le PA-04-12-400-HS-24VDC . Il est important que l' actionneur dispose d'un système de rétroaction pour que l'Arduino puisse surveiller sa position. N'importe quel système de rétroaction d'actionneur linéaire peut fonctionner, par exemple un potentiomètre. Le potentiomètre serait moins précis, mais aurait l'avantage de ne pas nécessiter de retour à la position initiale après une coupure de courant. Le code devrait é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 de l'actionneur vers Arduino/MegaMoto
- Broche 3 à 5 V
- Broche 2 à GND
- Broche 1 vers broche 2 de l'Arduino
- Broche 4 à A sur la MegaMoto
- Broche 5 à B sur la MegaMoto
Capteur à ultrasons pour Arduino/Megamoto
- VCC à 5 V
- GND à GND
- Trigonométrie vers la broche 8
- Écho à la broche 7
MegaMoto vers l'alimentation électrique
- + à V+
- - à V-
Étape 2 : Programmation de l'Arduino
Le code utilisé dans ce tutoriel est une version modifiée de celui utilisé dans un autre article, Capteurs à effet Hall 1 : Contrôle de position . N'hésitez pas à consulter ce tutoriel pour mieux comprendre comment utiliser le capteur à effet Hall pour le contrôle de position ! Le capteur à ultrasons fonctionne en émettant un signal ultrasonique déclenché par l'une des broches GPIO de l'Arduino. Ce signal ultrasonique est ensuite 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 à cela, nous pouvons calculer la distance d'un actionneur linéaire en mesurant le temps entre l'émission et la réception, et 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 (ce point est décrit plus en détail dans l'article mentionné ci-dessus). La position de la course en pouces est déterminée en calculant le nombre d'impulsions/pouce émises par notre actionneur, puis en divisant le nombre d'impulsions par ce nombre. La conversion en pouces des valeurs du capteur à ultrasons et du capteur à effet Hall simplifie et clarifie le codage. En résumé, nous indiquons à l'Arduino : « Si l'objet est à x pouces, étendez l'actionneur de x pouces. » Le téléchargement du code ci-dessous vous permettra d'appliquer le modèle de distance contrôlée par l'actionneur linéaire à l'un de nos actionneurs PA-04-12-400-HS-24VDC. L'étape suivante abordera les modifications possibles du code.
[code]
/* Le but de ce code est de pouvoir mesurer la distance d'un objet et de positionner la course d'un actionneur linéaire en conséquence.
* Les composants requis sont un Arduion Uno, un pilote PobotPower MegaMoto et un capteur à ultrasons.
* Écrit par Progressive Automations le 02/02/21
*/
#define PWMA0 6
#define PWMB0 5
#define activate0 13 //broches pour MegaMoto
#define hall0 2 //broches d'interruption pour les capteurs à effet Hall
#define echoPin 7 //broche d'écho sur le capteur à ultrasons
#define trigPin 8 //sortie sur capteur à ultrasons
durée du flotteur, distance ;
int enable = 0; //activer le code PIN pour megaMoto
int count[] = {0};
int currentPos = 0;//position actuelle
int seuil = 100 ;//tolérance de position
int destination = 0;
bool forwards = faux ;
bool backwards = false;// états du moteur
void setup() {
pinMode(PWMA0, SORTIE);
pinMode(PWMB0, OUTPUT);//définir les sorties PWM
pinMode(enable0, SORTIE);
digitalWrite(enable0, LOW);//activer et désactiver la carte
pinMode(hall0, ENTRÉE);
digitalWrite(hall0, LOW);//définir hall, définir bas pour démarrer le front montant
attachInterrupt(0, speed0, RISING); // activer les interruptions à effet Hall
pinMode(trigPin,OUTPUT);
pinMode(echoPin, ENTRÉE);
Serial.begin(9600);
//homeActuator();//rétracte complètement l'actionneur
Serial.println("PRÊT");
}//fin de la configuration
boucle vide() {
getDistance();//mesure la distance de l'objet à partir du capteur à ultrasons
currentPos = count[0];
si(distance < 13) //ignorer la valeur si elle est supérieure à la longueur du trait
{
destination = distance * 275 ; // traduire la distance mesurée (en pouces) à la position de course souhaitée (en impulsions)
}
si ((destination >= (currentPos - seuil)) && (destination <= (currentPos + seuil))) stopMoving();//arrêter l'actionneur s'il est dans la position souhaitée
sinon si (destination > currentPos) goForwards();
sinon si (destination < currentPos) goBackwards();
Serial.print("Comptes : "); Serial.println(compte[0]);
Serial.print("currentPos: "); Serial.println(currentPos);
Serial.print("Destination : "); Serial.println(destination);
}//fin de boucle
void speed0() {
//Serial.println("Mise à jour 1");
si (avant == vrai) count[0]++; //si on avance, ajouter counts
sinon si (en arrière == vrai) count[0]--; //en cas de recul, soustraire les comptes
}//fin vitesse0
/*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 = vrai;
vers l'arrière = faux;
//Serial.println("Avancer");
digitalWrite(enable0, HIGH);//activer 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);//appliquer les vitesses
}//fin de goForwards
void goBackwards()
{
forwards = faux;
en arrière = vrai;
//Serial.println("Reculer");
digitalWrite(enable0, HIGH);//activer 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);//appliquer les vitesses
}//fin de goBackwards
void stopMoving()
{
forwards = faux;
vers l'arrière = faux;
Serial.println("Arrêté");
analogWrite(PWMA0, 0);
analogWrite(PWMB0, 0);//définir les vitesses à 0
délai(10);
digitalWrite(enable0, LOW);//désactiver la carte
}//fin d'arrêtDéplacement
void getDistance()
{
digitalWrite(trigPin, BAS);
delayMicroseconds(10);
digitalWrite(trigPin, HAUT);
delayMicroseconds(10);
digitalWrite(trigPin, BAS);
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 définir le nombre à 0
{
allerEnRetour();
delay(25000);//modifiez cette valeur en fonction du temps nécessaire à l'actionneur pour se rétracter complètement
compte[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 mesure du capteur à ultrasons. L'augmenter diminue la précision, tandis que la diminuer a l'effet inverse. En définissant cette valeur à 100, nous indiquons à l'Arduino de ne pas déplacer l'actionneur tant que les impulsions des capteurs à effet Hall et à ultrasons sont espacées de moins de 100 impulsions. Un seuil trop bas peut entraîner des mouvements saccadés de l'actionneur pour atteindre la position exacte.

Modifiez cette valeur en fonction de la course de votre actionneur (ou d'un pouce de plus). Cela indiquera à l'Arduino d'ignorer toute valeur trop élevée.

Modifiez cette valeur en impulsions/pouce de votre actionneur.

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 similaires, que vous utilisiez cette idée ou que vous créiez quelque chose de différent avec nos produits ! Vous pouvez également nous contacter par courriel à sales@progressiveautomations.com ou par téléphone au 1-800-676-6123.