Biblioteca Dynamixel Download

jueves, 11 de agosto de 2011


Actualizado 13/06/2013              Version 1.2.1

Importante: En la actualización de la biblioteca V1.2.1 las instrucciones cambian de ser Ax12.instruccion a Dynamixel.instruccion ya que es capaz de trabajar con diferentes modelos de estos servomotores, también el nombre de la biblioteca a sido modificado siguiendo el estándar de notación CamelCase.

Biblioteca Dynamixel Serial
Descripción: En esta versión se utilizan los pines Seriales del Arduino 0 - Rx  y  1 – Tx además de un pin de control de flujo de datos si se desea utilizar el circuito 74LS241.
Enlace de descarga: Biblioteca   -  Documentación ES - Documentation EN.
Hardware requerido: Servomotor Dynamixel , Arduino, IC 74LS241, USB2Serial Converter (opcional).

Biblioteca Dynamixel Serial1
Descripción: En esta versión se utilizan los pines Seriales del Arduino Mega 19 – Rx1  y  18 – Tx1 además de un pin de control de flujo de datos si se desea utilizar el circuito 74LS241.
Enlace de descarga: Biblioteca   -   Documentación ES - Documentation EN.
Hardware requerido: Servomotor Dynamixel , Arduino Mega, IC 74LS241.

Biblioteca Dynamixel Serial2
Descripción: En esta versión se utilizan los pines Seriales del Arduino Mega 17 – Rx2  y  16 – Tx2 además de un pin de control de flujo de datos si se desea utilizar el circuito 74LS241.
Enlace de descarga: Biblioteca   -   Documentación ES - Documentation EN.
Hardware requerido: Servomotor Dynamixel , Arduino Mega, IC 74LS241.

Biblioteca Dynamixel Serial3
Descripción: En esta versión se utilizan los pines Seriales del Arduino Mega 15 – Rx3  y  14 – Tx4 además de un pin de control de flujo de datos si se desea utilizar el circuito 74LS241.
Enlace de descarga: Biblioteca   -   Documentación ES - Documentation EN.
Hardware requerido: Servomotor Dynamixel , Arduino Mega, IC 74LS241.

Biblioteca Dynamixel SoftSerial
Descripción: En esta versión se pueden escoger  los pines que se deseen para la comunicación serial por medio de software, además de un pin de control de flujo de datos si se desea utilizar el circuito 74LS241.
Enlace de descarga: Biblioteca   -   Actualización SoftSerial   -   Documentación ES - Documentation EN.
Hardware requerido: Servomotor Dynamixel , Arduino, IC 74LS241. 
Cambios necesarios: Remplaza la carpeta de SoftwareSerial que se encuentra junto con las bibliotecas principales de Arduino, el reemplazar esto no cambiar el funcionamiento de esa biblioteca solo la hará accesible para la biblioteca Dynamixel SoftSerial. SoftwareSerial.


*SoftSerial remplazara al antiguo SoftwareSerial (El remplazo no afecta el comportamiento del SoftwareSerial solo hace algunas funciones publicas para poder ser llamadas por la Biblioteca Dynamixel ) y es necesaria incluirla en el Sketch #include “SoftwareSerial.h”

**Las versiones de Dynamixel Serial1, Serial2 y Serial3 solo son para Arduino Mega ya que los otros arduinos no cuentan con estos puertos seriales.

***La velocidad por SoftSerial se vera reducida ya que la comunicación es hecha a través de pines que no fueron diseñados para esa actividad. (La lectura por SoftwareSerial aun no funciona ya que Softwareserial no realiza una lectura correcta )
Recomiendo leer el Manual de estos servomotores para un mejor entendimiento.

Versiones anteriores de estas bibliotecas pueden ser descargados desde aquí.

- Special thanks to Ambarish Parasar for making the translation of the documentation.

