Está en la página 1de 70

GUÍA DE PROGRAMACIÓN DEL

BIOLOID

Darío R. Quiñones Colomer


Vicente Llinares Llata

Ingeniero Técnico Industrial Esp.


Electrónica

Julio,2012
Juan Ramón Rufino Valor
Ingeniería Electrónica
1 Resumen

1. Resumen

En este trabajo vamos a realizar un manual de cómo programar en lenguaje C un robot


humanoide llamado Bioloid. El robot es de la casa Robotis y usa 18 servomotores DY-
NAMIXEL AX-12A. Este manual mostrará todos los pasos necesarios para poder llegar
a programar con éxito cualquier tipo de robot de la casa Bioloid a partir de una base de
C. Además seguiremos el mismo método de trabajo que hemos seguido durante meses
y enseñaremos a interpretar y utilizar los diferentes medios que cada usuario de Bioloid
tiene a su alcance para conseguir un final deseado.

La decisión de utilizar el lenguaje C en este trabajo ha sido porqué podemos llegar a


controlar características del robot y del ambiente que lo rodea que con los programas que
nos facilita la casa Robotis no somos capaces.

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.

Nuestro propósito es el de mostrar a cualquier usuario cómo programar en C los movi-


mientos de cada uno de los servos para llegar a implementar cualquier movimiento del
robot. También mostraremos la posibilidad de leer variables de sus diferentes sensores y
poder conocer mejor el medio que lo rodea. Explicaremos las características que el robot
tiene en diferentes procesos de su implementación y además enseñaremos soluciones a
diferentes problemas que hemos encontrado en el proceso de programación.

II
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice

Índice

1. Resumen II

2. Bioloid 1

2.1. ¿Que es Bioloid? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.2. Contenido del Bioloid . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.3. ServoMotores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.4. Módulo controlador CM-510 . . . . . . . . . . . . . . . . . . . . . . . . 8

2.5. Sensores y puertos de los sensores . . . . . . . . . . . . . . . . . . . . . 10

2.5.1. Gyro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.5.2. IR Sensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.6. Batería (LiPo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.7. RC100 Gamepad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.7.1. Captura de botones presionados . . . . . . . . . . . . . . . . . . 12

2.8. USB2Dynamixel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.9. Nuevas Novedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.10. AVR Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3. Metodología 16

4. Introducción al programa Roboplus. 18

4.1. Roboplus Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4.2. Roboplus Motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

4.3. Roboplus Task . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

4.4. Roboplus Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

III
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice

5. Comprobación del funcionamiento de todos los Servos 23

6. Implementar la subida y la bajada de un escalón 24

6.1. Utilización de los sensores proporcionados por RoboPlus. . . . . . . . . . 25

7. Paso a la programación en C mediante AVR Studio. 27

7.1. Entrada/salida Boot Loader . . . . . . . . . . . . . . . . . . . . . . . . . 28

7.2. Programa básico para comunicarse con el Servo . . . . . . . . . . . . . . 29

8. Funciones de Comunicaciones 30

9. Lectura/escritura de puertos 31

10. Movimientos sincronizados de varios servos 32

11. Chequeo de los parámetros de los motores 32

12. Programa Principal 34

13. Posición inicial del robot (Walk Ready) 36

14. Uso del Micrófono 37

15. Movimiento Coordinado “El Pino” 38

15.1. Cabecera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

15.2. Declaracion movimientos . . . . . . . . . . . . . . . . . . . . . . . . . . 39

15.3. Variables y configuracion previa . . . . . . . . . . . . . . . . . . . . . . 40

15.4. Trama de movimientos sincronizados . . . . . . . . . . . . . . . . . . . 40

16. Caminar 43

IV
Darío R. Quiñones Colomer Vicente Llinares Llata
Índice

16.1. Declaracion movimientos . . . . . . . . . . . . . . . . . . . . . . . . . . 43

16.2. Variables y configuracion previa . . . . . . . . . . . . . . . . . . . . . . 44

16.3. Trama de movimientos sincronizados . . . . . . . . . . . . . . . . . . . 44

17. Referencias API 47

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

2.1. ¿Que es Bioloid?

Bioloid es kit de la plataforma robótica modular de la compañía Robotis, se podría decir


que es una de las plataformas más completas de robótica modular. Se trata de la pri-
mera plataforma robótica de su clase en ser construida con tecnología inteligente servo-
controlada en serie que te permite retroalimentación y control sensorial de posición, velo-
cidad, temperatura, corriente y tensión de cada servo-motor. Con bioloid podemos llegar a
crear un gran número de robots distintos, Robotis nos ofrece de forma guiada 26 maneras
de hacerlo, desde el uso de 4 servomotores, hasta el nivel más alto con 18 servomotores
, permite al usuario construir una gran variedad de configuraciones robóticas, incluyen-
do robots exploradores autónomos, perritos quadrúpedos, robots araña hexápodos, robots
dinosaurios, y por supuesto robots humanoides bípedos.

2.2. Contenido del 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:

Bioloid Beginner Kit

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.

Contenido del kit:

1. 1 módulo controlador CM-5 basado en el microcontrolador Atmel ATMega128

1
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

2. 4 Servomotores Dynamixel AX-12

3. 1 módulo multisensensor AX-S1

4. Piezas mecánicas, tornillería, ruedas, pneumáticos para el ensamblaje (Beginner


Frame Set)

5. Batería recargable (9,6V 2,3Ah NiMH)

6. Alimentador de potencia.

7. Cable serie RS-232 de 9 pins

8. CD-ROM con Software, vídeos, manuales, etc.

9. Quick Start en inglés con instrucciones de montaje (100 páginas impresas)

10. Guía de usuario de programación de Bioloid (125 páginas impresas)

Bioloid Comprehensive Kit

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.

Dispone de un total de 18 servos, sensores de proximidad y luminosidad hacia delante y


hacia los lados, un micrófono y un pequeño altavoz.

Bioloid comprehensive kit permite al usuario de manera guiada crear hasta 26 robots
diferentes y probarlos con programas de control de ejemplo.

Contenido del kit:

1. 1 x CM-5 (módulo controlador basado en el Atmel ATMega128 a 16 MHz)

2. 18 x AX-12 (Servomotores Dynamixel controlados en serie)

3. 1 x AX-S1 (módulo sensor del robot)

4. Mas de 100 piezas mecánicas, ruedas, pneumaticos para el ensamblaje con los ser-
vos (Comprehensive Frame Set)

5. 1 x Puertos de conexión serie

6. Batería recargable (9,6V, 2,3Ah, NiMH)

2
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

7. Alimentador de potencia

8. Cable serie RS-232 de 9 pins

9. CD-ROM con Software de programación, vídeos, manuales, etc.

10. Tornillería, tuercas, espaciadores

11. Manuales impresos en inglés con instrucciones de montaje y guia de usuario

Bioloid Expert Kit

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:

Incluye un curso para aprender a realizar programas utilizando un compilador Ansi-C.

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

Contenido del kit:

1. 1 x set cámara inalámbrica

2. 2 x Controlador CM-5

3. 21 x Servos Dynamixel AX-12

4. 3 x Módulos de sensores AX-S1

5. 2 x Frame set

6. 1 x módulo ZIG-100, 1 x ZIG2Serial

7. 1 x USB2Dynamixel

8. 1 x Alimentador de potencia

9. 2 x Baterías recargables Ni-MH

10. 2 x Comprehensive Frame Set

11. CD con Software adicional

12. Manuales impresos adicionales

13. Caja de aluminio

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:

1. Módulo Microcontrolador CM-510 (Atmel ATMEGA 256)

2. 18 servomotores de serie AX-12 (control de serie)

3. 3 sensores de distancia

4. Sensor Giroscópico

5. Baterías recargables (11,1 V)

6. Gamepad (joystick de control)

7. USB2 Dynamixel

8. Suite de Software de programación RoboPlus

9. Cargador de baterías

10. Cable de serie (9 pines tipo D)

11. Variedad de piezas de chasis

12. Accesorios de montaje, tornillos y tuercas

13. Etiquetas para mantener las tuercas durante el montaje

14. Documentación y CD-ROM con ejemplos de programas, videos, etc

A continuación explicaremos más a fondo algunos de los contenidos más importantes


para el uso de nuestro Bioloid.

5
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

2.3. ServoMotores

Figura 1: Actuadores Dynamixel AX-12A

Cada actuador Dynamixel AX-12A incluido en el kit permite la rotación contínua, y


tiene un microcontrolador que entiende 50 comandos, la mayoría de los cuales fijan o
leen parámetros que definen su comportamiento. El típico servo de radiocontrol de Hobby
sólo entiende la órden "ángulo objetivo"(dada por una señal PWM), pero los actuadores
Dynamixel te permiten utilizarlos como un actuador profesional con sensores: el software
que se ejecuta en el CM-5 puede reaccionar al entorno utilizando la información leida de
los sensores del AX-12A. Esta información leida puede ser la posición actual, la corriente
consumida, o la variación de la temperatura del servo con la carga aplicada en el mismo,
lo que permite control retroalimentado sofisticado controlando el par que soporta cada
articulación del robot. Esto tiene aplicaciones por ejemplo en los robots bípedos, ya que
sin necesidad de inclinómetros o acelerómetros, se pueden conseguir efectos de equilibrio.

Características AX-12A:

1. Retroalimentación de Posición, Temperatura (Par) y tensión de entrada

2. Ratio de reducción: 1/254

3. Tamaño: 50 x 32 x 38 mm

4. Peso: 55 g

5. Holding Torque: 16.5kg-cm @ 10V

6. Velocidad: 0.196sec/60◦ @ 10V

7. Red Serie (TTL) ( 7343bps 1Mbps)

8. Ángulo de operación: 300o

9. En modo de 360o , 1024 velocidades configurables

6
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

10. Engranajes y cuerpo de plástico

Cada servomotor AX-12 es un accionador


inteligente y modular que incorpora un re-
ductor de engranajes, un motor de corrien-
te continua de precisión y electrónica de
control con capacidad de red, todo en una
caja.

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).

Los puntos fuertes de los servomotores son:

La precisión de posicionamiento: La posición y la velocidad se puede ajustar con


una resolución de 1024 pasos

La tolerancia ajustable: El grado de tolerancia sobre el posicionamiento es ajus-


table

El reenvío de información: El servomotor puede reenviar su posición, su velocidad


y el tipo de acople aplicado

Gestión crítica: El servomotor puede alertar al sistema si ciertos parámetros sobre-


pasan los umbrales predefinidos (temperatura, tensión, uniones) y automáticamente
hacerlos frente (cortar el acople del motor, etc.)

Comunicación: La conexión Daisy-Chain le facilita el cableado permitiéndole una


comunicación a 1Mbps

Control distribuido: La posición, la velocidad y el acople pueden ajustarse en una


sola instrucción, lo que permite al procesador principal manejar muchos Dynamixel
(servomotor o bloque sensor), incluso con pocos recursos.

El equipo proporcionado es completo, no necesita más que un ordenador, una toma de


corriente para cargar y ganas de montar sus creaciones. El software GUI (interfaz gráfica)

7
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

es gratuito y libre de licencia, lo que permite a las instituciones educativas instalar el


software en un número ilimitado de ordenadores.

2.4. Módulo controlador CM-510

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.

Figura 2: Módulo CM-510

Programaremos este controlador en C para conseguir los posiciones y características de


los movimientos de los servos AX-12 en el BIoloid.

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.

5. El puerto para el receptor ZigBee (opcional) está ahora en el exterior permitiendo


una fácil actualización. Además, este puerto puede ser utilizado para ampliar el
robot con cualquier otro dispositivo externo.

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.

En la Figura 3 podemos observar los nombres de cada parte de nuestro controlador y la


configuración que la carcasa de nuestro controlador nos proporciona.

Figura 3: Nombre de cada parte del CM-510

9
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

2.5. Sensores y puertos de los sensores

El módulo de sensores AX-S1, que con-


tinúa siendo compatible con el nuevo sis-
tema, se ha eliminado del kit Bioloid Pre-
mium y en su lugar, se proporcionan por
separado los sensores para una mayor fle-
xibilidad: 3 sensores de IR que se pueden
ensamblar donde se desee dentro de la es-
tructura del robot. Uno de ellos es un sen-
sor de precisión de distancia IR Sharp, que
está localizado el el pecho del Bioloid y
nos ayuda a encontrar obstáculos que estén
en la parte de delante del robot. Por último,
el micrófono y el altavoz se han trasladado
al microcontrolador CM-510.

Probablemente el elemento más característico de los microcontroladores son los puertos


de Entrada/Salida, con los cuales podemos enviar y recibir información para controlar
distintos elementos electrónicos como sensores, actuadores y LEDs.

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):

DDRx: donde se indica si se enviarán o recibirán datos

PINx: aquí se reciben los datos

PORTx: y desde aquí se envían los datos al exterior del microcontrolador

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

Se incluye un nuevo sensor Gyro que se


conecta al bus dynamixel para equilibrar
y balancear el robot automáticamente. Sus
características que nos proporciona son:

1. Medidas de velocidad angular.

2. Calcula de qué lado se inclina el ro-


bot o está consumiendo mas poten-
cia.

3. Mantiene el equilibrio del robot y pue-


de ser utilizado para cualquier apli-
cación de control de movimiento.

2.5.2. IR Sensor

El sensor BIOLOID IR (Infrarojos), con


cable de 5 pins incluido, es utilizado por
los robots para detectar objetos o colores.
Se puede encajar en cualquier sitio utili-
zando los anclajes. Se utiliza un método
que produce luces infrarrojas y calcula la
cantidad reflejada.

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.

Las especificaciones del sensor IR son las siguientes.

1. Peso: 4,4 g

2. Rango de distancia detectada: 10 80 cm

3. Tensión recomendada: 4,5 V 5,5 V

2.6. Batería (LiPo)

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.

Esta modificación mejora el comportamiento del robot de muchas formas:

1. El centro de gravedad está mas bajo y ofrece una mayor estabilidad.

2. El voltaje más alto ofrece un mejor torque y velocidad de los servos AX-12+.

3. Ofrece mayores tiempos de ejecución de una carga completa.

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.

2.7. RC100 Gamepad

