Μερικές φορές, όταν δημιουργούμε ένα έργο χρησιμοποιώντας έναν γραμμικό ενεργοποιητή, προσπαθούμε να λύσουμε ένα πρόβλημα που δεν θα μπορούσε να λυθεί χωρίς τα πλεονεκτήματα που προσφέρουν αυτοί οι μηχανισμοί. Άλλες φορές, προσπαθούμε να κάνουμε μια συγκεκριμένη εργασία πιο εύκολη αυτοματοποιώντας την. Αλλά πού και πού, δημιουργούμε κάτι απλώς επειδή μπορούμε. Αυτό είναι ένα από αυτά τα έργα.
Σε αυτό το άρθρο, θα δούμε πώς μπορείτε να χρησιμοποιήσετε έναν υπερηχητικό αισθητήρα για να μετρήσετε την απόσταση ενός αντικειμένου από τον γραμμικό ενεργοποιητή και να τη χρησιμοποιήσετε για να αλλάζει αυτόματα η θέση της Διαδρομής του ενεργοποιητή. Αν και αυτό δεν δημιουργήθηκε έχοντας κατά νου κάποια συγκεκριμένη εφαρμογή, οι δυνατότητες είναι ατελείωτες.
Τι θα χρειαστείτε
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Υπερηχητικός αισθητήρας
- 1 x PA-04-12-400-HS-24VDC (μπορεί να είναι οποιοσδήποτε ενεργοποιητής με ανάδραση αισθητήρα Hall)
- 1 x PS-20-24 (ή οποιοδήποτε τροφοδοτικό 24VDC με ονομαστικό ρεύμα τουλάχιστον 6A)
Για τον έλεγχο, χρησιμοποιούμε ένα Arduino Uno με οδηγό κινητήρα MegaMoto. Ο ενεργοποιητής μας είναι ο PA-04-12-400-HS-24VDC. Είναι σημαντικό ο ενεργοποιητής να έχει κάποιο είδος ανάδρασης ώστε το Arduino να μπορεί να παρακολουθεί τη θέση του – οποιοσδήποτε έλεγχος ανάδρασης γραμμικού ενεργοποιητή μπορεί να λειτουργήσει· για παράδειγμα, η ανάδραση από ποτενσιόμετρο θα ήταν επίσης αποτελεσματική εδώ. Το ποτενσιόμετρο θα ήταν λιγότερο ακριβές, αλλά θα είχε το πλεονέκτημα ότι δεν θα απαιτούσε ρουτίνα αρχικοποίησης θέσης (homing) μετά από απώλεια ρεύματος. Ο κώδικας θα πρέπει επίσης να τροποποιηθεί.
Βήμα 1: Καλωδίωση

Η καλωδίωση για αυτό το έργο είναι πολύ απλή. Εδώ θα χρησιμοποιήσουμε μόνο έναν από τους δύο αισθητήρες Hall στο PA-04-HS – δεν έχει σημασία ποιον (pin 4 ή 5). Η παρακάτω αντιστοίχιση pins αφορά τον 6-πινο συνδετήρα Molex που συνοδεύει το PA-04-HS:

