How to Control Your Actuator Using an Ultra-Sonic Sensor

Kako krmiliti svoj aktuator z ultrazvočnim senzorjem

Josh Nigh
Josh Nigh
PA Engineer

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.

Dvignite krmiljenje svojega linearnega aktuatorja na višjo raven z našimi mikrokrmilniki Arduino!

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

 

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

Korak 1: Ožičenje aktuatorja

 

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

 

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.

Korak 3: Spreminjanje kode

 

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.

 

Naš PA-04-HS ima vgrajen senzor Hallovega učinka!

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.