RC-100 es el controlador remoto inalámbrico (gamepad) introducido por ROBOTIS para


robots BIOLOID y OLLO. La carcasa es semitransparente y permite ver el estado de los
LED’s. Ha sido elegante y ergonómicamente diseñado en forma de boomerang para ser
sujetado cómodamente con acceso fácil a todos los botones. Tiene un modo automático
de ahorro de energía que automáticamente apaga el controlador remoto cuando no ha sido
utilizado durante un cierto tiempo.

El joystick de control RC100 Gamepad permite un enfoque de la robótica muy lúdico al


proporcionar un control remoto de los robots. RC100 Gamepad es 100 % compatible con
la suite de software RoboPlus y trabaja a través de tecnologías inalámbricas de infrarrojos
(IR) o Zigbee (radio frecuencia), para un mejor rendimiento y fiabilidad.

2.7.1. Captura de botones presionados

Sus 10 botones soportan mas de 1023 combinaciones distintas de ser presionados, per-
mitiendo cualquier combinación para controlar tu robot.

Los valores correspondientes a cada botón o combinación de botones presionados son


únicos. Cada botón envía inalámbricamente un valor que puede ser leído por el Behavior
Control Program, según la siguiente combinación:

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.

Es posible detectar cualquier combinación de botones presionados. Cada combinación


provocará un valor único entre 1 y 1023.

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.

El adaptador USB2Dynamixel tiene tres puertos de comunicación además del puerto


USB:

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.

RS485: Conector de 4 pins, utilizados en los actuadores Dynamixel de altas presta-


ciones DX, RX y EX.

RS232 DB9: Conector serie estandard RS232 de 9 Pins. Este puerto es ideal para
conectar el adaptador ZIG2Serial.

Figura 5: Puertos de comunicación del adaptador USB2Dynamixel

14
Darío R. Quiñones Colomer Vicente Llinares Llata
2 Bioloid

2.9. Nuevas Novedades

Después de un importante programa de desarrollo de 2 años, un número significativo de


otras nuevas características y mejoras se han incluido en el kit BIOLOID Premium:

1. Nuevos conjuntos de componentes mecánicos: más ligeros y resistentes.

2. Nuevos cables para facilitar el mantenimiento y mayor durabilidad.

3. Nuevas posibilidades de montajes mecánicos (mano prensil articulada, por ejem-


plo).

4. Nuevo diseño del busto del modelo humanoide para un aspecto más "humano per- 2

mitir la personalización.

5. Piezas mecánicas equipadas con el sistema OLLO para el posicionamiento más


preciso de los componentes.

2.10. AVR Studio

El AVR Studio es la plataforma informática de programación con la que nosotros vamos


a programar nuestro microcontrolador CM-510 que contiene el Bioloid. Usaremos el pro-
grama denominado AVR Studio 4. El AVR Studio 4 es un entorno de desarrollo integrado
para la depuración de software AVR. El AVR Studio permite la simulación de chips y la
emulación en el circuito para la familia de microcontroladores AVR. La interfaz de usua-
rio está especialmente diseñada para ser fácil de usar y con un resumen de información
completa. El AVR utiliza la misma interfaz de usuario tanto para la simulación como para
la emulación de proporcionar una rápida curva de aprendizaje.

A partir de esta plataforma de programación en C intentaremos implementar todas las


características necesarias para que el Bioloid realice los movimientos precisos y ajustados
al entorno que envuelve al robot.

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.

1. Introducción al programa Roboplus.


En este apartado definiremos y nos introduciremos a los programas que el paquete
Roboplus contiene para trabajar con el Bioloid.

2. Comprobación del funcionamiento de todos los Servos.


Antes de trabajar con nuestro robot, haremos una comprobación del funcionamiento
de todos los servos y memorizaremos los rangos de posición de cada servo que
pueden ser utilizados sin ningún problema.

3. Implementar la subida y bajada de un escalón.


En este apartado, intentaremos implementar todos los movimientos necesarios pa-
ra que nuestro Bioloid pueda subir y bajar un peldaño de una manera totalmente
automatizada.

4. Paso a la programación en C mediante AVR Studio.


En este apartado vamos a explicar como programamos en base C todos los mo-
vimientos que queramos. Empezaremos con una sencilla programación en la que
intentaremos hacer que el robot camine y más adelante iremos mejorando y com-
plicando nuestro programa. El programa que utilizaremos será el AVR Studio.

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.

7. Movimientos sincronizados de varios servos.


En este punto vemos como realizar tramas para hacer movimientos sincronizados y
que el robot los pueda realizar al mismo tiempo.

8. Chequeo de los parámetros de los motores.


En este apartado se revisan todos los parámetros de cada motor y son mostrados en
pantalla para una mejor y más fácil revisión.

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.

10. Posición inicial del robot (Walk Ready).


Aquí se implementa la función que utilizamos para poner al robot erguido. Esta
posición es muy usada en nuestro programa ya que es de una manera la posición
inicial y final en cada movimiento.

11. Uso del micrófono.


En este punto vemos como se implementa el código para el uso del micrófono en
nuestro robot.

12. Movimiento coordinado “El Pino”


En este apartado se hace una demostración de un movimiento coordinado del robot.
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.

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.

14. Referencias API.


En este punto se explican todas y cada una de las funciones que podemos utilizar
en la programación de los servos. En cada uno de la explicación de las funciones,
detallamos los parámetros y mostramos un pequeño ejemplo.

17
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.

4. Introducción al programa Roboplus.

Lo primero que realizamos en nuestro trabajo fue introducirnos y aprender lo máximo en


todas las características que nuestro robot tiene. Pensamos que lo mejor sería empezar a
ver el funcionamiento de los servos con la ayuda de los programas que nos proporciona
la casa Bioloid al comprar el robot. Al ejecutar el programa Roboplus vemos que hay una
serie de cuatro subprogramas que nos ayudarán en diferentes maneras con nuestro robot.
Los cuatro subprogramas son Roboplus Task, Roboplus Manager, Roboplus Motion y
RoboPlus Terminal. También hay dos secciones de ayuda que se llaman User’s Guide y
e-Manual.

4.1. Roboplus Manager

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.

Las funciones principales de este programa son los siguientes:

1. Gestión del firmware del controlador (Actualización y restauración).


2. Inspeccionar el estado del controlador y los dispositivos periféricos (Test).
3. Establecer los modos requeridos (Ajustes).

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.

Figura 6: RoboPlus Manager

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.

Figura 7: RoboPlus Manager

4.2. Roboplus Motion

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.

RoboPlus Motion es la herramienta que permite la programación de los movimientos


de sus robots. Incluye las características: “Catch & Play",“3D Motion Editor “Inverse
2

Kinematics Engine". Además, el software es capaz de comunicar con Microsoft Excel


para afinar las posiciones de los servomotores sobre la base de sus propios cálculos. Una
característica única en el mercado.

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.

Esta herramienta incluye:

1. Funcionalidad “Catch & Play"(Programación moviendo manualmente las articula-


ciones).
2. 3D Motion Editor. Herramienta de cinemática inversa (Inverse Kinematics) Ade-
más, interactúa con Excel permitiendo diseñar y realizar ajustes finos de posiciones
y movimientos de los servos basados en tus cálculos, algo que antes no era posible
en ningún humanoide.

