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.
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
- 1 x RobotPower MegaMoto Motor Driver Shield
- 1 x Arduino Uno
- 1 x Sensor ultrasónico
- 1 x PA-04-12-400-HS-24VDC (puede ser cualquier actuador con realimentación por efecto Hall)
- 1 x PS-20-24 (o cualquier fuente de 24 VCC con una corriente nominal de al menos 6 A)
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

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
- 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.

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.

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.