לפעמים כשאנחנו יוצרים פרויקט באמצעות מפעיל ליניארי, אנחנו מנסים לפתור בעיה שלא ניתן היה לפתור אותה ללא היתרונות שמציעים מנגנונים אלה. פעמים אחרות, אנחנו מנסים להקל על משימה מסוימת על ידי אוטומציה שלה. אבל מדי פעם, אנחנו ניצור משהו רק כי אנחנו יכולים. זה אחד מאותם פרויקטים.
במאמר זה, נסקור כיצד ניתן להשתמש בחיישן אולטרסאונד כדי למדוד את מרחק המפעיל הליניארי של אובייקט ולהשתמש בו כדי לשנות באופן אוטומטי את מיקום מהלך המפעיל. אמנם זה לא נוצר עם יישום ספציפי כלשהו, אך האפשרויות הן אינסופיות.
הנה מה שתצטרכו
- 1 x מגן נהג מנוע RobotPower MegaMoto
- 1 x ארדואינו אונו
- 1 x חיישן אולטרה-סוני
- 1 x PA-04-12-400-HS-24 וולט DC (יכול להיות כל מפעיל עם משוב אפקט הול)
- 1 x PS-20-24 (או כל ספק כוח של 24 וולט DC המדורג לפחות ל-6 אמפר)
לצורך בקרה, אנו משתמשים בארדואינו אונו עם דרייבר מנוע MegaMoto. המפעיל שלנו הוא ה... PA-04-12-400-HS-24 וולט DCחשוב ש- מַפעִיל יש לו סוג של משוב כך שהארדואינו מסוגל לנטר את מיקומו - כל בקרת משוב של מפעיל ליניארי יכולה לעבוד, לדוגמה משוב פוטנציומטר יהיה יעיל גם כאן. הפוטנציומטר יהיה פחות מדויק, אך יהיה לו יתרון בכך שלא ידרוש הליך כיוון בית לאחר הפסקת חשמל. יהיה צורך גם לשנות את הקוד.
שלב 1: חיווט

החיווט עבור פרויקט זה פשוט מאוד. נשתמש כאן רק באחד משני חיישני אפקט הול ב-PA-04-HS - לא משנה איזה מהם (פין 4 או 5). הגדרת הפינים שלהלן היא עבור מחבר Molex בעל 6 פינים שמגיע עם ה-PA-04-HS:

מחבר 6 פינים של המפעיל לארדואינו/מגה מוטו
- פין 3 עד 5V
- פין 2 ל-GND
- פין 1 לפין 2 של ארדואינו
- פין 4 ל-A במגה-מוטו
- פין 5 ל-B במגה-מוטו
חיישן אולטרה-סוני לארדואינו/מגה-מוטו
- VCC ל-5V
- GND ל-GND
- טריג לפין 8
- הד לפין 7
מגה-מוטו לספק כוח
- + ל-V+
- - ל-V-
שלב 2: תכנות הארדואינו
הקוד בו נעשה שימוש במדריך הוא גרסה שונה של מה שהשתמשנו בו בפוסט אחר, חיישני אפקט הול 1: בקרת מיקוםאל תהססו להעיף מבט במדריך זה כדי להבין טוב יותר כיצד אנו משתמשים בחיישן אפקט הול לבקרת מיקום! אופן פעולתו של חיישן האולטרסאונד הוא על ידי שידור פינג אולטרסאונד המופעל על ידי אחד מפיני ה-GPIO בארדואינו. הפינג האולטרסאונד הזה מוחזר לאחר מכן מעצם ומזוהה על ידי המקלט. כאשר המקלט מזהה את הפינג, הוא שולח פולס לארדואינו. באמצעותו, נוכל לבצע משוואה לחישוב המרחק עבור מפעיל ליניארי על ידי מדידת משך הזמן בין השידור לקליטה, ולהשתמש בנוסחה כדי להמיר את המדידה הזו לאינץ'ים.
כיצד אנו קובעים את מיקום המפעיל היא על ידי ספירת מספר הפולסים המופקים על ידי חיישן אפקט הול (זה מתואר ביתר פירוט בפוסט שהוזכר לעיל). אנו יכולים לקבוע את מיקום המהלך באינצ'ים על ידי מציאת מספר הפולסים/אינצ' המופקים על ידי המפעיל הספציפי שלנו, ולאחר מכן חלוקת ספירת הפולסים שלנו במספר זה. המרת הקריאה מהחיישן האולטרסאונד והקריאה מחיישן אפקט הול לאינץ' הופכת את הקידוד להרבה יותר נקי וקל. משם, אנו בעצם אומרים לארדואינו "אם האובייקט נמצא במרחק של x אינצ'ים, הרחב את המפעיל ב-x אינצ'ים". העלאת הקוד שלהלן תאפשר לכם להתקין את מודל המרחק הנשלט על ידי המפעיל הליניארי באחד ממפעילי PA-04-12-400-HS-24 VDC שלנו. בשלב הבא נעבור על שינויים שניתן לבצע בקוד.
[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 inch); 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: שינוי הקוד
ערך הסף קובע את מידת הדיוק של מיקום המפעיל לקריאת החיישן האולטרסאונד. הגדלתו תפחית את הדיוק, והקטנתו תגרום להשפעה הפוכה. על ידי קביעת ערך זה ל-100, אנו בעצם אומרים לארדואינו לא להזיז את המפעיל כל עוד הפולסים של אפקט הול וחיישני האולטרסאונד נמצאים במרחק של עד 100 פולסים זה מזה. מספר נמוך מדי עלול לגרום למפעיל לנוע בתנועות קופצניות תכופות כשהוא מנסה להגיע למיקום הנכון בדיוק.

שנה ערך זה לאורך התנועה של המפעיל שלך (או אינץ' אחד ארוך יותר). פעולה זו תגיד לארדואינו להתעלם מכל ערך גבוה מדי.

שנה ערך זה לפולסים/אינץ' של המפעיל שלך.

מַסְקָנָה
אנו מקווים בכנות שתמצאו את הפרויקט הזה מועיל - או לפחות מעניין! אל תהססו לשנות אותו ולהפוך אותו לשלך. כרגיל, נשמח לראות כל פרויקט קשור שיש לכם, בין אם אתם משתמשים ברעיון הזה או יוצרים משהו שונה עם המוצרים שלנו! אתם יכולים גם ליצור איתנו קשר בדוא"ל בכתובת sales@progressiveautomations.com ובטלפון 1-800-676-6123.