Soms, wanneer we een project maken met een lineaire actuator, proberen we een probleem op te lossen dat zonder de voordelen die deze mechanismen bieden niet opgelost zou kunnen worden. Andere keren proberen we een bepaalde taak te vereenvoudigen door deze te automatiseren. Maar zo nu en dan bouwen we iets gewoon omdat het kan. Dit is zo’n project.
In dit artikel laten we zien hoe u een ultrasone sensor kunt gebruiken om de afstand van een object te meten en die te gebruiken om de positie binnen de slag van de actuator automatisch te veranderen. Hoewel dit niet met een specifieke toepassing in gedachten is gemaakt, zijn de mogelijkheden eindeloos.
Dit heeft u nodig
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Ultrasone sensor
- 1 x PA-04-12-400-HS-24VDC (kan elke actuator met Hall‑effect-terugkoppeling zijn)
- 1 x PS-20-24 (of een 24 VDC‑voeding met een minimale nominale waarde van 6 A)
Voor de besturing gebruiken we een Arduino Uno met een MegaMoto‑motordriver. Onze actuator is de PA-04-12-400-HS-24VDC. Het is belangrijk dat de actuator een vorm van terugkoppeling heeft, zodat de Arduino de positie kan bewaken – elke terugkoppelingsoplossing voor een lineaire actuator kan werken; bijvoorbeeld terugkoppeling via een potentiometer is hier ook effectief. De potentiometer is minder nauwkeurig, maar heeft als voordeel dat na een stroomuitval geen referentieprocedure nodig is. De code moet dan ook worden aangepast.
Stap 1: Bekabeling

De bekabeling voor dit project is zeer eenvoudig. We gebruiken hier slechts één van de twee Hall‑effectsensoren in de PA‑04‑HS – het maakt niet uit welke (pin 4 of 5). De onderstaande pinout is voor de 6‑polige Molex‑Connector die bij de PA‑04‑HS wordt geleverd:

6‑polige Connector van de actuator naar Arduino/MegaMoto
- Pin 3 naar 5V
- Pin 2 naar GND
- Pin 1 naar Arduino‑pin 2
- Pin 4 naar A op de MegaMoto
- Pin 5 naar B op de MegaMoto
Ultrasone sensor naar Arduino/Megamoto
- VCC naar 5V
- GND naar GND
- Trig naar pin 8
- Echo naar pin 7
MegaMoto naar voeding
- + naar V+
- - naar V-
Stap 2: De Arduino programmeren
De code in deze tutorial is een aangepaste versie van wat we in een andere post gebruikten, Hall‑effectsensoren 1: Positieregeling. Bekijk gerust die tutorial om beter te begrijpen hoe we de Hall‑effectsensor gebruiken voor positieregeling! De ultrasone sensor werkt door een ultrasone ping te verzenden die wordt geactiveerd door een van de GPIO‑pinnen op de Arduino. Die ultrasone ping wordt vervolgens weerkaatst door een object en gedetecteerd door de ontvanger. Wanneer de ontvanger de ping detecteert, stuurt hij een puls naar de Arduino. Hiermee kunnen we een vergelijking uitvoeren om de afstand voor een lineaire actuator te berekenen door de tijd tussen zenden en ontvangen te meten, en een formule te gebruiken om die meting om te zetten naar inches.
De positie van de actuator bepalen we door het aantal pulsen te tellen dat door de Hall‑effectsensor wordt uitgegeven (dit wordt uitgebreider beschreven in de eerder genoemde post). We kunnen de slagpositie in inches bepalen door te achterhalen hoeveel pulsen per inch onze specifieke actuator uitgeeft en vervolgens onze pulstellingen door dat aantal te delen. Als zowel de meting van de ultrasone sensor als die van de Hall‑effectsensor naar inches zijn omgerekend, wordt het coderen veel overzichtelijker en eenvoudiger. Van daaruit zeggen we in feite tegen de Arduino: ‘als het object x inch ver weg is, schuif de actuator x inch uit’. Door de onderstaande code te uploaden kunt u het afstandsmodel met lineaire actuatorbesturing toepassen op een van onze PA‑04‑12‑400‑HS‑24VDC‑actuators. In de volgende stap bespreken we aanpassingen die in de code kunnen worden gedaan.
[code]
/* Het doel van deze code is om de afstand van een object te meten en de slag van een lineaire actuator overeenkomstig te positioneren.
* De benodigde componenten zijn een Arduino Uno, een PobotPower MegaMoto-driver en een ultrasone sensor.
* Geschreven door Progressive Automations 2/02/21
*/
#define PWMA0 6
#define PWMB0 5
#define enable0 13 //pinnen voor MegaMoto
#define hall0 2 //interruptpinnen voor Hall-effectsensoren
#define echoPin 7 //echopin op ultrasone sensor
#define trigPin 8 //uitgang op ultrasone sensor
float duration, distance;
int enable = 0; //enable‑pin voor MegaMoto
int count[] = {0};
int currentPos = 0;//huidige positie
int threshold = 100;//positietolerantie
int destination = 0;
bool forwards = false;
bool backwards = false;// motorstaten
void setup() {
pinMode(PWMA0, OUTPUT);
pinMode(PWMB0, OUTPUT);//PWM‑uitgangen instellen
pinMode(enable0, OUTPUT);
digitalWrite(enable0, LOW);//enable instellen en board UIT
pinMode(hall0, INPUT);
digitalWrite(hall0, LOW);//hall instellen, laag om te starten voor de stijgende flank
attachInterrupt(0, speed0, RISING); //Hall‑effect‑interrupts inschakelen
pinMode(trigPin,OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
//homeActuator();//trekt actuator volledig in
Serial.println("GEREED");
}//einde setup
void loop() {
getDistance();//afstand van object via ultrasone sensor meten
currentPos = count[0];
if(distance < 13) //waarde negeren als deze groter is dan de slaglengte
{
destination = distance * 275; //gemeten afstand (in inches) omzetten naar gewenste slagpositie (in pulsen)
}
if ((destination >= (currentPos - threshold)) && (destination <= (currentPos + threshold))) stopMoving();//actuator stoppen als hij in de gewenste positie staat
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);
}//einde loop
void speed0() {
//Serial.println("Update 1");
if (forwards == true) count[0]++; //als we vooruit bewegen, tellen we op
else if (backwards == true) count[0]--; //als we achteruit bewegen, trekken we af
}//einde speed0
/*void ReadInputs() {
sw[0] = digitalRead(switch0), sw[1] = digitalRead(switch1);//schakelaars controleren
currentPos = count[0];
}//einde read inputs
*/
void goForwards()
{
forwards = true;
backwards = false;
//Serial.println("Vooruit bewegen");
digitalWrite(enable0, HIGH);//board inschakelen
//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);//snelheden toepassen
}//einde goForwards
void goBackwards()
{
forwards = false;
backwards = true;
//Serial.println("Achteruit bewegen");
digitalWrite(enable0, HIGH);//board inschakelen
//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);//snelheden toepassen
}//einde goBackwards
void stopMoving()
{
forwards = false;
backwards = false;
Serial.println("Gestopt");
analogWrite(PWMA0, 0);
analogWrite(PWMB0, 0);//snelheden op 0 zetten
delay(10);
digitalWrite(enable0, LOW);//board uitschakelen
}//einde 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("Afstand:"); Serial.println(distance);
}
void homeActuator() //actuator volledig intrekken en teller op 0 zetten
{
goBackwards();
delay(25000);//wijzig deze waarde naar de tijd die de actuator nodig heeft om volledig in te trekken
count[0] = {0};
}
[/code]
Stap 3: De code aanpassen
De waarde van threshold bepaalt hoe nauwkeurig de positie van de actuator moet overeenkomen met de meting van de ultrasone sensor. Verhogen vermindert de nauwkeurigheid, verlagen heeft het omgekeerde effect. Door deze waarde op 100 te zetten, vertellen we de Arduino in feite de actuator niet te verplaatsen zolang de pulsen van de Hall‑effect- en ultrasone sensoren binnen 100 pulsen van elkaar liggen. Als dit getal te laag is, kan dit ertoe leiden dat de actuator vaak schokkerige bewegingen maakt terwijl hij probeert de exact juiste positie te bereiken.

Wijzig deze waarde naar de Slaglengte van uw actuator (of een inch langer). Dit vertelt de Arduino om waarden die te hoog zijn te negeren.

Wijzig deze waarde naar de pulsen per inch van uw actuator.

Conclusie
We hopen oprecht dat u dit project nuttig – of op zijn minst interessant – vindt! Voel u vrij om dit aan te passen en er uw eigen draai aan te geven. Zoals altijd zien we graag gerelateerde projecten die u heeft, of u deze aanpak nu gebruikt of iets anders creëert met onze producten! U kunt ons ook per e‑mail bereiken via sales@progressiveautomations.com en telefonisch via 1-800-676-6123.