En la Figura 8 podemos ver la ventana principal del Roboplus Motion. A la izquierda de


todo es donde están todo nuestros movimientos guardados y solo con seleccionarlos y dar
al “play” el robot los ejecutará (antes deberíamos conectar el microcontrolador del Bioloid
al programa). Incluso podemos hacer bucles de repetición con el conjunto de movimientos
que veamos necesarios. A la derecha del todo podemos cambiar la posición de cada servo
y una vez lo tenemos, guardamos todos esos movimientos en un step. Cada movimiento
puede tener un máximo de siete steps y si quisiéramos más, deberíamos generar otro
movimiento.

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.

Como en todo programa de programación, es imprescindible la práctica con el para llegar


a tener una soltura buena y conocer todo lo que el Roboplus Motion puede ayudarnos. Es
muy aconsejable que se practique con diferentes movimientos que queramos que el robot
haga. La casa Robotis nos proporciona, en el mismo programa, movimientos que están ya
programados para así no empezar desde cero y tener una guía útil de como funciona el
programa.

20
Darío R. Quiñones Colomer Vicente Llinares Llata
4 Introducción al programa Roboplus.

Figura 8: RoboPlus Motion

4.3. Roboplus Task

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.

Permite el desarrollo de comportamientos autónomos de los robots. Podemos utilizar fun-


ciones simples como LOOP, IF o FUNCTION que nos permiten programar rápidamente
las conductas complejas sin tener que pasar a través de una larga fase de aprendizaje.
Por otro lado, RoboPlus Task incluye una función única nombrada CALLBACK (llamada
cada 8 ms), lo que permite el ajuste en tiempo real de las tareas que requieren precisión,
como caminar (reenvío de información del giroscopio en tiempo real) y correcciones espe-
cíficas basadas en la retroalimentación de los sensores incluidos. RoboPlus Task es ideal
para alumnos y profesores, pero también es muy atractivo para usuarios avanzados, ya que
permite la creación rápida de prototipos de la lógica muy sofisticados sin la necesidad de
utilizar el compilador C de WinAVR para desarrollar un firmware propio a medida, como
ocurría antes.

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.

Figura 9: RoboPlus Task

4.4. Roboplus Terminal

El RoboPlus Terminal es un programa


que lo utilizamos para comunicarse con la
CPU del robot. RoboPlus Terminal es una
herramienta para ayudar a los usuarios a
manipular el controlador por sí mismos a
través del texto de interfaz de usuario. El
programa de terminal se comunica con el
controlador en la base de código ASCII, y
se imprime información diversa transmiti- Figura 10: Ventana de selección de puerto
da por el controlador para los usuarios.

Es el clásico acceso en modo terminal de


Robotis donde se puede interactuar directamente con el robot. Además, se puede utili-
zar para depurar programas de RoboPlus Task mediante el uso del comando PRINT en
RoboPlus.

El puerto de comunicación debe estar configurado para conectarse al controlador utili-


zando RoboPlus Terminal. Si RoboPlus Terminal se inicia por primera vez, la informa-
ción de conexión está exactamente restaurada. Si el nombre de puerto serie se cambia o
el puerto serie se utiliza en otro programa, puede no estar conectado al controlador.

Si la instalación y la conexión se ejecutan al mismo tiempo que el puerto de comunicacio-


nes no está conectado, la ventana de selección del puerto es la que vemos en la Figura 10.
En esta ventana debe seleccionar el puerto serie y velocidad de comunicación conectado
al controlador, y después hacemos clic en “Aceptar". La velocidad de la conexión básica
del regulador es 57600bps.

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.

RoboPlus Terminal puede transmitir el contenido de los archivos en el controlador conec-


tado en formato binario. Si la extensión es hexagonal, se cambia a binario y la transmite
basándose en el formato HEX de Intel. Otras extensiones se pueden transmitir sin necesi-
dad de cambiar.

5. Comprobación del funcionamiento de todos los Servos

Antes de trabajar con nuestro robot es muy aconsejable comprobar todos los servos y
conocer la estructura con la que está compuesta nuestro Bioloid.

Figura 11: Servo-motores del Bioloid en funcionamiento

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.

6. Implementar la subida y la bajada de un escalón

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.

También es muy importante la velocidad de ejecución de los movimientos y steps. En


estos movimientos lo mejor es utilizar una velocidad de ejecución muy baja para que
ningún movimiento excesivo pueda precipitar al robot a caerse.

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.

Para la realización de un acto como el de subir un escalón es necesaria muchas horas de


trabajo e intentos para llegar a realizarlo de una manera exitosa. Debemos tener en cuenta
cada cambio en la posición de cada servo para mantener un punto en el que el robot tenga
equilibrio y ningún servo realice más par del debido.

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.

6.1. Utilización de los sensores proporcionados por RoboPlus.

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.

7. Paso a la programación en C mediante AVR Studio.

Después de conocer el funcionamiento del robot a fondo y programar mediante Roboplus


Manager algunos movimientos que necesitaremos en un futuro para la programación del
Bioloid, vamos a pasar a programar en lenguaje C todo lo que nuestro robot necesita.

Después de un tiempo considerable usando el programa Roboplus y conociendo todas las


características que nos facilita para los movimientos en el robot, hemos considerado que
debemos seguir avanzando en nuestros trabajo y conseguir diferentes metas. Algunas de
estas metas puede ser, por ejemplo, la lectura de valores de sensores exteriores al bioloid
a partir de una base de C o el control de todas las variables que el robot necesita a partir
de la programación en C. Para ello, hemos asimilado que con los programas de Roboplus
no podemos conseguirlo, ya que necesitamos programar desde una plataforma diferente
al microcontrolador CM-510 que tiene el Bioloid y hacer que consiga diferentes metas a
través del bus de comunicaciones que nos proporciona el robot.

El programa que hemos utilizado para conseguir programar el microcontrolador CM-510


es el AVR Studio 4 que explicamos en la Sección 2.

Después de la utilización de los programas de Roboplus y la recopilación de movimientos


que necesitamos que el robot realice, vamos a empezar a trabajar con el programa AVR
Studio 4. Todos los valores que cada servo necesita para realizar los movimientos los
guardamos en un editor de texto sencillo para que cuando lleguemos al momento en el
que necesitemos programar la serie de movimientos en C, podamos utilizar los mismos
valores.

A continuación, vamos a explicar la función del programa y vamos a enseñar la pro-


gramación que hemos utilizado para poder conseguir diferentes metas en nuestro trabajo.
Para explicar nuestra forma de programar el Bioloid, primero, vamos a hacer que el robot
camine y así demostrar con una meta sencilla el comportamiento y todas las característi-
cas importantes que el Bioloid necesita para una programación óptima.

Al ejecutar el programa, generamos un nuevo proyecto y elegimos el tipo de microcon-


trolador con el que vamos a trabajar; en nuestro caso, es el ATmega2651. Una vez tenemos
todo el proyecto generado vamos a conocer el programa por dentro. A la izquierda tene-
mos todas las carpetas que componen el proyecto y que necesitaremos en el programa
para tener todo más organizado, como pueda ser los archivos de cabecera, los archivos
fuente, dependencias externas, librerías y otros archivos. En el medio está el archivo con
el que estamos programando en el momento concreto, y en la parte derecha tenemos una
vista de todos los puertos que tenemos al alcance.

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.

