How to Control Your Actuator Using an Ultra-Sonic Sensor

Ako ovládať svoj aktuátor pomocou ultrazvukového senzora

Josh Nigh
Josh Nigh
PA Engineer

Niekedy, keď vytvárame projekt s lineárnym aktuátorom, snažíme sa vyriešiť problém, ktorý by bez výhod, ktoré tieto mechanizmy ponúkajú, nebolo možné vyriešiť. Inokedy sa snažíme určitú úlohu zjednodušiť jej automatizovaním. No občas niečo vytvoríme len preto, že môžeme. Toto je jeden z takých projektov.

Posuňte ovládanie svojho lineárneho aktuátora na vyššiu úroveň s našimi mikrokontrolérmi Arduino!

V tomto článku si ukážeme, ako môžete použiť ultrazvukový senzor na meranie vzdialenosti k objektu a podľa nej automaticky meniť polohu zdvihu aktuátora. Hoci sme to nevytvárali s konkrétnou aplikáciou v mysli, možnosti sú nekonečné.

 

Čo budete potrebovať

 

Na riadenie používame Arduino Uno s motorovým driverom MegaMoto. Náš aktuátor je PA-04-12-400-HS-24VDC. Je dôležité, aby mal aktuátor nejakú formu spätnej väzby, aby Arduino vedelo sledovať jeho polohu – fungovať môže akákoľvek spätná väzba lineárneho aktuátora; napríklad spätná väzba z potenciometra by tu bola tiež účinná. Potenciometer bude menej presný, ale má výhodu, že po výpadku napájania nevyžaduje vykonať referencovanie. Kód by bolo potrebné upraviť.

 

Krok 1: Zapojenie

Krok 1: Zapojenie aktuátora

 

Zapojenie pre tento projekt je veľmi jednoduché. Budeme využívať len jeden z dvoch Hallových senzorov v PA-04-HS – nezáleží na tom, ktorý (pin 4 alebo 5). Nižšie uvedené rozloženie pinov platí pre 6-pinový konektor Molex, ktorý je súčasťou PA-04-HS:

6-pinový konektor aktuátora k Arduino/MegaMoto

 

6-pinový konektor aktuátora k Arduino/MegaMoto

  • Pin 3 na 5 V
  • Pin 2 na GND
  • Pin 1 na pin 2 Arduina
  • Pin 4 na A na MegaMoto
  • Pin 5 na B na MegaMoto

 

Ultrazvukový senzor k Arduino/Megamoto

  • VCC na 5 V
  • GND na GND
  • Trig na pin 8
  • Echo na pin 7

 

MegaMoto k napájaciemu zdroju

  • + na V+
  • - na V-

 

Krok 2: Programovanie Arduina

Kód použitý v tomto návode je upravená verzia toho, čo sme použili v inom príspevku, Hall Effect Sensors 1: Position Control. Kľudne si ho pozrite, aby ste lepšie pochopili, ako používame Hallov senzor na riadenie polohy! Ultrazvukový senzor funguje tak, že vysiela ultrazvukový ping, ktorý je spúšťaný jedným z GPIO pinov na Arduine. Tento ultrazvukový ping sa odrazí od objektu a prijímač ho deteguje. Keď prijímač ping zachytí, vyšle impulz do Arduina. Vďaka tomu môžeme vypočítať vzdialenosť pre lineárny aktuátor meraním času medzi vyslaním a prijatím a prepočtom tejto hodnoty na palce pomocou vzorca.

Polohu aktuátora určujeme počítaním počtu impulzov, ktoré generuje Hallov senzor (to je podrobnejšie popísané v príspevku uvedenom vyššie). Polohu zdvihu v palcoch zistíme tak, že zistíme, koľko pulzov/palec dáva náš konkrétny aktuátor, a potom náš počet pulzov vydelíme týmto číslom. Keď sú údaje z ultrazvukového senzora aj z Hallovho senzora prepočítané na palce, kódovanie je oveľa čistejšie a jednoduchšie. Odtiaľ Arduinu v podstate hovoríme: „ak je objekt vzdialený x palcov, vysuň aktuátor o x palcov.“ Nahratie nižšie uvedeného kódu vám umožní uplatniť model riadenia vzdialenosti lineárneho aktuátora na jeden z našich aktuátorov PA-04-12-400-HS-24VDC. V ďalšom kroku si prejdeme úpravy, ktoré možno v kóde vykonať.

[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]

Krok 3: Úprava kódu

Hodnota threshold určuje, ako presne sa má poloha aktuátora zhodovať s údajom z ultrazvukového senzora. Zvýšenie ju zníži presnosť, zníženie bude mať opačný efekt. Keď je táto hodnota nastavená na 100, v podstate hovoríme Arduinu, aby aktuátor nepohybovalo, pokiaľ sú pulzy z Hallovho a ultrazvukového senzora v rámci 100 pulzov od seba. Ak je toto číslo príliš nízke, môže to viesť k častým trhavým pohybom aktuátora, keď sa snaží dosiahnuť presnú polohu.

Krok 3: Úprava kódu

 

Zmeňte túto hodnotu na dĺžku zdvihu vášho aktuátora (alebo o jeden palec dlhšiu). Týmto dáte Arduinu pokyn ignorovať hodnoty, ktoré sú príliš vysoké.

 

Zmeňte túto hodnotu na počet pulzov/palec vášho aktuátora.

 

Náš PA-04-HS má vstavaný Hallov senzor!

Záver

Úprimne veríme, že tento projekt pre vás bude užitočný – alebo aspoň zaujímavý! Kľudne si ho upravte a prispôsobte podľa seba. Ako vždy, radi uvidíme akékoľvek súvisiace projekty, či už využijete tento nápad, alebo vytvoríte niečo iné s našimi produktmi! Kontaktovať nás môžete e‑mailom na sales@progressiveautomations.com a telefonicky na 1-800-676-6123.