Ibland när vi skapar ett projekt med hjälp av en linjär ställdon, vi försöker lösa ett problem som inte skulle kunna lösas utan de fördelar som dessa mekanismer erbjuder. Andra gånger försöker vi göra en viss uppgift enklare genom att automatisera den. Men då och då skapar vi något bara för att vi kan. Detta är ett av de projekten.
I den här artikeln går vi igenom hur du kan använda en ultraljudssensor för att mäta ett objekts linjära ställdonavstånd och använda den för att automatiskt ändra positionen för ställdonets slaglängd. Även om detta inte skapades med någon specifik tillämpning i åtanke är möjligheterna oändliga.
Här är vad du behöver
- 1 st RobotPower MegaMoto Motor Driver Shield
- 1 st Arduino Uno
- 1 st Ultraljudssensor
- 1 st PA-04-12-400-HS-24 VDC (kan vara vilket ställdon som helst med halleffektåterkoppling)
- 1 st PS-20-24 (eller någon annan 24 VDC strömförsörjning klassad för minst 6 ampere)
För styrning använder vi en Arduino Uno med en MegaMoto-motordrivare. Vårt ställdon är PA-04-12-400-HS-24 VDCDet är viktigt att ställdon har någon form av återkoppling så att Arduino kan övervaka sin position – vilken linjär ställdons återkopplingskontroll som helst kan fungera, till exempel skulle potentiometeråterkoppling också vara effektiv här. Potentiometern skulle vara mindre noggrann, men skulle ha fördelen att den inte kräver en heminställningsprocedur efter ett strömavbrott. Koden skulle också behöva modifieras.
Steg 1: Kabeldragning

Kopplingen för det här projektet är mycket enkel. Vi kommer bara att använda en av de två halleffektsensorerna i PA-04-HS här – det spelar ingen roll vilken (pin 4 eller 5). Pinouten nedan är för den 6-poliga Molex-kontakten som medföljer PA-04-HS:

Ställdonets 6-poliga kontakt till Arduino/MegaMoto
- Stift 3 till 5V
- Stift 2 till GND
- Stift 1 till Arduino stift 2
- Stift 4 till A på MegaMoto
- Stift 5 till B på MegaMoto
Ultraljudssensor till Arduino/Megamoto
- VCC till 5V
- Jord till jord
- Trig till stift 8
- Eko till stift 7
MegaMoto till strömförsörjning
- + till V+
- - till V-
Steg 2: Programmering av Arduino
Koden som används i handledningen är en modifierad version av den vi använde i ett annat inlägg, Halleffektsensorer 1: PositionskontrollTa gärna en titt på den här handledningen för att bättre förstå hur vi använder halleffektsensorn för positionskontroll! Ultraljudssensorn fungerar genom att sända ut ett ultraljudsping som utlöses av en av GPIO-pinnarna på Arduinon. Ultraljudspinget reflekteras sedan från ett objekt och detekteras av mottagaren. När mottagaren detekterar pingen skickar den en puls till Arduinon. Genom detta kan vi utföra en ekvation för att beräkna avståndet för ett linjärt ställdon genom att mäta tiden mellan sändning och mottagning, och använda en formel för att omvandla det måttet till tum.
Vi bestämmer ställdonets position genom att räkna antalet pulser som Hall-effektsensorn matar ut (detta beskrivs mer detaljerat i inlägget som nämns ovan). Vi kan bestämma slaglängden i tum genom att ta reda på hur många pulser/tum som matas ut av vårt specifika ställdon och sedan dividera vårt pulsantal med det antalet. Att konvertera avläsningen från ultraljudssensorn och avläsningen från Hall-effektsensorn till tum gör kodningen mycket renare och enklare. Därifrån säger vi i princip till Arduino: "om objektet är x tum bort, förläng ställdonet x tum." Genom att ladda upp koden nedan kan du installera den linjära ställdonets styrda avståndsmodell på ett av våra PA-04-12-400-HS-24 VDC-ställdon. I nästa steg kommer vi att gå igenom modifieringar som kan göras i koden.
[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 tum); 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]
Steg 3: Ändra koden
Tröskelvärdet avgör hur exakt ställdonets position ska matcha ultraljudssensorns avläsning. Att öka det minskar noggrannheten, att minska det får den motsatta effekten. Genom att sätta detta värde på 100 säger vi i princip till Arduino att inte röra ställdonet så länge pulserna från Hall-effekten och ultraljudssensorerna är inom 100 pulser från varandra. Om detta värde är för lågt kan det resultera i att ställdonet rör sig i frekventa ryckiga rörelser när det försöker komma in i exakt rätt position.

Ändra detta värde till slaglängden på ditt ställdon (eller en tum längre). Detta kommer att instruera Arduino att ignorera alla värden som är för höga.

Ändra detta värde till pulser/tum för ditt ställdon.

Slutsats
Vi hoppas innerligt att du finner det här projektet användbart – eller åtminstone intressant! Du får gärna modifiera det och göra det till ditt eget. Som alltid vill vi gärna se om du har några relaterade projekt, oavsett om du använder den här idén eller skapar något annorlunda med våra produkter! Du kan också nå oss via e-post på sales@progressiveautomations.com och per telefon på 1-800-676-6123.