Včasih, ko ustvarjamo projekt z linearnim aktuatorjem, poskušamo rešiti težavo, ki je brez prednosti, ki jih ti mehanizmi ponujajo, ne bi bilo mogoče rešiti. Drugič želimo določeno nalogo olajšati z avtomatizacijo. A tu in tam nekaj ustvarimo preprosto zato, ker lahko. To je eden od takih projektov.
V tem članku bomo pokazali, kako lahko uporabite ultrazvočni senzor za merjenje razdalje aktuatorja do objekta in to uporabite za samodejno spreminjanje položaja hoda aktuatorja. Čeprav to ni bilo ustvarjeno z določeno aplikacijo v mislih, so možnosti neskončne.
Kaj boste potrebovali
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Ultrazvočni senzor
- 1 x PA-04-12-400-HS-24VDC (lahko je kateri koli aktuator s povratno zvezo Hallovega učinka)
- 1 x PS-20-24 (ali kateri koli napajalnik 24VDC z nazivom vsaj 6 A)
Za krmiljenje uporabljamo Arduino Uno z gonilnikom motorja MegaMoto. Naš aktuator je PA-04-12-400-HS-24VDC. Pomembno je, da ima aktuator neko vrsto povratne zveze, da lahko Arduino spremlja njegov položaj – deluje katerikoli nadzor linearnega aktuatorja s povratno zvezo; na primer učinkovita bi bila tudi povratna zveza potenciometra. Potenciometer bi bil manj natančen, vendar bi imel prednost, da po izpadu napajanja ne bi bilo treba izvesti postopka referenciranja. Kodo bi bilo treba tudi prilagoditi.
Korak 1: Ožičenje

Ožičenje za ta projekt je zelo preprosto. Tukaj bomo uporabili le enega od dveh senzorjev Hallovega učinka v PA-04-HS – ni pomembno katerega (pin 4 ali 5). Spodnja razporeditev pinov velja za 6-polni Molex konektor, ki je priložen PA-04-HS:

6-polni konektor aktuatorja na Arduino/MegaMoto
- Pin 3 na 5V
- Pin 2 na GND
- Pin 1 na pin 2 na Arduinu
- Pin 4 na A na MegaMoto
- Pin 5 na B na MegaMoto
Ultrazvočni senzor na Arduino/MegaMoto
- VCC na 5V
- GND na GND
- Trig na pin 8
- Echo na pin 7
MegaMoto na napajalnik
- + na V+
- - na V-
Korak 2: Programiranje Arduina
Koda, uporabljena v vodiču, je spremenjena različica tiste, ki smo jo uporabili v drugi objavi, Hallovi senzorji 1: Krmiljenje položaja. Vabimo vas, da si ogledate ta vodič, da bolje razumete, kako uporabljamo senzor Hallovega učinka za krmiljenje položaja! Ultrazvočni senzor deluje tako, da pošlje ultrazvočni ping, ki ga sproži eden od GPIO pinov na Arduinu. Ta ultrazvočni ping se nato odbije od objekta in ga zazna sprejemnik. Ko sprejemnik zazna ping, pošlje pulz Arduinu. Na ta način lahko z izračunom časa med oddajo in sprejemom izračunamo razdaljo za linearni aktuator ter s formulo to meritev pretvorimo v palce.
Položaj aktuatorja določimo tako, da štejemo število impulzov, ki jih odda senzor Hallovega učinka (to je podrobneje opisano v zgoraj omenjeni objavi). Položaj hoda v palcih lahko določimo tako, da ugotovimo, koliko impulzov na palec odda naš specifični aktuator, nato pa naš števec impulzov delimo s to številko. Če sta branje z ultrazvočnega senzorja in branje s senzorja Hallovega učinka obe pretvorjeni v palce, je kodiranje precej bolj čisto in enostavno. Od tam v bistvu Arduinu rečemo: »Če je objekt oddaljen x palcev, raztegni aktuator za x palcev.« Nalaganje spodnje kode vam omogoča uveljavitev modela, pri katerem linearni aktuator sledi izmerjeni razdalji, na enega od naših aktuatorjev PA-04-12-400-HS-24VDC. V naslednjem koraku bomo pregledali možne spremembe kode.
[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]
Korak 3: Spreminjanje kode
Vrednost threshold določa, kako natančno naj se položaj aktuatorja ujema z odčitkom ultrazvočnega senzorja. Njeno povečanje bo zmanjšalo natančnost, zmanjšanje pa bo imelo nasproten učinek. Če je ta vrednost nastavljena na 100, v bistvu Arduinu povemo, naj ne premika aktuatorja, dokler sta impulza senzorja Hallovega učinka in ultrazvočnega senzorja znotraj 100 impulzov drug od drugega. Če je ta številka prenizka, lahko povzroči, da se aktuator pogosto sunkovito premika, ko poskuša doseči točen položaj.

To vrednost spremenite na dolžino hoda vašega aktuatorja (ali za en palec več). S tem boste Arduinu povedali, naj ignorira vrednosti, ki so previsoke.

To vrednost spremenite na število impulzov na palec vašega aktuatorja.

Zaključek
Iskreno upamo, da vam bo ta projekt koristen – ali vsaj zanimiv! Prosimo, brez zadržkov ga prilagodite in naredite po svoje. Kot vedno bi z veseljem videli vse povezane projekte, ki jih imate, ne glede na to, ali uporabite to idejo ali z našimi izdelki ustvarite nekaj povsem drugega! Z nami se lahko povežete tudi po e-pošti na sales@progressiveautomations.com ali po telefonu na 1-800-676-6123.