A volte, quando creiamo un progetto utilizzando un attuatore lineareStiamo cercando di risolvere un problema che non potrebbe essere risolto senza i vantaggi offerti da questi meccanismi. Altre volte, cerchiamo di semplificare un determinato compito automatizzandolo. Ma di tanto in tanto, creiamo qualcosa semplicemente perché possiamo. Questo è uno di quei progetti.
In questo articolo, vedremo come utilizzare un sensore a ultrasuoni per misurare la distanza percorsa da un attuatore lineare e come utilizzare questa misurazione per modificare automaticamente la posizione della corsa dell'attuatore. Sebbene non sia stato progettato per un'applicazione specifica, le possibilità sono infinite.
Ecco cosa ti servirà
- 1 x Protezione del driver del motore RobotPower MegaMoto
- 1 x Arduino Uno
- 1 x Sensore a ultrasuoni
- 1 x PA-04-12-400-HS-24 Vcc (può essere qualsiasi attuatore con feedback ad effetto Hall)
- 1 x PS-20-24 (o qualsiasi alimentatore da 24 Vcc con una corrente nominale di almeno 6 ampere)
Per il controllo, utilizziamo un Arduino Uno con un driver per motori MegaMoto. Il nostro attuatore è il PA-04-12-400-HS-24 Vcc. È importante che il attuatore È necessario un qualche tipo di feedback che permetta ad Arduino di monitorare la propria posizione: qualsiasi controllo di feedback per attuatori lineari può funzionare, ad esempio anche il feedback di un potenziometro sarebbe efficace. Il potenziometro sarebbe meno preciso, ma avrebbe il vantaggio di non richiedere una procedura di homing dopo un'interruzione di corrente. Anche il codice dovrebbe essere modificato.
Passaggio 1: Cablaggio

Il cablaggio per questo progetto è molto semplice. Useremo solo uno dei due sensori a effetto Hall presenti nel PA-04-HS, non importa quale (pin 4 o 5). La piedinatura riportata di seguito si riferisce al connettore Molex a 6 pin fornito con il PA-04-HS:

Connettore a 6 pin dell'attuatore per Arduino/MegaMoto
- Pin 3 a 5V
- Il pin 2 è collegato a GND.
- Pin 1 al pin 2 di Arduino
- Pin 4 su A sul MegaMoto
- Collegare il pin 5 al pin B sul MegaMoto
Sensore a ultrasuoni per Arduino/Megamoto
- VCC a 5V
- GND a GND
- Attiva il pulsante per il pin 8
- Esegui l'eco sul pin 7
MegaMoto all'alimentatore
- + a V+
- - a V-
Passaggio 2: Programmazione dell'Arduino
Il codice utilizzato nel tutorial è una versione modificata di quello che abbiamo usato in un altro post, Sensori ad effetto Hall 1: Controllo di posizioneNon esitate a consultare questo tutorial per comprendere meglio come utilizziamo il sensore a effetto Hall per il controllo di posizione! Il sensore a ultrasuoni funziona trasmettendo un impulso ultrasonico attivato da uno dei pin GPIO di Arduino. Questo impulso ultrasonico viene riflesso da un oggetto e rilevato dal ricevitore. Quando il ricevitore rileva l'impulso, invia un impulso ad Arduino. In questo modo, possiamo calcolare la distanza percorsa da un attuatore lineare misurando il tempo tra la trasmissione e la ricezione e utilizzare una formula per convertire tale misurazione in pollici.
Il metodo che utilizziamo per determinare la posizione dell'attuatore consiste nel contare il numero di impulsi emessi dal sensore a effetto Hall (come descritto in dettaglio nel post menzionato in precedenza). Possiamo quindi determinare la posizione della corsa in pollici calcolando quanti impulsi/pollice emette il nostro specifico attuatore e dividendo il conteggio degli impulsi per tale valore. Convertire in pollici sia la lettura del sensore a ultrasuoni che quella del sensore a effetto Hall semplifica notevolmente la programmazione. In pratica, stiamo dicendo ad Arduino: "Se l'oggetto si trova a x pollici di distanza, estendi l'attuatore di x pollici". Caricando il codice seguente, sarà possibile implementare il modello di controllo della distanza tramite attuatore lineare su uno dei nostri attuatori PA-04-12-400-HS-24 Vcc. Nel passaggio successivo, analizzeremo le modifiche che possono essere apportate al codice.
[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 pollici); 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]
Passaggio 3: Modifica del codice
Il valore di soglia determina con quale precisione la posizione dell'attuatore deve corrispondere alla lettura del sensore a ultrasuoni. Aumentandolo, la precisione diminuirà, diminuendolo, si otterrà l'effetto opposto. Impostando questo valore a 100, si dice essenzialmente ad Arduino di non muovere l'attuatore finché gli impulsi del sensore a effetto Hall e del sensore a ultrasuoni differiscono di non più di 100 impulsi. Un valore troppo basso potrebbe causare movimenti a scatti frequenti dell'attuatore, nel tentativo di raggiungere la posizione corretta.

Modifica questo valore in base alla lunghezza della corsa del tuo attuatore (o un pollice in più). In questo modo, Arduino ignorerà qualsiasi valore troppo elevato.

Modifica questo valore in base al numero di impulsi/pollice del tuo attuatore.

Conclusione
Ci auguriamo sinceramente che questo progetto vi sia utile, o almeno interessante! Sentitevi liberi di modificarlo e personalizzarlo. Come sempre, ci piacerebbe vedere i vostri progetti correlati, sia che utilizziate questa idea, sia che creiate qualcosa di diverso con i nostri prodotti! Potete anche contattarci via email all'indirizzo sales@progressiveautomations.com e telefonicamente al numero 1-800-676-6123.