Guia de Programacion Del Bioloid PDF
Guia de Programacion Del Bioloid PDF
Guia de Programacion Del Bioloid PDF
BIOLOID
Julio,2012
Juan Ramón Rufino Valor
Ingeniería Electrónica
1 Resumen
1. Resumen
A nuestro parecer, la programación del Bioloid desde el software que incluye la casa
fabricante es muy poco útil o imposible programar algo con un poco de complejidad. Así
que después de semanas de dudas y debate entre nosotros, hemos decidido que la mejor
manera para conseguir que nuestro robot realice acciones que consideramos buenas es
la de programar en C sobre el microcontrolador que incluyen. Esto, evidentemente, nos
alarga el tiempo de ejecución de cualquier movimiento que queramos implementarle al
bioloid, ya que en C necesitamos mucha información y trabajo para llegar a un final
exitoso.
II
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice
Índice
1. Resumen II
2. Bioloid 1
2.3. ServoMotores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5.1. Gyro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.2. IR Sensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.8. USB2Dynamixel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3. Metodología 16
III
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice
8. Funciones de Comunicaciones 30
9. Lectura/escritura de puertos 31
15.1. Cabecera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
16. Caminar 43
IV
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice
17.1. dxl_initialize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
17.2. dxl_terminate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
17.3. dxl_set_txpacket_id . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
17.4. dxl_set_txpacket_instruction . . . . . . . . . . . . . . . . . . . . . . . . 50
17.5. dxl_set_txpacket_parameter . . . . . . . . . . . . . . . . . . . . . . . . 51
17.6. dxl_set_txpacket_length . . . . . . . . . . . . . . . . . . . . . . . . . . 52
17.7. dxl_get_rxpacket_length . . . . . . . . . . . . . . . . . . . . . . . . . . 52
17.8. dxl_get_rxpacket_parameter . . . . . . . . . . . . . . . . . . . . . . . . 53
17.9. dxl_get_rxpacket_error . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
17.10.dxl_tx_packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
17.11.dxl_rx_packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
17.12.dxl_txrx_packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
17.13.dxl_get_result . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
17.14.dxl_ping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
17.15.dxl_write_byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
17.16.dxl_write_word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
17.17.dxl_read_byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
17.18.dxl_read_word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
17.19.dxl_makeword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
17.20.dxl_get_highbyte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
V
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice
17.21.dxl_get_lowbyte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
VI
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
2. Bioloid
Antes de explicar que es cada kit y el contenido de cada kit, hay que decir donde con-
seguirlos. La manera más fácil de acceder a los kits bioloid es la pagina de la compañía
ro-botica.
Bioloid nos ofrece hast 4 kits a elegir dependiendo de nuestro conocimiento sobre el
tema:
Como ya sabemos, bioloid es una plataforma de robótica modular, con el beginner kit po-
demos introducirnos de una manera muy fácil y comprensible en el mundo de la robótica,
podríamos decir que bioloid beginner kit es una versión superior a LEGO Mindstorms
NXT y Meccano, una plataforma ideal para la educación o bien para el hobby, como kit
introductorio a la robótica bioloid beginner tiene la posibilidad de ampliarse con los otros
kits superiores.
Bioloid beginner permite al usuario de manera guiada crear hasta 14 robots diferentes y
probarlos con programas de control de ejemplo.
1
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
6. Alimentador de potencia.
Podríamos decir que el comprehensive kit es el hermano mayor de bioloid beginner kit,
por tanto al igual que este, bioloid comprehensive es una plataforma ideal y mucho más
avanzada para el desarrollo de nuestros robots, con este kit podremos desarrollar robots
mucho más impresionantes y versátiles.
Bioloid comprehensive kit permite al usuario de manera guiada crear hasta 26 robots
diferentes y probarlos con programas de control de ejemplo.
4. Mas de 100 piezas mecánicas, ruedas, pneumaticos para el ensamblaje con los ser-
vos (Comprehensive Frame Set)
2
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
7. Alimentador de potencia
Este kit se podría decir que es una gran ampliación de bioloid comprehensive, dispone
de muchas más opciones que su hermano mediano:
Podremos controlar nuestro robot mediante radio control gracias a el módulo de comuni-
cación inalámbrico ZIG-100. Bioloid expert nos permite controlar los módulos de senso-
res y los actuadores directamente desde el PC, utilizando el dispositivo USB2Dynamixel.
Bioloid expert nos ofrece la posibilidad de agregar visión artificial a nuestro robot, pa-
ra ello incorpora una pequeña cámara conectada directamente a nuestro PC, procesa las
imágenes utilizando detección de bordes.
3
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
2. 2 x Controlador CM-5
5. 2 x Frame set
7. 1 x USB2Dynamixel
8. 1 x Alimentador de potencia
En nuestro caso, el Bioloid que vamos a utilizar es el Bioloid PREMIUM Kit. Este kit
es mucho más completo a muchos niveles. Con este kit poseemos una mayor movilidad,
una mayor inteligencia, diversidad y un control de servo-motores más trabajado. El Bio-
loid PREMIUM kit es más completo que sus hermanos menores y nos permite el trabajo
desde el ordenador, cosa que es muy útil cuando estemos programando en C todos sus
movimientos. Además, todas las características que hemos nombrado nos ayudarán a la
programación en C y el conocimiento del entorno del robot que sin duda necesitaremos.
A continuación, haremos una explicación más detallada del kit PREMIUM y desglosa-
remos todas las características que tiene y los avances que nos proporciona.
4
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
Los contenidos que el Bioloid PREMIUM kit nos proporciona son los siguientes:
3. 3 sensores de distancia
4. Sensor Giroscópico
7. USB2 Dynamixel
9. Cargador de baterías
5
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
2.3. ServoMotores
Características AX-12A:
3. Tamaño: 50 x 32 x 38 mm
4. Peso: 55 g
6
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
Los servomotores AX-12 del kit BIOLOID Beginner son controlados por una conexión
de serie a 1Mbauds y pueden ser vinculados entre sí para crear cadenas de servomotores.
Hasta 254 servomotores pueden ser conectados. El sistema de comunicación le permi-
te controlarlos a todos al mismo tiempo, para por ejemplo, ponerlos en movimiento o
sincronizarlos.
La posición y la velocidad de los servomotores AX-12 se pueden ajustar con una reso-
lución de 1024 pasos. Con su tolerancia ajustable y la información de retorno (posición,
velocidad, acople), estos servomotores le permiten adaptar sus operaciones a las condi-
ciones externas e internas tales como la temperatura, la presencia de una pendiente o el
voltaje de la batería (sin necesidad de sensores adicionales).
7
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
El módulo CM-510 es una evolución del antigua CM-5 que fue usado en los promeros
Bioloid que habian en el mercado.
Características del micro controlador Robotis CM-510 utilizado por Bioloid Premium:
1. Procesador ATMega2561
2. Peso: 51,3 g
3. Tensión de trabajo 6,5V a 15V. Se recomienda trabajar con los 11,1 V que propor-
ciona la batería Li-Po de 3 celdas, o con el alimentador de potencia proporcionado
con Bioloid.
4. 6 Puertos auxiliares de 5 pines compatibles con OLLO para la expansión con sen-
sores y dispositivos de terceros: DMS (snesor de distancia Sharp), Sensor de tacto
OLLO, Sensor de IR, etc.
8
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
6. Diseñado para soportar y conectar directamente las baterías LiPo de Bioloid Pre-
mium: Mecanismo de desconexión automática de la batería y monitorización del
nivel de carga.
7. 5 puertos de popular bus TTL de Bioloid (3 pines) para controlar un número inde-
finifo actuadores AX-12+ o AX-18F y módulod de sensores AX-S1, AX-20, Gyro,
etc.
8. El USBDownloader LN-101 también utilizado para descargar programas en OLLO
permite descragar programas del PC al micro-controlador CM-510.
9. LED’s informativos del estado del micro controlador.
10. Detector de sonido (micrófono)
11. Sensor de temperatura.
12. Sensor de tensión.
13. Generador de sonidos y tonos.
14. Totalmente compatible con el potente software de descarga gratuita RoboPlus y
programable en lenguaje C para usuarios experimentados.
Para obtener más información sobre el controlador CM-510 que hemos usado se puede
acudir al manual facilitado en la página web principal de Robotis.
9
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
El controlador de Robotis CM-510 nos ofrece 6 conexiones donde podremos utilizar los
puertos de entrada salida que el microcontrolador ATMega 2561 incorpora. Cada puerto
se controla mediante tres registros (un registro es básicamente una zona de memoria):
Para manejar los puertos se han de utilizar los operadores de C a nivel de bits para
activar y desactivar cada uno de los bits que representan los puntos de conexión (PIN)
que componen los puertos. Estas operaciones utilizan los mismos operadores booleanos
que las puertas lógicas y tablas de verdad.
A continuación vamos a definir los dos tipos de sensores que el Bioloid PREMIUM kit
nos proporciona.
2.5.1. Gyro
10
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
2.5.2. IR Sensor
La luz infrarroja no es adecuado para medir la distancia entre los objetos porque aunque
dos objetos están a la misma distancia, la cantidad reflejada se puede variar dependiendo
del color y el brillo.
1. Peso: 4,4 g
Los robots del kit BIOLOID Premium están equipados con una batería de 11,1 V del tipo
LiPo que se acopla de forma independiente, bajo el controlador. Este cambio mejora el
11
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
comportamiento del robot de varias maneras: el centro de gravedad es más bajo para una
mayor estabilidad, el mayor voltaje mejora el acople y la velocidad de los servomotores
AX-12, y la autonomía del robot se ve también muy mejorada, la batería puede ser fácil-
mente reemplazada. La nueva batería LiPo es ideal para uso prolongado, demostraciones
o competiciones.
2. El voltaje más alto ofrece un mejor torque y velocidad de los servos AX-12+.
4. Debido a que la batería está fuera de la caja de control, puede ser mas fácilmente
reemplazada una vez agotada.
5. Esto es ideal para largos periodos de uso, tales como las demostraciones y sobre
todo las competiciones.
Sus 10 botones soportan mas de 1023 combinaciones distintas de ser presionados, per-
mitiendo cualquier combinación para controlar tu robot.
12
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
U: 1
D: 2
L: 4
R: 8
1: 16
2: 32
3: 64
4: 128
5: 256
6: 512
Por ejemplo, cuando se presiona el botón [U] en el control remoto RC-100, el valor
“1"será enviado al robot. En el Behavior Control Program se puede definir un movimiento,
estado o comportamiento que será ejecutado cuando el valor inalámbrico “1"sea recibido
por el robot.
Por ejemplo: [U] + [1] ⇒ 1 + 16 = 17. El robot recibirá el valor 17, y podrá ser programa-
da su lectura a través del RoboPlus Task (programa de control) de Bioloid para ejecutar
movimientos preprogramados del robot o activar cualquier estado del robot.
Figura 4: Configuración simple del canal por infrarojos (cuando operan varios gamepads
a la vez)
2.8. USB2Dynamixel
El accesorio USB2 Dynamixel ofrece una interfaz USB para programar el robot. Ade-
más, incluye puertos para el bus Dynamixel, los cuales permiten un control directo y de
13
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
bajo nivel de los servomotores y sensores para aplicaciones que requieren mucha poten-
cia de cálculo (algoritmos que se pueden ejecutar desde un PC con control del robot en
tiempo real).
Controla cualquier red de módulos Dynamixel (como los servos Dynamixel AX-12 o el
módulo de sensores AX-S1, o los actuadores Dynamixel de altas prestaciones) utilizando
tu PC como controlador, y comunicando a través del puerto USB de tu PC con el bus
Dynamixel, sin pasar por el controlador CM-510 de Bioloid o del controlador CM-700 de
los actuadores Dynamixel.
Con librerías de soporte para programar tu robot en tu entorno favorito: Matlab, Micro-
soft Visual Studio, Java, C/C++, C#, Visual Basic, Python, LabVIEW.
Todos los actuadores Dynamixel operan entre 9V y 18,5V según el modelo, y todos
ellos pueden obtener la potencia del alimentador de potencia SMPS Bioloid/Dynamixel,
12V, 5A, Ref 2126. También se puede utilizar como conversor Puerto USB a puerto se-
rie RS232 para descargar los programas en ordenadores sin puerto serie en robots que
requieren el puerto serie como Bioloid Comprehensive Kit o Robonova.
Nivel TTL: Conector de 3 pins utilizados con las serie Dynamixel AX de Bioloid.
El actuador inteligente AX-12+, AX-18 y el módulo sensor AX-S1 de Bioloid se
conectan a este puerto.
RS232 DB9: Conector serie estandard RS232 de 9 Pins. Este puerto es ideal para
conectar el adaptador ZIG2Serial.
14
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid
4. Nuevo diseño del busto del modelo humanoide para un aspecto más "humano per- 2
mitir la personalización.
15
Darío R. Quiñones Colomer Vicente Llinares Llata
3 Metodología
3. Metodología
Una vez introducidos en nuestro robot y en las herramientas que utilizaremos en su pro-
gramación, vamos a explicar todo nuestro trabajo durante meses y toda la metodología
utilizada para conseguir los objetivos que nos marcamos a principio de proyecto.
5. Funciones de comunicaciones.
En este apartado se implementan las funciones para conocer el estado de las comu-
nicaciones que utilizamos en cada momento.
6. Lectura/escritura de puertos.
Aquí realizamos un ejemplo muy útil de como leer y escribir en los puertos.
16
Darío R. Quiñones Colomer Vicente Llinares Llata
3 Metodología
9. Programa principal.
En este apartado se muestra y se explica el programa principal de nuestra progra-
mación. Con este código podemos controlar y las interrupciones y las principales
funciones que nuestro robot realiza.
13. Caminar.
Al igual que en el movimiento coordinado de el pino, vamos a realizar una serie de
movimientos que utilizaremos para que, esta vez, el robot camine. Explicamos por
apartados el código utilizado y mostramos todas las características y movimientos
que el robot necesita en una programación en C.
17
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.
En primer lugar vamos a trabajar con el Roboplus Manager. Roboplus Manager ha sido
diseñado para manejar todas las funciones de su robot. Este software reúne la gestión del
Firmware, del bus Dynamixel y de la depuración. RoboPlus Manager proporciona una
visión única de todos los componentes conectados al bus Dynamixel y permite editar los
parámetros de cada uno de ellos en tiempo real.
Lo primero que debemos hacer para empezar a trabajar con nuestro programa. Para ello,
conectamos el robot al PC para que Roboplus Manager lo detecte (en la Figura 6 podemos
ver la ventana de inicio y como nos proporcionan información de la conexión). Para ello,
conectamos el robot al PC por medio del cable de comunicación serie que nos propor-
cionan con la compra del robot y más tarde, elegimos el puerto de comunicaciones que
hemos elegido para la conexión.
En la Figura 7 podemos observar el programa Roboplus Manager por dentro. Una vez
sincronizado con el robot, ya podemos trabajar con los servos. En la ventana de la iz-
quierda vemos los 18 servos que el robot tiene y a la derecha están las características que
vamos a estudiar sobre ellos. Por ejemplo, si queremos ver las características del primer
servo, lo seleccionamos y vamos a la derecha para controlar todos los parámetros que nos
proporcionan, como pueda ser la ID, temperatura del actuador, voltaje que está gastando
el servo en tiempo real, la presión, la velocidad, etc. También podemos observar los va-
lores que tienen los sensores del controlador, como el voltaje, los botones, el micrófono,
18
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.
el altavoz. Además, podemos controlar los puertos libres que pueden ser gestionados por
nosotros mismos. Esto es muy útil porqué así vemos en cada momento que necesitemos
los valores de los puertos para saber el rango que tienen a la hora de programar.
En este programa podemos controlar movimientos de todos los servos de una manera
simple e intuitiva para el usuario. Este programa se basa en un conjunto de steps ejecuta-
dos en el orden que precisemos, para así formar determinados movimientos, es decir, que
en cada step seleccionamos la posición final que debe tener los servos y unimos cada step
para formar movimientos de manera que el robot llegue a hacer todo lo que queramos.
19
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.
Para una persona que está acostumbrada a programar en lenguajes como C, puede re-
sultarle un poco dificultoso y extraño el inicio con este programa. Antes de empezar a
programar con el RoboPlus Motion, debemos saber que cada servomotor del Bioloid ne-
cesita un valor de posición para determinar el movimiento que queremos que haga y hacia
donde queremos que vaya. Nuestro Bioloid está compuesto por 18 servomotores y en ca-
da movimiento que queremos que haga el BIoloid, necesitamos que cada servo tenga una
valor de posición determinado para realizar el movimiento de una manera exitosa. Para
ello, el RoboPlus Motion nos permite visualizar la lista de todos los motores del Bioloid
y sus respectivos valores de posición que determinamos.
Por último, en el medio arriba es donde guardamos los steps generados, y abajo es donde
controlamos algunos parámetros de los servos uno por uno. Podemos controlar la veloci-
dad e ejecución, las veces que se repiten o el control de inercia.
20
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.
Con este programa podemos programar los movimientos del robot y las lecturas de sus
sensores mediante un lenguaje muy sencillo e intuitivo. Aunque esta es una herramienta
visual, diseñado para ser accesible a principiantes, utiliza la semántica de un lenguaje de
programación estructurado como C o Java.
En la Figura 9 podemos ver una imagen del programa. Vemos que tiene una estética mas
vistosa al usar colores y u buen sangrado de las funciones.
21
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.
22
Darío R. Quiñones Colomer Vicente Llinares Llata
5 Comprobación del funcionamiento de todos los Servos
RoboPlus terminal recibe señales desde el controlador conectado y muestra los conteni-
dos en la pantalla.También puede transmitir o recibir grandes volúmenes de datos desde
y hacia el controlador conectado. No existe un protocolo de transmisión de datos.
Antes de trabajar con nuestro robot es muy aconsejable comprobar todos los servos y
conocer la estructura con la que está compuesta nuestro Bioloid.
Para comprobar todos los servos, el mejor método es usar el RoboPlus Motion y con
su ayuda hacer movimientos de los servos individualmente. Seleccionamos el servo y lo
hacemos mover de un extremo a otro. Hacemos esto para ver si algún servo falla o no fun-
ciona correctamente. También, es muy aconsejable que comprobemos la batería y algunos
23
Darío R. Quiñones Colomer Vicente Llinares Llata
6 Implementar la subida y la bajada de un escalón
movimientos que la casa Bioloid nos proporciona con el programa RoboPlus Motion para
ver si todos los steps utilizados son precisos y no hay ningún tipo de problema.
Más tarde lo que hacemos es estudiar toda la ergonomía que utiliza el robot para así en
un futuro no pedirle al servomotor una posición que no pueda darnos o pueda ser dañina
para el servo. Con el RoboPlus Motion sabemos que los servos pueden darnos un rango
de posición del 0 a 1024 pero nosotros necesitamos saber el rango en los valores de C.
Para ello, lo que hacemos es leer los valores de cada servo en sus movimientos con
el programa AVG Studio que hemos explicado en la Sección 2. A partir de un sencillo
programa en C, leemos los valores máximos que los servos pueden darnos debido a su
ergonomía y características de montaje (piezas utilizadas para el montaje del robot, cables,
otros servos). Estos valores los escribimos y los guardamos para cuando trabajemos en la
colocación de las posiciones, tener una rango de valores mínimos y máximos para no
sobrepasarlos.
Uno de nuestros objetivos finales es el de subir escalones y bajarlos con una autonomía
total. Así que durante nuestros días de trabajo en el laboratorio hemos ido intercalando
diferentes trabajos para hacer más amena nuestra forma de trabajar. Por ejemplo, unos
días nos dedicábamos a programar con el AVG Studio y otros a encontrar soluciones a
otros problemas. Algunos de esos problemas eran los de conocer la serie de movimientos
exactos de cada servomotor en la subida de un escalón.
Para solucionar este problema usamos el programa RoboPlus Motion, y así definir todo
los steps necesarios en las acciones requeridas. Usamos este programa porque podemos
trabajar con el robot al mismo tiempo que guardamos todas las posiciones. Para ello en-
cendemos y apagamos el par de los servos necesarios y así poder colocarlos de la manera
que queramos con la ayuda, incluso, de nuestras propias manos (modo “Catch & Play").
Debemos saber que el RuboPlus Motion nos permite seleccionar los grupos de servos que
necesitemos para trabajar con más agilidad.
Al programar nuestro robot para que suba un escalón, tenemos el problema del equilibrio.
En cada movimiento de los servos tenemos que encontrar la posición de equilibrio para
que no se caiga y pueda seguir. Por ejemplo, al levantar alguna pierna para subir el escalón
debemos inclinar el torso del cuerpo del robot hacia el lado contrario del pie levantado,
24
Darío R. Quiñones Colomer Vicente Llinares Llata
6 Implementar la subida y la bajada de un escalón
incluso, ayudándonos con los brazos del bioloid y así encontrar el punto de equilibrio
donde el robot pueda estar de pie sin ayuda.
Otro problema es cuando un servo aplica demasiado par y el servo “salta”, es decir, deja
de funcionar y lo señala con una luz roja en el motor. Esto es muy común cuando, por
equivocación, el programador hace que el servo intente una rotación más grande de lo
que la ergonomía del robot permite. Este problema nos sucede con mucha frecuencia, ya
que cuando probamos algún movimiento nuevo, es muy común que un servo realice una
fuerza más elevada de la aconsejada.
El primer modo que hemos probado es un modo muy parecido al ejecutado por una
persona al subir un escalón, es decir, desde una posición totalmente recta y plantada, in-
tentamos levantar un pie para superar el escalón, y una vez el pie está apoyado en la parte
superior del escalón levantar el otro pie trasero apoyando todo el peso del robot en el pri-
mer pie. Este método es muy ineficaz porque al estar el robot totalmente erguido el punto
de equilibrio del robot está en una posición muy superior en su figura. Para solucionar
este problema debemos agachar la figura humanoide con la ayuda de las piernas del robot
para conseguir un punto de equilibrio más inferior.
Una vez tenemos el conjunto de steps y movimientos que creemos que son necesarios,
guardamos todos los movimientos y los puntos finales de cada servo en cada step y los
utilizamos en nuestro programa en C, que realizaremos en el AVR Studio.
Una vez tenemos los movimientos necesarios para subir y bajar un escalón guardados,
es necesario que el robot sepa en cada momento donde se encuentra, y pueda ejecutar los
movimientos guardados en el momento y lugar adecuados.
Para ello, necesitamos sensores con los que ayudarnos para conocer mejor el entorno que
envuelve al robot. Ante el caso de subir y bajar escalones vamos a usar dos sensores IR
(posicionados en los dos pies del robot) de infrarrojos con los que conocer la distancia
que hay entre el sensor y cualquier objeto. En el pie derecho, que es con el que damos el
primer paso para bajar y subir escalones, pondremos un sensor horizontalmente mirando
hacia delante para localizar los objetos que estén justo delante del pie del robot. En el
pie izquierdo pondremos el mismo sensor verticalmente mirando hacia abajo para saber
el momento en el que el suelo que pisa el robot desaparece, es decir, que hay un escalón
hacia abajo.
25
Darío R. Quiñones Colomer Vicente Llinares Llata
6 Implementar la subida y la bajada de un escalón
En primer lugar, utilizaremos los sensores de infrarrojos que la casa Roboplus nos pro-
porciona con el robot y veremos si nuestro objetivo funciona. Más adelante, veremos si
es necesario algún sensor más potente y lo buscaremos en el mercado.
Para hacer una prueba sencilla y rápida con los sensores de RoboPlus lo más sencillo es
usar el programa RoboPlus Task. En este programa haremos que el robot camine hasta que
encuentre un obstáculo (haremos que implemente los movimientos necesarios para subir
un escalón) o encuentre un escalón descendente (haremos que implemente los movimien-
tos necesarios para que el robot baje el escalón). Cuando no encuentre ninguno de los
casos marcados anteriormente el robot seguirá caminando para encontrar más obstáculos.
Evidentemente, los sensores se deben de conectar a los puertos de nuestro CM-510. Los
puertos que hemos usado para esta prueba es el puerto 6 para el sensor del pie derecho y
el puerto 4 para el sensor del pie izquierdo.
Antes de usar el programa RoboPlus Task, vamos a conocer los valores que el sensor de
infrarrojos nos da según la distancia del objeto. Para ello, vamos al RoboPlus Manager y
vemos los valores que hay en el puerto 6 y 4 de nuestro robot. Al observar los valores que
el sensor da, vemos que cuando el sensor se va acercando a algún objeto los valores van
decreciendo hasta llegar al 0 que es cuando el sensor ha llegado hasta el objeto.
Durante este proceso hemos tenido un problema y es que el valor cero no solo aparece
cuando el objeto está tocando el sensor, es decir, que hay un momento en el que el sensor
llega a su valor máximo de cercanía y si se aleja más los valores van descendiendo hasta
llegar a cero. Para solucionar este problema hemos determinado un momento en el cual
el robot va a estar acercándose y no alejándose al objeto hasta llegar a cero, y empezar
a implementar los movimientos y steps requeridos. Con esto nos referimos a que solo
implementaremos los movimientos cuando el sensor esté decrementando los valores y
llegue a 0.
Con el programa RoboPlus Task es muy sencillo crear bucles y llamar a paginas de
steps hechas con el RoboPlus Motion. Así que nuestro programa se basará en llamar a
las páginas que forman la andadura del robot y seguidamente, generaremos un if con el
que usaremos el valor del sensor, y cuando sea menor que 4 o igual a 0 (el sensor está
cerca del obstáculo) llamaremos a las páginas que forman los movimientos necesario para
esquivar el obstáculo (en nuestro caso, subir el escalón). El acto de bajar el escalón será
igual solo que el valor que nos interesará será cuando los datos del sensor sean diferentes
de 0 o igual a una distancia igual a la altura del escalón, es decir, que el robot esté al borde
del escalón.
Nuestro objetivo con esta prueba es que con una programación fácil y rápida como la del
programa RoboPlus Task, podamos conocer el funcionamiento de los sensores para que
en un futuro, cuando lo intentemos programar en C, tengamos los conocimientos básicos
y necesarios para que la programación sea exitosa.
26
Darío R. Quiñones Colomer Vicente Llinares Llata
7 Paso a la programación en C mediante AVR Studio.
Una vez tenemos todo implementado, vamos a empezar la programación con el progra-
ma. A continuación vamos a mostrar el código que hemos utilizado. Lo dividiremos en
diferentes partes para explicar y definir los puntos importantes a destacar.
27
Darío R. Quiñones Colomer Vicente Llinares Llata
7 Paso a la programación en C mediante AVR Studio.
Primero hablaremos sobre las características más elementales para programar con éxito,
como pueda ser el ejecutar los programas y pasarlos al controlador del robot, el código
para comunicarse con los servos, funciones para conocer el estado de las comunicaciones
o los movimientos sincronizados de varios servos. Más tarde, definiremos el programa
principal y las características más importantes del código. Por último, explicaremos al-
gunos movimientos utilizados para mostrar al usuario el modo de ejecución para llegar a
hacer una programación exitosa de cualquier serie de movimientos.
Utilizamos este método para cargar los programas que hemos compilado en C y así pro-
barlos en el robot. Para entrar al modo Boot Loader, debemos mantener el robot conectado
RoboPlus Terminal, y conectar el robot, mientras pulsamos “ALT+3”, Si todo va bien apa-
recerá la siguiente imagen:
Una vez realizado esto, pulsaremos la tecla “L” para ponerlo en modo carga, pulsaremos
la pestaña “file” y pulsaremos “Transmit file”, seleccionando asi el “.HEX” creado por el
Avr Studio.
El fichero se cargará en pocos segundos, y nos dirá que está todo OK, Si es así, escribire-
mos “GO”, y pulsaremos “intro” para que el robot, inicie el programa.
28
Darío R. Quiñones Colomer Vicente Llinares Llata
7 Paso a la programación en C mediante AVR Studio.
s e r i a l _ i n i t i a l i z e (57600);
dxl_ initia lize ( 0 , D E FA UL T _B AU D NU M ); // Not using device index
sei (); // Interrupt Enable
while (1)
{
// Check moving done
bMoving = dxl_read_byte ( id , P_MOVING );
CommStatus = dxl _get_r esult ();
if ( CommStatus == COM M_RXSU CCESS )
{
if ( bMoving == 0 )
{
// Cambiar posicion destino
if ( index == 0 )
index = 1;
else
index = 0;
29
Darío R. Quiñones Colomer Vicente Llinares Llata
8 Funciones de Comunicaciones
Ejemplo:
Para indicar la posición a la que queremos ir, debemos acceder a los valores 30 y 31.
Posteriormente hemos declarado las funciones que necesitaremos mas tarde, las cuales
explicaremos en la Sección 8
8. Funciones de Comunicaciones
30
Darío R. Quiñones Colomer Vicente Llinares Llata
9 Lectura/escritura de puertos
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ERRBIT_ANGLE ) == 1)
printf ( " Angle ␣ limit ␣ error !\ n " );
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( E RR B IT _O V ER H EA T ) == 1)
printf ( " Overheat ␣ error !\ n " );
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ERRBIT_RANGE ) == 1)
printf ( " Out ␣ of ␣ range ␣ error !\ n " );
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( E RR B IT _C H EC K SU M ) == 1)
printf ( " Checksum ␣ error !\ n " );
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( E RR B IT _O V ER L OA D ) == 1)
printf ( " Overload ␣ error !\ n " );
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( E R R B I T _ I N S T R U C T I O N ) == 1)
printf ( " Instruction ␣ code ␣ error !\ n " );
}
A partir de esta función, podremos saber si el paquete recibido como respuesta indica
algún error.
9. Lectura/escritura de puertos
while (1)
{
int i ;
for ( i = 0; i <= 6; i ++)
{
PORTC = ~(1 < < i );
_delay_ms (250);
}
}
return 1;
}
31
Darío R. Quiñones Colomer Vicente Llinares Llata
11 Chequeo de los parámetros de los motores
Con este sencillo programa podremos ver como van iluminándose los diferentes LED’s
del robot. En el inicio del programa se puede observar, que se ha configurado el puerto
deseado.
A partir de tese código conseguimos construir la trama con la que enviaremos a cada
servo su correspondiente posición.
32
Darío R. Quiñones Colomer Vicente Llinares Llata
11 Chequeo de los parámetros de los motores
En esta función se ha implementado los comandos necesarios para poder visualizar me-
diante el Roboplus Terminal el cual se habla en la Subsección 4.4, el estado de todos los
servos Dynamixel, informándonos así de cada uno de los 18 servos. La información que
nos aporta es la siguiente:
4. Led de alarma
6. Posición Objetivo
9. Posición actual
33
Darío R. Quiñones Colomer Vicente Llinares Llata
12 Programa Principal
int acel ;
int RcvData ;
s e r i a l _ i n i t i a l i z e (57600);
dxl _initi alize ( 0 , D E FA UL T _B A UD NU M ); // Not using device index
check ();
34
Darío R. Quiñones Colomer Vicente Llinares Llata
12 Programa Principal
Hasta aquí, ejecutamos las funciones básicas, que son la comprobación de los servos
(“check”), habilitamos las interrupciones y ponemos al robot en la posición inicial (“walk_ready”)
Pino ();
// RC ();
//
_delay_ms (500);
Aquí es donde elegimos el movimiento deseado, en este caso, hemos elegido el del pino
porque es el que más depurado está.
DDRC = 0 x7F ;
PORTC = 0 x7E ;
PORTD &= ~0 x80 ; // P O R T _ L I N K _ P L U G I N = 0; // no pull up
PORTD &= ~0 x20 ; // P O R T _ E N A B L E _ R X D _ L I N K _ P C = 0;
PORTD |= 0 x40 ; // P O R T _ E N A B L E _ R X D _ L I N K _ Z I G B E E = 1;
DDRD = 0 x70 ;
PORTD = 0 x13 ;
En esta parte, hemos configurado los puertos con sus correspondientes valores.
while (1)
{
ADCSRA = (1 << ADEN ) | (1 << ADPS2 ) | (1 << ADPS1 ); // ADC Enable , Clock 1/64 div .
ADMUX = ADC_PORT_3 ; // ADC Port 3 Select
PORTA &= ~0 x20 ; // ADC Port 3 IR ON
_delay_us (12); // Short Delay for rising sensor signal
ADCSRA |= (1 << ADIF ); // AD - Conversion Interrupt Flag Clear
ADCSRA |= (1 << ADSC ); // AD - Conversion Start
while ( !( ADCSRA & (1 << ADIF )) );
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if ( ADC >300)
{
acel =254 - ADC ;
printf ( " \ naceleracion = % d \ r \ n " , 254 - ADC ); // Print Value on USART
}
if ( ADC <200)
{
acel =254 - ADC ;
printf ( " \ naceleracion = % d \ r \ n " , 245 - ADC ); // Print Value on USART
}
35
Darío R. Quiñones Colomer Vicente Llinares Llata
13 Posición inicial del robot (Walk Ready )
Con esto, podemos ver la aceleración del robot hacia delante y hacia atrás, gracias al
gyro sensor.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ADCSRA = (1 << ADEN ) | (1 << ADPS2 ) | (1 << ADPS1 ); // ADC Enable , Clock 1/64 div .
MIC ();
// if ( zgb_rx_check () == 1)
// {
// RcvData = zgb_rx_data ();
if ( RcvData & RC100_BTN_1 )
PORTC &= ~ LED_MANAGE ;
else
PORTC |= LED_MANAGE ;
}
return 0;
}
Por último, con esta parte del código recibimos la señal del mando o de los botones
situados en la parte posterior del robot.
void WalkReady ()
{
int ID [18]={235 ,788 ,279 ,744 ,462 ,561 ,358 ,666 ,506 ,515 ,340 ,682 ,239 ,783 ,647 ,375 ,506 ,515};
int i ;
int bMoving ;
int CommStatus ;
s e r i a l _ i n i t i a l i z e (57600);
dxl _initi alize ( 0 , D E FA UL T _B A UD NU M ); // Not using device index
sei (); // Interrupt Enable
36
Darío R. Quiñones Colomer Vicente Llinares Llata
14 Uso del Micrófono
Esta es la función que pone el robot en su posición básica, ya que en muchos momentos
de la programación es muy aconsejable regresar a una posición inicial. Este es un claro
ejemplo de un movimiento sincronizado simple.
En esta funcion, se desarrolla un ejemplo del uso del micro, en el cual cuando se produce
un sonido fuerte cerca, el Bioloid da un paso hacia delante y conecta todos sus led’s.
Mientras no se produzca ningún sonido, el Bioloid permanece en estado de reposo.
37
Darío R. Quiñones Colomer Vicente Llinares Llata
15 Movimiento Coordinado “El Pino”
15.1. Cabecera
# define ADC_PORT_1 1
# define ADC_PORT_2 2
# define ADC_PORT_3 3
# define ADC_PORT_4 4
# define ADC_PORT_5 5
# define ADC_PORT_6 6
// / Control table address
# define MOV ING_SP EED_L 32
# define MOV ING_SP EED_H 33
# define P _ G O A L _ P O S I T I O N _ L 30
# define P _ G O A L _ P O S I T I O N _ H 31
# define P _ P R E S E N T _ P O S I T I O N _ L 36
# define P _ P R E S E N T _ P O S I T I O N _ H 37
# define P_MOVING 46
# define P_G OAL_SP EED_L 32
# define P_G OAL_SP EED_H 33
# define TOR QUE_LI MIT_L 34
# define TOR QUE_LI MIT_H 35
// # define I N ST _S Y NC _W R IT E 0 x83
# define BR OA D CA ST I NG _I D 0 xfe
# define DE FA U LT _B A UD NU M 1 // 1 Mbps
# define NUM_ACTUATOR 17 // Number of actuator
# define STEP_THETA ( PI / 100.0 f ) // Large value is more fast
# define CON TROL_P ERIOD (20) // msec ( Large value is more slow )
38
Darío R. Quiñones Colomer Vicente Llinares Llata
15 Movimiento Coordinado “El Pino”
void Pino ()
{
En esta parte del código, se declaran las matrices las cuales equivalen a un STEP del
Roboplus Motion (Figura 8), el método mas efectivo para conseguir los movimientos, es
realizarlos en el motion y posteriormente copiarlos en forma de matriz a nuestro programa
en Embebd_C.
La estructura ideal de la matriz es:
int nombre[pasos_totales][num_servos]=
{Paso1},
{Paso2},
.. (1)
{ . },
{Paso n},
39
Darío R. Quiñones Colomer Vicente Llinares Llata
15 Movimiento Coordinado “El Pino”
int GoalPos ;
int i ,j , result ;
int CommStatus ;
s e r i a l _ i n i t i a l i z e (57600);
dxl _initi alize ( 0 , D E FA UL T _B A UD NU M ); // Not using device index
sei (); // Interrupt Enable
40
Darío R. Quiñones Colomer Vicente Llinares Llata
15 Movimiento Coordinado “El Pino”
Aquí se monta la trama acorde con lo explicado en la Sección 10. Por cada PASO a rea-
lizar, hay que montar una trama.
Para poder implementar todo esto, ha sido necesario la creación de dos bucles “for” anida-
dos. para así poder conseguir un Step con 5 pasos, que es nuestro caso.
Una vez montada la trama se ejecuta el parámetro “dxl_txrx_packet();” con el cual se en-
vía la trama.
Después de cada envío es necesario dejar un periodo de espera, para que los próximos
movimientos tengan tiempo para ejecutarse.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for ( j =0; j <=1; j ++)
{
// Make syncwrite packet
d x l _ s e t _ t x p a c k e t _ i d ( BROADCAST_ID );
d x l _ s e t _ t x p a c k e t _ i n s t r u c t i o n ( I NS T _S YN C _W R IT E );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (0 , P _ G O A L _ P O S I T I O N _ L );
// d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , M OVING_ SPEED_ L );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , 2);
for ( i =0; i <= NUM_ACTUATOR ; i ++ )
{
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (2+3* i , i +1); // ID
GoalPos = ( int ) Pino1 [ j ][ i ];
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (2+3* i +1 , d x l_ ge t _l ow b yt e ( GoalPos ));
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (2+3* i +2 , d x l _ g e t _ h i g h b y t e ( GoalPos ));
}
d x l _ s e t _ t x p a c k e t _ l e n g t h ((2+1)* NUM_ACTUATOR +4);
// d x l _ s e t _ t x p a c k e t _ l e n g t h ((2+1)* NUM_ACTUATOR +2);
// printf ( "\ nEscribiendo trama FML1 linea %d \ n " , j );
// while (! T X D _ B U F F E R _ R E A D Y _ B I T );
d xl _t x rx _ pa ck e t ();
result = dxl_ge t_resu lt ( );
P r i n t E r r o r p a c k e t ( result );
_delay_ms ( CON TROL_P ERIOD *100);
}
// _delay_ms (100);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for ( j =0; j <=4; j ++)
{
// Make syncwrite packet
d x l _ s e t _ t x p a c k e t _ i d ( BROADCAST_ID );
d x l _ s e t _ t x p a c k e t _ i n s t r u c t i o n ( I NS T _S YN C _W R IT E );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (0 , P _ G O A L _ P O S I T I O N _ L );
// d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , M OVING_ SPEED_ L );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , 2);
for ( i =0; i <= NUM_ACTUATOR ; i ++ )
{
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (2+3* i , i +1); // ID
GoalPos = Pino2 [ j ][ i ];
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (2+3* i +1 , d x l_ ge t _l ow b yt e ( GoalPos ));
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (2+3* i +2 , d x l _ g e t _ h i g h b y t e ( GoalPos ));
}
d x l _ s e t _ t x p a c k e t _ l e n g t h ((2+1)* NUM_ACTUATOR +4);
// printf ( "\ nEscribiendo trama FML2 linea %d \ n " , j );
d xl _t x rx _ pa ck e t ();
result = dxl_ge t_resu lt ( );
P r i n t E r r o r p a c k e t ( result );
_delay_ms ( CON TROL_P ERIOD *40);
}
41
Darío R. Quiñones Colomer Vicente Llinares Llata
15 Movimiento Coordinado “El Pino”
Lo explicado anteriormente lo hemos repetido dos veces mas, ya que tenemos en total 3
STEPS.
// _delay_ms (100);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CommStatus = dxl _get_r esult ();
if ( CommStatus == COM M_RXSU CCESS )
Prin tError Code ();
else
P ri nt C om mS t at u s ( CommStatus );
}
42
Darío R. Quiñones Colomer Vicente Llinares Llata
16 Caminar
16. Caminar
Las matrices de los movimientos se crean del mismo modo que en la subsección 15.2
43
Darío R. Quiñones Colomer Vicente Llinares Llata
16 Caminar
void Walk3 ()
{
int GoalPos ;
int i ,j , result , v =0 , fin =1;
int CommStatus ;
s e r i a l _ i n i t i a l i z e (57600);
dxl _initi alize ( 0 , D E FA UL T _B A UD NU M ); // Not using device index
sei (); // Interrupt Enable
while ( fin )
{
dxl _write _word ( BROADCAST_ID , P_GOAL_SPEED_L , 20+ v );
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - Montamos una trama de envio - - - - - - - - - - - - - - - - - - - - - - -
for ( j =0; j <=6; j ++)
{
// Make syncwrite packet
d x l _ s e t _ t x p a c k e t _ i d ( BROADCAST_ID );
d x l _ s e t _ t x p a c k e t _ i n s t r u c t i o n ( I NS T _S YN C _W R IT E );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (0 , P _ G O A L _ P O S I T I O N _ L );
// d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , M OVING_ SPEED_ L );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , 2);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for ( j =0; j <=6; j ++)
44
Darío R. Quiñones Colomer Vicente Llinares Llata
16 Caminar
{
// Make syncwrite packet
d x l _ s e t _ t x p a c k e t _ i d ( BROADCAST_ID );
d x l _ s e t _ t x p a c k e t _ i n s t r u c t i o n ( I NS T _S YN C _W R IT E );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (0 , P _ G O A L _ P O S I T I O N _ L );
// d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , M OVING_ SPEED_ L );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r (1 , 2);
45
Darío R. Quiñones Colomer Vicente Llinares Llata
16 Caminar
P r i n t E r r o r p a c k e t ( result );
_delay_ms ( CON TROL_P ERIOD );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Las tramas se han construido de la misma manera que el movimiento del pino, explicado
en la subsección 15.4
46
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
En esta sección recogemos todas las funciones que son necesarias para la programación
en C del Bioloid. Describimos cada función y las características principales que poseen,
además de la estructura que se necesita. Definimos los parámetros, los valores que devuel-
ven y, por último enseñamos un ejemplo de ejecución simple para que el usuario acabe de
comprender el funcionamiento.
17.1. dxl_initialize
Parámetros
47
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
# define DE FA U LT _P O RT NU M 3 // COM3
# define DE FA U LT _B A UD NU M 1 // 1 Mbps
int result ;
result = dxl_ initia lize ( DEFAULT_PORTNUM , DE F AU LT _ BA UD N UM );
if ( result == 1) { // Exito al Abrir USB2Dynamixel }
else if ( result == 0 ) { // Fallo al abrir USB2Dynamixel }
48
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.2. dxl_terminate
Finaliza la comunicación
Parámetros
Nada
Ejemplo
dxl_terminate ();
17.3. dxl_set_txpacket_id
void d x l _ s e t _ t x p a c k e t _ i d ( int id );
Parámetros
• ID
Aquí indicamos el ID destino del paquete.
El valor 254, es el de broadcast, para enviar a todos los servos.
Ejemplo
d x l _ s e t _ t x p a c k e t _ i d ( 1 );
49
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.4. dxl_set_txpacket_instruction
Parámetros
• Instrucción
Los siguientes códigos,son los comandos que se pueden realizar. Uno de las
acciones siguientes pueden ser obtenidas.
Ejemplo
d x l _ s e t _ t x p a c k e t _ i n s t r u c t i o n ( INST_WRITE );
50
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.5. dxl_set_txpacket_parameter
Parámetros
• Indice
Indicamos la posición o indice que se encuentra el parámetro.
• Valor
Valor que le vamos ha asignar al parámetro (0-255).
Ejemplo
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r ( 0 , 10 );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r ( 1 , 20 );
d x l _ s e t _ t x p a c k e t _ p a r a m e t e r ( 2 , 30 );
51
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.6. dxl_set_txpacket_length
Parámetros
Ejemplo
d x l _ s e t _ t x p a c k e t _ l e n g t h ( 10 );
17.7. dxl_get_rxpacket_length
int d x l _ g e t _ r x p a c k e t _ l e n g t h ( );
Parámetros
• Nada
Ejemplo
length = d x l _ g e t _ r x p a c k e t _ l e n g t h ( );
52
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.8. dxl_get_rxpacket_parameter
Parámetros
• Indice
Numero del parámetro que queremos obtener información.
Ejemplo
Parameter0 = dxl_get_rxpacket_parameter ( 0 );
Parameter1 = dxl_get_rxpacket_parameter ( 1 );
Parameter2 = dxl_get_rxpacket_parameter ( 2 );
Parameter3 = dxl_get_rxpacket_parameter ( 3 );
53
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.9. dxl_get_rxpacket_error
Parámetros
• errbit
Es un bit que se usa como flag, para saber si ocurren errores o no.
Ejemplo
54
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.10. dxl_tx_packet
void dxl_tx_packet ( );
Parámetros
Nada
Ejemplo
dxl_tx_packet ( );
17.11. dxl_rx_packet
void dxl_rx_packet ( );
Parámetros
Nada
Ejemplo
dxl_rx_packet ( );
result = dxl_ge t_resu lt ( );
55
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.12. dxl_txrx_packet
void d xl _t x rx _p a ck et ( );
Parámetros
Nada
Ejemplo
d xl _t x rx _p a ck e t ( );
result = dxl_ge t_resu lt ( );
56
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.13. dxl_get_result
Parámetros
nada
Ejemplo
57
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.14. dxl_ping
Comprueba la existencia del servo indicado.El resultado se puede probar con dxl_get_result (Subsección 17
Parámetros
• ID
Aquí indicamos el ID del servo a consultar.
Ejemplo
dxl_ping ( 2 );
if ( d xl_get _resul t ( ) == COMM _RXSUC CESS )
{
// Succeed to verify ID 2
}
58
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.15. dxl_write_byte
Parámetros
• ID
Dynamixel ID para escribir información.
• Dirección
Valor de dirección de información.
• Valor
Valores de la dirección para escribir en Dynamixel.
Ejemplo
59
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.16. dxl_write_word
Parámetros
• ID
Dynamixel ID para escribir información.
• Dirección
Dirección de la información.
• Valor
Valores de la dirección para escribir en Dynamixel.
Ejemplo
60
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.17. dxl_read_byte
Parámetros
• ID
Dynamixel ID para leer información.
• Dirección
Valor de dirección de información.
Ejemplo
data = dxl_read_byte ( 2 , 36 );
if ( d xl_get _resul t ( ) == COMM _RXSUC CESS )
{
// using data
}
61
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.18. dxl_read_word
Parámetros
• ID
Dynamixel ID para leer información.
• Dirección
Valor de dirección de información.
Ejemplo
data = dxl_read_word ( 2 , 36 );
if ( d xl_get _resul t ( ) == COMM _RXSUC CESS )
{
// data ??
}
62
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.19. dxl_makeword
Parámetros
• Low Byte
Byte bajo para ser byte de tipo WORD.
• highbyte
Byte alto para ser byte de tipo WORD.
Ejemplo
63
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API
17.20. dxl_get_highbyte
Parámetros
• WORD
Datos de tipo WORD para extraer dato superior.
Ejemplo
highbyte = d x l _ g e t _ h i g h b y t e ( word );
17.21. dxl_get_lowbyte
Parámetros
• Word
Tipo de datos para extraer el byte inferior.
Ejemplo
lowbyte = d x l_ ge t _l ow b yt e ( word );
64
Darío R. Quiñones Colomer Vicente Llinares Llata