Saltar al contenido

Comunicación y Control de Motores Dynamixel

  • TUTORIAL

Los servos Dynamixel de Robotis son un material muy conveniente al momento de desarrollar un proyecto en el que sea necesario el control exacto de la posición, velocidad o fuerza de los motores. Una característica particular de estos motores es que el control no se hace por medio de un PWM como los servos convencionales, sino por parámetros enviados por comunicación serial UART usando un solo hilo, esta entrada hablará sobre la forma de establecer la comunicación y hacer el control de estos motores.

Cada motor tiene integrado un microcontrolador ATmega8 que se encarga de la comunicación, el control de posición, la velocidad y demás parámetros, incluidas las constantes del controlador PID del motor. Los motores se pueden conectar en serie, para esto se usan tres cables, dos con la alimentación de 9.6 V DC y el tercero es el dedicado a la comunicación, con este cable se implementa una topología daisy chain sobre un protocolo UART Half Duplex.

Para la comunicación serial generalmente se usan dos cables, las señales RX y TX, en este caso sólo se cuenta con un cable que deben compartir las dos señales, y para que la comunicación sea posible es necesario controlar el tráfico de la línea y evitar colisiones.

La recomendación de Robotis es hacer el control del tráfico usando buffers 74HC126 y una compuerta 74HC04. Aparte de los pines de RX y TX se usaría uno adicional para seleccionar la dirección de la comunicación, cuando ese pin esté en 1 permitirá el flujo de datos de salida, mientras que desactivará el buffer RX al poner la salida a su máxima impedancia; cuando este pin cambie su estado a 0 y la señal pase a través de la compuerta NOT, permitirá el flujo de datos de entrada y desactivará el buffer TX; una configuración similar está dentro de cada uno de los motores.

Los buffers y la compuerta se pueden reemplazar por un circuito integrado 74LS241N, este tiene ocho buffers y dos líneas de control; cuatro de los buffers serían controlados por la línea directa y uno de estos se encargaría de la señal TX, el segundo grupo es controlado por un grupo cuya entrada es invertida y uno de ellos se conectaría a la señal RX.

Ahora que se ha aclarado el uso del hardware, es necesario verificar como se controlará el flujo de datos por medio del software. Los motores están configurados para “escuchar” los comandos del maestro y sólo “responden” cuando este se lo solicita, así que la línea de comunicación siempre está disponible para que alguno de los dispositivos inicie la transmisión.

Cuando el maestro, un Arduino en este caso, deba transmitir una orden a alguno de los motores debe poner en 1 el pin de control de flujo. En la trama de datos que envía estará incluido el ID único para cada motor, la orden y los parámetros de dicha orden; al finalizar la transmisión el pin de control de flujo debe volver a 0 para poder recibir la confirmación de recibido del motor al que envió el comando. El manejo de esta estructura de control se volvería complejo en la medida en que vaya aumentando el número de motores a manejar, afortunadamente se pueden usar librerías con las que el control del flujo de datos es trasparente para el programador.

case 'M':
while(Serial.available()<5)
{
  digitalWrite(13, HIGH);
}
digitalWrite(13, LOW);
motor = Serial.read();       // Lectura del ID del motor
posicionL = Serial.read();   // Byte menos significativo de posicion
posicionH = Serial.read();   // Byte mas significativo de posicion
velocidadL = Serial.read();  // Byte menos significativo de velocidad
velocidadH = Serial.read();  // Byte mas significativo de velocidad
posicionH = posicionH << 8;
posicion = posicionH + posicionL;  // Palabra de posicion
velocidadH = velocidadH << 8;
velocidad = velocidadH + velocidadL;  // Palabra de velocidad
Dynamixel.moveSpeed(motor, posicion, velocidad);
Serial.println(motor);
Serial.println(posicion);
Serial.println(velocidad);
break;

Si tienes alguna inquietud no dudes en comentar.

Deja un comentario