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.
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ť
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Ultrazvukový senzor
- 1 x PA-04-12-400-HS-24VDC (môže to byť akýkoľvek aktuátor so spätnou väzbou z Hallovho senzora)
- 1 x PS-20-24 (alebo akýkoľvek napájací zdroj 24 VDC s menovitým prúdom aspoň 6 A)
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

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
- 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.

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.

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.