Biblioteca de Arduino para AX-12

El Dinamyxel AX-12+ es un un servo digital “inteligente”, fabricado por la empresa Robotis e implementado en sus kits robóticos Bioloid (que cuando pueda me voy a comprar uno); es lo que podríamos llamar un “superservo”.

Algunas de sus características, que me vienen a la mente ahora:

  • soporta rotación continua y modo servo standard, este último con un radio de giro de 300 grados
  • velocidad y torque ajustables
  • velocidad máxima: 300 grados/seg. Torque máximo: 16Kg/cm
  • comunicación serial a 1Mb/s, half duplex. Se pueden conectar varios motores en cadena a un mismo bus.
  • usa un microcontrolador ATmega8 (vale decir que adentro de cada motor hay una Arduino de las viejas)
  • 10 bits de resolución en todos los parámetros (0-1023)
  • alimentación de 7-10V (los servos standard funcionan entre 4,5-6V)
  • feedback de todo tipo de información: posición angular, temperatura, voltaje, fuerza, velocidad, sobrecarga, errores, etc.  a través del bus serial, y posee además un led de notificación.
  • y lo que más me gusta: viene con los famosos “brackets” en forma de “U”, de un plástico muy resistente, tornillos, y otras piezas mecánicas de gran interés, por sólo 45 dólares.

Cuando me enteré de la existencia de tan maravilloso actuador, comencé a buscar información sobre su control mediante Arduino. Dado que el propio motor implementa un ATmega8 y que el microcontrolador central de los Bioloid es un ATmega128, pensé que tenía que ser más que posible dicha combinación.

Afortunadamente encontré este proyecto, el ArbotiX RoboController, que es justamente una placa controladora de robots capaz de manejar los AX-12, basada en ATmega644 y de código abierto. La ArbotiX está basada en Sanguino, y no en la Arduino propiamente dicha. La principal diferencia es que estas placas, al igual que la CM-5 del Bioloid, tienen dos puertos USART, mientras que la Arduino “clásica” tiene solamente uno.

Si usamos los AX-12 en un proyecto, siempre nos va a convenir tener un segundo puerto serial, para comunicar con la PC u otro hardware “superior”. En el caso de la Arduino clásica, esto se resuelve usando la biblioteca SoftwareSerial, que fue lo que yo hice en el video de más abajo. Hay que tener en cuenta que la SoftwareSerial está limitada a 9600 baudios, y que consume memoria y tiempo del procesador, pero en muchos casos esto no representa mayor problema.

En resumen, la adaptación de la biblioteca de ArbotiX a una Arduino clásica consistió simplemente en cambiar el nombre de algunos registros. Una vez que probé que esto funcionaba, aproveché para ampliar y mejorar la funcionalidad de la librería, y actualmente estoy trabajando con mi propia versión, que pueden descargar aquí.

En el video de prueba, el setup es el siguiente:

  • los pines 0 y 1 (RX y TX) van unidos entre sí y conectados al pin de datos del AX-12
  • la alimentación del AX-12 se extrae de los mismos 9V que alimentan a la tarjeta
  • los pines 2 y 3 se utilizan con la “software serial”, y van conectados a un convertidor serial-USB (FTDI) el cual a su vez se conecta al PC y es monitoreado con el Putty. No es posible usar para esto el propio convertidor serial-USB incluido en la Arduino, ya que el mismo se encuentra físicamente soldado a los pines 0 y 1.

Bueno, aquí les dejo el video. Saludos!

YouTube Preview Image

Compártelo:
  • Print this article!
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

8 Comentarios »

  1. avatar Bernice Franklin Dice:

    This article was very useful for a paper I am writing for my thesis.

    Thanks

    Bernice Franklin

  2. avatar Oskar Mobardov Dice:

    Dear Pablo

    I need very urgent your help!

    Can you give me a hint, how can I run my ax-12 with ardunio?

    Can I you give me a hint, how I must to wire ardunio and ax-12?

    Best regards,
    Oskar

  3. avatar pabloxid Dice:

    Hi Oskar, you have to wire TX and RX together to AX12 data pin, and use this library (go to “descargas” section to download it).

  4. avatar Proyecto Butiá | Palmera blog Dice:

    [...] se optó por comenzar el desarrollo usando Arduino, dada la facilidad ofrecida por la biblioteca para controlar motores AX-12+, pero sin descartar una futura implementación usando el hardware [...]

  5. avatar Oskar Mobardov Dice:

    Dear Pablo

    Thank you very much for your reply.

    Can you give us your test Arduino Sketchfile (pde) for ax-12?

    I’ve no idee, how can i use ax12.cpp and ax12.h file with arduino editor.

    Thank you.

    Best regards,
    Oskar

  6. avatar pabloxid Dice:

    You have to put these files into a folder under the “libraries” folder of yor Arduino IDE installation. Please note that this folder is not in the same place for Arduino 0018 and previous IDE releases. For 0017 and older, the folder is \hardware\libraries.

    Then, you can load this code in Arduino IDE to test the motors:

    #include < SoftwareSerial.h >
    #include < ax12.h >

    SoftwareSerial swSerial (2, 3);

    void setup() {
    ax12Init (1000000);
    swSerial.begin(9600);

    writeData (14, AX_TORQUE_ENABLE, 1, 1); // “14″ is the motor ID

    }

    void loop() {

    int error = ping (14);
    swSerial.print (”ping ID: “); swSerial.print (status_id, DEC);
    swSerial.print (” int.error: “); swSerial.print (error, DEC);
    swSerial.print (” status.error: “); swSerial.println (status_error, DEC);
    swSerial.println (” “);

    error = readData (14, AX_PRESENT_TEMPERATURE, 1);
    swSerial.print (”temperatura: “); swSerial.print (status_data, DEC);
    swSerial.print (” int.error: “); swSerial.print (error, DEC);
    swSerial.print (” status.error: “); swSerial.println (status_error, DEC);
    swSerial.println (” “);

    error = writeData (14, AX_GOAL_POSITION_L, 2, int(random(1024)));
    swSerial.print (”goal position ID: “); swSerial.print (status_id, DEC);
    swSerial.print (” int.error: “); swSerial.print (error, DEC);
    swSerial.print (” status.error: “); swSerial.println (status_error, DEC);
    swSerial.println (” “);

    delay (200);

    error = readData (14, AX_PRESENT_POSITION_L, 2);
    swSerial.print (”posicion: “); swSerial.print (status_data, DEC);
    swSerial.print (” int.error: “); swSerial.print (error, DEC);
    swSerial.print (” status.error: “); swSerial.println (status_error, DEC);
    swSerial.println (” “);

    }

  7. avatar Oskar Mobardov Dice:

    Hi Pablo

    You are my HERO!!!!

    Thank you very very very much!!!

    Can u tell me please, which kind of terminal software you are using?

    Best,
    Oskar

  8. avatar pabloxid Dice:

    PuTTY. Please note that terminal is connected to Arduino via a serial-USB converter on pins 2,3. These pins are used by the SoftwareSerial library.

    In more recent implementation, I just use the FTDI chip included in Arduino, I detach it from pins 0,1 and connect it to pins 2,3. Then, I reconnect it to pins 0,1 when programming the board.

RSS alimentación de los comentarios de esta entrada. TrackBack URL

Dejar un comentario