How to Control Your Actuator Using an Ultra-Sonic Sensor

Come controllare il tuo Attuatore con un sensore a ultrasuoni

Josh Nigh
Josh Nigh
PA Engineer

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.

Porta il controllo del tuo attuatore lineare al livello successivo con i nostri microcontrollori Arduino!

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

 

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

Passaggio 1: Cablaggio dell'attuatore

 

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

 

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.

Passaggio 3: Modifica del codice

 

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.

 

Il nostro PA-04-HS ha un sensore ad effetto Hall integrato!

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.