arduino-actuador-lineal

Ejercer grandes fuerzas con actuador lineal y Arduino

¿Qué es un actuador lineal?

Un actuador lineal es un dispositivo que generar movimiento rectilíneo. Podemos controlar este tipo de actuadores desde un procesador como Arduino.

Internamente un actuador lineal está formado por un motor eléctrico con un mecanismo reductor que consta por varios engranajes y un tornillo sinfín. El tornillo empuja un émbolo o vástago, que puede extenderse o retraerse en función del sentido de giro del motor.

Los actuadores lineales tienen la ventaja de ejercer grandes fuerzas y grandes desplazamientos. Según modelos, pueden ejercer de 20 a 150kgf, con desplazamientos de 100 a 800mm.

Como desventaja, los actuadores lineales tienen velocidades de desplazamiento lentas, típicamente del orden de 4-20 mm/s, por lo que el tiempo extensión total puede llegar a ser de varios minutos en los modelos más largos y lentos.

Existen actuadores lineales de diferentes tensiones de alimentación, siendo frecuentes modelos de 12V y 24V. El consumo de corriente es, en general, elevado, del orden de 3A a 5A en los modelos de 12V, y de 2A-3A en modelos de 24V.

arduino-accionador-lineal-funcionamiento

En cuando al control, encontramos tres tipos de actuadores.

  • Actuadores lineales sin control.
  • Actuadores lineales con dos pulsadores de fin de carrera, que permiten detectar cuando el émbolo ha alcanzado una posición terminal.
  • Actuadores lineales con potenciómetro, que proporciona una medida analógica de la posición del émbolo.

Los actuadores lineales son ampliamente empleados en todo tipo de aplicaciones industriales, debido a la gran capacidad para ejercer fuerzas y buena precisión, que han permitido sustituir equipamientos hidráulicos, comparativamente muchos más costosos y complejos de mantener.

En nuestros proyectos de electrónica y robótica podemos emplear actuadores lineales cuando necesitemos elevar grandes cargas, por ejemplo, mesas elevadoras, desplegar un toldo o expandir un brazo robótico.

Precio

Los actuadores lineales son dispositivos caros, típicamente entre 20-80€. El precio depende totalmente de la longitud, fuerza máxima, y velocidad.

arduino-accionador-lineal-componente

Así, podemos encontrar un actuador lineal de 90Kgf a 100mm por 25€, 100kgf a 300mm por 50€,y de 150kgf a 150mm por 60€, buscando en vendedores internacionales de eBay o AliExpress.

Esquema de montaje

En primer lugar vamos a ver la conexión del motor del actuador linea, ya que este es común para todo tipo de actuador. Posteriormente veremos el control de posición del actuador, que depende del modelo de actuador que tengamos (incluso es frecuente que no tenga ninguno).

Alimentación del actuador lineal

Todos los actuadores tendrán dos conductores para activar el motor eléctrico que acciona el tornillo sinfín. Para poder extender y retraer el émbolo necesitamos ser capaces de invertir el sentido de giro del motor, es decir, invertir el sentido en el que la corriente atraviesa el motor.

Como sabemos, para ello podemos usar un puente-H. Sin embargo, los controladores de DC que hemos visto (L298N y TB6612FNG) no disponen de la potencia suficiente para controlar un actuador lineal de grandes dimensiones, y en la mayoría de los casos quemaríamos el controlador.

Una alternativa habitual es emplear dos etapas de relés SPDT (single pole double throw) en una configuración similar a un puente-H. La desventaja de usar relés convencionales es que perderemos el control de velocidad, dado que los relés mecánicos tienen tiempos de conmutación largos.

Si queremos disponer de control de velocidad, deberemos usar relés de estado sólido, o construir nuestro propio puente-H usando transistores BJT o transistores MOSFET.

Control del actuador lineal

En cuanto al control, en caso de disponer de pulsadores digitales como fin de simplemente los conectaríamos a dos pines digitales cualquiera como vimos en la entrada lectura de un pulsador con Arduino.

Si el actuador lineal dispone de un potenciómetro que permita determinar la posición del émbolo, conectaríamos la salida a un pin analógico tal y como vimos en la entrada lectura de un potenciómetro con Arduino.

Ejemplo de conexión un actuador lineal

El siguiente esquema muestra la conexión de un actuador lineal con potenciómetro para el control de la posición del ángulo. Si vuestro actuador lineal no tiene potenciómetro, simplemente obviar esa parte y conectar únicamente el conector.

Con los relés ponemos cada una de las fases del actuador lineal a Gnd o Vcc. Cuando los relés están apagados, ambas fases están en Gnd y el actuador está parado. Al activar uno de los dos relés ponemos una de las fases en Vcc, manteniendo la otra a Gnd, consiguiendo que gire en uno u otro sentido.

arduino-accionador-lineal-montaje

La conexión, vista desde Arduino, sería la siguiente. En líneas discontinuas aparece la conexión del potenciómetro. Nuevamente, si vuestro actuador lineal no tiene control analógico de posición, obviar esta parte.

arduino-accionador-lineal-conexion

Ejemplos de código

Mover el actuador

En el primer ejemplo, simplemente movemos el actuador. Para ello tenemos tres funciones, extendActuator(), retractActuator() y stopActuator(), que configuran la salida de los relés para que la corriente atraviese el actuador en el sentido deseado.

Observar que antes de poner cualquier relé a HIGH, hay una pausa de 250ms para asegurarse de que el relé anterior esta a LOW, y así prevenir posibles cortocircuitos.

const int pinRelayA = 8;
const int pinRelayB = 9;

void setup()
{
  // initialize relay pins
  pinMode(pinRelayA, OUTPUT);
  pinMode(pinRelayB, OUTPUT);

  // preset relays to LOW
  digitalWrite(pinRelayA, LOW);
  digitalWrite(pinRelayB, LOW);
}

void loop()
{
  extendActuator();
  delay(5000);
  retractActuator();
  delay(5000);
  stopActuator();
  delay(5000);
}

//Set one relay one and the other off
//this will move extend the actuator
void extendActuator()
{
  digitalWrite(pinRelayB, LOW);
  delay(250);
  digitalWrite(pinRelayA, HIGH);
}

//Set one relay off and the other on 
//this will move retract the actuator 
void retractActuator()
{
  digitalWrite(pinRelayA, LOW);
  delay(250);
  digitalWrite(pinRelayB, HIGH);
}

//Set both relays off
//this will stop the actuator in a braking
void stopActuator()
{
  digitalWrite(pinRelayA, LOW);
  digitalWrite(pinRelayB, LOW);
}

Control de posición en el actuador lineal

El siguiente ejemplo muestra cómo se realizaría el control de posición en un actuador lineal con potenciómetro. Se emplean las mismas funciones que en el ejemplo anterior para controlar el movimiento del actuador.

El ejemplo simular recibir un valor objetivo (Goal) mediante la función GetGoalPosition(). En un programa rea, esta función se sustituiría y, por ejemplo, recibiría la nueva consigna por puerto serie, I2C, Bluetooth, o simplemente ejecutaría un cálculo para determinar la posición deseada.

El bucle de control principal monitoriza la consigna de posición. Si esta cambia, activa el actuador. Posteriormente, compara el valor de consigna con la posición y el estado del actuador para determinar si tiene que parar el movimiento.

const int pinRelayA = 8;
const int pinRelayB = 9;
const int sensorPin = A0;

int GoalPosition = 350;
int CurrentPosition = 0;
bool IsExtending = false;
bool IsRetracting = false;

void setup()
{
  // initialize relay pins
  pinMode(pinRelayA, OUTPUT);
  pinMode(pinRelayB, OUTPUT);

  // preset relays to LOW
  digitalWrite(pinRelayA, LOW);
  digitalWrite(pinRelayB, LOW);
}

void loop()
{
  int newGoalPosition = GetGoalPosition();
  if (newGoalPosition != GetGoalPosition())
  {
    GoalPosition = newGoalPosition;
    ActivateActuator();
  }

  if (IsExtending || IsRetracting)
  {
    CurrentPosition = analogRead(sensorPin);

    if ((IsExtending = true && CurrentPosition > GoalPosition) || (IsRetracting = true && CurrentPosition < GoalPosition))
    {
      IsExtending = false;
      IsExtending = false;
      stopActuator();
    }
  }
}

int GetGoalPosition()
{
  return 300;
}

int ActivateActuator()
{
  if (CurrentPosition < GoalPosition)
  {
    IsExtending = true;
    IsRetracting = false;
    extendActuator();
  }
  if (CurrentPosition > GoalPosition)
  {
    IsExtending = false;
    IsRetracting = true;
    retractActuator();
  }
}

void extendActuator()
{
  digitalWrite(pinRelayB, LOW);
  delay(250);
  digitalWrite(pinRelayA, HIGH);
}

void retractActuator()
{
  digitalWrite(pinRelayA, LOW);
  delay(250);
  digitalWrite(pinRelayB, HIGH);
}

void stopActuator()
{
  digitalWrite(pinRelayA, LOW);
  digitalWrite(pinRelayB, LOW);
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full