Někdy, když vytváříme projekt pomocí lineární aktuátor, snažíme se vyřešit problém, který by nebylo možné vyřešit bez výhod, které tyto mechanismy nabízejí. Jindy se snažíme určitý úkol usnadnit jeho automatizací. Ale čas od času něco vytvoříme, jen proto, že to můžeme. Toto je jeden z takových projektů.
V tomto článku si probereme, jak můžete pomocí ultrazvukového senzoru měřit lineární vzdálenost aktuátoru od objektu a jak jej použít k automatické změně polohy zdvihu aktuátoru. I když tento článek nebyl vytvořen s ohledem na žádnou konkrétní aplikaci, možnosti jsou nekonečné.
Zde je to, co budete potřebovat
- 1x Štít ovladače motoru RobotPower MegaMoto
- 1x Arduino Uno
- 1x Ultrazvukový senzor
- 1x PA-04-12-400-HS-24 VDC (může to být jakýkoli aktuátor se zpětnou vazbou založenou na Hallově efektu)
- 1x PS-20-24 (nebo jakýkoli zdroj napájení 24 VDC s jmenovitým proudem alespoň 6 ampérů)
Pro ovládání používáme Arduino Uno s ovladačem motoru MegaMoto. Náš aktuátor je PA-04-12-400-HS-24 VDCJe důležité, aby pohon má nějaký druh zpětné vazby, aby Arduino mohlo monitorovat svou polohu – fungovat může jakékoli řízení zpětné vazby lineárního aktuátoru, například zpětná vazba z potenciometru by zde byla také účinná. Potenciometr by byl méně přesný, ale měl by tu výhodu, že po výpadku napájení nevyžaduje provedení procedury návratu do výchozí polohy. Kód by také bylo třeba upravit.
Krok 1: Zapojení

Zapojení pro tento projekt je velmi jednoduché. Použijeme zde pouze jeden ze dvou Hallových senzorů v PA-04-HS – nezáleží na tom, který (pin 4 nebo 5). Níže uvedené zapojení pinů je pro 6pinový konektor Molex, který je součástí PA-04-HS:

6pinový konektor aktuátoru k Arduinu/MegaMoto
- Pin 3 až 5V
- Pin 2 k GND
- Pin 1 k pinu 2 Arduina
- Pin 4 na A na MegaMoto
- Pin 5 na B na MegaMoto
Ultrazvukový senzor pro Arduino/Megamoto
- VCC až 5V
- GND k GND
- Spouštění na pin 8
- Echo na pin 7
MegaMoto k napájení
- + až V+
- - do V-
Krok 2: Programování Arduina
Kód použitý v tutoriálu je upravenou verzí kódu, který jsme použili v jiném příspěvku, Hallovy senzory 1: Řízení polohyNeváhejte se podívat na tento tutoriál, abyste lépe pochopili, jak používáme Hallův senzor pro řízení polohy! Ultrazvukový senzor funguje tak, že vysílá ultrazvukový ping, který je spuštěn jedním z GPIO pinů na Arduinu. Tento ultrazvukový ping se poté odrazí od objektu a detekuje ho přijímač. Když přijímač ping detekuje, vyšle impuls do Arduina. Díky tomu můžeme sestavit rovnici pro výpočet vzdálenosti lineárního aktuátoru změřením doby mezi vysláním a příjmem a pomocí vzorce převést toto měření na palce.
Polohu aktuátoru určujeme počítáním počtu pulzů vydaných Hallovým senzorem (to je podrobněji popsáno ve výše uvedeném příspěvku). Polohu zdvihu v palcích můžeme určit tak, že zjistíme, kolik pulzů/palec vydá náš konkrétní aktuátor, a poté vydělíme počet pulzů tímto číslem. Převedení hodnoty z ultrazvukového senzoru a hodnoty z Hallova senzoru na palce značně usnadňuje a zjednodušuje kódování. V podstatě říkáme Arduinu: „Pokud je objekt vzdálen x palců, vysuňte aktuátor o x palců.“ Nahráním níže uvedeného kódu budete moci nainstalovat model lineárního aktuátoru s řízenou vzdáleností do jednoho z našich aktuátorů PA-04-12-400-HS-24 VDC. V dalším kroku si probereme úpravy, které lze v kódu provést.
[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 palce); 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 prahové hodnoty určuje, jak přesně by se měla poloha aktuátoru shodovat s údaji ultrazvukového senzoru. Zvýšením se sníží přesnost, snížením se bude mít opačný účinek. Nastavením této hodnoty na 100 v podstatě říkáme Arduinu, aby nepohyboval aktuátorem, dokud se pulzy Hallova jevu a ultrazvukového senzoru nacházejí v rozmezí 100 pulzů od sebe. Příliš nízká hodnota může vést k častým trhavým pohybům aktuátoru při snaze dostat se do přesně správné polohy.

Změňte tuto hodnotu na délku zdvihu vašeho aktuátoru (nebo o palec delší). Tím Arduinu řeknete, aby ignoroval jakékoli příliš vysoké hodnoty.

Změňte tuto hodnotu na počet pulzů/palec vašeho aktuátoru.

Závěr
Upřímně doufáme, že vám tento projekt přijde užitečný – nebo alespoň zajímavý! Neváhejte jej upravit a přizpůsobit si ho. Jako vždy bychom rádi viděli jakékoli vaše související projekty, ať už tento nápad využijete, nebo s našimi produkty vytvoříte něco jiného! Můžete nás také kontaktovat e-mailem na adrese sales@progressiveautomations.com a telefonicky na čísle 1-800-676-6123.