7.1. Entrada/salida Boot Loader

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:

Figura 12: Boot Loader

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.

7.2. Programa básico para comunicarse con el Servo

# include < avr / io .h >


# include < avr / interrupt .h >
# include < stdio .h >

# include " dynamixel . h "


# include " serial . h "

// / Tabla de control de acceso


# 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

// Configuracion Por Defecto


# define DE FA U LT _B A UD NU M 1 // 1 Mbps
# define DEFAULT_ID 1

void P ri nt C om mS t at us ( int CommStatus );


void P rintEr rorCod e ( void );

int main ( void )


{
unsigned short GoalPos [2] = {0 , 1023};
int index = 0;
int id = 1;
int bMoving , wPresentPos ;
int CommStatus ;

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;

// Escribir posicion destino


dxl_ write_ word ( id , P_GOAL_POSITION_L , GoalPos [ index ] );
}
Prin tError Code ();

// Read present position


wPresentPos = dxl_read_word ( id , P _ P R E S E N T _ P O S I T I O N _ L );
printf ( " %d ␣ ␣ ␣ %d \ n " , GoalPos [ index ] , wPresentPos );
}
else P ri nt C om mS t at us ( CommStatus );
}
return 0;
}

29
Darío R. Quiñones Colomer Vicente Llinares Llata
8 Funciones de Comunicaciones

En el ejemplo anterior podemos observar un ejemplo sencillo de como realizar un movi-


miento con un solo servo del Bioloid.
Para ello hemos necesitado las librerías que se pueden observar en los “#includes”. Las
tres primeras, las lleva el AVR por defecto, y las dos siguientes (“dynamixel.h” y “se-
rial.h”) vienen dadas por el Bioloid.
Posteriormente se definen ciertos parámetros los cuales indican el valor al cual tenemos
que recurrir para realizar dichas instrucciones.

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

// Print communication result


void P ri nt C om mS t at us ( int CommStatus )
{
switch ( CommStatus )
{
case COMM_TXFAIL :
printf ( " COMM_TXFAIL : ␣ Failed ␣ transmit ␣ instruction ␣ packet !\ n " );
break ;
case COMM_TXERROR :
printf ( " COMM_TXERROR : ␣ Incorrect ␣ instruction ␣ packet !\ n " );
break ;
case COMM_RXFAIL :
printf ( " COMM_RXFAIL : ␣ Failed ␣ get ␣ status ␣ packet ␣ from ␣ device !\ n " );
break ;
case C OMM_RX WAITIN G :
printf ( " COM M_RXWA ITING : ␣ Now ␣ recieving ␣ status ␣ packet !\ n " );
break ;
case C OMM_RX TIMEOU T :
printf ( " COM M_RXTI MEOUT : ␣ There ␣ is ␣ no ␣ status ␣ packet !\ n " );
break ;
case C OMM_RX CORRUP T :
printf ( " COM M_RXCO RRUPT : ␣ Incorrect ␣ status ␣ packet !\ n " );
break ;
default :
printf ( " This ␣ is ␣ unknown ␣ error ␣ code !\ n " );
break ;
}
}

Con esta funcion podremos saber el estado de las comunicaciones.

30
Darío R. Quiñones Colomer Vicente Llinares Llata
9 Lectura/escritura de puertos

// Print error bit of status packet


void P rintEr rorCod e ()
{
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ERRBI T_VOLT AGE ) == 1)
printf ( " Input ␣ voltage ␣ error !\ n " );

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

# include < avr / io .h >


# include < util / delay .h >

int main ( void )


