How to Control Your Actuator Using an Ultra-Sonic Sensor

Cómo controlar su actuador usando un sensor ultrasónico

Josh Nigh
Josh Nigh
PA Engineer

A veces, cuando creamos un proyecto usando un actuador lineal, intentamos resolver un problema que no podría solucionarse sin las ventajas que ofrecen estos mecanismos. Otras veces, buscamos facilitar una tarea automatizándola. Pero, de vez en cuando, creamos algo simplemente porque podemos. Este es uno de esos proyectos.

¡Lleva el control de tu actuador lineal al siguiente nivel con nuestros microcontroladores Arduino!

En este artículo, veremos cómo puedes usar un sensor ultrasónico para medir la distancia de un objeto y utilizarla para cambiar automáticamente la posición de la carrera del actuador. Aunque no se creó con una aplicación específica en mente, las posibilidades son infinitas.

 

Qué vas a necesitar

 

Para el control, usamos un Arduino Uno con un controlador de motor MegaMoto. Nuestro actuador es el PA-04-12-400-HS-24VDC. Es importante que el actuador tenga algún tipo de realimentación para que el Arduino pueda supervisar su posición; cualquier sistema de realimentación en un actuador lineal puede funcionar; por ejemplo, la realimentación mediante potenciómetro también sería efectiva aquí. El potenciómetro sería menos preciso, pero tendría la ventaja de no requerir un procedimiento de referenciado (homing) tras una pérdida de alimentación. También habría que modificar el código.

 

Paso 1: Cableado

Paso 1: Cableado del actuador

 

El cableado de este proyecto es muy sencillo. Aquí solo usaremos uno de los dos sensores de efecto Hall del PA-04-HS; no importa cuál (pin 4 o 5). El pinout siguiente corresponde al conector Molex de 6 pines que viene con el PA-04-HS:

Conector de 6 pines del actuador a Arduino/MegaMoto

 

Conector de 6 pines del actuador a Arduino/MegaMoto

  • Pin 3 a 5V
  • Pin 2 a GND
  • Pin 1 al pin 2 de Arduino
  • Pin 4 a A en la MegaMoto
  • Pin 5 a B en la MegaMoto

 

Sensor ultrasónico a Arduino/MegaMoto

  • VCC a 5V
  • GND a GND
  • Trig al pin 8
  • Echo al pin 7

 

MegaMoto a fuente de alimentación

  • + a V+
  • - a V-

 

Paso 2: Programar el Arduino

El código usado en este tutorial es una versión modificada del que utilizamos en otra publicación, Sensores de efecto Hall 1: Control de posición. Échale un vistazo para comprender mejor cómo usamos el sensor de efecto Hall para el control de posición. El sensor ultrasónico funciona transmitiendo un pulso ultrasónico que se dispara desde uno de los pines GPIO del Arduino. Ese pulso rebota en un objeto y es detectado por el receptor. Cuando el receptor detecta el pulso, envía una señal al Arduino. Con esto, podemos calcular la distancia para un actuador lineal midiendo el tiempo entre la transmisión y la recepción, y usar una fórmula para convertir esa medición en pulgadas.

Determinamos la posición del actuador contando el número de impulsos que emite el sensor de efecto Hall (esto se describe con más detalle en la publicación mencionada). Podemos obtener la posición de la carrera en pulgadas sabiendo cuántos impulsos por pulgada emite nuestro actuador específico y dividiendo el conteo de impulsos por ese número. Tener tanto la lectura del sensor ultrasónico como la del sensor de efecto Hall convertidas a pulgadas hace que la programación sea más clara y sencilla. A partir de ahí, básicamente le decimos al Arduino: “si el objeto está a x pulgadas, extiende el actuador x pulgadas”. Cargar el código de abajo te permitirá implementar el modelo de distancia controlada por actuador lineal en uno de nuestros actuadores PA-04-12-400-HS-24VDC. En el siguiente paso veremos las modificaciones que se pueden hacer al código.

[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]

Paso 3: Modificar el código

El valor de umbral (threshold) determina con qué precisión debe coincidir la posición del actuador con la lectura del sensor ultrasónico. Aumentarlo disminuirá la precisión; disminuirlo tendrá el efecto inverso. Al establecer este valor en 100, básicamente le decimos al Arduino que no mueva el actuador mientras los impulsos de los sensores de efecto Hall y ultrasónico estén dentro de 100 impulsos entre sí. Si este número es demasiado bajo, puede provocar que el actuador se mueva con tirones frecuentes al intentar alcanzar la posición exacta.

Paso 3: Modificar el código

 

Cambia este valor por la longitud de carrera de tu actuador (o una pulgada más). Esto le indicará al Arduino que ignore los valores demasiado altos.

 

Cambia este valor por los impulsos por pulgada de tu actuador.

 

¡Nuestro PA-04-HS integra un sensor de efecto Hall!

Conclusión

Esperamos sinceramente que este proyecto te resulte útil —o al menos interesante—. Siéntete libre de modificarlo y hacerlo tuyo. Como siempre, nos encantaría ver cualquier proyecto relacionado que tengas, ya sea que uses esta idea o crees algo diferente con nuestros productos. También puedes contactarnos por correo electrónico en sales@progressiveautomations.com y por teléfono al 1-800-676-6123.