88 Comentarios, Dejar un Comentario:

  • hola , recien estaba checando tus post, muy buenos por cierto, cual es la diferencia de estas nuevas librerias con respecto a la primera?, saludos

  • Savage

    Hola, Gracias. La diferencia entre estas bibliotecas y la primera es que añadí algunas funciones más como el activar el modo de rotación continua, si deseas que gire a la derecha o a la izquierda y a que velocidad, la función REG_WRITE para move y move speed que sirve para guardar estas instrucciones en la memoria y poder ser activadas con action() en todos los servos al mismo tiempo, modifique el serial begin para que puedas trabajar con el puerto serial que mas acomode tus necesidades ya sea si tienes un arduino mega o un uno, o si prefieres trabajarlo con SoftwareSerial así como si quieres un pin que controle el flujo de datos del 74LS241, para cambiar el Baud Rate ya no es necesario checar el PDF solo pones las velocidad que deseas y la cambia en el servo. La primera Biblioteca era capaz de trabajar a 1 Mbps (lectura y escritura) y estas nuevas no pueden leer a 1Mbps ya que hay que modificar el HardwareSerial dependiendo el puerto Serial que vayamos a ocupar, con la anterior biblioteca no se podía usar el Serial.print(); y con estas nuevas si se puede. Saludos :D

  • Hi,
    I have a problem with the new libraries. I'm using na ArduinoMega 1280 wich is connected to the 74LS241(digital pin2 to pin 19 on TTL IC, arduino RX1 to pin 18, arduino TX1 to pin 17, arduino 5V to the IC VCC, IC GND to arduino GND, and pins 2 & 3 to the servo data pin).
    I'm using this code:

    #include
    #include
    #include

    int Error;
    void setup(){
    Ax12.begin(1000000,2); //Servo speed and Control pin
    Serial.begin(115200); // Serial speed for PC
    Error = Ax12. ledStatus (1, ON);
    Serial.println(Error);
    delay(1000);
    }

    void loop(){
    moveMotor();
    }

    void moveMotor(){
    Ax12.move(1,200); // Ax12 move.
    delay(3000);
    Ax12.move(1,800); // Ax12 move.
    delay(3000);
    }

    The problem is I can't get no response or movement from the servo. It only twitches but doesn't move. I thought maybe my servo was faulty but I tried three AX servos and still the same problem occured.

  • Got it to work. :) Thx for the great library. My problem was that I wasn't powering up the servo from the arduino but from another power source. Ah well. Thanks again!

  • Savage

    I'm glad you have figured out, Cheers.

  • Is there a command that stops the servo's movement? I'm working on a animatronics project and it would be practical to stop it when it's needed. Also is there a way to get the current position while moving? When I call readPosition() (if the motor is moving) I get the last position it stopped at.

  • Savage

    Hi, i guess you’r using the endless mode. you can stop the servo with this command:
    Ax12.turn(1,RIGTH,0); // The speed (ZERO) indicate no movement at all, And no you can't get the servo present position while is in endless mode, but you might use Ax12.move and move it 1 by 1 and stopped when ever you want. Cheers. :D

  • Hi, I was thinking of stoping it not in endless mode. I'll try to switch it from normal mode to endless mode and then back again. Maybe that stops it. By the way I thought about getting the position in regular mode not endless but it's the same thing. It can't give a reading until it reaches the target position.

    Cheers

  • Savage

    Ok, maybe if you do the steps of the servo gradually, for example: (Animatronics)

    Ax12.move(2,Ax12.readPosition(1)); This line will make the servo 2 imitate the servo 1.
    I will search for the reading Position hoping that the servo can return the value in any moment. :D

  • Hy I can't receive any feedback from AX-12+
    ( Serial.print(Ax12.readTemperature(18)); ) .
    It is moving flawlessly , i use the SN74LS241N component , i use arduino mega 2560 , i use
    #include "Dynamixel_Serial1.h" library.

    My connection :
    74ls241 pin 1 and 19 connected to arduino digital pin 2
    74ls241 pin 18 to arduino RX1 (pin 19)
    74ls241 pin 17 to arduino TX1 (pin 18)
    74ls241 pin 20 to arduino 5v
    74ls241 pin 2 and 3 to AX-12+ data , and an R10k to arduino 5v (i tried without too)
    74ls241 pin 10 to arduino ground and AX-12+ ground.
    ~8v batery to the AX-12+ with an 10uF cap

    I tried to put an 104cap betwen 74ls241 (pin 1 and 19) and ground. No luck.


    The sketch :


    #include "Dynamixel_Serial1.h" // Include the Dynamixel Library

    void setup(){ // Configuration

    Serial.begin(9600);

    Ax12.begin(1000000,2); // Configure the usart at 1mbps
    // The digital pin 2 will make the switch from tx to rx
    }

    void loop(){

    delay(5000);

    Ax12.moveSpeed(18,random(200,800),random(256,200));// Move the servo with ID 18

    int temp = Ax12.readTemperature(18);
    int voltage = Ax12.readVoltage(18);
    int pposition = Ax12.readPosition(18);
    int pingg = Ax12.ping(18);

    Serial.println("servo id 18 : ");
    Serial.print("temperatura = ");
    Serial.println(temp);
    Serial.print("voltage = ");
    Serial.println(voltage);
    Serial.print("pozitie = ");
    Serial.println(pposition);
    Serial.print("ping = ");
    Serial.println(pingg);

    }


    The serial monitor response :

    servo id 18 :

    temperatura = 0

    voltage = 0

    pozitie = 0

    ping = -1

  • Savage

    Hi, your connections and the code seems to be right, you can try without the ic 74ls241, the library should still be able to send and receive from the servo just by short circuit the RX1 and TX1 and connecting those to the data pin of the servo and if you receive information from the servo that means that something its wrong with the IC 74ls241 maybe a loose cable or something like that.
    The connections will be:
    Ground of the arduino to ground of the servo (Ax-12).
    RX1 and TX1 of the arduino to Data of the servo.
    Just remember to connected the shortcircuit of TX1 and RX1 after you upload the program to the arduino.
    Good Luck. :D Cheers

  • hola como estas! de antemano quiero agradecerte pues eres el priemro que tiene una libreria como esta, la verdad soy muy nuevo en el tema y ya hemos movido dynamixel pero con programas como matlab y codeblocks, ahora queremos algo un poco mas estables y di con este link, tenemos dynamixel ax-12 pero la verdad vi que hay varias bibliotecas y nos e cual usar, lo unico que queremos hacer es mover los dynamixel como ruedas y comops ervos, controlarles velocidad posicion , torquey poder conectar los 18 servos de compresive kit que tenemos, entonces que biblioteca seria la mejor?, como debo conectar estos servos(me refiero a fuente externa y al alrduino, es necesaria la pastilla 74ls241? y si tuvieras ejemplos sencillos del codigo te agradeceria mucho!!! y de verdad gracias por ese aporte!

  • Savage

    Hola, Gracias :D, No es necesario el 74LS241 si lo único que deseas hacer es escritura en el servo, si deseas algún feedback si es completamente necesario. Para quitar el 74LS241 lo que desbes hacer es conectar el pin Data del servo al pin Tx del Arduino.

    Ejermplo:

    #include “Dynamixel_Serial.h”

    void setup(){
    Ax12.begin(1000000);
    }

    void loop(){
    for(int i = 0; i <= 18;i++)
    Ax12.move(i,512); // Mueve el Servo con ID i a la Posición 512

    for(int i = 0; i <= 18;i++)
    Ax12.moveSpeed(i,750,1023); // Mueve el Servo a la Posición 750 con una Velocidad de 1023

    for(int i = 0; i <= 18;i++){
    Ax12.torqueStatus(i,ON); // Habilita el Torque del Servo con ID i
    delay(1000);
    Ax12.torqueStatus(i,OFF); // Deshabilita el Torque del Servo con ID i
    }

    for(int i = 0; i <= 18;i++){
    Ax12.setEndless(i,ON); // Prende el Endless Mode Rotación Continua
    Ax12.turn(i,RIGTH,1023); // Gira el servo a la Derecha a maxima velocidad
    delay(1000);
    Ax12.turn(i,LEFT,1023); // Gira el servo a la Izquierda a maxima velocidad
    delay(1000);
    Ax12.setEndless(i,OFF); // Apaga el Endless Mode Rotación Continua
    }
    //Este es un ejemplo sencillo con todo lo que quieres que hagan tus servos. Saludos, Suerte. :D
    }

  • oye de verdad muchisimas gracias!!!!! estas bibliotecas sirven para cualquier seria de dynamixel? o solo para ax12? ens erio muchisisismas gracias!!! nos acabas de salvar la vida en la universidad! muy util esta info, estas vacaiones seran de arduino y dynamixel! jejejeje

  • Savage

    Hola, perdón por la tardanza esta semana estuve muy atareado con otros proyectos, y respondiendo a tu pregunta si puede servir para otros servos Dynamixel pero hay que agregar o cambiar el 74LS241 por un RS485 que es el otro protocolo que utilizan los demás motores de otras series. Que bien seguro serán una vacaciones muy entretenidas. :D Saludos.

  • In response and completion of the problem written in 23 de noviembre de 2011 02:35


    I have tested without 74LS241 and with another 74LS241 but no success with receiving data from dynamixel. It is still moving flawlessly. I even try to change the baud rate but no success . I updated the library with todays downloaded library.
    I have 9 AX12 and i have tested more that 1 servo . Please some help or advice .

  • Josué Alejandro Savage

    Hi, maybe the servo SRL (Status Return Level) is set in Return None, so try reseting the servo and then upload again your Read program with the 74ls241.


    #include “Dynamixel_Serial1.h”

    void setup(){
    pinMode(13,OUTPUT);
    Ax12.begin(1000000,2);
    Ax12.reset(1);
    }

    void loop(){

    digitalWrite(13,HIGH);
    }

  • OK thanks. It works.
    Attention if someone does the same.
    After reset servo has id 1.

  • Hola! Ya te había escrito antes, el año pasado, otra vez estoy trabajando con Arduino y los AX12.

    Tengo un problema con mi código y no tengo ni idea como solucionarlo, el código es el siguiente:

    #include // Include the Dynamixel Library


    float M1[3];
    float M2[3];
    float M3[3];
    float V1[3];
    float V2[3];
    float V3[3];
    float T[3];
    int i;

    void setup(){ // Configuration

    Dynamixel.begin(1000000,2); // Inicialize the servo at 1Mbps and Pin Control 2
    delay(1000);
    }


    void loop(){

    /////////*** SECUENCIA 1 ***\\\\\\\\\
    M1[0]= 0;
    V1[0]= 300;
    M2[0]= 0;
    V2[0]= 300;
    M3[0]= 0;
    V3[0]= 300;
    T[0]=5000;
    /////////*** SECUENCIA 2 ***\\\\\\\\\
    M1[1]= 500;
    V1[1]= 300;
    M2[1]= 500;
    V2[1]= 300;
    M3[1]= 500;
    V3[1]= 300;
    T[1]=5000;
    /////////*** SECUENCIA 3 ***\\\\\\\\\
    M1[2]= 1023;
    V1[2]= 300;
    M2[2]= 1023;
    V2[2]= 300;
    M3[2]= 1023;
    V3[2]= 300;
    T[2]=5000;


    for (i=0;i<3;i++){

    Dynamixel.moveSpeed(13,M1[i],V1[i]);
    delay(10);
    Dynamixel.moveSpeed(15,M2[i],V2[i]);
    delay(10);
    Dynamixel.moveSpeed(17,M3[i],V3[i]);

    delay(T[i]);

    Dynamixel.end();
    Serial.begin(9600); // Begin Serial Comunication

    Serial.print("M1[i]:"); // Print the variables in the Serial Monitor
    Serial.println(M1[i]);
    Serial.println(M2[i]);
    Serial.println(M3[i]);
    Serial.println(V1[i]);
    Serial.println(V2[i]);
    Serial.println(V3[i]);
    Serial.println("------------------");
    Serial.println();

    Serial.end();

    Dynamixel.begin(1000000,2); // Begin Servo Comunication
    delay(1000);

    }
    }


    El problema es que el valor de M1[i] siemppre es cero, no me toma el valor que yo le doy, por tanto la secuencia en mis motores no se ejecuta correctamente, tu sabrias porque es este error? Me sucedio con esta libreria y tambien con la version anterior.

    Gracias!

  • Josué Alejandro Savage

    Hola, solo en M1[i] hace eso que mencionas?
    El tipo de datos que recibe la función son:

    Dynamixel.moveSpeed(char ID, int Position, int Speed);

    y estas metiendo datos float, quiza si cambias tus variables de float a int se solucione.

  • CK

    Hi, i just downloaded your library and i am not sure how to use it..

  • hola,
    estamos probando las librerias en un arduino UNO con un AX12 pero el motor no responde. Existe algun tipo de cambio que haya que hacer en el IDE para que nos permita ir a 1Mhz? Porque parece que la CPU no es capaz de generar una señal a tan alta frecuencia...
    Con el MEGA no hay ningun problema...

  • Josué Alejandro Savage

    Hola, Nono se necesita hacer nada en el IDE, debería funcionar tal como en el MEGA, intenta disminuyendo el BaudRate con el Arduino Mega después conectalo al arduino UNO y si se mueve significaría que si es problema de la velocidad de lo contrario te recomiendo checar tus conexiones, hice la bibliotecas para el Arduino UNO y después las pase al MEGA así que deberían funcionar. Saludos

  • nanda fathurrahman

    Hello Savage,

    I have tried your library on Arduino 0022, but i find a lot of errors when I compile it. like this :
    arduino-0022\libraries\DynamixelSerial\/DynamixelSerial.h:230: error: expected ',' or '...' before numeric constant
    DynamixelSerial\/DynamixelSerial.h:231: error: expected ',' or '...' before numeric constant
    ...and so on. 70 errors were detected.

    do you have any suggestion to fix this?

    Thank You.

  • soyunusuario

    Hola, Savage:
    Instalé la librería de Dynamixel SoftSerial en Arduino 1.0. Al momento de compilar para probar me salen algunos errores de este estilo:

    /usr/share/arduino/libraries/SoftwareSerial/SoftwareSerial.h: In member function 'void DynamixelClass::begin(long int, unsigned char, unsigned char)':
    /usr/share/arduino/libraries/SoftwareSerial/SoftwareSerial.h:76:8: error: 'void SoftwareSerial::setRX(uint8_t)' is private

    ¿Alguna sugerencia?

  • Josué Alejandro Savage

    Hi nanda, in my sourceForge Page you can download the library version for the Arduino 0022 or previous version of Arduino 1.0, i highly recommend to upgrade your Arduino IDE.

  • Josué Alejandro Savage

    Hola soyunusuario, para lograr que funcione la Biblioteca Dynamixel SoftSerial es necesario actualizar la Biblioteca de Arduino SoftwareSerial solo remplaza esa carpeta con la nueva y estará listo para usar, puedes descargar la Biblioteca SoftwareSerial Modificada aquí: http://sourceforge.net/projects/savelectronics.u/files/Dynamixel%20Library/Dynamixel_1.2/SoftwareSerial.zip/download

    Saludos

  • pedro Jimenez

    hola Josué, es posible usar las librerías si no tengo el IC? intento unir TX y TR del serial1 en la arduino mega, pero no recibo nada en el bueffer de entrada.(valor -1). Los servos si se mueven, pero no responden a los comandos de read (ya coloque el SRL en 2 y aun asi no recibo respuesta. Sera que necesito el IC??

  • Josué Alejandro Savage

    Hola, exacto para recibir datos del dynamixel es necesario el IC, puedes usar cualquier buffer triestado siguiendo la configuración que esta en el post. Saludos

  • hi do you have Serial Dynamixel Library pdf in english?

  • Josué Alejandro Savage

    Hi, i'm a little busy now, but i will rewrite the documentation in english soon, maybe in a week from now.

  • ArduinoNJguy

    HI, Thanks for this great library. I am using your library with the 74HC126 and the 74HC04, because I have those handy.

    I am getting very inconsistent results.

    For example, I have code that moves to position 200, at speed 200, waits 5 seconds, than reads the position, and then goes to position 1000 at speed 1000, and waits 5 seconds, all in the loop which should repeat the above code.

    It seems to work one time through, and then after that very sporadically, it may do it again in 20 seconds, or in 30 seconds, and than 2 times in a row, or not.

    Very unpredictable.

    I have tried to reset the dynamixel and I am still getting the same thing.

    I also have 4 different AX-12A's, and they are all behaving the same way.

    Any ideas on why I am getting such unpredictable behavior?

    I tried adding a 220uF capacitor right before the + and - go into the AX12A, and same thing, does not seem to help.

    I am very frustrated, any help would be appreciated.

  • Josué Alejandro Savage

    Hi, your wiring and all the hardware its fine but in your code there is a problem, The Dynamixel servos will no move from 0 to 1023 just as they said, usually it will move from 200 to 800 or maybe 900 you should read the register for that parameters, in the speed its ok it can move form 0 to 1023 speed. So try modifying that value of 1000 to 800 and run the program, now it should work fine if not read the information back from the motor by changing the SRL Register to Read All and the error coming back will tell you whats exactly the problem.

  • ArduinoNJguy

    Thank you for your response.

    I will try that. One other problem I am having is I cannot read any values. Everything comes back at -1, even after I reset the servos. Every once in a while, i get a number like -241 or -245, for the position, or the temperature, so this makes it difficult to read, is there anything else I can do to read the values and get a real response?

    I am using the mega and DynamixelSerial3 library, and have tried others as well, none can read, very strange.

  • ArduinoNJguy

    I was able to get it to work from 200 to 800 as you said, but interestingly, it only worked about 5 times, than took a break, and stopped for 3 loops, and then started back up again. I am assuming that is becuase of temperature?

    Here is the code I am using to try to read position:

    #include

    int DynaID;


    void setup(){
    Serial.begin(9600); // Begin Serial Comunication
    Dynamixel.begin(1000000,2); // Inicialize the servo at 1Mbps and Pin Control 2
    //Dynamixel.setAngleLimit(DynaID,0,1023);

    DynaID=1;

    delay(1000);


    }

    void loop(){




    // Dynamixel.move(1,random(200,800)); // Move the Servo radomly from 200 to 800
    Serial.print(" *** Move to 200,200: \n ");
    Dynamixel.move(DynaID,200);




    Serial.print(" CurPos= ");

    Serial.print(Dynamixel.readPosition(DynaID));

    Serial.print("\n");

    delay(2000);




    Serial.print(" *** Move to 800,200: \n ");
    Dynamixel.move(DynaID,800);



    Serial.print(" CurPos= ");

    Serial.print(Dynamixel.readPosition(DynaID));

    Serial.print("\n");

    delay(2000);




    // Serial.print(" *** Temperature: "); // Print the variables in the Serial Monitor
    // Serial.print(Temperature);
    // Serial.print(" Celcius Voltage: ");
    // Serial.print(Voltage);
    // Serial.print(" Volts Position: ");
    // Serial.print(Position);
    // Serial.println(" of 1023 resolution");

    //delay(1000);

    }

  • ArduinoNJguy

    Also, when I try your read example, I just get this for every line:

    *** Temperature: -1 Celcius Voltage: -1 Volts Position: -1 of 1023 resolution


    This was again after a reset, any help would be greatly appreciated, this is a great library, unfortunately I am not able to use for my application without being able to properly read values.
    I would be happy to contribute $$ if I can get this working and use your library.

    Thanks!

  • Josué Alejandro Savage

    Hi, ok there are some parameter for the reading to work, the file DynamixelSerial.h contains both of this parameter, the first is the TIME_OUT and is initialized with 10, try a 15 or 20 this parameter is in mili seconds and that will adjust your servo response. The other parameter is Tx_Delay_Time that parameter wait for the data to be send and then change the direction of the data cable as receiving so maybe the port its closing before the data has reach the servo or is closing after the data has been send from the servo to the arduino so for that parameter try from 200 to 600, and that should be all now the servos should respond as claim. Hope that helps.

  • Josué Alejandro Savage

    In dynamixelserial.h in line173 and 174.

    #define TIME_OUT 10 // change this to 20
    #define TX_DELAY_TIME 400 // and this from 200 to 600

  • ArduinoNJguy

    Thanks for the response. I tried that, still not working.

    Anything else you can think of?

    Maybe something with SRL I have to do? I tried setSRL(1,2) and that did not seem to work either, but I don't quite understnad SRL.

    Nothing seems to work, maybe baud rate or something?

  • Josué Alejandro Savage

    The status return level should be 2 (Respond to all instructions), maybe checking if all the connections are fine by trying the next program you should get a string in HEX.

    Run this program to star debugging the software or the hardware, tell me what does the servo return.

    // ID. 1 Baud rate 1Mbps

    void setup(){
    Serial.begin(1000000);
    pinMode(2,OUTPUT);
    delay(1000);
    }

    void loop(){

    digitalWrite(2,HIGH);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0x01);
    Serial.write(0x04);
    Serial.write(0x02);
    Serial.write(0x2B);
    Serial.write(0x01);
    Serial.write(0xCC);
    delay(10);
    digitalWrite(2,LOW);

    delay(1000);

    Serial.print("Returned Data: ");

    while(Serial.available()){
    Serial.print("0x");
    Serial.print(Serial.read(),HEX);
    Serial.print(" - ");
    }

    Serial.println("Thats all, now you should be able to see the data.");

    delay(1000);
    }

  • ArduinoNJguy

    Josue, earlier in the week I had ordered a 74LS241 chip, and it just came in this morning.

    I rewired my breadboard using your schematic and this 74LS241 chip, and re-ran the program.

    Everything is working perfectly! There must have either been a problem with the way I wired the 74HC04 and the 74HC126, which I don't think because I checked 10 times, or maybe there was a problem with one of the chips themselves.

    Everything is doing exactly what it should, the readings are perfect, and it is stable and predictable!

    Thanks very much for this great library, and all of your help. I will be making a contribution so that you can continue your great work!

  • ArduinoNJguy

    I just noticed your donations are not working. I would like to contribute to your work. Do you plan on having that working soon?

  • Josué Alejandro Savage

    Yes i have some troubles with Paypal but you can do a bank transferif you want. Here is the information:
    http://savageelectronics.blogspot.com/p/about.html

    Thanks

  • Hi,

    May I know if this library will work with Dynamixel RX series?
    Thanks in advance!

  • Josué Alejandro Savage

    Hi, i think so, it should work but i have never tested the RX series before.

  • Mike Gimon

    I keep getting an error about Ax12 not being declared. Any idea what is wrong?

  • Josué Alejandro Savage

    Yes, just replace all the Ax12 with Dynamixel, in the newer version of the libraries the new constructor is Dynamixel, for example:

    Dynamixel.move(); Dynamixel.ping();

  • Mike Gimon

    Nice thanks, that fixed the problem Josue.

    However it's still not moving. I'm setting this up so it looks like the picture here: http://robottini.altervista.org/wp-content/uploads/2011/12/Dynamixel-Arduino-electric-schema.jpg

    However the difference is tx and rx is connected to pin 16 and 17 on arduino mega. I also dont have the usb to serial converter connected because i don't think i need it. I simply want to be able to get the servo to move.

    So far the code i am using is:

    #include

    int Error;
    void setup()
    {
    Dynamixel.begin(1000000,2); //Servo speed and Control pin
    Serial.begin(115200); // Serial speed for PC
    Error = Dynamixel. ledStatus (1, ON);
    Serial.println(Error);
    delay(1000);
    }

    void loop()
    {
    moveMotor();
    }

    void moveMotor()
    {
    Dynamixel.move(1,200); // move.
    delay(3000);
    Dynamixel.move(1,800); // move.
    delay(3000);
    }

    Do you have any tips on getting it working?

  • Mike Gimon

    nevermind, its working now. Seems i needed to increase the voltage from 7 to 10 volts. now it seems to work. Now i just need to figure out how to use its other features like torque feedback. If you have a source for this kind of information. please post on here. thanks.

  • Josué Alejandro Savage

    Im glad you solved, more information its just in the documentation in this post or in the Dynamixel Datasheet. The library come with examples, that should be helpful just don't play with the configuration example if you don't fully understand how this works, cause you may screw the servo. Hope that information helps a little.

  • ArduinoNJguy

    Joshua,

    I would really like to contribute for this library, but I am not able to wire money from my bank account to other countries, and your paypal is not setup.

    Perhaps I can send you some electronics or something to you instead of a donation? Or maybe you have another idea?

  • Josué Alejandro Savage

    Hi ArduinoNJguy, yes you can send some electronics, that will be awesome even a postcard will be really great, I'm glad you like this library. Thanks.

  • ArduinoNJguy

    The library is fantastic, really great.

    OK, please give me an idea of a few things that you can use, or that you would like to try out, and I will send something out to you as appreciation for this library.

  • Josué Alejandro Savage

    I like all kind of electronics, I love the microcontrollers electronics (digital electronics), talking about analog electronics i like sensors, you can send anything i don't really have much electronics in here.

  • miguel angel miranda tirado

    Hola josué,

    Tengo algunas preguntas sobre los actuadores dnamixel espero puedas ayudarme, veras estoy tratando de controlar un RX- 24 F, soy nuevo en esto del protocolo RS-485 y usando este tipo de servomotores inteligentes, mi duda es que significa cuando el led rojo del servomotor enciende y apaga solo una vez según el manual:

    Confirmation of Connection

    The LED of Dynamixel flickers once if the power is supplied to Dynamixel properly via wiring.

    quiere decir que todo esta bien, supongo no ? jeje,


    Pero al usar la librería que hiciste "Biblioteca Serial 1" y usando el ejemplo que viene de "Write" no me funciona no se si sea por esto;

    1.- El ID no es el correcto
    2.-No se si requiero del 74LS241 para leer los datos del servo

    Estoy usando el arduino Mega r3 y la version del compilador es 1.5.2
    lo que hago es mandar de la salida del uart directo al max-485

    De ante mano Gracias!!
    Y te felicito por tu gran contribución""
    Pd: De grande quiero ser como tu!!! hehe just a little joke :)

  • miguel angel miranda tirado

    Esto es lo que tengo desde el arduino :

    pero recibo solo "-1"

    #include
    byte wrt = 0x00;
    int Pin1 = 13;
    int var = Dynamixel.RWStatus(254);
    int var2 = Dynamixel.ping(254);
    void setup(){
    Serial.begin(9600);
    Dynamixel.setBD(254, 9600);
    delay(500);
    Dynamixel.begin( 9600,254);

    delay(1000);
    pinMode(Pin1, OUTPUT);digitalWrite(Pin1, LOW);
    Dynamixel.ledStatus(254, ON);
    }

    void loop(){
    Serial.println(var2);
    if (var== -1){
    digitalWrite(Pin1, HIGH);
    }
    }


    No tengo el cable USB Dynamixel, para saber a cuantos Baudios esta el servo ni su ID, entonces según yo con la librería le puedo decir a que velocidad cierto? pero no se si primero tiene que hacer la comunicación para poder después configurar el servo.


    Como puedo saber el iD y la velocidad en baudios que tiene el servo??

    Gracias Saludos""

  • Josué Alejandro Savage

    Hola, no necesitas el 74ls241 ya que tu motor anda por RS-485, si el motor es nuevo tendrá un ID 0 y velocidad de 1000000, puedes cambiar esa informacion con las instrucciones de la biblioteca o restaurar con el comando Dynamixel.reset(ID); , Ese prgrama solo devuelve -1 ya que ese valor var2 es cargado solo una vez y antes de hacer todas las configuraciones.

    Intenta asi:

    byte wrt = 0x00;
    int Pin1 = 13;
    int var = Dynamixel.RWStatus(0);
    int var2 = Dynamixel.ping(0);
    void setup(){
    Serial.begin(9600);
    delay(500);
    Dynamixel.begin(1000000,2);

    delay(1000);
    pinMode(Pin1, OUTPUT);digitalWrite(Pin1, LOW);
    Dynamixel.ledStatus(0, ON);
    }

    void loop(){
    var2 = Dynamixel.ping(0);
    Serial.println(var2);
    if (var== -1){
    digitalWrite(Pin1, HIGH);
    }
    }


    El ID 254 es de Broadcast por lo que nunca responderá con dato, jamas devolvera temperatura posición etc si ese ID es utilizado ya que habría un colisión de datos con los demás motores que estén conectados al canal. Saludos

  • miguel angel miranda tirado

    Hola Savage,

    Pues lo intente como me dijiste pero nada... :(

    le mando el comando para que se mueva que encienda el led pero nada sigo recibiendo -1 y el led no se enciende que podria ser??el motor no creo porque ya probe el mismo programa con con otro motor nada

    Gracias por la respuesta!!!

    Pd: Ya entendi entonces tengo que llamar esa función siempre que quiera leer algún dato del servomotor" Gracias!!!

  • Josué Alejandro Savage

    Hola, el motor no se mueve, ni responde a ningún comando? existen dos causas para esto, algo en la conexiones esta mal, te recomiendo verificar que todo este bien conectado, puedes ver la conexiones en este mismo blog en la pestaña dynamixel, la otra causa de que no haga nada ni responda a ningún comando es que este con otro ID u otro Baud Rate por lo que te recomiendo regresarlo a los valores de fabrica. Pero recomiendo que primero cheques tus conexiones, si necesitas ayuda con el reset te puedo pasar un programa para resetearlo. Saludos

  • miguel angel miranda tirado

    Que tal, así es no responde a ningún comando, ya comprobé las conexiones y todo parece estar en orden, me base en la información que tú pusiste y la que está en el manual de dynamixel. Y aún no responde, creo que es la segunda causa que mencionaste, serías tan amable de ayudarme con el código de reset???
    Gracias en verdad!!"

  • Josué Alejandro Savage

    Graba este código en tu arduino y este deberá resetear el motor y hacer que se mueva también el led del arduino prendera cuando el programa termine si es que aun no se mueve el motor.

    #include

    long BaudRates[] = {1000000,666667,500000,400000,333333,285714,250000,222222,
    200000,181818,166667,153846,142857,133333,125000,117647,111111,105263,100000,
    95238,90909,86957,83333,80000,76923,74074,71429,68966,66667,64516,62500,60606,
    58824,57143,55556,54054,52632,51282,50000,48780,47619,46512,45455,44444,43478,
    42553,41667,40816,40000,39216,38462,37736,37037,36364,35714,35088,34483,33898,
    33333,32787,32258,31746,31250,30769,30303,29851,29412,28986,28571,28169,27778,
    27397,27027,26667,26316,25974,25641,25316,25000,24691,24390,24096,23810,23529,
    23256,22989,22727,22472,22222,21978,21739,21505,21277,21053,20833,20619,20408,
    20202,20000,19802,19608,19417,19231,19048,18868,18692,18519,18349,18182,18018,
    17857,17699,17544,17391,17241,17094,16949,16807,16667,16529,16393,16260,16129,
    16000,15873,15748,15625,15504,15385,15267,15152,15038,14925,14815,14706,14599,
    14493,14388,14286,14184,14085,13986,13889,13793,13699,13605,13514,13423,13333,
    13245,13158,13072,12987,12903,12821,12739,12658,12579,12500,12422,12346,12270,
    12195,12121,12048,11976,11905,11834,11765,11696,11628,11561,11494,11429,11364,
    11299,11236,11173,11111,11050,10989,10929,10870,10811,10753,10695,10638,10582,
    10526,10471,10417,10363,10309,10256,10204,10152,10101,10050,10000,9950,9901,
    9852,9804,9756,9709,9662,9615,9569,9524,9479,9434,9390,9346,9302,9259,9217,
    9174,9132,9091,9050,9009,8969,8929,8889,8850,8811,8772,8734,8696,8658,8621,
    8584,8547,8511,8475,8439,8403,8368,8333,8299,8264,8230,8197,8163,8130,8097,
    8065,8032,8000,7968,7937,7905,7874,7843};


    void setup(){
    pinMode(13,OUTPUT);


    for ( int i = 0; i <= 254;i++ ){
    Dynamixel.begin(BaudRates[i],2); // inicializa la comunicacion.
    Dynamixel.reset(254); // Cambia el Baud a 1000000 ( 1Mbps )
    Dynamixel.end();
    }


    Dynamixel.begin(1000000,2); // Comprobacion.
    }

    void loop(){

    digitalWrite(13,ON);
    Dynamixel.move(1,random(200,800));
    delay(1000);
    }

  • miguel angel miranda tirado

    Hola savage ,

    Pues que crees que no :(

    sigue sin jalar, ya me asuste jeje ...

    Gracias!!

    Ya verifique conexiones y todo bien no se si sea el CI o que este pasando

    De ante mano Gracias Por tu ayuda!

  • Josué Alejandro Savage

    Hola, si tienes algunas fotos de tus conexiones y fuente de energía que este utilizando para poder ver si hay algo malo o puedo darte alguna otra recomendación. Saludos

  • miguel angel miranda tirado

    Hola Josué,
    Ya las mande a tu correo porque aquí no se como subir fotos Gracias!!

  • miguel angel miranda tirado
    Este comentario ha sido eliminado por el autor.
  • miguel angel miranda tirado

    hola savage,

    Pues he seguido intentando y nada aún realmente no se a que se deba, aquí esta lo ultimo en código que he echo para esto Saludos!!.




    int ledPin = 13;
    int i = 0;
    byte startAddress;
    byte servoID= 0x01;
    byte ledOn = 0x01;
    byte ledOff = 0x00;



    void setup() {
    Serial.begin(57600);
    int DEPin= 2;
    digitalWrite(DEPin, HIGH);
    pinMode(ledPin,OUTPUT);
    }




    void loop() {

    delay(1);

    if (i%2 ==0){
    activateServos(servoID, ledOn);
    delay(200);
    }else{
    activateServos(servoID, ledOff);
    delay(200);
    }

    i++;
    if (i>1000){
    i=1;
    }
    }




    void activateServos (byte servoID, byte newValue){
    int checksum_ACK;
    byte notchecksum;
    startAddress = 0X19;

    checksum_ACK = servoID + 0x03 + 0x04 + startAddress + newValue;
    notchecksum = ~checksum_ACK;

    digitalWrite(2,HIGH);
    delay(5);

    Serial.print(0xFF);
    Serial.print(0xFF);
    Serial.print(servoID);
    Serial.print(0x04);
    Serial.print(0x03);
    Serial.print(startAddress);
    Serial.print(newValue);
    Serial.print(notchecksum);

    delay(3);
    }

    codigo basado en
    http://real2electronics.blogspot.mx/2009/09/arduino-and-rs485-english-version.html

    http://arduino.cc/forum/index.php/topic,22674.0.html


    pero pues sigue sin funcionar
    Saludos,

  • miguel angel miranda tirado

    Hola Josué,

    Nuevamente yo, pues tuve que comprar el USB2 Dynamixel y configurar los BaudRate desde ahí y el ID! y así ya funciono use el ultimo programa

    que mostré y funciono bien espero así poder yo también hacer mi librería XD

    Muchas Gracias Por tu tiempo y tu ayuda
    una ultima cosa de que manera puedo ayudarte en forma de agradecimiento???
    Saludos!!!

  • Josué Alejandro Savage

    Hola Miguel, me alegra que ya este funcionando, justamente estaba viendo eso y encontré algunos video en donde comentaban que habían modificado un poco esta biblioteca para que funcionara, he intentado contactarme con esta persona pero no he recibido respuesta por lo que me alegra escuchar que funciona la biblioteca, desafortunadamente no tengo los recursos para comprar un motor de esos y por eso no estaba seguro que funcionara mi código solo en teoría.

    Seria genial que compartieras tus resultados.
    Saludos.

  • miguel angel miranda tirado

    Si de hecho por si te vuelven a preguntar la velocidad en baudios que en mi caso venia por default es "57142" el ID viene en 0X01 como bien decías tu librería funciona BIEN!!

    El modelo de los motores es RX-24F supongo que funciona bien en todas las series.

    Claro que si, los comandos los estoy mandando desde MATLAB al Arduino cuando tenga el programa te lo comparto para que si alguien en tu blog lo quiera realizar sea de ayuda.

    Saludos!!!

  • Challa Chaitanya

    hi
    this is chaitanya from india can you code this in matrix multi media flowcode i am using dynamxel ax-12 for atmega 328 please my mail id s.k.chaitanya.challa@gmail.com thank you

  • Josué Alejandro Savage

    Hello chaitanya, unfortunately Multi Media FlowCode its a payment program and i don't have it in my computer so i cannot develop anything for this and also have never used before, i have no idea if the program will led add libraries. Greetings

  • Giang

    Hi Josué,

    Your libraries look great. I have tried the DynamixelSerial.h and it worked like a charm.
    However, the DynamixelSoftSerial.h didn't work.
    I found out the problems were:

    #define setRXPin(args) (SoftSerial.setRX(args))
    #define setTXPin(args) (SoftSerial.setTX(args))

    because now setTX() and setRX() in SoftwareSerial.h are private methods.
    I'd tried to change them to public methods but the program still didn't work.

    If you have time, I hope you can fix the example. Thank a alot.

  • Josué Alejandro Savage

    Hello, Giang, in this post below the SoftSerial Library download it a part that says: Necessary Changes, download that file and replace that file, If still won't work please write the errors that arduino says in the IDE in other to see whats happening.

  • Giang

    Hi Josué,

    Thank you for your instant reply.
    The program now can be compiled. However, in the example of DynamixelSoftSerial, you called:

    Dynamixel.begin(9600,2,3,4); //Inicialize the servo at 1Mbps and Pin Control 2

    So the baud rate is 9600, Rx = 2, Tx = 3 and DataPin = 4 right?

    I connected the components accordingly, uploaded the program, but nothing happened.
    I'm still checking to see what's wrong with it. The hardware is fine, because I just checked with DynamixelSerial.

    Can you please take a look? Thank you in advance.

  • Josué Alejandro Savage

    Hi, yes thats right baud rate is 9600, Rx = 2, Tx = 3 and DataPin = 4.

    Have you already change the Baud Rate on your servo to 9600 bps ? Try to run your servo with the Dynamixel Serial with the same configurations Baud Rate 9600, and after that try with the softSerial version. I don't see any errors in there, it should work.

  • Giang

    Hi Josué,

    Sorry for late reply. I tried to change baud to 9600 using setBD() but it didn't work.
    Now everything stops working altogether, even the DynamixelSerial.
    Probably something is wrong with my hardware. I will have to go through again.
    I'll try your suggestion again and let you know the result tomorrow. It's already 10PM now.
    Thank you very much for your kind support.

  • Sergio HERNANDEZ MENDEZ

    Hola Josue, me llamo Sergio y estoy utilizando tu libreria, me ha servido mucho para entender el manual de los motores dynamixel. En mi caso tengo un RX-28 segun veo son los mismos valores de la tabla, asi como comados de lectura y escritura que de otros modelos dynamixel. Estoy corriendo el ejemplo de dynamixel.read en el cual yo le especifico la velocidad, pines de rx,tx y el pin de control. La parte de enviar funciona bien, si ejecuta los comandos, el problema esta en la parte de recepcion solo veo -1 como resultado. Estoy ocupando un rs485 breakout de sparkfun y las conexiones estan correctas, tambien utilizo una arduino mega. Espero me puedas orientar para saber que esta pasando con la recepcion de datos por que no leo el valor esperado. Gracias de antemano y espero tu respuesta. Saludos

  • Josué Alejandro Savage

    Hola Sergio, desafortunadamente no se muy bien como ayudarte a solucionar eso, deberías poder leer datos, checa que estén bien conectado todo. Si tienes alguna forma de ver si el motor responde con ayuda de un osciloscipio seria lo ideal, de esa forma te sera mas sencillo ver que esta pasando y en donde esta el problema, con un error mas especifico seria más sencillo poder ayudarte, yo no cuento con ese tipo de motores e interfaz solo se decir que algunas personas si les responde y a otras no aunque no sabría por que. Saludos.

  • Sergio HERNANDEZ MENDEZ

    Hola josue ya lo pude solucionar, modifique unas cosas de la libreria para poder echarlo a andar, tambien tenia probñemas con los pines de la arduino para comunicacion serial, pues resulta que no todos pueden ocuparse para tx y rx, despues voy a documentar todo lo que hice para echarlos a andar asi como los problemas que tuve que resolver, en cuanto lo tenga te lo mando y espero a alguien le sirva, gracias por la libreria me sirvio mucho para entender sobre el envio y la recepcion de instrucciones. Saludos y que estes bien :)

  • Saludos savage, use tus librerias pero ninguna me ha funcionado tengo un arduino mega 2560 y he checado la conexion con los servos dynamixel ax-12a mil veces, estoy usando el CI HD74LS244P, distinto al que la mayoria usa al 74LS241N, mi pregunta es si realmente puede afectar esto al funcionamiento de los servos pues no encuentro algun otro motivo por el cual no funcione. De antemano muchas gracias

  • Josué Alejandro Savage

    Hola, claro, si afecta, si lo verificas bien ese circuito funciona de manera diferente, te recomiendo hacer los cambios necesarios o conseguir el circuito que recomiendo. Saludos.

  • Bueno eso explica todo, tratare de conseguir el 74LS241N, muchisimas gracias savage saludos

  • Hola, soy un estudiante de Japón.
    Estoy tratando de ejecutar la Ax-12 + en el Arduino.
    Estoy utilizando el 74HC241 IC.
    Arduino es MEGA2560.
    No funciona cuando se conecta como se indica en esta página.
    Biblioteca utiliza el DynamixelSerial.
    No sé la causa.
    Por favor, dígame la solución.

  • Super Duraznito.

    hola Savage!. Estudio mecatrónica, y estamos haciendo un brazo robotico. lamentablemente, los servos de hobby no dan el ancho para el peso y precision que pensamos implementarle. Tengo acceso a los dynamixel ax-12, pero no al buffer tri-estado especifico que nombras... A los que si tengo acceso son a :
    SN54/74AC240
    y
    CD54, 74HC (T) 240-41,244.
    Me valen? he leido en un comentario anterior que cualquier buffer tri estado puede funcionar. en el caso del anterior puedo usar estos?
    Mi otra idea de solucion, menos eficiente y mas "bruta" es poner un arduino por motor, conectando rx y tx directamente...¿Estoy en lo correcto?
    saludos, y miles de gracias por tu blog!

  • Josué Alejandro Savage

    Hola, te recomiendo seguir con este diagrama, un poco mas grande pero este es el que robots utiliza en su Datasheet. El conectar rx y tx juntos funciona solo para enviar instrucciones al Motor no siempre responde bien a la lecturas pero puedes intentarlo, Saludos

  • Juan Sebastián Botero Valencia

    Saludo, de antemano muchas gracias la librería me ha sido de mucha utilidad para controlar un AX12W, sin embargo aun no he podido realizar la lectura de los datos, me reporta un "-2", Tienen alguna idea de lo que puede pasar?, Gracias.

  • Josué Alejandro Savage

    Según el datasheet, este es el error: "Set as 1 if the Goal Position is set outside of the range between CW Angle Limit and CCW Angle
    Limit." te recomiendo cambiar esos limites de forma que no interfieran con tus comandos de acción y lectura, saludos.

  • Juan Sebastián Botero Valencia

    Los límites están definidos en '0' que aplica al modo en rotación continua, ahora, en nuevas pruebas el error cambia a otros valores negativos (-3,-4,-5) y no veo la relación con la tabla de error, alguna idea al respecto?. Gracias.

  • Publicar un comentario en la entrada