{
DDRC = 0 x7F ;
PORTC = 0 x7E ;

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.

10. Movimientos sincronizados de varios servos

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 ( 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 , id [ i ]); // ID
GoalPos = FML0 [ 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 ␣ FML0 ␣ linea ␣ %d \ n " ,j );
d xl _t x rx _p a ck e t ();
}

A partir de tese código conseguimos construir la trama con la que enviaremos a cada
servo su correspondiente posición.

Las diferentes funciones están explicadas en la Sección 17.

11. Chequeo de los parámetros de los motores

# include " global . h "


void check ( void )
{
int id = 1 , valor ;
for ( id =1; id <= 18; id ++)
{
valor = dxl_read_word ( id , 3 ); // ID
printf ( " Id ␣ : ␣ %d ␣ ␣ \ n " , valor -256 );
dxl_ write_ word ( id , 3 ,256+ id ); // ID
printf ( " Id ␣ : ␣ %d ␣ ␣ \ n " , valor -256 );
valor = dxl_read_word ( id , 6 ); // CW Angle Limit ( Joint )
printf ( " CW ␣ Angle ␣ Limit ␣ ( Joint ) ␣ : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 8 ); // CCW Angle Limit ( Joint )

32
Darío R. Quiñones Colomer Vicente Llinares Llata
11 Chequeo de los parámetros de los motores

printf ( " CCW ␣ Angle ␣ Limit ␣ ( Joint ): ␣ %d ␣ ␣ \ n " , valor );


valor = dxl_read_word ( id , 17 ); // Alarm LED
printf ( " Alarm ␣ LED ␣ : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 24 ); // Torque Enable
printf ( " Torque ␣ Enable : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 30 ); // Goal Position
printf ( " Goal ␣ Position ␣ : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 32 ); // Moving Speed
printf ( " Moving ␣ Speed : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 34 ); // Torque Limit
printf ( " Torque ␣ Limit : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 36 ); // Present Position
printf ( " Present ␣ Position : ␣ %d ␣ ␣ \ n " , valor );
valor = dxl_read_word ( id , 43 ); // Present Temperature
printf ( " Present ␣ Temperature : ␣ %d ␣ ␣ \ n \ n \ n " , valor );
}
}

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:

1. Id del motor correspondiente.

2. Angulo máximo en el sentido de las agujas de reloj.

3. Angulo máximo en el sentido contrario de las agujas de reloj.

4. Led de alarma

5. Habilitación del motor

6. Posición Objetivo

7. Velocidad a la que se moverá

8. Par máximo del motor

9. Posición actual

10. Temperatura Actual del motor

33
Darío R. Quiñones Colomer Vicente Llinares Llata
12 Programa Principal

Para todo esto ha usado la instrucción “dxl_read_word( id, indice parámetro )” , la


cual nos pide el numero de id, y la posición de memoria del parámetro deseado, dicha
posición se puede saber consultando el Roboplus Manager (Figura 6) , una vez pasados
estos parámetros, nos devuelve un valor el cual representamos mediante un “printf ”. el
resultado obtenido es:

Figura 13: Terminal

12. Programa Principal

# include " global . h "

int acel ;

int main ( void )


{

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

// z gb_ini tializ e (1); // Not using device index


sei (); // Interrupt Enable 00
WalkReady ();
_delay_ms (1000);

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 .

ADMUX = ADC_PORT_4 ; // ADC Port 4 Select

PORTA &= ~0 x10 ; // ADC Port 4 IR ON

MIC ();

// if ( zgb_rx_check () == 1)
// {
// RcvData = zgb_rx_data ();
if ( RcvData & RC100_BTN_1 )
PORTC &= ~ LED_MANAGE ;
else
PORTC |= LED_MANAGE ;

if ( RcvData & RC100_BTN_2 )


PORTC &= ~ LED_PROGRAM ;
else
PORTC |= LED_PROGRAM ;

if ( RcvData & RC100_BTN_3 )


PORTC &= ~ LED_PLAY ;
else
PORTC |= LED_PLAY ;
// }

}
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.

13. Posición inicial del robot (Walk Ready)

# include " global . h "

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

printf ( " \ n \ nRead / Write ␣ example ␣ for ␣ CM -510\ n \ n " );

for ( i =0; i <=17; i ++)


{

bMoving = dxl_read_byte ( i +1 , P_MOVING );


CommStatus = dxl _get_r esult ();
if ( CommStatus == COM M_RXSU CCESS )
{
if ( bMoving == 0 )
{
printf ( " \ nWalkReady ␣ ok ! " );
dxl_ write_ word ( i +1 , MOVING_SPEED_L ,200);
printf ( " \ nID [ % d ]= % d " ,i +1 , ID [ i ]);
// Write goal position
dxl_ write_ word ( i +1 , P_GOAL_POSITION_L , ID [ i ] );
}
Prin tError Code ();
}
else
P ri nt C om m St at u s ( CommStatus );
}

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.

14. Uso del Micrófono

# include " global . h "


void MIC ( void )
{
// int MIC_on =1;
if (~ PIND & MIC_SIGNAL )
{
PORTC = ~( LED_BAT | LED_TxD | LED_RxD | LED_AUX | LED_MANAGE | LED_PROGRAM | LED_PLAY );
// if ( MIC_on )
Walk3 (); // , MIC_on =0;
// if ( MIC_on ==0) WalkReady ();
}
else PORTC = LED_BAT | LED_TxD | LED_RxD | LED_AUX | LED_MANAGE | LED_PROGRAM | LED_PLAY ;

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. Movimiento Coordinado “El Pino”

15.1. Cabecera

# include < avr / io .h >


# include < avr / interrupt .h >
# include < stdio .h >
# include < util / delay .h >
# include " zigbee . h "
# include < util / delay .h >
# include " serial . h "
# include " walk . h "
// # include " dxl_hal . h "
# include " dynamixel . h "
extern int acel ;
# define LED_BAT 0 x01
# define LED_TxD 0 x02
# define LED_RxD 0 x04
# define LED_AUX 0 x08
# define LED_MANAGE 0 x10
# define LED_PROGRAM 0 x20
# define LED_PLAY 0 x40

# define MIC_SIGNAL 0 x03

# 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 )

Este código corresponde al fichero de cabecera “global.h”, en el cual se declaran todas


las constantes.

38
Darío R. Quiñones Colomer Vicente Llinares Llata
15 Movimiento Coordinado “El Pino”

15.2. Declaracion movimientos

# include " global . h "

void Pino ()
{

int Pino0 [6][18]=


{{705 ,318 ,275 ,748 ,440 ,583 ,353 ,670 ,499 ,524 ,57 ,966 ,369 ,654 ,481 ,542 ,506 ,517} ,
{833 ,190 ,497 ,526 ,214 ,809 ,353 ,670 ,498 ,525 ,63 ,960 ,524 ,499 ,535 ,488 ,501 ,522} ,
{828 ,195 ,511 ,512 ,513 ,510 ,353 ,670 ,498 ,525 ,63 ,960 ,523 ,500 ,535 ,488 ,501 ,522} ,
{328 ,695 ,508 ,515 ,528 ,495 ,353 ,670 ,498 ,525 ,63 ,960 ,523 ,500 ,535 ,488 ,501 ,522} ,
{512 ,511 ,306 ,717 ,504 ,519 ,353 ,670 ,498 ,525 ,63 ,960 ,523 ,500 ,535 ,488 ,501 ,522} ,
{532 ,491 ,306 ,717 ,504 ,519 ,353 ,670 ,498 ,525 ,611 ,412 ,452 ,571 ,552 ,471 ,501 ,522}};

int Pino1 [2][18]=


{{532 ,491 ,306 ,717 ,504 ,519 ,353 ,670 ,498 ,525 ,611 ,412 ,452 ,571 ,552 ,471 ,501 ,522} ,
{532 ,491 ,306 ,717 ,504 ,519 ,353 ,670 ,248 ,775 ,611 ,412 ,452 ,571 ,552 ,471 ,501 ,522}};

int Pino2 [5][18]=


{{532 ,491 ,306 ,717 ,504 ,519 ,353 ,670 ,498 ,525 ,611 ,412 ,452 ,571 ,552 ,471 ,501 ,522} ,
{512 ,511 ,306 ,717 ,504 ,519 ,353 ,670 ,498 ,525 ,63 ,960 ,523 ,500 ,535 ,488 ,501 ,522} ,
{611 ,412 ,580 ,443 ,155 ,868 ,353 ,670 ,498 ,525 ,55 ,968 ,121 ,902 ,835 ,188 ,504 ,519} ,
{394 ,629 ,264 ,759 ,454 ,569 ,354 ,669 ,512 ,511 ,80 ,943 ,38 ,985 ,705 ,318 ,512 ,511} ,
{235 ,788 ,279 ,744 ,462 ,561 ,358 ,666 ,507 ,516 ,341 ,682 ,240 ,783 ,647 ,376 ,507 ,516}};

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”

15.3. Variables y configuracion previa

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

// Set goal speed


dxl _write _word ( BROADCAST_ID , P_GOAL_SPEED_L , 300 );
// Set goal position
dxl _write _word ( BROADCAST_ID , TORQUE_LIMIT_L , 800);

En esta parte se configura la comunicacion y se declaran variables necesarias,a la par


que se establece el par maximo y la velocidad a la que se tiene que alcanzar la posición
deseada.

15.4. Trama de movimientos sincronizados

// - - - - - - - - - - - - - - - - - - - - - Montamos una trama de envio - - - - - - - - - - - - - - - - - - - - - - -


for ( j =0; j <=5; j ++)
{
// Make syncwrite packet
d x l _ s e t _ t x p a c k e t _ i d ( BROADCAST_ID );
// printf (" \ n0x %x " , 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 );
// printf (" 0 x %x " , IN S T_ SY N C_ WR I TE );
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 );
// printf (" 0 x %x " , 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
// printf (" \ nID = % x " , i +1);
GoalPos = ( int ) Pino0 [ 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 ));
// printf (" Goal_pos_low =0 x %x " , d x l_ ge t _l o wb 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 ));
// printf (" Goal_pos_high =0 x %x " , d x l _ g e t _ h i g h b y t e ( GoalPos ));

// printf ( "\ nEscribiendo trama FML0 linea %d ID %d posicion %d \ n " ,j , i +1 , 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 FML0 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 *20);
}

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

Para acabar la función, se comprueban los errores de comunicación, y si ocurre algo no


deseado, será mostrado por pantalla.

42
Darío R. Quiñones Colomer Vicente Llinares Llata
16 Caminar

16. Caminar

16.1. Declaracion movimientos

# include " global . h "

int FML0 [7][18]=


{{169 ,722 ,279 ,744 ,462 ,561 ,358 ,666 ,513 ,522 ,302 ,660 ,246 ,769 ,621 ,348 ,513 ,522} ,
{166 ,719 ,279 ,744 ,462 ,561 ,358 ,666 ,518 ,527 ,308 ,651 ,248 ,761 ,625 ,348 ,518 ,527} ,
{167 ,720 ,279 ,744 ,462 ,561 ,358 ,666 ,519 ,533 ,314 ,650 ,252 ,761 ,628 ,346 ,523 ,532} ,
{171 ,724 ,279 ,744 ,462 ,561 ,358 ,666 ,513 ,541 ,321 ,662 ,257 ,778 ,629 ,341 ,527 ,537} ,
{179 ,732 ,279 ,744 ,462 ,561 ,358 ,666 ,504 ,550 ,327 ,682 ,262 ,801 ,630 ,338 ,530 ,541} ,
{189 ,742 ,279 ,744 ,462 ,561 ,358 ,666 ,496 ,556 ,332 ,704 ,266 ,820 ,631 ,342 ,532 ,543} ,
{201 ,754 ,279 ,744 ,462 ,561 ,358 ,666 ,493 ,558 ,335 ,724 ,267 ,827 ,633 ,354 ,533 ,544}};

int FML1 [7][18]=


{{215 ,768 ,279 ,744 ,462 ,561 ,358 ,666 ,496 ,556 ,337 ,736 ,266 ,820 ,636 ,374 ,532 ,543} ,
{230 ,783 ,279 ,744 ,462 ,561 ,358 ,666 ,504 ,550 ,338 ,740 ,262 ,801 ,641 ,396 ,530 ,541} ,
{246 ,799 ,279 ,744 ,462 ,561 ,358 ,666 ,513 ,541 ,339 ,737 ,257 ,778 ,647 ,416 ,527 ,537} ,
{260 ,813 ,279 ,744 ,462 ,561 ,358 ,666 ,519 ,533 ,340 ,732 ,252 ,761 ,654 ,428 ,523 ,532} ,
{274 ,827 ,279 ,744 ,462 ,561 ,358 ,666 ,518 ,527 ,343 ,730 ,248 ,761 ,660 ,427 ,518 ,527} ,
{285 ,838 ,279 ,744 ,462 ,561 ,358 ,666 ,513 ,522 ,347 ,730 ,246 ,769 ,666 ,418 ,513 ,522} ,
{294 ,847 ,279 ,744 ,462 ,561 ,358 ,666 ,507 ,516 ,354 ,726 ,248 ,775 ,671 ,409 ,507 ,516}};

int FML2 [7][18]=


{{300 ,853 ,279 ,744 ,462 ,561 ,358 ,666 ,501 ,510 ,363 ,721 ,254 ,777 ,675 ,402 ,501 ,510} ,
{303 ,856 ,279 ,744 ,462 ,561 ,358 ,666 ,496 ,505 ,372 ,715 ,262 ,775 ,675 ,398 ,496 ,505} ,
{302 ,855 ,279 ,744 ,462 ,561 ,358 ,666 ,490 ,504 ,373 ,709 ,262 ,771 ,677 ,395 ,491 ,500} ,
{298 ,851 ,279 ,744 ,462 ,561 ,358 ,666 ,482 ,510 ,361 ,702 ,245 ,766 ,682 ,394 ,486 ,496} ,
{290 ,843 ,279 ,744 ,462 ,561 ,358 ,666 ,473 ,519 ,341 ,696 ,222 ,761 ,685 ,393 ,482 ,493} ,
{280 ,833 ,279 ,744 ,462 ,561 ,358 ,666 ,467 ,527 ,319 ,691 ,203 ,757 ,681 ,392 ,480 ,491} ,
{268 ,821 ,279 ,744 ,462 ,561 ,358 ,666 ,465 ,530 ,299 ,688 ,196 ,756 ,669 ,390 ,479 ,490}};

int FML3 [7][18]=


{{254 ,807 ,279 ,744 ,462 ,561 ,358 ,666 ,467 ,527 ,287 ,686 ,203 ,757 ,649 ,387 ,480 ,491} ,
{239 ,792 ,279 ,744 ,462 ,561 ,358 ,666 ,473 ,519 ,283 ,685 ,222 ,761 ,627 ,382 ,482 ,493} ,
{223 ,776 ,279 ,744 ,462 ,561 ,358 ,666 ,482 ,510 ,286 ,684 ,245 ,766 ,607 ,376 ,486 ,496} ,
{209 ,762 ,279 ,744 ,462 ,561 ,358 ,666 ,490 ,504 ,291 ,683 ,262 ,771 ,595 ,369 ,491 ,500} ,
{195 ,748 ,279 ,744 ,462 ,561 ,358 ,666 ,496 ,505 ,293 ,680 ,262 ,775 ,596 ,363 ,496 ,505} ,
{184 ,737 ,279 ,744 ,462 ,561 ,358 ,666 ,501 ,510 ,293 ,676 ,254 ,777 ,605 ,357 ,501 ,510} ,
{175 ,728 ,279 ,744 ,462 ,561 ,358 ,666 ,507 ,516 ,297 ,669 ,248 ,775 ,614 ,352 ,507 ,516}};

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

16.2. Variables y configuracion previa

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

// Set goal speed


dxl _write _word ( BROADCAST_ID , P_GOAL_SPEED_L , 20 );
// Set goal position
dxl _write _word ( BROADCAST_ID , TORQUE_LIMIT_L , 800);

En esta parte se configura la comunicación y se declaran variables necesarias, al mismo


tiempo que se establece el par máximo y la velocidad a la que se tiene que alcanzar la
posición deseada.

16.3. Trama de movimientos sincronizados

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 ( 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 ) FML0 [ 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 xl _t x rx _p a 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 );
}

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

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 ) FML1 [ 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 xl _t x rx _p a 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 );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 , 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 = FML2 [ 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 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 );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 ( 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 = FML3 [ 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 xl _t x rx _ pa ck e t ();
result = dxl_ge t_resu lt ( );

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 );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

CommStatus = dxl _get_r esult ();


if ( CommStatus == COM M_RXSU CCESS )
Pri ntErro rCode ();
else
P ri nt C om mS t at u s ( CommStatus );
v = v +20;
}

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

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

Se inicializa los dispositivos de comunicación y pone los servos en el estado adecuado


para recibir instrucciones.

int dxl_in itiali ze ( int devIndex , int baudnum );

Parámetros

• devIndex Es el número de dispositivos de comunicación conectados actual-


mente. (Se puede variar dependiendo de la plataforma.)
Por ejemplo, Windows distingue dispositivos por puerto COM.
• baudnum Es Baud número de la tasa que se establece. Es el mismo número
utilizado por Dynamixel.

La siguiente tabla muestra la velocidad de transmisión principal.

Valores que devuelve

• Devuelve 1 si todo ha sido correcto.


• Devuelve 0 si ocurre un error.

Ejemplo Usando el COM3 en el entorno de Windows a una velocidad de 1 Mbps.

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

void dxl_terminate ();

Parámetros
Nada

Valores que devuelve


Nada

Ejemplo

dxl_terminate ();

17.3. dxl_set_txpacket_id

El ID se introduce en paquetes de instrucciones.

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.

Valores que devuelve


Nada

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

Comandos que son incluidos en el paquete de envió.

void 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 ( int instruction );

Parámetros

• Instrucción
Los siguientes códigos,son los comandos que se pueden realizar. Uno de las
acciones siguientes pueden ser obtenidas.

Valores que devuelve


Nada

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ámetro ha introducir en la instruction packet.

void d x l _ s e t _ t x p a c k e t _ p a r a m e t e r ( int index , int value );

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).

Valores que devuelve


Nada

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

Indica la longitud del paquete que se va a enviar.

void d x l _ s e t _ t x p a c k e t _ l e n g t h ( int length );

Parámetros

• length Longitud del paquete.

Valores que devuelve


Nada

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

Indica la longitud del paquete que se va a recibir.

int d x l _ g e t _ r x p a c k e t _ l e n g t h ( );

Parámetros

• Nada

Valores que devuelve


Longitud del paquete.

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

Para leer un parámetro.

int d x l _ g e t _ r x p a c k e t _ p a r a m e t e r ( int index );

Parámetros

• Indice
Numero del parámetro que queremos obtener información.

Valores que devuelve


Valor del parámetro indicado.

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

Chequea el error incluido en el paquete de estado.

int d x l _ g e t _ r x p a c k e t _ e r r o r ( int errbit );

Parámetros

• errbit
Es un bit que se usa como flag, para saber si ocurren errores o no.

Valores que devuelve

• Devuelve 1 si ocurre un error.


• Devuelve 0 si todo ha sido correcto.

Ejemplo

if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ERR BIT_VO LTAGE ) == 1 )


{ // Input voltage error occurred }
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ERRBIT_ANGLE ) == 1 )
{ // Angle limit error occurred }
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ER RB I T_ OV E RH EA T ) == 1 )
{ // Overheating error occurred }
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ERRBIT_RANGE ) == 1 )
{ // Range error occurred }
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ER RB I T_ CH E CK SU M ) == 1 )
{ // Checksum error occurred }
if ( d x l _ g e t _ r x p a c k e t _ e r r o r ( ER RB I T_ OV E RL OA D ) == 1 )
{ // Overload error occurred }
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 )
{ // Instruction error occurred }

54
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API

17.10. dxl_tx_packet

Envía el paquete de instrucciones.

void dxl_tx_packet ( );

Parámetros
Nada

Valores que devuelve


Nada

Ejemplo

dxl_tx_packet ( );

17.11. dxl_rx_packet

Habilita la recepción de datos,que posteriormente serán extraídos con dxl_get_result(


); (Subsección 17.13).

void dxl_rx_packet ( );

Parámetros
Nada

Valores que devuelve


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

Habilita el envío y la recepción de datos,que posteriormente serán extraídos con dxl_get_result(


); (Subsección 17.13).

void d xl _t x rx _p a ck et ( );

Parámetros
Nada

Valores que devuelve


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

Chequea el error incluido en el paquete de estado.

int dxl_ge t_resu lt ( );

Parámetros
nada

Valores que devuelve


Value Meaning
COMM_TXSUCCESS Envío Correcto
COMM_TXFAIL Error en la trasmisión
COMM_RXFAIL Error en la recepción
COMM_TXERROR Error en el envió
COMM_RXWAITING El paquete no ha llegado aun.
COMM_RXTIMEOUT El servo no responde
COMM_RXCORRUPT Paquete corrupto
COMM_RXSUCCESS Recepción Correcta

Ejemplo

result = dxl_ge t_resu lt ( );


if ( result == COM M_TXSU CCESS )
else if ( result == CO MM_RXS UCCESS )
else if ( result == COMM_TXFAIL )
else if ( result == COMM_RXFAIL )
else if ( result == COMM_TXERROR )
else if ( result == CO MM_RXW AITING )

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

void dxl_ping ( int id );

Parámetros

• ID
Aquí indicamos el ID del servo a consultar.

Valores que devuelve


Nada

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

La información de un byte puede ser escrita en Dynamixel. La comunicación resultante


puede ser comprobada por dxl_get_result (Subsección 17.13)

void d xl_wri te_byt e ( int id , int address , int value );

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.

Valores que devuelve


Ninguno.

Ejemplo

dxl _write _byte ( 2 , 19 , 1 );


if ( d xl_get _resul t ( ) == COMM _RXSUC CESS )
{
// Succeed to write
}

59
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API

17.16. dxl_write_word

La información de 2 bytes puede ser leida en Dinamixel. La comunicación resultante


puede ser comprobada por dxl_get_result (Subsección 17.13)

void d xl_wri te_wor d ( int id , int address , int value );

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.

Valores que devuelve


Ninguno.

Ejemplo

dxl _write _word ( 2 , 30 , 512 );


if ( d xl_get _resul t ( ) == COMM _RXSUC CESS )
{
// Succeed to write
}

60
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API

17.17. dxl_read_byte

Información de un byte puede ser leida en Dynamixel. La comunicación resultante puede


ser comprobada por el dxl_get_result (Subsección 17.13)

int dxl_read_byte ( int id , int address );

Parámetros

• ID
Dynamixel ID para leer información.
• Dirección
Valor de dirección de información.

Valores que devuelve


La lectura de los valores de datos.

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

La información de 2 bytes se puede leer en Dynamixel. El resultado admite comunicación


que puede ser comprobado por el dxl_get_result (Subsección 17.13)

int dxl_read_word ( int id , int address );

Parámetros

• ID
Dynamixel ID para leer información.
• Dirección
Valor de dirección de información.

Valores que devuelve


La lectura de los valores de datos.

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

Cambia 2 bytestipo a datos de tipo WORD.

int dxl_makeword int lowbyte , int highbyte );

Parámetros

• Low Byte
Byte bajo para ser byte de tipo WORD.
• highbyte
Byte alto para ser byte de tipo WORD.

Valores que devuelve


Datos de tpo WORD están hechos de bytes altos y bajos.

Ejemplo

word = dxl_makeword ( lowbyte , highbyte );

63
Darío R. Quiñones Colomer Vicente Llinares Llata
17 Referencias API

17.20. dxl_get_highbyte

Los bytes más altos se extraen de los tipo WORD.

int d x l _ g e t _ h i g h b y t e ( int word );

Parámetros

• WORD
Datos de tipo WORD para extraer dato superior.

Valores que devuelve


Byte más alto extraído desde el dato de tipo WORD.

Ejemplo

highbyte = d x l _ g e t _ h i g h b y t e ( word );

17.21. dxl_get_lowbyte

Los bytes más bajos se extraen de los tipo WORD.

int d xl _g e t_ l ow by t e ( int word );

Parámetros

• Word
Tipo de datos para extraer el byte inferior.

Valores que devuelve


Los Bytes de datos más bajos son extraídos de los tipo WORD.

Ejemplo

lowbyte = d x l_ ge t _l ow b yt e ( word );

64
Darío R. Quiñones Colomer Vicente Llinares Llata

También podría gustarte