6-πινος συνδετήρας του ενεργοποιητή προς Arduino/MegaMoto
- Pin 3 στο 5V
- Pin 2 στο GND
- Pin 1 στο pin 2 του Arduino
- Pin 4 στο A στο MegaMoto
- Pin 5 στο B στο MegaMoto
Υπερηχητικός αισθητήρας προς Arduino/MegaMoto
- VCC στο 5V
- GND στο GND
- Trig στο Pin 8
- Echo στο Pin 7
MegaMoto προς τροφοδοτικό
- + στο V+
- - στο V-
Βήμα 2: Προγραμματισμός του Arduino
Ο κώδικας που χρησιμοποιείται στο tutorial είναι μια τροποποιημένη έκδοση από ό,τι χρησιμοποιήσαμε σε άλλη ανάρτηση, Hall Effect Sensors 1: Position Control. Δείτε ελεύθερα αυτό το tutorial για να κατανοήσετε καλύτερα πώς χρησιμοποιούμε τον αισθητήρα Hall για έλεγχο θέσης! Ο τρόπος λειτουργίας του υπερηχητικού αισθητήρα είναι με τη μετάδοση ενός υπερηχητικού ping που ενεργοποιείται από ένα από τα GPIO pins στο Arduino. Αυτό το υπερηχητικό ping ανακλάται έπειτα από ένα αντικείμενο και ανιχνεύεται από τον δέκτη. Όταν ο δέκτης ανιχνεύει το ping, στέλνει έναν παλμό στο Arduino. Μέσα από αυτό, μπορούμε να εκτελέσουμε έναν υπολογισμό για την απόσταση για έναν γραμμικό ενεργοποιητή, μετρώντας τον χρόνο μεταξύ μετάδοσης και λήψης και χρησιμοποιώντας έναν τύπο για να μετατρέψουμε αυτή τη μέτρηση σε ίντσες.
Τον τρόπο με τον οποίο προσδιορίζουμε τη θέση του ενεργοποιητή, είναι μετρώντας τον αριθμό των παλμών που εξάγονται από τον αισθητήρα Hall (περιγράφεται αναλυτικότερα στην παραπάνω ανάρτηση). Μπορούμε να προσδιορίσουμε τη θέση της Διαδρομής σε ίντσες, βρίσκοντας πόσοι παλμοί/ίντσα εξάγονται από τον συγκεκριμένο ενεργοποιητή μας και έπειτα διαιρώντας τον αριθμό παλμών με αυτήν την τιμή. Αν τόσο η μέτρηση από τον υπερηχητικό αισθητήρα όσο και η μέτρηση από τον αισθητήρα Hall μετατραπούν σε ίντσες, ο κώδικας γίνεται πολύ πιο καθαρός και εύκολος. Από εκεί και πέρα, ουσιαστικά λέμε στο Arduino «αν το αντικείμενο είναι x ίντσες μακριά, εκτείνε τον ενεργοποιητή x ίντσες». Κάνοντας upload τον παρακάτω κώδικα θα μπορέσετε να εφαρμόσετε το μοντέλο απόστασης ελεγχόμενο από γραμμικό ενεργοποιητή σε έναν από τους ενεργοποιητές μας PA-04-12-400-HS-24VDC. Στο επόμενο βήμα θα δούμε τροποποιήσεις που μπορούν να γίνουν στον κώδικα.
[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]
Βήμα 3: Τροποποίηση του κώδικα
Η τιμή του threshold καθορίζει πόσο ακριβώς πρέπει η θέση του ενεργοποιητή να ταιριάζει με την ένδειξη του υπερηχητικού αισθητήρα. Αυξάνοντάς το θα μειωθεί η ακρίβεια, ενώ μειώνοντάς το θα έχουμε το αντίστροφο αποτέλεσμα. Έχοντας αυτήν την τιμή στο 100, ουσιαστικά λέμε στο Arduino να μην κινεί τον ενεργοποιητή όσο οι παλμοί των αισθητήρων Hall και υπερήχων βρίσκονται εντός 100 παλμών μεταξύ τους. Αν αυτή η τιμή είναι πολύ χαμηλή, μπορεί να έχει ως αποτέλεσμα ο ενεργοποιητής να κινείται με συχνούς «τραχιούς» παλμούς καθώς προσπαθεί να φτάσει την ακριβή θέση.

Αλλάξτε αυτήν την τιμή ώστε να αντιστοιχεί στο μήκος της Διαδρομής του ενεργοποιητή σας (ή μία ίντσα μεγαλύτερη). Αυτό θα πει στο Arduino να αγνοεί τυχόν τιμές που είναι υπερβολικά υψηλές.

Αλλάξτε αυτήν την τιμή στους παλμούς/ίντσα του ενεργοποιητή σας.

Συμπέρασμα
Ειλικρινά ελπίζουμε να βρείτε αυτό το έργο χρήσιμο – ή τουλάχιστον ενδιαφέρον! Μη διστάσετε να το τροποποιήσετε και να το κάνετε δικό σας. Όπως πάντα, θα θέλαμε πολύ να δούμε σχετικά έργα που έχετε, είτε χρησιμοποιείτε αυτήν την ιδέα είτε δημιουργείτε κάτι διαφορετικό με τα προϊόντα μας! Μπορείτε επίσης να επικοινωνήσετε μαζί μας με email στο sales@progressiveautomations.com και τηλεφωνικά στο 1-800-676-6123.