A volte, quando realizziamo un progetto con un attuatore lineare, cerchiamo di risolvere un problema che senza i vantaggi offerti da questi meccanismi non sarebbe risolvibile. Altre volte vogliamo semplicemente rendere un’attività più semplice automatizzandola. Ma ogni tanto, creiamo qualcosa solo perché possiamo. Questo è uno di quei progetti.
In questo articolo vedremo come usare un sensore a ultrasuoni per misurare la distanza di un oggetto e utilizzarla per modificare automaticamente la posizione della corsa dell’attuatore. Pur non essendo stato pensato per un’applicazione specifica, le possibilità sono infinite.
Ecco cosa ti serve
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Sensore a ultrasuoni
- 1 x PA-04-12-400-HS-24VDC (può essere qualsiasi attuatore con feedback ad effetto Hall)
- 1 x PS-20-24 (o qualsiasi alimentatore 24VDC in grado di fornire almeno 6 ampere)
Per il controllo utilizziamo un Arduino Uno con un driver motore MegaMoto. Il nostro attuatore è il PA-04-12-400-HS-24VDC. È importante che l’attuatore disponga di qualche tipo di feedback, così che l’Arduino possa monitorarne la posizione – qualsiasi controllo con feedback per attuatore lineare può funzionare; ad esempio, anche un feedback a potenziometro sarebbe efficace qui. Il potenziometro sarebbe meno preciso, ma avrebbe il vantaggio di non richiedere una procedura di homing dopo un’interruzione di alimentazione. Anche il codice andrebbe modificato.
Passaggio 1: Cablaggio

Il cablaggio per questo progetto è molto semplice. Useremo solo uno dei due sensori ad effetto Hall presenti nel PA-04-HS: non importa quale (pin 4 o 5). Il pinout seguente è per il connettore Molex a 6 pin fornito con il PA-04-HS:

Connettore a 6 pin dell’attuatore verso Arduino/MegaMoto
- Pin 3 a 5V
- Pin 2 a GND
- Pin 1 al pin 2 di Arduino
- Pin 4 ad A su MegaMoto
- Pin 5 a B su MegaMoto
Sensore a ultrasuoni verso Arduino/MegaMoto
- VCC a 5V
- GND a GND
- Trig al Pin 8
- Echo al Pin 7
MegaMoto verso alimentatore
- + a V+
- - a V-
Passaggio 2: Programmazione dell’Arduino
Il codice usato in questo tutorial è una versione modificata di quanto utilizzato in un altro post, Hall Effect Sensors 1: Position Control. Dai un’occhiata a quel tutorial per capire meglio come stiamo usando il sensore ad effetto Hall per il controllo di posizione! Il sensore a ultrasuoni funziona trasmettendo un ping ultrasonico, attivato da uno dei pin GPIO dell’Arduino. Quel ping viene riflesso da un oggetto e rilevato dal ricevitore. Quando il ricevitore rileva il ping, invia un impulso all’Arduino. In questo modo possiamo calcolare la distanza misurando il tempo tra trasmissione e ricezione e usare una formula per convertire quella misura in pollici.
Determiniamo la posizione dell’attuatore contando il numero di impulsi emessi dal sensore ad effetto Hall (questo è descritto più in dettaglio nel post sopra menzionato). Possiamo determinare la posizione della corsa in pollici trovando quanti impulsi/pollice emette il nostro specifico attuatore e dividendo il conteggio degli impulsi per quel valore. Convertire sia la lettura del sensore a ultrasuoni sia quella del sensore ad effetto Hall in pollici rende il codice molto più pulito e semplice. Da lì, in sostanza diciamo ad Arduino “se l’oggetto è a x pollici di distanza, estendi l’attuatore di x pollici”. Caricando il codice qui sotto potrai implementare il controllo della posizione dell’attuatore in base alla distanza misurata su uno dei nostri PA-04-12-400-HS-24VDC. Nel passaggio successivo vedremo quali modifiche si possono apportare 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");
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 threshold determina con quale accuratezza la posizione dell’attuatore deve corrispondere alla lettura del sensore a ultrasuoni. Aumentandolo si riduce la precisione, diminuendolo si ottiene l’effetto opposto. Impostando questo valore a 100, stiamo in pratica dicendo ad Arduino di non muovere l’attuatore finché gli impulsi del sensore ad effetto Hall e del sensore a ultrasuoni sono entro 100 impulsi l’uno dall’altro. Impostare questo numero troppo basso può far sì che l’attuatore si muova spesso a scatti mentre cerca di raggiungere la posizione esatta.

Imposta questo valore sulla lunghezza della corsa del tuo attuatore (o un pollice in più). Questo dirà ad Arduino di ignorare i valori troppo elevati.

Imposta questo valore sugli impulsi/pollice del tuo attuatore.

Conclusione
Speriamo sinceramente che questo progetto ti sia utile – o almeno interessante! Sentiti libero di modificarlo e farlo tuo. Come sempre, ci piacerebbe vedere eventuali progetti correlati che hai realizzato, sia che tu utilizzi questa idea sia che tu crei qualcosa di diverso con i nostri prodotti! Puoi contattarci via e‑mail all’indirizzo sales@progressiveautomations.com e per telefono al 1-800-676-6123.