Photo of MegaMoto Plus H-bridge for Arduino Model: LC-80 by Progressive Automations

Parte I: ¿Cómo monitorear la retroalimentación de un actuador lineal?

Anna Sapiga
Anna Sapiga
PA Engineer

En la guía de hoy, veremos cómo saber cuánta fuerza está aplicando un actuador lineal monitoreando la cantidad de corriente que está usando. Esta será una de nuestras guías más avanzadas y requerirá codificación, calibración y programación complejas. Cubriremos el monitoreo de la entrada analógica y cómo utiliza sus funciones. Para este proyecto, usaremos un MegaMoto Plus , un actuador lineal (estamos usando nuestro mini actuador PA-14), un Arduino Uno y una fuente de alimentación de al menos 12 V.

Foto del mini actuador PA-14, un Arduino Uno y una fuente de alimentación

Para empezar, necesitaremos hacer el cableado para conectar todo. Comience conectando el MegaMoto al Arduino, simplemente coloque el MegaMoto encima del Uno para hacerlo. Luego, conecta un cable desde el terminal BAT+ que se encuentra en el MegaMoto al pin Vin que se encuentra en el Uno.

Foto del puente H MegaMoto Plus para Arduino Modelo: LC-80 de Progressive Automations


Ahora necesitamos conectar los cables de los actuadores lineales a los terminales A y B del MegaMoto y conectar la fuente de alimentación de 12 V a BAT+ y GND a BAT-. También necesitaremos conectar dos botones para control conectándolos cada uno entre un pin no utilizado y GND. Recomendamos conectar los botones a una placa de pruebas.

Foto de los cables de los actuadores lineales que se conectan a los terminales A y B del MegaMoto y conectan la fuente de alimentación de 12 V a BAT+ y GND a BAT.

Ahora es el momento de codificar un poco con Arduino Uno. Queremos programar los botones para que puedan controlar cuándo se extenderá y retraerá el actuador. La corriente comenzará a monitorearse una vez que el actuador se extienda y esto nos permitirá observar si supera el límite máximo de corriente o no. Si supera el límite, el actuador se detendrá automáticamente hasta que usted decida retraerlo. Teniendo en cuenta que los motores dentro de los actuadores tienen un gran pico de corriente cuando se encienden por primera vez, el código que ingresamos tendrá un breve retraso antes de comenzar a monitorear la corriente. Este código se podrá leer cuando el actuador haya alcanzado sus finales de carrera, que es cuando la corriente cae a 0.
 const intEnablePin = 8;
const intPWMPinA = 11;
constanteintPWMPinB = 3; // pines para Megamoto
const int botónIzquierda = 4;
const int buttonRight = 5;//botones para mover el motor
constante int CPin1 = A5; // retroalimentación motora

int cierre izquierdo = BAJO;
int rightlatch = LOW;//pestillos del motor (usados ​​para la lógica del código)
int hitLimits = 0;//comienza en 0
int hitLimitsmax = 10;//valores para saber si se alcanzaron los límites de viaje
último tiempo de retroalimentación prolongado = 0; // debe ser largo, de lo contrario se desborda
int retardo del tiempo de primera retroalimentación = 750; //primer retraso para ignorar el pico actual
int tiempo de retroalimentación = 50; //retraso entre ciclos de retroalimentación, con qué frecuencia desea que se revise el motor
retroalimentación de tiempo actual = 0; // debe ser largo, de lo contrario se desborda unceTime = 300; //cantidad para eliminar el rebote de los botones, los valores más bajos hacen que los botones sean más sensibleslong lastButtonpress = 0; // temporizador para antirrebote
long currentTimedebounce = 0;
intCRaw = 0; // valor de entrada para las lecturas actuales
int máxAmps = 0; // límite de viaje
bool dontExtend = falso;
bool primera ejecución = verdadero;
boolfullyRetracted = false;//lógica del programa
configuración nula()
{
Serie.begin(9600);
pinMode(EnablePin, SALIDA);
pinMode(PWMPinA, SALIDA);
pinMode(PWMPinB, OUTPUT);//Establecer salidas del motor
pinMode(botónIzquierdo, ENTRADA);
pinMode(botónDerecha, ENTRADA);//botones
digitalWrite(botónIzquierda, ALTA);
digitalWrite(buttonRight, HIGH);//habilita pullups internos
pinMode(CPin1, INPUT);//establecer entrada de retroalimentación
currentTimedebounce = milis();
currentTimefeedback = 0;//Establecer tiempos iniciales
maxAmps = 15;// ESTABLEZCA LA CORRIENTE MÁXIMA AQUÍ
}//finalizar configuración
bucle vacío()
{
latchButtons();//verificar botones, ver si necesitamos movernos
moveMotor();//revisa los pestillos, mueve el motor hacia adentro o hacia afuera
}//finalizar el bucle principal
Botones de cierre vacíos()
{
if (digitalRead(buttonLeft)==LOW)//izquierda es hacia adelante
{
currentTimedebounce = millis() - lastButtonpress;// comprobar el tiempo desde la última pulsación
if (currentTimedebounce > debounceTime && dontExtend == false)//una vez que haya activado dontExtend, ignore todas las pulsaciones hacia adelante
{
leftlatch = !leftlatch;// si el motor se está moviendo, deténgalo, si está parado, comience a moversefirstRun = true;// establezca el indicador firstRun para ignorar el pico de corriente
completamente retraído = falso; // una vez que avanzas, no estás completamente retraído
lastButtonpress = millis();//almacenar la hora de la última pulsación del botón
devolver;
}//terminara si
}//fin de botón IZQUIERDA
if (digitalRead(buttonRight)==LOW)//la derecha está al revés
{
currentTimedebounce = millis() - lastButtonpress;// comprobar el tiempo desde la última pulsación
if (tiempo actual de rebote > tiempo de rebote)
{
rightlatch = !rightlatch;// si el motor se está moviendo, se detiene, si está parado, comienza a moverse
firstRun = true;// establece el indicador firstRun para ignorar el pico actual
lastButtonpress = millis();//almacenar la hora de la última pulsación del botón
devolver;
}//terminara si
}//finalizar btnDERECHA
}//finalizar botones de cierre
movimiento vacíoMotor()
{
if (cierre izquierdo == ALTO) motorForward(255); //velocidad = 0-255
if (cierre izquierdo == BAJO) motorStop();
if (cierre derecho == ALTO) motorBack(255); //velocidad = 0-255
if (cierre derecho == BAJO) motorStop();
}//finalizar movimientoMotor
motor vacíoAdelante(velocidad int)
{
mientras (dontExtend == false && leftlatch == ALTO)
{
escritura digital (EnablePin, ALTA);
analogWrite(PWMPinA, velocidad);
analogWrite(PWMPinB, 0);//mueve el motor
si (primera ejecución == verdadero) retraso (primera demora en el tiempo de retroalimentación); // mayor retraso para ignorar el pico actual
de lo contrario demora (retraso del tiempo de retroalimentación); //pequeño retraso para alcanzar la velocidad
obtener comentarios();
primera ejecución = falso;
latchButtons();//verificar botones nuevamente
}//finalizar mientras
}//final del motorAdelante

motor vacíoBack (velocidad int)
{
mientras (cierre derecho == ALTO)
{
escritura digital (EnablePin, ALTA);
escritura analógica(PWMPinA, 0);
analogWrite(PWMPinB, velocidad);//mueve el motor
if (firstRun == true) delay(firstfeedbacktimedelay);// retraso mayor para ignorar el pico actual
de lo contrario demora (retraso del tiempo de retroalimentación); //pequeño retraso para alcanzar la velocidad
obtener comentarios();
primera ejecución = falso;
latchButtons();//verificar botones nuevamente
}//finalizar mientras
dontExtend = false;//permitir que el motor se extienda nuevamente, después de haber sido retraído
}//final del motorVolver
parada de motor anulada()
{
escritura analógica(PWMPinA, 0);
escritura analógica(PWMPinB, 0);
escritura digital (EnablePin, BAJO);
firstRun = true;//una vez que el motor se haya detenido, vuelva a habilitar firstRun para tener en cuenta los picos de corriente de arranque
}//finalizar paradaMotor

anular la retroalimentación()
{
CRaw = analogRead(CPin1); // Leer actual
if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;
de lo contrario hitLimits = 0; // verificamos si el motor está en los límites y la corriente se ha detenido
if (hitLimits == hitLimitsmax && rightlatch == ALTO)
{
pestillo derecho = BAJO; //parar el motor
completamente retraído = verdadero;
}//terminara si
de lo contrario, si (hitLimits == hitLimitsmax && leftlatch == ALTO)
{
pestillo izquierdo = BAJO;//detener el motor
límites de impacto = 0;
}//terminara si
si (CRaw > maxAmps)
{
no extender = verdadero;
pestillo izquierdo = BAJO; //se detiene si la retroalimentación supera el máximo
}//terminara si
lastfeedbacktime = millis();//almacenar la hora anterior para recibir comentarios
}//finalizar obtener comentarios

Con este código básico, controlará con éxito la retroalimentación de su actuador lineal. En la Parte II profundizaremos en cómo funciona el código y cómo editarlo a tu gusto. Esperamos que esta publicación le haya resultado útil y permanezca atento a la Parte II en las próximas semanas. Si desea pedir alguna de las unidades que utilizamos en este ejemplo o desea obtener más información sobre nuestros productos , contáctenos .