Néha, amikor egy projektet létrehozunk egy lineáris aktuátor, egy olyan problémát próbálunk megoldani, amely nem lenne megoldható ezen mechanizmusok által kínált előnyök nélkül. Máskor egy bizonyos feladatot automatizálással próbálunk megkönnyíteni. De időnként azért alkotunk valamit, mert megtehetjük. Ez egy ilyen projekt.
Ebben a cikkben azt vizsgáljuk meg, hogyan használhatunk ultrahangos érzékelőt egy tárgy lineáris aktuátorának távolságának mérésére, és hogyan használhatjuk azt az aktuátor löketének pozíciójának automatikus megváltoztatására. Bár ezt nem valamilyen konkrét alkalmazásra tervezték, a lehetőségek végtelenek.
Íme, amire szükséged lesz
- 1 db RobotPower MegaMoto motorvezető pajzs
- 1 db Arduino Uno
- 1 db Ultrahangos érzékelő
- 1 db PA-04-12-400-HS-24 VDC (bármilyen Hall-effektussal visszacsatolt aktuátor lehet)
- 1 db PS-20-24 (vagy bármilyen 24 VDC tápegység, legalább 6 amperes névleges áramerősséggel)
Vezérléshez Arduino Unót használunk egy MegaMoto motorvezérlővel. Az aktuátorunk a PA-04-12-400-HS-24 VDCFontos, hogy a aktuátor rendelkezik valamilyen visszacsatolással, így az Arduino képes figyelni a pozícióját – bármilyen lineáris aktuátor visszacsatolt vezérlés működhet, például a potenciométeres visszacsatolás is hatékony lenne itt. A potenciométer kevésbé lenne pontos, de az az előnye lenne, hogy áramkimaradás után nem kellene homing eljárást végrehajtani. A kódot is módosítani kellene.
1. lépés: Bekötés

A projekt bekötése nagyon egyszerű. A PA-04-HS két Hall-effektus-érzékelője közül csak az egyiket fogjuk használni – mindegy, hogy melyiket (4-es vagy 5-ös láb). Az alábbi lábkiosztás a PA-04-HS-hez tartozó 6 tűs Molex csatlakozóhoz tartozik:

Aktuátor 6 tűs csatlakozója az Arduino/MegaMoto-hoz
- 3. csatlakozó 5 V-ra
- 2. érintkező a GND-hez
- 1. tű az Arduino 2. tűjéhez
- 4-es csatlakozó az A-hoz a MegaMoton
- 5-ös csatlakozó a B-hez a MegaMoton
Ultrahangos érzékelő Arduino/Megamoto eszközökhöz
- VCC-ről 5 V-ra
- GND-ről GND-re
- Triggerkapcsoló a 8. lábhoz
- Visszhang a 7. lábra
MegaMoto tápegységhez
- +-tól V+-ig
- - V-hez
2. lépés: Az Arduino programozása
A bemutatóban használt kód egy másik bejegyzésben használt kód módosított változata, Hall-effektus-érzékelők 1: PozíciószabályozásVess egy pillantást erre az oktatóanyagra, hogy jobban megértsd, hogyan használjuk a Hall-effektus-érzékelőt pozíciószabályozáshoz! Az ultrahangos érzékelő úgy működik, hogy egy ultrahangos ping-et küld, amelyet az Arduino egyik GPIO-kivezetése vált ki. Ez az ultrahangos ping ezután visszaverődik egy tárgyról, és a vevő érzékeli. Amikor a vevő érzékeli a ping-et, impulzust küld az Arduinonak. Ezen keresztül egy egyenlettel kiszámíthatjuk egy lineáris aktuátor távolságát az adás és a vétel között eltelt idő mérésével, és egy képlet segítségével ezt a mérést hüvelykre válthatjuk.
Az aktuátor pozícióját úgy határozzuk meg, hogy megszámoljuk a Hall-effektus-érzékelő által kiadott impulzusok számát (erről részletesebben a fent említett bejegyzésben olvashat). A löket pozícióját hüvelykben úgy határozhatjuk meg, hogy megtudjuk, hány impulzust ad ki hüvelykenként az adott aktuátor, majd elosztjuk az impulzusszámot ezzel a számmal. Az ultrahangos érzékelő és a Hall-effektus-érzékelő leolvasásának hüvelykre konvertálása sokkal tisztábbá és könnyebbé teszi a kódolást. Ebből kiindulva lényegében azt mondjuk az Arduinonak, hogy „ha az objektum x hüvelyk távolságra van, akkor nyújtsa ki az aktuátort x hüvelyk távolságra”. Az alábbi kód feltöltésével beállíthatja a lineáris aktuátor által vezérelt távolságmodellt az egyik PA-04-12-400-HS-24 VDC aktuátorunkon. A következő lépésben áttekintjük a kódon végrehajtható módosításokat.
[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 hüvelyk); 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]
3. lépés: A kód módosítása
A küszöbérték értéke határozza meg, hogy az aktuátor pozíciója milyen pontosan egyezzen meg az ultrahangos érzékelő által leolvasott értékkel. Növelésével csökken a pontosság, csökkentésével pedig fordított a hatás. Ha ezt az értéket 100-ra állítjuk, lényegében azt mondjuk az Arduinonak, hogy ne mozgassa az aktuátort, amíg a Hall-effektus és az ultrahangos érzékelők impulzusai 100 impulzuson belül vannak egymástól. Ha ez a szám túl alacsony, az az aktuátor gyakori rángatózásait eredményezheti, miközben megpróbálja a pontosan megfelelő pozícióba kerülni.

Változtasd meg ezt az értéket a működtetőd lökethosszára (vagy egy hüvelykkel hosszabbra). Ez arra fogja utasítani az Arduinót, hogy figyelmen kívül hagyja a túl magas értékeket.

Módosítsa ezt az értéket a működtető impulzus/hüvelyk értékére.

Következtetés
Reméljük, hogy hasznosnak – vagy legalább érdekesnek – találod ezt a projektet! Nyugodtan módosítsd, és tedd a sajátoddá. Mint mindig, örömmel látnánk minden kapcsolódó projektedet, akár ezt az ötletet használod, akár valami mást alkotsz a termékeinkből! E-mailben is elérhetsz minket a következő címen: sales@progressiveautomations.com és telefonon az 1-800-676-6123 számon.