Arduino y Dynamixel AX-12

sábado, 22 de enero de 2011

Después de un largo tiempo he aquí una Biblioteca para controlar los actuadores Ax-12A de Dynamixel.
Estos Servos son bastante increíbles, parece que no les podría faltar nada, ya que pueden devolver Temperatura interna, Voltaje, Posición y Velocidad; Esto lo logra ya que tiene un microcontrolador ATmega8 el cual se comunica atravez de Half Duplex UART-TTL.

Estas bibliotecas sirven para comunicarse con los servomotores Dynamixel de varias formas en diferentes pines de las placas Arduino.

La comunicación se realiza a través del puerto Serie (UART o USART) del Arduino por lo que estos puertos utilizados se volverán exclusivos para comunicarse con el servomotor Dynamixel.

La alimentación de estos Servos es con una fuente de 9.6v y uniendo la tierra del arduino con la tierra de la fuente del Servo para que la comunicación no tenga errores de interpretación y la biblioteca pueda funcionar correctamente.La alimentación del Servo y del Arduino también puede ser de la misma fuente por lo que Vin del Arduino tendrá que tener un voltaje de 9.6v (Este es el voltaje sugerido por Robotis).


Las conexiones de alimentación del Servo con otras versiones y modelos de arduino funcionan de la misma forma.

Para utilizar estas bibliotecas se necesita un buffer tri-estado, se puede hacer con dos circuitos integrados 74HC04 y 74HC126 tal como recomienda Bioloid y utiliza en sus controladores o pueden usar un solo circuito integrado 74LS241 que yo recomiendo ya que es más sencillo de utilizar y/o conectar. Los pines de comunicación cambiaran según sea la Biblioteca que se quiera utilizar.



Circuito Savage Electronics - Dynamixel Serial:

Circuito Savage Electronics - Dynamixel Serial1:


Circuito Savage Electronics - Dynamixel Serial2:


Circuito Savage Electronics - Dynamixel Serial3:


Circuito Savage Electronics - Dynamixel SoftSerial:




Video Demostrativo:


431 Comentarios, Dejar un Comentario:

«El más antiguo   ‹Más antiguo   201 – 400 de 431   Más reciente›   El más reciente»
  • Alejandro Daniel Jose Gomez Florez

    Nada, el código tal cual como me lo enviaste no funciona... sabes si se puede arreglar con el USB2Dynamixel?

  • Josué Alejandro Savage

    Si recuerdas en que ID lo dejaste intenta ponerlo en la linea: Dynamixel.reset(ID);, se puede hacer con el USB2Dynamixel pero es basicamente los mismo pero manualmente intentando BaudRate por Baudrate con el ID 254, una vez encontrado el BaudRate se remplaza y listo, una forma más drastica es reprogramando el Atmega8 directamente, tengo un Post de como hacerlo aqui en el Blog, si tienes el codigo que has utilizado quizas sea más facil ver que ha pasado, verifica tus conexiones, no olvides unir la tierra de tu bateria con la del arduino.

  • Alejandro Daniel Jose Gomez Florez

    antes de realizar las pruebas, comprobé las conexiones con un ejemplo que tengo y un motor diferente al que no le inetenté modificar el baud rate. Todo funciona, salvo los motores.

    El código accidentalemte lo cerré de los nervios que tenía. lo que hice fue usar la linea para cambiar el baud rate motor por motor y de allí ninguno funciona. Y el problema es que estos motores no son míos.

    es algo como esto

    motors[8]= {8, 7, 12, 17, 16, 18, 9, 11};

    void setup(){
    Dynamixel.begin(1000000, 2);
    for(int i=1; i<8; i++){
    Dynamixel.setBD(motors[i], 9600);
    }
    }

    incluyendo la librería claro está


    cabe aclarar que empleé la librería DynamixelSerial, un arduino dumilanove 328p, una batería de 8,4 V, y el integrado 74LS241N.

  • Josué Alejandro Savage

    Todo parece estar bien, cabe resaltar que el motor que tiene un ID de 8, el primero del arreglo motors debería funcionar tal como antes ya que a ese motor no se le ha modificado nada ya que el arreglo fue llamado desde 1 y el primer motor esta en motors[0], verifica si ese motor se mueve de ser que no se mueva hay que buscar que otra cosa fue lo que les paso.

    El pequeño programa que te acabo de pasar servirá conectando solo un motor a la vez, ya he utilizado ese programa varias veces antes y me ha funcionado perfectamente.

  • Alejandro Daniel Jose Gomez Florez

    lo siento no era desde 1 sino desde 0, es que al escribirlo rápido me equivoqué..

  • Josué Alejandro Savage

    Mira esta es una forma más agresiva de reparar estos motores: http://savageelectronics.blogspot.mx/2011/07/reparar-servo-dynamixel-ax-12.html
    pero solo la recomiendo una vez probando otros metodos menos invasivos, aun me falta subir los archivos nuevamente pero pronto los subire, dale un vistazo, pero antes te recomiendo sigas intentado repararlo de otra forma, por ejemplo cambiando la bateria cables etc etc. Suerte cualquier cosa estamos en contacto.

  • Alejandro Daniel Jose Gomez Florez

    Hola. ya pude arreglar el problema con los servomotores. Empleé el USB2Dynamixel que vino con el kit, y con el cual no contaba el día de ayer, ya que estaba en la universidad y yo estaba trabajando en mi casa. Lo que hice fué emplear la busqueda con el Dynamixel wizard y despues de media hora, pude detectar los motores, se configuraron a un baud rate de 9200 cuando yo le asigné 9600 en el cambio. Te agradezco por toda la atención prestada, eres muy formal. Gracias por todo.

  • Unknown

    Hello Savage,

    I had problem with the Data Control Pin of 74LS241.
    I can not switch between TX and RX when I connect this pin with my uC port. I have programed the uC port to set as Output and set the logic to High and Low.. but it wont work.
    If i left the Data Control pin not connected, the data is transmitted well, but I can not catch the RX data feedback.
    Do you have any suggestions?
    Thank You.
    Nanda.

  • I wired all,copied all libraries,upload code"Dynamixel_Write" and nothin happens,like its all turnd off.
    What is the reason for that?Help

  • Josué Alejandro Savage

    it could be your battery, check your connections it should work, check the ID and Speed of your servo and edit the example code. Good Luck Greetings.

  • Gosta

    Hey savage
    i am copied library,uploaded code,connect everything and hothing.
    When i plug in power led just blink and thats all.
    Dont want to move,dont want to do anything like its all dead.
    I try with other libraries but stil nothing.
    What could that been?
    Plz help.

  • Josué Alejandro Savage

    Hi, if you are using a battery independent to the arduino power remember to mix the GND of the battery to the GND of the arduino, check your connections. good luck :)

  • Hi Savage, would this library work with the MX-64? I tried with the AX-12s and they work brilliantly, but not so with the MX-64s.

  • Hi to answer my own question, yes the code works on MX64 and MX28, however the wiring diagram given here is not exactly correct, causing my MX64 to constantly burn out and spoil. A 10k resistor needs to be paralleled from Dynamixel side Data In to a 5v. You can refer to the wiring diagram on the mx-64 manual, Connection to UART (TTL : MX-28T, MX-64T, MX-106T) .

    http://support.robotis.com/en/product/dynamixel/dxl_mx_main.htm

    AX and RX series don't need that extra resistor because it has a buffer inside that prevents the burn-out, however MX series don't have that. Best to put in that resistor, according to my distributor.

    Thanks for everything Savage!

  • Josué Alejandro Savage

    Hi, sorry I have been busy, thank you for the information, it is now updated.

  • babeth

    me pueden ayudar con el codigo para mover los tres servos al mismo tiempo con ID diferentes y en angulos distintos son los RX-64 y utilizo una usb2Dynamixel gracias

  • Josué Alejandro Savage

    Hola, quieres mover los tres servos solo con el USB2Dynamixel? me parece que no hay programas ya hechos que te ayuden a hacer eso, si puedes enviar datos seriales desde tu computadora con el USB2Dynamixel te puedo decir que debes enviar para lograr eso, la alternativa es un arduino o microcontrolador similar. Saludos

  • Hi savage, its me again who did the RX-64. Seems that though i can send info to the RX-64, like moving the RX-64, it cannot receive information from the servo properly. Example readPosition gives back -1 (error).

  • Sorry for the typo. I meant the MX-64. The position reader is more advanced as it is using magnetic encoders, having accuracy increased from 1024 to 4096.

  • Josué Alejandro Savage

    This library support that data size, even much bigger data for new Dynamixels to come, it should work, check your connections and the status return level register. the SRL should be "2 DEC" to get answer from the dinamixel. Good luck.

  • hi joshua, I'am using Arduino duemilanove atmega 328 and MAX485
    with Robotis RX-24F servo motor,I have downloaded the serial dynamixel
    library in your website.I have upload the example in the library folder to the arduino but there are no respsonse from the motor.Do i need to make modify on the serial dynamixel library folder's file?

  • Josué Alejandro Savage

    Hi, no it should be running as it is. check your connections, make sure that the ground of your arduino and your servo is the same for both of them. Good Luck.

  • Hi Savage, its me again with the MX64. Sorry to bother you with so much questions, but the MX64 is still not giving back information. I have it daisy chained with a AX12A, and the AX12A is giving back readPosition properly, while the MX64 gives back -1. I have tried the setSRL() to set it to "2" but its still not working.

    I am using your DynamixelSerial1 library if it matters. Also, i have the same wiring diagram as you.

    Thank you,
    G.

  • hi joshu
    void loop(){
    Dynamixel.moveSpeed(1,0,100);
    delay(5000);
    Dynamixel.moveSpeed(1,1023,100);
    delay(5000);}
    what command should i use to wait for the motion to be completed before moving another position if I do not wish to use delay(5000)
    ?because different speed need different delay.Thanks you for your help

  • Josué Alejandro Savage

    Hi, thats odd, it should work, run this program and feedme back with the data on the Serial Monitor.


    void setup(){
    Serial.begin(9600); // Serial Monitor Baud Rate for Debbuging
    Serial1.begin(1000000); // Motor Baud Rate
    pinMode(2,OUTPUT); // Control Pin comunication

    digitalWrite(2,HIGH); // Set Transmition Mode
    Serial1.write(0xFF); // Start Bytes
    Serial1.write(0xFF);
    Serial1.write(0x01); // ID of the Motor
    Serial1.write(0x04); // Read Position Command Length
    Serial1.write(0x02); // Read Register in the motor
    Serial1.write(0x36); // Motor Position Register
    Serial1.write(0x02); // Number of Bytes of the Position
    Serial1.write(0xC0); // Checksum 0xFF - (ID + .... all the data). except the start bytes
    digitalWrite(2,LOW); // Set Reception Mode

    }

    void loop(){

    if(Serial1.available() > 0){
    Serial.write(Serial1.read(),HEX);
    Serial.print(" - ");
    }

    }

    That program send the position of the servo.

  • Josué Alejandro Savage

    Hi, you can try this:

    void loop(){
    Dynamixel.moveSpeed(1,0,100);
    while(Dynamixel.moving() == 1);
    Dynamixel.moveSpeed(1,1023,100);
    while(Dynamixel.moving() == 1);

    That should work.

  • hi joshu,
    when i verify it, it say ''no matching function for call to DynamixelClass::moving()"
    i downloaded the Serial Dynamixel Library first link(upper)


    RX_24F.cpp: In function 'void loop()':
    RX_24F:15: error: no matching function for call to 'DynamixelClass::moving()'
    C:\Users\Valued Acer Customer\Desktop\arduino-1.0.1-windows\arduino-1.0.1\libraries\DynamixelSerial/DynamixelSerial.h:239: note: candidates are: int DynamixelClass::moving(unsigned char)

  • sorry joshu
    I know my problem why i cannot use while(Dynamixel.moving(1)==1) because i'm also having problem getting feedback from the servomotor like what others' are having.

  • hi sorry to bother, after i've used Dynamixel.reset(1),i can no longer control my servomotor, I tried using Dynamixel.setID(254,1)but there is no luck do you know why?

  • Josué Alejandro Savage

    For the feedback error i need some data to see whats happening, if you could send the data on the serial monitor after running the program above it would be much easer to me understand the problem.

    After reseting a servo it should be in the Factory defaults, for example: ID = 1 Baud Rate = 1000000 etc.

  • Hi Savage, I'm not sure if i did something wrong, but there is totally no output. Pressing the reset button on the arduino didnt help. I copied your code directly, although i changed

    Serial.write(Serial1.read(),HEX);
    to
    Serial.print(Serial1.read(), HEX);
    because it gave me invalid conversion from int to uint_8*.

    I tried putting a nonsense Serial.print("test") in void loop but outside of the Serial.available IF statement and it will just keep printing that.

    Thanks very much Savage,
    G.

  • Josué Alejandro Savage

    Have you check the baud rate of the serial monitor it should be the same as de Serial.begin().
    and should respond something like this FF - FF - 01 - 00 ......

  • Hi Savage,

    Sorry i took so long to reply. I still did not manage to get any reading from the MX64, however when i used an AX12A, i managed to get "FF - FF - 5 - 2 - 10 - E8 - ". I am not sure if my motor is spoilt, since its still able to move on command, just not read. I'll send it for checking first thing tomorrow.

    G

  • Hi Savage,

    The MX-64 servo i used is tested to be not spoilt at all, and it still can write but not read. With the same setup, an AX12A daisy chained to the MX64 writes and reads, so i dont think it is a problem with the setup. Could it be the library that is not able to take in the read size?

    G

  • hi savage,
    is there a way to change the wheel mode of dynamixel RX-24F to joint mode?

  • Josué Alejandro Savage

    Hi, its not the library, should be something else, unfortunately i don't have any MX-64 to see whats happening, i will read the manual of the MX-64 and try to get you an answer, the Mx-64 should answer to the read command just as the AX series " FF FF 01 ....." the previous program just read the serial data after the read command is send.

  • Josué Alejandro Savage

    Hi, sorry for my bad english, what is the joint mode?

  • Josué Alejandro Savage

    Sorry, my bad, the position register is 0x24 not 0x36. try this again and send me the data in your serial monitor.

    void setup(){
    Serial.begin(9600); // Serial Monitor Baud Rate for Debbuging
    Serial1.begin(1000000); // Motor Baud Rate
    pinMode(2,OUTPUT); // Control Pin comunication

    digitalWrite(2,HIGH); // Set Transmition Mode
    Serial1.write(0xFF); // Start Bytes
    Serial1.write(0xFF);
    Serial1.write(0x01); // ID of the Motor
    Serial1.write(0x04); // Read Position Command Length
    Serial1.write(0x02); // Read Register in the motor
    Serial1.write(0x24); // Motor Position Register 36 dec
    Serial1.write(0x02); // Number of Bytes of the Position
    Serial1.write(0xD2); // Checksum 0xFF - (ID + .... all the data). except the start bytes
    digitalWrite(2,LOW); // Set Reception Mode
    }

    void loop(){
    if(Serial1.available() > 0){
    Serial.write(Serial1.read(),HEX);
    Serial.print(" - ");
    }
    }

  • Hi Savage,

    Still no output. A daisy-chained AX12A gives FF - FF - 5 - 2 - 10 - E8 - , while the MX64 shows nothing.

    G

  • Josué Alejandro Savage

    Ok, according to the Ax-12 feedback there is an error:

    FF FF Start Bytes, 5 - ID of the motor, 2 - Length , 10 - Checksum error, E8 - Checksum

    so you are not sending the right Checksum, for a motor with ID 5 the checksum to the above program will be: 0xCE in line 14.

    Serial1.write(0xCE); // Checksum 0xFF - (ID + .... all the data). except the start bytes

  • Hi Savage,
    I changed the checksum like you said previously, and now the AX-12A is giving me back FF - FF - 5 - 4 - 0 - 64 - 2 - 90 - . The MX-64 is still not working.

    G

  • Josué Alejandro Savage

    Ok, the Ax is working fine, now try this program by changing the transmission delay time, if doesn't work try removing the 74-241 IC and short the Tx and Rx of the arduino and now that is the Data cable.

    void setup(){
    Serial.begin(9600); // Serial Monitor Baud Rate for Debbuging
    Serial1.begin(1000000); // Motor Baud Rate
    pinMode(2,OUTPUT); // Control Pin comunication

    digitalWrite(2,HIGH); // Set Transmition Mode
    Serial1.write(0xFF); // Start Bytes
    Serial1.write(0xFF);
    Serial1.write(0x01); // ID of the Motor
    Serial1.write(0x04); // Read Position Command Length
    Serial1.write(0x02); // Read Register in the motor
    Serial1.write(0x24); // Motor Position Register 36 dec
    Serial1.write(0x02); // Number of Bytes of the Position
    Serial1.write(0xD2); // Checksum 0xFF - (ID + .... all the data). except the start bytes
    delayMicroseconds(400); // Time delay for complete the transmission (200 to 1000) us
    digitalWrite(2,LOW); // Set Reception Mode
    }

    void loop(){
    if(Serial1.available() > 0){
    Serial.write(Serial1.read(),HEX);
    Serial.print(" - ");
    }
    }

  • Michael Koch

    Hello,

    thanks for your library, it works great with the AX-12!

    I tried to get it working with a MX-28T, but I have a problem with the 4096 steps of the MX-28T-encoder. The servo only accepts commands to 1024, this means I only can use 25% of 360°.
    Where do I have to change your sourcecode to switch from 1024 to 4096 steps?

    Thanks a lot for a short advice!

    Michael

  • Josué Alejandro Savage

    Hi Michael, You can send any value from 0 to 32,767 'cause its a 16 bit variable ( int ) so a value like 4095 shouldn't be a problem, but yo can try editing the file DynamixelSerial.cpp changing the int variables for unsigned int or maybe double. for example:

    int DynamixelClass::move(unsigned char ID, int Position) - to - int DynamixelClass::move(unsigned char ID, unsigned int Position) // line 206 in DynamixelSerial.cpp

    and also changing the same parameter in DynamixelSerial.h
    let me know how it goes. Good luck.

  • Michael Koch

    It's working! Thanks a lot!
    Great library!
    Bye!

  • 0330

    Hola tengo una duda la primera, puedo mover varios ax12 de un brazo de un robot bioloid??.

    la segunda, logro comunicarme con un motor y activar y desactivar el led con la funcion de tu libreria. pero al momento de intentar moverlo no se mueve. y checo el status con las funcion ping y me regresa un -1 siempre.

    como es posible que pueda comunicarme con el led pero no pueda leer nada del motor?

  • 0330

    oye por favor agregame en skype carlos.serna800 por que necesito un poco de ayudaaa :)

  • Josué Alejandro Savage

    Hola, claro puedes mover hasta 253 servos, cuando no hay respuesta del servo regresa -1 por lo que puede que no estés conectando bien el circuito al servo o tengas el Status Return Level para no regresar datos.

  • Hi Savage,

    Its me with the MX-64 issue. I managed to solved the problem, which i think was actually due to the baudrate difference. Somehow it was set to some value that could allow me to write but not read it. I used a code to find all ID numbers and baudrate, and reset it.

    for (int i=1; i<0xFF; i++)
    {
    long Baudrate_BPS = 0;
    Baudrate_BPS = 2000000 / (i + 1);
    Dynamixel.begin(Baudrate_BPS ,2);
    Dynamixel.reset(0xFE);
    }

    After that i just had to set it to whatever ID and baudrate i wanted. Thanks for all the replies you gave me. Thought this might help anyone else who got stuck with the same problem i had.

    G.

  • Josué Alejandro Savage

    Hi, nice and elegant solution, i would never imagine that it was a baudrate problem. Thanks for the feedback.

  • ilovekexin

    Hi, i am new to arduino program, but i need to use it for my project.
    why do i get all these error messages when i am just compiling a working program of my friends. The error message is shown below.

    error: 'VarSpeedServo' does not name a type
    In function 'void setup()':
    error: 'Dynamixel' was not declared in this scope
    error: 'mouth' was not declared in this scope
    In function 'void loop()':
    error: 'Dynamixel' was not declared in this scope
    error: 'mouth' was not declared in this scope
    error: 'mouth' was not declared in this scope
    error: 'Dynamixel' was not declared in this scope
    In function 'void setSmoothPosition()':
    error: 'Dynamixel' was not declared in this scope
    error: 'Dynamixel' was not declared in this scope
    error: 'Dynamixel' was not declared in this scope

    Thank you very much for your kindly attention and hope to hear from you soon.

    Regards
    L.

  • Josué Alejandro Savage

    Hi, you probably don't copy the entire program an just a section of this cause error says that all the errors are in declarations, copy all the program or copy the file *.ino and opened it should work with you too. Good Luck.

  • druckgott

    Hallo, I have connected an MX-28 with the Dynamixel Example to my Arduino Uno like this:
    http://postimage.org/image/mgryg3i6t/

    But my Dynamixel do not work.

    If I use the driver Board:
    http://www.dfrobot.com/wiki/index.php/AX12_CDS55xx_Driver_Board%28SKU:DRI0016%29
    it works.

    Can you help me?
    thx
    druckgott

  • Josué Alejandro Savage

    I see, Have you powered the 74ls241 with 5v and ground? and i think you forget the 10k resistor from Data to vcc (5v rail).

  • druckgott

    Hi, ok now its powerd with 5 V for the 74ls241 but do not work. I have two 4,7K resistors instead of the 10K. itś on the left side of my Picture with 9.4K. Or is it importent that itś exact 10K?

    My sketch is at the moment the example sketch:
    #include // Library needed to control Dynamixal servo

    #define SERVO_ID 0x01 // ID of which we will set Dynamixel too
    #define SERVO_ControlPin 0x10 // Control pin of buffer chip, NOTE: this does not matter becasue we are not using a half to full contorl buffer.
    #define SERVO_SET_Baudrate 57600 // Baud rate speed which the Dynamixel will be set too (57600)
    #define LED13 0x0D // Pin of Visual indication for runing "heart beat" using onboard LED
    #define TX_DEALY 2000 // in uSec


    void setup(){
    delay(1000); // Give time for Dynamixel to start on power-up

    Dynamixel.begin(SERVO_SET_Baudrate, SERVO_ControlPin, TX_DEALY); // We now need to set Ardiuno to the new Baudrate speed
    Dynamixel.setMode(SERVO_ID, WHEEL, 0, 0); // set mode to WHEEL

    }


    void loop(){
    Dynamixel.wheel(SERVO_ID,LEFT,0x3FF); // Comman for Wheel mode, Move left at max speed
    delay(4000);

    Dynamixel.wheel(SERVO_ID,RIGHT,0x3FF); // Comman for Wheel mode, Move right at 50 speedd
    delay(4000);

    }

    Or do I have to change something for the pins?

  • druckgott

    Here my changed parts:
    http://s7.directupload.net/file/d/3108/knlxicee_jpg.htm

    http://s14.directupload.net/file/d/3108/tf4lkd6p_jpg.htm

    I hope you can help me!
    thx
    druckgott

  • Josué Alejandro Savage

    Hi, you almost got it , the resistor can be any value greater than 1k, the 4k7 resistor its ok but you are no connecting this right, check the diagram this resistor its a Pull-up resistor, that mean it should be connected to positive rail of your circuit not to ground. hope that helps if not i can look for an alternative circuit.

  • druckgott

    Ah sorry the line wrong its connected to 5V not like in my picture
    but do not work

    I checked the voltage on dynamical and all on the data pulup its all ok, and but it will not work

  • Josué Alejandro Savage

    Ok, i think its this #define SERVO_ControlPin 0x10 // Control pin of buffer chip that pin is the 0x10 so in binary will be 0001 0000 and that number in decimal its 16, shouldn`t be 0x02 ( 2 decimal ) hope its that.

  • druckgott

    Mhh I have changed it now to: #define SERVO_ControlPin 0x02, but do also not work.

    What else could it be? with the Adapterboard AX12_CDS55xx it moves

    On the Arduino uno the TX led flash every 4sec, but nothing else.

    thx
    druckgott

  • druckgott

    Only for information I have a MX-28 not a MX-28T?!

  • Josué Alejandro Savage

    Ok, that means that is transmitting but in order to check that is also transmitting to the Data cable connect an LED instead of the motor and lets se if it flashes, if not then its the Control pin of the IC that its not working right.

  • druckgott

    Ok I get an Output of Voltage between 4,9 and 4,6 itś going down and Up I have no other resistor here for a led.

  • Josué Alejandro Savage

    Thats sounds ok, it seems to be transmitting data, try with out the ic short rx and tx and servo data cable.

  • druckgott

    I do not exactly understand what you mean. With out all three cables? Or ( TX rx and data)
    Or remove every cable single step by step with the other ones connected ?

  • Josué Alejandro Savage

    Yes, just Tx and Rx of the arduino, shorting them will now be connected to the Servo Data Line. al the power rails will be the same, just the data cable (tx & rx) will be short out.

  • druckgott

    Hi, ok I have connected the dataline side which is on the IC to a free line and also connected the two tx rx parts from the arduino side to this line. (TX and RX and Data Line are connected now) But nothing happens?! Should I again connect the LED/messure the Voltage

  • druckgott

    Hi again,

    i have now a led on the Dataline, but the led is not fashing. It the whole time on.

    Do I have a wrong Chip? 07DJV6K E4 SN74LS241N

    I have checked the connections again and all looks right. I have +5V and GND on the IC and I have the Pullup Resistors also there.

  • Josué Alejandro Savage

    Yes thats the chip, don't know why is not sending data out of the chip, it should but you said that it works with the AX12_CDS55xx right? let me check that board and see what its happening.

  • druckgott

    yes this the AX12_CDS55xx itś working perfekt.

  • No me funciona. Te cuento: Arduino Mega2560 alimentado por USB. Dynamixel alimentado por una fuente externa. Masas unidas. Conexiones del buffer comprobadas 1 y mil veces. Serial usado en el Mega: Rx1 y Tx1. Pin de datos el 2. Ninguno de los ejemplos funciona. Tan solo al conectar, parpadea una vez en rojo el servo y ahí se queda. He probado con el id 254 por si las moscas; he probado con otro servo (tengo dos recién comprados) y nada. La versión del IDE Arduino es la 1.3. Los cables están bien: comprobado con polímetro. Desesperado. No sé mucho inglés y he visto que alguien ha hecho un chequeo pedido por ti. ¿Me puedes ayudar en castellano?

  • He olvidado decir que uso la librería DynamixelSerial1. Gracias

  • Josué Alejandro Savage

    Hola, vale tomando en cuenta lo que comentas, con que voltaje alimentas los motores (deberia estar de los 9 a lo 10v para un funcionamiento optimo) con que lo estas alimentando? una bateria, una fuente, un eliminador de baterias? proporciona suficiente corriente al motor? intenta alimentarlo con otra fuente. Saludos

  • Qué rapidez. Se agradece. Ya he dado con lo que era: Había conectado las señales DataControl y Data a sus respectivos al revés, es decir, Data al pin 2 del Arduino y DataControl al servo. Solucionado. Muchas gracias, te lo has currado y me facilitas la vida. Moraleja: nunca se revisan los circuitos lo suficiente...

  • Josué Alejandro Savage

    Que bien, me alegra que lo hayas encontrado, dice el buen Dave Jones: nunca supongas nada cuando se trate de electronica, verifica. :) Saludos

  • MiguelaÑez

    Hola,

    en primer lugar felicitarte por la librería, está bastante lograda. Tengo un problema con el código de ejemplo. El servo se mueve pero los valores que obtengo son siempre -1. ¿Podrías ayudarme?

    #include

    int Temperature,Voltage,Position;

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

    void loop(){
    Temperature = Dynamixel.readTemperature(1); // Request and Print the Temperature
    Voltage = Dynamixel.readVoltage(1); // Request and Print the Voltage
    Position = Dynamixel.readPosition(1); // Request and Print the Position

    Dynamixel.move(1,random(200,800)); // Move the Servo radomly from 200 to 800

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

    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");

    Serial.end(); // End the Serial Comunication
    Dynamixel.begin(1000000,2); // Begin Servo Comunication

    delay(1000);

    }

    Gracias de antemano.

  • Josué Alejandro Savage

    Hola, lo que podría estar fallando es el alambrado de tu circuito, arriba esta una ilustración de como debe alambrase, es posible también que SRL este configurado para no responder, cambialo a responder a todo.
    SRL -> Status Return Level.
    Si tienes alguna foto donde pueda ver tus conexiones me será más sencillo identificar el problema. Saludos

  • MiguelaÑez

    He probado el siguiente código:
    #include

    int Temperature,Voltage,Position;
    int resReset, resSetSrl, resPing;

    void setup(){
    Dynamixel.begin(1000000,2);
    delay(1000);

    delay(1000);
    }

    void loop(){

    resReset = Dynamixel.reset(1);
    resSetSrl = Dynamixel.setSRL(1, 2);
    resPing = Dynamixel.ping(1);
    Temperature = Dynamixel.readTemperature(1); // Request and Print the Temperature
    Voltage = Dynamixel.readVoltage(1); // Request and Print the Voltage
    Position = Dynamixel.readPosition(1); // Request and Print the Position
    delay(1000);

    Dynamixel.move(1,200);
    delay(1000);
    Dynamixel.move(1,800);
    delay(1000);
    Dynamixel.end();

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

    Serial.print(" ping: ");
    Serial.println(resPing);
    Serial.print(" setSrl: ");
    Serial.println(resSetSrl);
    Serial.print(" Reset: ");
    Serial.println(resReset);
    Serial.print(" *** Temperature: "); // Print the variables in the Serial Monitor
    Serial.print(Temperature);
    Serial.print(" Voltage: ");
    Serial.print(Voltage);
    Serial.print(" Volts Position: ");
    Serial.print(Position);
    Serial.println(" of 1023 resolution");

    Serial.end(); // End the Serial Comunication
    Dynamixel.begin(1000000,2);
    }

    Y los resultados que tengo son los siguientes:

    ÿÿÿ ping: -1
    setSrl: -1
    Reset: -1
    *** Temperature: -1 Voltage: -1 Volts Position: -1 of 1023 resolutionÿÿÿ

    ¿Al hacer "Dynamixel.end();" se puede usar sin problema el puerto serie con "Serial.begin(9600);" para enviar los datos del servo al pc? ¿Necesito hw adicional?

    Mi circuito:
    [IMG]http://i49.tinypic.com/sq613d.jpg[/IMG]
    [IMG]http://i48.tinypic.com/msy9h4.jpg[/IMG]

  • Josué Alejandro Savage

    Vale, tu código esta bien, si se puede enviar sin problemas al PC si usa antes end(); en los dos casos tal y como lo estas haciendo. Solo que el hay un problema en el hardware, la resistencia de 10K en lugar de ir del cable data hacia el pin del Servo mandala del cable data hacia vcc y completa el cable data hasta el servo. Saludos.

    http://tinypic.com/r/sy6p0g/6

  • MiguelaÑez

    Muchas gracias! Lo probaré y te cuento! :)

  • Hi Savage,

    Thanks for the great library. I tried your Dynamixel Serial library with Arduino Mega 2560 to communicate with RX28 Dynamixel actuator, with a Sparkfun RS485 breakout board in between. I tried to control the LED as well as the Dynamixel.move and they both works well.

    However, I am not able to get any feedback from the RX28. I ran your example code which reads the temperature, voltage and position of the actuator and it gives me this result:


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

    I believe it means there's no feedback from the actuator.
    Could you give me any hint or suggestion for the possible fault resulting to this?
    Sorry that I am quite a newbie and any advices from the community is greatly appreciated.

    Thank you.

  • Hi Savage,

    I am the person above just posted who is using RX28.
    I followed the comments above and I tried your program. This is what i get:

    FF - FF - 1 - 4 - 0 - 99 - 3 - 5E -

    Best regards,
    Atom

  • It seems weird that I could get feedback from your simple code but when I use the Dynamixel Serial library, it wont work. I will still get the result:

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

    Please advice~~

    Regards,
    Atom

  • Hi again,

    Sorry for spamming... But I tested out the codes:

    //This program send the position of the servo

    int Position = -1;
    int Time_Counter = 0;
    int TIME_OUT=10;
    int Position_Low_Byte = 0;
    int Position_High_Byte = 0;
    int Position_Long_Byte = -1;


    void setup(){
    Serial.begin(9600); // Serial Monitor Baud Rate for Debbuging
    Serial1.begin(1000000); // Motor Baud Rate
    pinMode(2,OUTPUT); // Control Pin comunication

    digitalWrite(2,HIGH); // Set Transmition Mode
    Serial1.write(0xFF); // Start Bytes
    Serial1.write(0xFF);
    Serial1.write(0x01); // ID of the Motor
    Serial1.write(0x04); // Read Position Command Length
    Serial1.write(0x02); // Read Register in the motor
    Serial1.write(0x24); // Motor Position Register 36 dec
    Serial1.write(0x02); // Number of Bytes of the Position
    Serial1.write(0xD2); // Checksum 0xFF - (ID + .... all the data). except the start bytes
    //delayMicroseconds(400); // Time delay for complete the transmission (200 to 1000) us // may comment this out
    digitalWrite(2,LOW); // Set Reception Mode
    }

    void loop(){

    while((Serial1.available()<7) & (Time_Counter < TIME_OUT)){
    Time_Counter++;
    delay(1000);
    }

    while(Serial1.available()>0){
    Serial.print(Serial1.read(),HEX); //start byte
    Serial.print(" - ");

    Serial.print(Serial1.read(),HEX); //start byte
    Serial.print(" - ");

    Serial.print(Serial1.read(),HEX); //motor id
    Serial.print(" - ");

    Serial.print(Serial1.read(),HEX); //length
    Serial.print(" - ");

    Serial.print(Serial1.read(),HEX); //error
    Serial.print(" - ");

    Position_Low_Byte = Serial1.read();
    Serial.print(Position_Low_Byte,HEX); //position low byte
    Serial.print(" - ");

    Position_High_Byte = Serial1.read();
    Serial.print(Position_High_Byte,HEX); //position high byte
    Serial.print(" - ");

    Serial.print(Serial1.read(),HEX); // checksum
    Serial.println(" - ");

    Position_Long_Byte = Position_High_Byte << 8;
    Position_Long_Byte = Position_Long_Byte + Position_Low_Byte;
    Serial.print("Current Position: ");
    Serial.println(Position_Long_Byte);

    delay(1000);
    }
    }



    I got the results correctly:


    FF - FF - 1 - 4 - 0 - 64 - 2 - 94 -
    Current Position: 612
    FF - FF - 1 - 4 - 0 - 2C - 2 - CC -
    Current Position: 556
    FF - FF - 1 - 4 - 0 - CA - 1 - 2F -
    Current Position: 458



    I'm just wondering why it doesn't work when I use the library... They are like almost the same codes...
    I have very minimal programming knowledge thus I don't know if there's a good method of debugging it.

    Hope to hear from you =)


    Regards,
    Atom

  • Josué Alejandro Savage

    Hi Atom, i think the problem is the feedback speed, you can modify to make it faster in the file named: DynamixelSerial.h at line 173 and 174 reduce the value of Tx_delay_time and increase Time_Out at maximum of 20. try different values, hope that helps reading the data.

  • Hi Savage,

    I changed the Time_Out to 20 and the Tx_delay_time to 10 and now it works! Thanks a bunch!
    Hope this info also helps others who experience the same issue.

    Regards,
    Atom

  • Arco Lee

    Hola Savage,

    I have grabbed a pair of AX-12A and a 74HC125D, which has Tx, Rx & GND only. No data. I have been using Arduino Uno.

    Do I 7,6,2 port of my Arduino as well?

    thank you in advance.

    Regards,
    Arco

  • Josué Alejandro Savage

    Sorry, i don't understand your question, but i think you may refer to this:
    http://www.robot-italy.com/media/catalog/product/cache/3/image/d43192dcd82ea942982b4b1d2a6e2479/m/x/mx_series_circuit_.png
    Hope that helps, if not please explain me a little more your problem.

  • Arco Lee

    Hello,

    I just have a 74HC125D chip for the moment. Is it possible with some configuration / hacking to run my 2 AX-12A in some way. Or 74LS241 is a must for running them? I just need them to move for now, I don't need the feedback temperature/angle...
    These servos are so difficult...:)

    Thanks,
    Arco

  • Josué Alejandro Savage

    Hi, no, you don't need any chip for just moving the motor, just connect the Tx of the arduino to the data cable of the motor.

  • Arco Lee

    Hi Jose,

    I was successful controlling the motors yesterday. Now I face 2 problems:-

    1. When I send a command of ID=1 , the two motors I connected works together. If i send a command of ID=2, none of them works.

    2. I used the reset(); command, now both of them don't works any longer.

    You got clues to fix this? btw, my motors models are AX-12A. any difference here?

    Thanks in advance.

    Regards,
    Arco

  • Arco Lee

    Hi Jose, it is me again.

    I did a code to clean the servo, perhaps I messed up with their IDs. but still they don't work.

    #include

    void setup(){
    int x;
    Dynamixel.begin(1000000,2);
    pinMode(6,OUTPUT);
    }

    void loop(){
    int x=0;

    do
    {
    Dynamixel.reset(x);
    Dynamixel.setID(x,1);
    x++;

    } while (x < 260);

    digitalWrite(6,HIGH);

    }

    Thanks for your help.
    Arco

  • Josué Alejandro Savage

    Hi Arco, your servos should be in ID 0, try accessing them with ID 0, when you reset a servo the default ID is 0. remember to have different ID for each servo.

  • Arco Lee

    Hi Jose,

    After that, do I need to connect motor one by one to set their ID from 0,1,2,3... in order to control them connected in series with the bus data package?

    Thanks, Arco

  • Jose

    Hola Savage, tengo 2 preguntas
    1. puedo usar una Arduino Leonardo con tu biblioteca?
    2. necesito tambien comunicarme con Processing a 9600 bd, que opcion es mejor, usar softserial para comunicarme con los dynamixel con otros pines y asi poder comunicarme con processing por el serial normal de arduino? o necesariamente tengo que comprar una Arduino mega ?
    Mil gracias y de nuevo, que gran aporte tu biblioteca a la comunidad

  • Josué Alejandro Savage

    Hola Jose, si si puedes usar esta biblioteca con un arduino leonardo, otra cosa que puedes hacer es multiplexar el serial de forma que en un momento hables con el pc y en otro momento hables con los motores, esto lo puedes hacer con las funciones de Serial.begin(9600); Seral.end(); y lo mismo para Dynamixel.begin(1000000); y Dynamixel.end(); de otra forma también puedes usar el softserial, no es necesario un arduino Mega. Saludos

  • Jose

    Perfecto!!!! :D mil gracias Savage!

  • grp19

    Hi,

    I am trying to use this library to control 2 AX-12 servos with an Arduino Mega 2560 R3 and am using Arduino 1.0.3. The problem that I am having is that none of the read functions work (I get -1 for readPosition() and readTemperature(), for example). I am using a 74LS241 wired as you have indicated and I am able to read positions using other libraries (like the bioloid library), but those libraries have other issues so I really want to use yours. Can you offer any help?

    Thanks,

    Guy Perez - Madison, WI

  • Josué Alejandro Savage

    Hi, i think maybe the connections are not right, have you join the ground from the supply of the motor to the ground of the arduino, Are you using a good and stable power supply for the motor around 10v 1A, if you can show me your connection (photos) and the code of your program it will be easier for me to help you.

  • Amir Mousavi

    Hi Savage,

    I have this wiring setup:

    https://lh3.googleusercontent.com/-k1Lgv8VKR5Y/UWtNX9PXbSI/AAAAAAAAIZw/iQGHd602zYw/s902/IMAG0490.jpg

    I am running your config code with modified pins but for some reason it wont work, (the servo LED is on, no compile or upload errors):

    #include
    #include

    void setup(){
    Dynamixel.begin(9600,6,7,2); // Inicialize the servo at 1Mbps and Pin Control 2
    delay(1000);
    }

    void loop(){

    Dynamixel.ledStatus(1,OFF);
    Dynamixel.move(1,random(200,800)); // Move the Servo radomly from 200 to 800
    delay(1000);

    Dynamixel.setTempLimit(1,80); // Set Max Temperature to 80 Celcius
    Dynamixel.setVoltageLimit(1,65,160); // Set Operating Voltage from 6.5v to 16v
    Dynamixel.setMaxTorque(1,512); // 50% of Torque
    Dynamixel.setSRL(1,2); // Set the SRL to Return All

    Dynamixel.ledStatus(1,ON); // Turn ON the LED

    delay(1000);

    }




  • Josué Alejandro Savage

    Hi, you have to connect also the control pin, i think its the orange cable, you have choose the pin 2 as pin control so connect the orange cable to pin 2.

    Dynamixel.begin(baudRate, RxPin, TxPin, dataControl)

    The motor is originally in 1MBPS as default, have you change already the motor baud rate to 9600?

    Dynamixel.setBD(1, 9600);

    Your motor has ID 1?

    Dynamixel.setID(254, 1);

    Hope that helps.

  • Amir Mousavi
    Este comentario ha sido eliminado por el autor.
  • Amir Mousavi

    I appreciate the quik feedback! So i realized the tx and rx were switched up when i took pic, so pin 2 is connected and im running this code but no response from servo:

    #include
    #include

    void setup(){

    Dynamixel.setID(254, 1);
    Dynamixel.setBD (1, 9600);
    Dynamixel.begin(9600,6,7,2); // Inicialize the servo at 1Mbps and Pin Control 2
    delay(1000);
    }

    void loop(){

    Dynamixel.ledStatus(1,OFF);
    Dynamixel.move(1,random(200,800)); // Move the Servo radomly from 200 to 800
    delay(1000);

    Dynamixel.setTempLimit(1,80); // Set Max Temperature to 80 Celcius
    Dynamixel.setVoltageLimit(1,65,160); // Set Operating Voltage from 6.5v to 16v
    Dynamixel.setMaxTorque(1,512); // 50% of Torque
    Dynamixel.setSRL(1,2); // Set the SRL to Return All

    Dynamixel.ledStatus(1,ON); // Turn ON the LED

    delay(1000);

    }

  • Josué Alejandro Savage

    The first 2 lines in setup function will not do anything cause the communication has not been initialized i recommend yo to run the original example and the add the lines:

    Dynamixel.setID(254, 1);
    Dynamixel.setBD (1, 9600);

    at the end of the setup function, so the baud rate and ID change to ID 1 and Baud Rate 9600, after this your program should work.

  • Amir Mousavi

    This setup() in the original Dynamixel_Config:

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

    so like this??

    Dynamixel.begin(9600,6,7,2);
    Dynamixel.setID(254, 1);
    Dynamixel.setBD (1, 9600);

    or

    Dynamixel.begin(1000000,6,7,2);
    Dynamixel.setID(254, 1);
    Dynamixel.setBD (1, 9600);



  • Josué Alejandro Savage

    Almost. Download the Dynamixel Serial Library and connect as in the image above.


    void setup(){
    Dynamixel.begin(1000000,2);
    Dynamixel.setID(254,1);
    Dynamixel.setBD (1,9600);

    }

    void loop(){
    // Do nothing or maybe just turn on a led to know it has finish.

    }

  • Amir Mousavi

    ok i was using the softwareserial libraries, so now i downloaded the dynamixel serial library and switched from pins 6&7 to 1&2 running this and no flash:

    #include

    void setup(){

    Dynamixel.begin(1000000,2);
    Dynamixel.setID(254,1);
    Dynamixel.setBD (1,9600);

    delay(1000);
    }

    void loop(){

    Dynamixel.ledStatus(1,OFF);
    delay(1000);
    Dynamixel.ledStatus(1,ON);
    delay(1000);

  • Josué Alejandro Savage

    Yes, now you have change the baud rate. now the program to flash the motor led should be:

    #include

    void setup(){

    Dynamixel.begin(9600,2);


    delay(100);
    }

    void loop(){

    Dynamixel.ledStatus(1,OFF);
    delay(1000);
    Dynamixel.ledStatus(1,ON);
    delay(1000);

    }

  • Håkon Stiansen

    Hello Savage!
    Thank you for sharing this great library! I have been toying around with the dynamixel MX28T servos using your Dynamixel_Serial library. I'm using Arduino Mega. Using your circuit I am able to send commands too the dynamixel. But unfortunately I am not able to read the feedback from the servo.
    Is there any changes I should make in the library for this to work?

    Thanks in advance!
    Haakon

  • Josué Alejandro Savage

    Amir Mousavi, try with id 254 and if still not try again that same program with 1MBPS (JUST Flash Led Program).

    Haakon Stiansen, Make sure that the status return level is set to Return all.

  • Håkon Stiansen

    Hi again :)
    Would you care to look at this code and check if I am doing it completely wrong?
    Thanks

    #include // Library needed to control Dynamixal servo

    #define SERVO_ID 0x01 // ID of which we will set Dynamixel too
    #define SERVO_ControlPin 0x02 // Control pin of buffer chip, NOTE: this does not matter becasue we are not using a half to full contorl buffer.
    #define SERVO_SET_Baudrate 57600 // Baud rate speed which the Dynamixel will be set too (57600)
    #define LED13 0x0D // Pin of Visual indication for runing "heart beat" using onboard LED
    #define TX_DEALY 2000 // in uSec
    char WD;
    int pos;

    void setup(){
    delay(1000); // Give time for Dynamixel to start on power-up

    Dynamixel.begin(SERVO_SET_Baudrate, SERVO_ControlPin, TX_DEALY); // We now need to set Ardiuno to the new Baudrate speed
    Dynamixel.setMode(SERVO_ID, SERVO, 1, 4095); // set mode to WHEEL
    Dynamixel.setHoldingTorque(SERVO_ID, OFF); // setter holdetorquen til "off"
    Dynamixel.setStatusPaket(SERVO_ID, ALL);
    Serial2.begin(115200);
    }

    void loop(){
    pos = Dynamixel.readPosition(SERVO_ID);
    delay(10);
    //For use with labVIEW
    Serial2.write("A");
    Serial2.write("B");
    Serial2.write("C");

    int posSP = 2;
    int posMV = 5;
    int velSP = 3;
    int velMV = 7;
    int loadMAX = 5;
    int loadMV = 3;


    Serial2.write(pos >> 8); // MSB 1
    Serial2.write(pos & 0xFF); // LSB 1
    Serial2.write(posMV >> 8); // MSB 2
    Serial2.write(posMV & 0xFF); // LSB 2
    Serial2.write(posSP >> 8); // MSB 3
    Serial2.write(posSP & 0xFF); // LSB 3
    Serial2.write(velMV >> 8); // MSB 4
    Serial2.write(velMV & 0xFF); // LSB4
    Serial2.write(loadMAX >> 8); // MSB 5
    Serial2.write(loadMAX & 0xFF); // LSB5
    Serial2.write(loadMV >> 8); // MSB 6
    Serial2.write(loadMV & 0xFF); // LSB6
    // For use with Pixart IR-camera. Set to posSP for this test
    Serial2.write(posSP >> 8); // MSB 7
    Serial2.write(posSP & 0xFF); // LSB7
    Serial2.write(posSP >> 8); // MSB 8
    Serial2.write(posSP & 0xFF); // LSB8
    Serial2.write(posSP >> 8); // MSB 9
    Serial2.write(posSP & 0xFF); // LSB9
    Serial2.write(posSP >> 8); // MSB 10
    Serial2.write(posSP & 0xFF); // LSB10
    Serial2.write(posSP >> 8); // MSB 11
    Serial2.write(posSP & 0xFF); // LSB11
    Serial2.write(posSP >> 8); // MSB 12
    Serial2.write(posSP & 0xFF); // LSB12
    Serial2.write(posSP >> 8); // MSB 13
    Serial2.write(posSP & 0xFF); // LSB13
    Serial2.write(posSP >> 8); // MSB 14
    Serial2.write(posSP & 0xFF); // LSB14
    Serial2.write(WD);

    WD++;
    }

  • Josué Alejandro Savage

    Hi Haakon Stiansen, i seems that your are using other library, where do you download that version, does it compiles?

  • Håkon Stiansen

    Hi again Savage!
    You are absolutely right. The library I had gotten my hands on was not the correct one. I have now figured it out using your library :)
    Now I got one last question:
    Is it possible to use your library without having to put the baudrate of the Dynamixels to 1Mbaud? I would like to run them at 57600. The Arduino is having trouble when I try to serial.print too labVIEW.
    Thanks
    Haakon

  • Josué Alejandro Savage

    Hi, yes of course, use the function Dynamixel.setBD(1,57600); the 1 been the ID of the motor and 57600 the new baud rate, just put that instruction in the program one tine and it will change the baud rate so now on you should initialize the motor with Dynamixel.begin(57600,2). Good Luck

  • MiguelaÑez

    Hola Josué,

    te planteo el siguiente problema. Tengo una placa Arduino Uno y un servo AX-12A. La placa esta configurada y cableada correctamente como indicas y utilizo tu librería para moverlo sin problemas. La lógica para mover el servo la envío desde una aplicación de mi pc mediante la librería de Arduino Serial.

    El bucle de mi aplicación (no el loop de Arduino) funciona de la siguiente manera:

    1) COMUNICACION PC-ARDUINO: PC envía orden desde mi aplicación (un char 'R' o 'L') para mover el servo a la placa arduino.

    2)Placa mediante librería Serial lee el char en arduino enviado desde pc. Código entre Serial.begin(9600); y Serial.end();

    3) COMUNICACION ARDUINO-SERVOS: Cierro conexión Serial (puerto COM3 mediante USB con pc) y abro Dynamixel: Dynamixel.begin(1000000,2); (Cableado hw está correcto). Muevo servos.

    4) Leo la posición del servo y la guardo en una variable.

    5) COMUNICACIÓN ARDUINO-PC: cierro conexión con servos Dynamixel.end(); (comunicacion serie mediante tx rx) y se vuelve a abrir la conexión serie con PC a través de COM3. Serial.begin(9600) -> envio datos -> Serial.end();

    6) Volver a 1).

    EL CÓDIGO:

    #include
    int val;

    void setup()
    {
    }

    void loop()
    {
    Serial.begin(9600);
    delay(5);

    if (Serial.available())
    {
    val = Serial.read();

    if(val == 'R')
    Serial.print('R');
    if(val == 'L')
    Serial.print('L');
    }
    Serial.end();

    //Dynamixel.begin(1000000,2);
    // codigo mover servo
    //Dynamixel.end();

    //...
    }

    EL PROBLEMA: si descomento Dynamixel.begin(1000000,2); arduino ya no recibe nada por el puerto serie. Es decir, falla el punto (2) del bucle y ya nada funciona.

    NOTA: El utilizar las librerías Serial y Dynamixel a la vez con Arduino Uno utilizando el puerto Serie USB con Serial.print(variable); para mandarlo al monitor funciona, pero cuando quiero que la aplicación en el otro extremo de la comunicación por el COM3 (usb) sea mi aplicación, alternando con la librería Dynamixel no funciona.

    ¿Podrías ayudarme?

    Gracias de antemano y enhorabuena por la librería.

  • MiguelaÑez

    Por cierto, el código de arriba es el que uso para probar que no funciona. Esta parte sobra pero sirve para ver que no funciona.

    if(val == 'R')
    Serial.print('R');
    if(val == 'L')
    Serial.print('L');
    }

  • Josué Alejandro Savage

    Hola, intenta poniendo un pequeño delay tras finalizar cada comunicación, quizás no pueda conectarse y desconectarse de la aplicación tan rápido, ve probando con diferentes valores con delays menores a un segundo debería bastar. Otra opción seria cambiar el BaudRate del Dynamixel a 9600 para que de esta forma puedas comunicarte con tu aplicación y el dinamixel al mismo tiempo sin terminar la comunicación.

    La función Dynamixel.begin(); contiene dentro el Serial.begin(); por lo que solo bastaría poner la dynamixel.begin(); para comunicarte con el PC por medio de las funciones Serial.print();. Espero esto te ayude, saludos.

  • MiguelaÑez

    Gracias Josué!

    Lo probaré y te cuento que tal.

  • MiguelaÑez

    Con la primera opción no lo he conseguido.

    Con la segunda utilizando al comunicación de Dynamixel.begin() a 9600 Seria.print(string) funciona haciendo pruebas con la consola de Arduino pero Serial.read() y Serial.available() parecen no funcionar. Ejemplo:

    #include
    int val;

    void setup()
    {
    }

    void loop()
    {
    Dynamixel.begin(9600,2);
    //Serial.begin(9600);
    delay(5);

    if (Serial.available() > 0)
    {
    val = Serial.read();

    if(val == 'U')
    Serial.print('U');
    else if(val == 'D')
    Serial.print('D');
    }
    else
    Serial.print('N');

    //Serial.end();
    Dynamixel.end();
    }

    Ambas conexiones imprimen constantemente N mientras no introduzcas ninguno de los caracteres esperados. La comunicación Serial es capaz de hacer el read y el available, pero cuando utilizo la librería Dynamixel ni el read ni available parecen funcionar. Únicamente imprime N porque siempre se mete al else, ya que no recibe datos al buffer.

    Por otro lado, poner ambas comunicaciones alternadas (Serial y Dynamixel) tampoco funciona, ni tampoco combinando delays entre los inicios y fin de las comunicaciones.

    ¿Cómo puedo arreglar para que pueda utilizar Serial.Read() junto a la librería Dynamixel?

    Gracias de antemano.

  • Josué Alejandro Savage

    Hola, no veo por que no te deja hacer la comunicación de forma correcta, com te decia la biblioteca dynamixel internamente utiliza todos los comandos de biblioteca serial tal y como si lo hicieras independientemente, no creo que sea problema de ninguna de esas dos bibliotecas, has comprobado que tu programa en el PC envíe correctamente los datos? prueba intentando encender un LED en ves de mover el motor, para empezar a eliminar probabilidades del error.

  • MiguelaÑez

    Gracias Josué por la respuesta y la rapidez. Sigo haciendo pruebas y si consigo descubrir el fallo o error te lo comunico ;)

  • MiguelaÑez

    Hola de nuevo. He conseguido arreglarlo:

    Analizando la librería, cuando haces Dynamixel.begin(baud, directionPin):

    Direction_Pin = directionPin;
    setDPin(Direction_Pin,OUTPUT);
    beginCom(baud);


    De esta forma, los Serial.print() van hacia el ordenador y los Serial.read() y Serial.avaible() no funcionan (o leen de los servos), quedando una comunicacion serie un tanto extraña.

    Para solucionarlo y poder leer del buffer serial los datos que envío desde el PC, hay que cambiar el modo del pin Direction_Pin a INPUT. De esta manera, el Serial.read() ya funciona, ya que Dynamixel.end() no lo deja en el estado inicial (por defecto son INPUT).

    Código final:

    #include
    int val;

    void setup()
    {
    }

    void loop()
    {
    Dynamixel.begin(9600,2);
    pinMode(2, INPUT);

    delay(5);
    if (Serial.available() > 0)
    {
    val = Serial.read();

    if(val == 'U')
    Serial.print('U');
    else if(val == 'D')
    Serial.print('D');
    else if(val == 'R')
    Serial.print('R');
    else if(val == 'L')
    Serial.print('L');
    }

    // Dynamixel begin
    pinMode(2, OUTPUT);
    // AQUI MUEVO SERVOS
    Dynamixel.end();
    }


  • MarcoTronic

    buenas tardes quisiera saber acerca de como llevar acabo la comunicacion del arduin con el XBee dado que la entradas digitales 0 y 1 son utilizadas para la comunicacion del servos.
    agradeceria su pudiera proporcionar un codigo de ejemplo

  • Josué Alejandro Savage

    Hola, para usar los xbee y los motores al mismo tiempo use la biblioteca Software Serial que proporciona arduino en sus ejemplos de esta forma para el xbee que no requiere tanta velocidad lo puedes manejar en cualquiera de los otros pines disponibles.

  • MiguelaÑez

    Hola a todos,

    aprovecho la ocasión para daros a conocer un proyecto en el que he combinado Kinect, Arduino y Dynamixel. En este primer post aún no hablo sobre dónde he introducido las tecnologías de Arduino y Dynamixel, pero os introduzco en el proyecto para que en el siguiente post lo entendáis perfectamente.

    Por supuesto, he hecho uso de gran trabajo de Josué con su librería para comunicar Dynamixel y Arduino.

    http://chipvela.blogspot.com.es/2013/05/intellikare.html

    Un saludo a todos!

  • Hola Savage,

    No he tenido exito en comunicarme con el Dynamixel MX28-T usando un Arduino Uno. Mi codigo es el que adjunto abajo. He intentando cambiar el baudrate y tambien el ID del servo usando

    Dynamixel.begin(1000000,2);
    Dynamixel.setID(1,254);
    Dynamixel.setBD (254,9600);

    pero sin exito. Le agradezco cualquier ayuda.

    #include

    void setup(){

    Dynamixel.begin(1000000,2);
    delay(100);
    }

    void loop(){

    Dynamixel.ledStatus(254,OFF);
    delay(1000);

    Dynamixel.ledStatus(254,ON);
    delay(1000);


    }

  • Josué Alejandro Savage

    Hola andres, antes que nada comentarte que el MX-28T tiene un baudrate de fabrica de 57600 por lo que para hacer cualquier cambio o interactuar con el motor deberas inicializar en ese baudrate.

    #include

    void setup(){

    Dynamixel.begin(57600,2);
    delay(100);
    }

    void loop(){
    Dynamixel.ledStatus(254,OFF);
    delay(1000);
    Dynamixel.ledStatus(254,ON);
    delay(1000);
    }

    Espero esto solucione tus dudas, si sigue sin funcionar dimelo y veremos que es lo que esta sucediendo.
    Saludos

  • Hola he estado tratando de implementar la biblioteca pero he presentado algunos problemas, a ver si me puedes ayudar.

    1) conecto el 74LS241N mas solo funciona cuando no connecto el pin de DataControl al pin 2, si lo conecto no ejecuta las instrucciones.

    2) no he podido leer ningun dato del motor.

  • Ah por cierto se me olvido mencionar que el motor tiene un baudrate 19230 y tambien que cuando le meto mano a la biblioteca para insertarle unos delays entonces parece funcionar ya conectando el Datacontrol al pin 2 pero sigo sin poder leer.
    Me imagino que el problema son con los tiempos, pero no se si solo radique en eso el problema.

    gracias,
    Saludos!
    Moi

  • asunto resuelto.
    gracias,
    Moi

  • Josué Alejandro Savage

    Deacuerdo que bien que hayas logrado encontrar el error, disculpa no haber podido responderte antes, agradecería que colocaras aquí que es lo que sucedió con tu circuito para que de esa forma cualquiera con un error similar pueda enterarse de como solucionarlo. Saludos

  • Hola Savage,

    Gracias por el consejo. Aun no tengo exito comunicandome con el MX-28T. Copie el codigo que enviaste y sin respuesta de parte del servo. Observaciones:

    1. Al aplicar poder al servo, el LED se enciende y apaga como se espera.
    2. El LED "TX" del Arduino se enciende y apaga demostrando que envia sus datos, tambien lo verifique con un osciloscopio.
    3. El circuito es una copia del que sugieres al inicio de tu tutorial.

    Te agradezco cualquier ayuda.

    Saludos,

    Andres

  • Josué Alejandro Savage

    Con el programa anterior lo único que deberá hacer el Servo es encender y apagar el led repetidamente, eso comprueba que la comunicación es correcta, después de eso puedes tratar haciendo que se mueve o realizar lecturas. Recuerda que el ID de default es el 1 o el 254 que es el ID de Broadcast. Para hacer que solo haga cosas sin esperar respuesta puedes sencillamente conectar el pin TX del arduino al cable data del motor para que sepas que el motor se mueve correctamente. Saludos

  • Hola Savage,

    Gracias por toda la ayuda. Al conectar directamente el pin de TX del Arduino al de data del servo si funciona correctamente. Como apuntaste, el problema es que el Arduino no puede recibir retroalimentacion de parte del servo si tengo el SN74LS241N funcionando como interface entre ambos. Como puedo arreglar esto?

    Saludos,

    Andres

  • Josué Alejandro Savage

    Lo que puedes hacer es comprobar que el 241 funcione colocando las condiciones de apertura de los buffer y enviar datos lógicos visualizados con LEDS. Por ejemplo desde el 241:

    Pin Data control: 1 logico (vcc)
    Pin Tx: 1 y 0 logico viendo el mismo dato en el pin Data con un LED.

    Pin Data control: 0 logico (gnd)
    Pin Data: 1 y 0 logico viendo el mismo dato en el pin Rx con un LED.

    Si el circuito no hace esto el error esta en el alambrado de este buffer.
    De funcionar como debe es posible que no tengas activado el registro SRL
    Status Return Level, configuralo a return all, con la funcion Dynamixel.setSRL() te recomiendo bajes la documentation que proporciono en la parte de descargas para que te sea más facil hacerlo. Saludos

  • Hola Savage,

    Ya hice la prueba que indicas y no tengo problema con el alambrado alrededor del SN74LS241N. Incluso utilice dos mas para constatar que no fuese problema de ese componente. Aun asi, y despues de usar el Dynamixel.setSRL(1,2) como usas en uno de tus ejemplos, no puedo enviar ni recibir datos al servo mientras use el SN74LS241N. Cambie la libreria DynamixelSerial que estaba usando por Dynamixel_SerialV2.2 y de nuevo, solo conectando directamente el pin TX del Arduino al MX28-T es que actua como se espera. Cual podria ser el problema? Gracias de nuevo por su ayuda y esta excelente libreria!

  • Josué Alejandro Savage

    Solo faltaria verificar que el arduino si este dando el sentido de la comunicación en el pin que hayas indicado, en mis ejemplos uso el pin 2, verifica si ese pin cambia de estado cuando se esta enviando o recibiendo informacion. Saludos

  • Tan Boon Hwa

    Hi Savage,

    Is it possible to make Dynamixel.read faster in rate? I get some delay while using the function Dynamixel.read.

    Thanks for enlighten me.

  • David Sanz Kirbis

    Hola,

    Enhorabuena por la librería. Sabes si hay algún integrado en formato DIP8 que sirva en sustitución del 74ls241?

    Un saludo

  • Josué Alejandro Savage

    Hola David,
    No lo hay, o no lo he encontrado por eso es que uso el 241, también empece buscando algo más compacto pero sin éxito, quizás si haya y busque mal, pero hasta donde se no lo hay. Saludos.

  • David Sanz Kirbis

    Just a warning, using the function Dynamixel.setEndless(id,OFF) with an MX-28 limits the angle range to 0-1023. Afterwards I had to reset the servos. I also couldn't use the DynamixelSerial1 library at the factory default 57600bps with an Arduino Leonardo board, but could do so with a code found here: http://forums.trossenrobotics.com/showthread.php?5812-Help-with-controlling-an-Dynamixel-MX-28T-with-an-Arduino-Uno
    I modified the BioloidUno library posted there to work with Leonardo's Serial1 and afterwards added functions to change the id's and to set the baudrate to 1000000bps.
    The code is here: http://www.4shared.com/zip/cVl9LwqU/mx28serial1.html

  • David Sanz Kirbis

    By the way, thanks and congratulations, Josué, for your work :)

  • Hola Savage

    tengo un error me dice error compilando

    decargue la librería DynamixelSoftSerial.h


    #include



    void setup(){
    Dynamixel.begin(9600,6,7,2); // Inicialize the servo at 1Mbps and Pin Control 2
    delay(1000);
    }

    void loop(){

    Dynamixel.ledStatus(1,OFF);
    Dynamixel.move(1,random(200,800)); // Move the Servo radomly from 200 to 800
    delay(1000);

    Dynamixel.setTempLimit(1,80); // Set Max Temperature to 80 Celcius
    Dynamixel.setVoltageLimit(1,65,160); // Set Operating Voltage from 6.5v to 16v
    Dynamixel.setMaxTorque(1,512); // 50% of Torque
    Dynamixel.setSRL(1,2); // Set the SRL to Return All

    Dynamixel.ledStatus(1,ON); // Turn ON the LED

    delay(1000);

    }

  • y también probe este:

    #include

    int Pot = 0; // Potenciometro conectado al pin analogico 0
    int Pot2=1;

    void setup()
    {
    Dynamixel.begin(1000000,2); // 1mbps pin de control " 2 "
    }
    void loop()
    {
    int val = map(analogRead(Pot),0,1023,200,800); // Mapea Pot
    Dynamixel.move(1,val); // Mueve servo 1
    int val2= map(analogRead(Pot2),0,1023,200,800);
    Dynamixel.move(2,val2);// Mueve servo 2
    delay(50); // Espera 50 ms, puede ser lo que tu quieras. :P
    }


    y me dice: no matching function for call to 'Dynamixel call:beging(int,int)'

  • Josué Alejandro Savage

    Hola, al parecer hay un error en la instalación del compilador, he visto ese tipo de errores y los han solucionado reinstalando el arduino IDE, te recomiendo hagas eso en caso de que ese sea el error. Si has descargado la version instalable descarga la que solo se descomprime el programa. Saludos.

  • ya instale nuevamente el arduino software versión 1.0.5y sigue marcando lo mismo ,¿La librería DynamixelSoftSerial.h ya alguien le ha funcionado?? parece ser que es la más reciente ya que el post la mayoría usa la librería Dynamixel.h, será algo de esta reciente librería?? saludos

  • Josué Alejandro Savage

    Ok, si lo lamento ahora recuerdo por que sucede eso, tienes que reemplazar la carpeta llamada Software Serial de Arduino por la que proporciono en la pagina de descargas que esta abajo de la biblioteca de Dynamixel SoftSerial. Saludos
    http://savageelectronics.blogspot.ru/2011/08/actualizacion-biblioteca-dynamixel.html

  • Hola savage buen día
    Ya remplace la carpeta SoftwareSerial y sigue marcando lo mismo, dos cosas estoy utilizado arduino UNO y la otra al agregar a libreria SoftSerial al sketch no se pone de color naranja que podrá ser.
    sale saludo

  • Josué Alejandro Savage

    Mejor dime que error te marca el arduino, para no estar adivinando que es lo que esta pasando, si no se colorea al incluir la biblioteca debe estar mal escrito el nombre o la ruta.

  • Adam El-Rahaiby

    Hello,

    Thank you for your work and creating this website.
    I am trying to use your code for an RX-28 servo. I am having a hard time figuring out what to modify in your library to work with the RX-28 and the RS485 breakout from sparkfun. Can you help me please? I know it should work because there is a YouTube video where a guy uses the RX-28, the RS285 breakout, and your code with modifications. Any help is greatly appreciated.
    Respectfully, Adam

  • Josué Alejandro Savage

    Hello, well it should work with out changing the code of this library, i think this Motor have some different starting parameters such as Baud Rate, have you moved that servo before or its your first servo, at what baud rate are you sending the commands, are you wiring the rs485 as says above in the image? I need a little more information to see whats going on or how can we modified the code in other to work.

  • Adam El-Rahaiby

    Thank you Josue for responding so quickly.
    Yes, this is the first time I have tried moving this servo and this is the first servo I have ever tried to actuate. I am a mechanical engineering student and have not had much practice with the arduino. I have not changed the baud rate but I do know that it does need to be changed. Is that done in the main code (config, read, write)? Also, I am wiring this similar to Pablo Grindel's page (http://www.pablogindel.com/informacion/the-arduinodynamixel-resource-page) which shows the 485 breakout. However, I am not using an a/c adapter like his picture shows, I am using a 12V battery and wiring the power in to pin 2 of the dynamixel. I am not sure if I need to wire the 12V battery to the Vin of the Arduino Mega or keep it as I have it. The other wiring is identical to Pablo's picture.
    Do I need to power the 12V to the arduino, and then from the arduino to the servo?
    Thank you very much for your help.
    Respectfully,
    Adam

  • Josué Alejandro Savage

    Ok, about the power supply you just have to make sure to join the grounds of the arduino and the servo. About the wiring its ok but the serial Channel will varies depending on the library that you download, if is the Serial1 library its ok at the image in the link that you send me. So you need to change the baud rate in the line Dynamixel.begin(Baud,2); Baud its the baud rate, replace the 1000000 for 57600. Tell if it now moves.

  • Adam El-Rahaiby

    Thank you Josue,
    I will try this evening when I get home from work at 6:00pm e.t.

  • Adam El-Rahaiby

    Josue,

    I tried changing only the baud rate as you mentioned and I am getting the following errors:

    Dynamixel_Read.ino: In function 'void setup()':
    Dynamixel_Read:7: error: 'Dynamixel' was not declared in this scope
    Dynamixel_Read.ino: In function 'void loop()':
    Dynamixel_Read:12: error: 'Dynamixel' was not declared in this scope

  • Adam El-Rahaiby

    I got through the error I posted yesterday.
    Now, its not giving me errors but its giving me (on the serial monitor) -1 volts, -1 celcius temp, and -1 of 1023 resolution on position.

  • Josué Alejandro Savage

    Ok, but its moving now, it just won't read? Let me check whats happening there.

  • Adam El-Rahaiby

    Hello Josue,
    The servo is not moving and not reading.

  • Josué Alejandro Savage

    Ok, send me your code, and if you can some photos of your wiring, cause i this moment i don't what could be the problem.

  • Carlofranco Ruiz Daza

    Hola Savage!!! Muchas gracias por compartir estas librerias!!! Tengo 2 cosas que consultarte, y desde ya muchas gracias por tu ayuda:
    1. Cuando compilo un pequeño programa que encontre, para probar el funcionamiento de un AX-12A y un AX12W (recien los adquiri y quiero aprendender a controlarlos perfectamente), me marca un error en la línea :#include . Te adjunto el programa:

    #include
    #include

    NewSoftSerial mySerial(9,8); //9=tx, 8=rx
    int k=0;

    void setup(){ // Configuration

    Ax12.begin(1000000,2); //2=data control
    mySerial.begin(9600); //speed of serial port used by NewSoftSerial
    }

    void loop(){

    // move servo 1 and 2 randomly
    Ax12.move(1,random(200,600));
    Ax12.move(2,random(200,600));
    mySerial.print("Number:");
    mySerial.println(k++);

    delay(1000);

    mySerial.print("Number2:");
    mySerial.println(random(100));

    }

    y ya descargue las librerias Dynamixel Serial y la SoftSerial.

    2. Estas librerias son utiles para las series RX y MX de Dynamixel?? Porque tengo un RX-24F y un MX-64T

    Muchas gracias. Saludos y felicitaciones por tu website.

    Carlofranco

  • Carlofranco Ruiz Daza

    Disculpa, no se copiaron bien las dos lineas del include. Estas son: Dynamixel_Serial.h y NewSoftSerial. h, respectivamente.

  • Josué Alejandro Savage

    Hola, disculpa que responda tan tarde, el error en la linea de include puede ser que no estés llamando bien a la Biblioteca, si esta en la misma carpeta que tu programa usa comillas si esta dentro del Programa Arduino usa mayor y menos que. Esta Biblioteca deberia ser compatible con todos esos modelos. Saudos

  • ECO9

    Hola!
    Tengo una duda, estamos haciendo un cuadropodo, con 4 servos en cada pata y una gimbal para una camara, si conectamos tansolos 4 motores AX-12 no hay problema, pero a la que conectamos 5 ya no funcionan, se quedan como con poco voltage, el eje esta duro, pero lo puedes mover tu con la mano.
    Necesitamos conectar los 18 servos dynamixel para el proyecto.
    Alguna idea sobre como conectar más de 4 servomotores?
    Saludos

  • Josué Alejandro Savage

    Hola, seguramente tu problema se debe a falta de Corriente, asegurate de que tu fuente de alimentación sea capaz de suministrar suficiente corriente para el numero de motores que usaras. Saludos.

  • ECO9

    Hola, no puede ser, es la bateria del kit premium 11.1V 1000mhA tambien hemos probado con una de 5000mhA y nada.
    Si solo tenemos conectado uno funciona perfectamente, pero si le vamos añadiendo más motores, estos dejan de responder con fluidez.
    El programa es simple, motor de aqui a aqui con delays, y cada vez añadimos un motor mas, pero de 4 ya no podemos hacer mover nada!
    es muy raro, van a 1Mb/s
    Alguien ya ha probado de conectar más de 4?
    Saludos

  • Yu-zhong shen

    Hola Savage,

    Thanks for the lib file.
    I have succeeded in writing a iPhone app to remote control the servo through bluetooth.
    However, I have an issue that although all the function of dynamixel works, the return is always -1.
    It is very strange that the servo receives the instruction but does give any response back.
    Do you have any idea?

  • Josué Alejandro Savage

    ECO9: Nunca he conectado mas de dos motores, desconozco la causa por la cual no responden, podría ser un problema en los delays del programa intenta utilizar la función regwrite. Son la funciones RW.

    Yu-zhong shen: What type of motor are you using, the motor should respond check if the chip (Motor )is answering with a digital analyzer or even an oscilloscope.

  • Hola Savage.

    Primeramente me gustaria agradecer el gran aporte con estas librerias, me han servido de mucho, soy nuevo en arduino y me gustaria preguntate: ¿es posible controlar estos motores desde el entorno de simulink, eh visto que es posible integrar librerias a bloques personalizados, se podra hacer lo mismo en el caso de los Dynamixel?

    Te dejo el link del cual baso mi pregunta: http://www.youtube.com/watch?v=_OLctOFjjYQ

    Gracias de antemano.

  • Josué Alejandro Savage

    Hola, tengo entendido de que se puede lograr hacer esa fusion, jamas lo he hecho y no sabría como guiarte, pero me han comentado que ya han hecho eso. Importante recordar que la comunicación con Simulink se hace con USB lo que ocupa el puerto Serial del arduino al igual que el Motor Dynamixel pero a diferentes velocidades por lo que no se puede usar el Arduino UNO para esa tarea.

    Saludos.

  • Hola Savage.

    Gracias por tus comentarios, los tendre en cuenta; estare intentandolo y si tengo algun avance lo compartire aqui.

    Saludos.

  • jennyfer prieto

    Hola, una pregunta cuando se conecta el servo dynamixel Ax-12 a la energía se prende un led que tiene a tras, cuando ese led queda parpadeando y no funciona el servo... que significa esto???

  • Josué Alejandro Savage

    Hola Jennyfer, eso significa que hay un error en las instrucciones que estas enviando, o no están llegando de forma correcta, te recomiendo filtrar la alimentación con algún capacitor electrolitico. Saludos

  • jennyfer prieto

    mira ya se ensayo con ese solo servo y no funciona, se intento resetear y nada sigue igual parpadea el led y no funciona el servo

  • Josué Alejandro Savage

    intenta variando el voltaje de alimentacion del servo de 9v a 12v, quizas los limites de protección fueron cambiados y es por eso que el led parpadea.

  • Jose Sobral

    Hi Josué
    I searched all over but I could not find any answer, may be you can help me.
    Can I send a goal position command without speed info? (or keeping last speed)?
    Can I send a sequence of goal position commands and obtain a continuous movement?
    If yes what should be the be the maximum rate?

  • Josué Alejandro Savage

    Hello Jose, of course you can, check the documentation in the download section, all the information is in there.

  • hola, estoy trabajando en un proyecto de brazo robotico manejado desde matlab usando un arduino leonardo como controlador. El arduino leonardo es similar al uno. use servos Tower Pro que son similares a los Hitec. Ahora tengo un dinamixel Ax-12A y lo quiero hacer funcionar con matlab, usando como controlador al mismo arduino leonardo.
    Pero no se que codigo usar, y que libreria deberia bajar.
    Lo que necesito es un ejemplo en el codigo para mover el dinamixel un angulo giratorio, como 50 grados, Ademas de la conección entre el arduino y el dinamixel que pienso que seria como los diagramas que muestras arriba.
    Estoy agradecido de antemano por la información que dispones en tu pagina, y si pones un ejemplo sobre el asunto mejor, gracias. Osmar

  • hola, estoy trabajando en un proyecto de brazo robotico manejado desde matlab usando un arduino leonardo como controlador. El arduino leonardo es similar al uno. use servos Tower Pro que son similares a los Hitec. Ahora tengo un dinamixel Ax-12A y lo quiero hacer funcionar con matlab, usando como controlador al mismo arduino leonardo.
    Pero no se que codigo usar, y que libreria deberia bajar.
    Lo que necesito es un ejemplo en el codigo para mover el dinamixel un angulo giratorio, como 50 grados, Ademas de la conección entre el arduino y el dinamixel que pienso que seria como los diagramas que muestras arriba.
    Estoy agradecido de antemano por la información que dispones en tu pagina, y si pones un ejemplo sobre el asunto mejor, gracias. Osmar

  • Alexis Riofrio

    Saludos Josué

    Deseo saber si te topaste con el inconveniente de no respuesta(-1) en la lectura del Dynamixel. Uso un arduino mega y dos Dyanmixel Ax-12A, el buffer 74ls241 he hice las conexiones tal cual las indicaciones, he variado el SRL directamente desde el Dynamixel Wizard a 2. Además cambie de placa (arduino uno a un mega por para eliminar el -si había conflicto con el puerto), pero no hay respuesta. Talvez sabes otro modo pues tambien intente cambiar la tasa de transmisión a 9600 pero el servo no respondio(solo lo hace a 1000000Baudios). Lo probe todo(IDE 1.5.6-r2) con el ejemplo de Read de tú librería y únicamnete escribe(lo se por los movimiento randómicos entre 200-800).


    Agradezco tu colaboración.
    Alex

  • Hello Josué,

    thanks a lot for your work!

    But I'm wodering why the Tri-State-Buffer is exactly necessary?
    Is it because if you used a simple Y-Cable the Arduino would receive it's own TX-Signals?
    Couldn't you simply flush the cache after sending a packet?

    Would it work if you put a diode in TX or RX?

    Unfortunately I don't have a Dynamixle to test this right know...

    Thank you!
    Angelo

  • Silver Silver

    Hi Josué !

    Awesome work! Thank you !

    I am using Arduino Mega with your library DynamixelSerial1.h
    control pin: D2
    Rx/TX: D18, D19.

    I can write to the AX-12A fine, but I am not able to read position, I keep getting "-1".

    i.e. Dynamixel.move(1,random(200,800)); // works ok!
    Position = Dynamixel.readPosition(1); Serial.print(Position); // returns "-1"

    Any suggestions?

    Thanks!
    Bruce

  • Josué Alejandro Savage

    Hi, you may try to change this parameter:
    #define TIME_OUT 10
    in the file DynamixelSerial.h by increasing the time for the answer to come, and also the status return configuration of you servo.

  • Hola savage :D he estado leyendo tu post y pues me parecio muy interesante, soy muy nuevo en esto de arduino y me han encargado una practica que no puedo continuar por que no logro que el dynamixel se conecte, tengo un AX-12A y tengo una placa no arduino, imitacion Freeduino cc V1.22, en el IDE de arduino si me carga los programas bajo la tarjeta Arduino Duemilanove w/ ATmega328.

    tengo un codigo para ver si lo puedo hacer funcionar no es bajo la libreria que estas ofreciendo, aqui el codigo:

    #include

    Servo servoX;
    Servo servoY;

    int positionServoX = 90;
    int positionServoY = 90;

    int degreesMove = 10;

    void setup(){
    Serial.begin(115200);

    servoX.attach(11,800,2500);
    servoY.attach(10,800,2500);
    }

    void loop()
    {
    if (Serial.available())
    {
    char command = (char)Serial.read();

    switch(command)
    {

    case 'a':

    if (positionServoX >= degreesMove)
    {
    positionServoX -= degreesMove;
    }

    servoX.write(positionServoX);

    break;

    case 'd':

    if (positionServoX <= (180+degreesMove))
    {
    positionServoX += degreesMove;
    }

    servoX.write(positionServoX);

    break;

    case 's':

    if (positionServoY >= degreesMove)
    {
    positionServoY -= degreesMove;
    }

    servoY.write(positionServoY);

    break;

    case 'w':

    if (positionServoY <= (180+degreesMove))
    {
    positionServoY += degreesMove;
    }

    servoY.write(positionServoY);

    break;

    case '1': degreesMove = 1;
    break;
    case '2': degreesMove = 5;
    break;
    case '3': degreesMove = 10;
    break;
    case '4': degreesMove = 20;
    break;

    default: break;
    }

    if(command > 0x30 && command < 0x35)
    {
    Serial.print("Speed Selected: ");
    Serial.println(degreesMove);
    }
    else
    {
    Serial.print("X: ");
    Serial.println(positionServoX);
    Serial.print("Y: ");
    Serial.println(positionServoY);
    }
    }
    }

    Queria ver si me podrias hacer correcciones adaptandolo al dynamixel y cual libreria necesitaria utilizar.
    Un gran saludo!!

  • la libreria es Servo.h

  • jessica soto

    Hola savage, he estado leyendo tu post y me parece muy interesante me gustaría saber si hay una forma de controlar 3 dynamixel AX-12 desde matlab por medio de un arduino y que arduino seria el mas adecuado para esta aplicación puesto que estamos desarrollando una plataforma y nos gustaría utilizar este tipo de servos.
    agradezco tu colaboración

  • Josué Alejandro Savage

    Hola Jessica, si es muy posible hacer lo que planteas, de hecho debe haber muchos ejemplos de eso en internet, te recomiendo usar un Arduino Mega ya que tiene varios Canales Seriales que te permitirán comunicarte con el PC y los motores sin ningún problema. Saludos

  • jessica soto

    hola savage,me pregunto si tienes información de como cambiarle la identidad que traen los servos por defecto ya que estoy tratando de utilizar tus librerías y he logrado utilizarlo para un servo pero cuando conecto varios en serie todos se mueven al mismo tiempo

  • Josué Alejandro Savage

    Hola Jessica, claro se puede cambiar el ID con la instrucción Dynamixel.setID(), te recomiendo descargar la documentación también para que puedas configurar a tu gusto los motores. Saludos

  • antonio ortiz

    hola Savage, tengo un problema. No puedo usar la librerias con el arduino due?, por mas que intento no funciona, las use con el arduino Mega y funcionan muy bien, pero con el due no :S, espero puedas ayudarme. Saludos (:

  • Horia Pernea

    Hello,

    my name is Horia I'm a 35 years old engineer and I can't manage to get any kind of control/communication between Arduino Mega and SR518 servo made by Spring RC that uses same Dynamixel protocol.
    My questions are:

    1)What Arduino IDE can I use with DynamixelSerial2?
    2)If using different than 1.0 (I use 1.0.6) do I need to replace HardwareSerial.h and HardwareSerial.cpp in Arduino/Cores/... ?

    What are the servo settings for the library to be used:
    3)Baudrate?
    4)Return delay time?

    P.S. Using a Sparkfun 485 board to connect the SR518 to Arduino Mega as in SoftwareSerial2 schematics

  • Josué Alejandro Savage

    Hello Horia, you can use whatever version of arduino, 1.0.6 it also ok. you don't need to replace nothing with the DynamixelSerial2 library, Baudrate is the speed of transmission normally and by default as 1 mbps (1000000) and the return delay time its how long should you wait for the answer of the motor. Hope that information helps you, Good luck ;)

  • achmad Firman Choiri

    hi sir, i try to control 2 servo from arduino is succesfully, but i failed to try 3 or many comunication servo.

    i testing servo one by one, it’s so okey,.
    – cable is connected
    – id same in the program
    – i make arduino uno for controlling
    – try 2 servo comunication . it’s ok
    – try 3 not responding, but if me unplug 1 cable of servo the 2 servo ready and working,.

    send me mail : ach_fch@yahoo.com

    what its wrong?
    help me sir

    thankyou,

  • Hello, I`m trying to work with the MX-64, I already used the AX series and it worked perfectly, but with the MX-64T (TTL communication) it doesn`t respond to any command. I`m using the Serial1 Dynamixel library, the circuito that you suggest. There`s something that I can try to fix it?
    Thanks

  • hg

    Hello Alejandro

    I know I joined this blog a bit late in the game :) but if I can say, one of the best blogs I have ever seen!

    So I just had the first successful test with Dynamixel Serial. (Ax-12 + Arduino Uno + 74LS241). Btw, great library and documentation! My issue is my control loop in the arduino sketch use case statements like:

    void loop(void)
    {
    switch (val) {

    case 'x' : DynamixelRead();
    Break;
    case 'y' : DynamixelCenter();
    Break;
    }
    }

    It works great the first time I enter a character in the Serial Monitor. Servos are moving and they send back their information properly. But then, it appears to 'lose control' and the next character read of Serial.Read(val) is not registered.

    Would really appreciate any thoughts you might have on what could cause that.

    Thank you and kind regards!

  • Buenas No se si tengo problemas con la libreria pero sera que alguien me puede ayudar Siempre me muestra error Ax12 Creo que es que no lo reconoce pero ya descargue la libreria que me dicen para arduino 1 r3 pero nada de nada

  • CornDog
    Este comentario ha sido eliminado por el autor.
  • CornDog

    For those interested, I made a webpage for the documentation on this library. I got tired of scrolling through a pdf. http://austinlpalmer.com/Projects/Documentr/#/home

  • «El más antiguo ‹Más antiguo   201 – 400 de 431   Más reciente› El más reciente»

    Publicar un comentario