Home » Arduino » ¿Cómo generar una señal PPM con Arduino para controlar un servo?

Login with your Social Account

¿Cómo generar una señal PPM con Arduino para controlar un servo?

  •  
  •  
  •  
  •  
  •  
  •  

Aprende a controlar un servo con Arduino para posicionar un eje de giro (o controlar la velocidad de un rueda con un servo de rotación continua). Se incluyen ejemplos de conexión y programación (gráfica y textual).

Un servo es un motor de corriente continua (CC) que dispone de la electrónica necesaria para posicionar el eje de giro mediante la generación de una señal de posición de pulso modulada (PPM). La gran mayoría de los servos utilizan un estándar en el que el periodo de la señal es de 20ms y se pueden mover desde su posición mínima con un ancho de pulso (típicamente de 0.5ms) hasta su posición máxima (típicamente de 2.5ms), pasando por su posición intermedia (normalmente son 1.5ms).

servo_pulse_width

La especificación de la señal PPM a generar para su control viene del ámbito del radio control (RC), por este motivo, los controladores de motores sin escobillas (electronic speed control o ESC) típicamente utilizados en los drones también se controlan con señales PPM como la de los servos. En realidad la señal PPM, es una señal PWM (modulada por pulsos) con una frecuencia de 50Hz para el control de posición. Normalmente, el servomotor permite controlar la posición de un eje ya que dispone de un potenciómetro interno que permite realimentar dicha posición. En ocasiones, y por sencillez, para controlar la velocidad de un eje de giro, también se pueden utilizar servomotores (de rotación continua) ya que su control es, por lo general más sencillo que el uso de electrónica específica basadas en puentes en H y señales PWM. Al igual que los servos de posición, los servos de rotación continua admiten una señal PPM con el mismo estándar, disponiendo normalmente de un potenciómetro de ajuste para establecer velocidad cero con un ancho de pulso de 1.5ms.

Tipos de servos:

Los servos o servomotores son muy utilizados en robótica y podemos encontrar servos de muchos tipos y tamaños:

  • Submicroservos (0-5g): Ofrecen pares por debajo del 1Kg y los rangos de alimentación suelen estar entre los 4.8V-6V.
  • Microservos (5g-10g): Ofrecen pares por debajo de los 2Kg y los rangos de alimentación suelen estar entre los 4.8V-6V.
  • Miniservos (11g-20g): Ofrecen pares por debajo de los 4Kg y los rangos de alimentación suelen estar entre los 4.8V-6V.
  • Parkservo (21g-30g): Ofrecen pares por debajo de los 7Kg y los rangos de alimentación suelen estar entre los 4.8V-6V.
  • Standard servo (31-49g): Ofrecen pares por debajo de los 15Kg (normalmente) y los rangos de alimentación suelen estar entre los 4.8V-6V o 6V-7.4V.
  • Extralarge servos (50g+): Ofrecen pares por debajo de los 30Kg (normalmente) y los rangos de alimentación suelen estar entre los 4.8V-6V o 6V-7.4V.

Los ángulos de giro de los servos dependen del modelo del motor y fabricante, con lo que se sugiere acceder a las hojas características de cada servomotor.

¿Como conectar un servo?

Los servos suelen utilizar un conector de 3 pines y dependiendo del tipo de fabricante existen diferentes variaciones en el conector y los colores empleados (la gran mayoría son compatibles entre ellos):

  • Futaba “J”: utiliza los colores blanco-rojo-negro.

J_connector_2

  • JR: utiliza los colores naranja-rojo-marrón.

JR_connector_2

  • Hitec “S”, Airtronics “Z”, Airtronics “T”: utilizan los colores amarillo-rojo-negro.
  • Para evitar una posible conexión incorrecta, la señal de alimentación siempre está en el pin de en medio.

Para conectar un servo al Arduino, debemos tener en consideración que la corriente que requiere el motor del servo no debería proporcionársela el regulador de 5V de Arduino, ya que este está diseñado para pequeñas corrientes (no soporta más allá de los 200mA) y por tanto la mayoría de aplicaciones requerirán de una alimentación externa regulada. En el campo del RC existen unos dispositivos para este propósito que permiten obtener las tensiones necesarias para los servos (5V o 6V, normalmente) con capacidad de suministrar corrientes mucho mayores (p.e.: 3A). Estos reguladores son conocidos por las siglas BEC (battery eliminator circuit) también conocidos por UBEC (ultimate BEC) o SBEC (smart BEC). Sólo para el caso de que queramos controlar un submicroservo o microservo, recomendaría el uso del motor directamente a Arduino.

Por otro lado, debemos tener en consideración que Arduino dispone de determinados pines específicos para generar señales PWM (por defecto), si bien, gestionando adecuadamente los temporizadores disponibles, se podría utilizar cualquiera de los pines IO. En el caso del Arduino Nano v3.0, dispone de 6 PWMs en los pines 3,5,6,9,10,11 con una resolución de 8-bits. La función analogWrite() permite generar señales PWM, pero para cumplir con los estándares de las señales PPM, debemos utilizar la librería Servo de Arduino.

A continuación se muestra un ejemplo de conexión de un servo a Arduino Nano v3.0 utilizando la tarjeta de expansión IO:

servo_power_nano_io_bb

Se puede utilizar un cable (o jumper) en Y de 3 pines (cables para extender los conectores de los servos) con el propósito de proporcionar la alimentación de 5V a través del UBEC. Idealmente, las alimentaciones de 5V del UBEC y 5V del Arduino (pin de en medio de la tarjeta de expansión) no deberían mezclarse, aunque tampoco supone un problema adicional. Si el servo a controlar no consume mucha corriente podríamos prescindir del UBEC.

¿Como controlar la posición del servo?

En el siguiente fichero se incluye un código de ejemplo para controlar la posición del servo utilizando el Arduino IDE:

Para controlar la posición del servo utilizando Ardublock debemos utilizar el bloque “Servo” dentro del menú “pins”, especificando el pin que queremos controlar y el ángulo del servo (entre 0 y 180). Los ángulos especificados no tienen porqué ser ángulos reales, ya que en realidad se refieren a posición mínima y máxima. Cada modelo de servo puede tener unos ángulos en su posición mínima y máxima diferentes. Si queréis especificar los ángulos reales, podéis utilizar el bloque “map” dentro de “utilidades” (en el ejemplo se asume un ángulo.

servo_ardublock

Descarga el programa aquí:

Para el caso de servos de rotación continua (típicamente utilizados para controlar la velocidad de giro de una rueda), se puede utilizar el siguiente programa de ejemplo en Arduino IDE:

El código equivalente en Ardublock es:

servo_rotacion_ardublock

que podéis descargar aquí:

¿Dónde comprar?

Servos

Arduino

Jumpers

A %d blogueros les gusta esto: