95
, Equation Chapter 1 Section 1 Proyecto Fin de Carrera Ingeniería de Telecomunicación Programación en C del Robot Escorpión Autora: Camelia Sarouf Tutor: José Ángel Acosta Rodríguez Dep. Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2016

Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

  • Upload
    votruc

  • View
    230

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

, Equation Chapter 1 Section 1

Proyecto Fin de Carrera

Ingeniería de Telecomunicación

Programación en C del Robot Escorpión

Autora: Camelia Sarouf

Tutor: José Ángel Acosta Rodríguez

Dep. Sistemas y Automática

Escuela Técnica Superior de Ingeniería

Universidad de Sevilla

Sevilla, 2016

Page 2: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 3: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

iii

Proyecto Fin de Carrera

Ingeniería de Telecomunicación

Programación en C del Robot Escorpión

Autora:

Camelia Sarouf

Tutor:

José Ángel Acosta Rodríguez

Profesor titular

Dep. de Sistemas y Automática

Escuela Técnica Superior de Ingeniería

Universidad de Sevilla

Sevilla, 2016

Page 4: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 5: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

v

Proyecto Fin de Carrera: Programación en C del Robot Escorpión

Autora: Camelia Sarouf

Tutor: José Ángel Acosta Rodríguez

El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros:

Presidente:

Vocales:

Secretario:

Acuerdan otorgarle la calificación de:

Sevilla, 2016

Page 6: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

El Secretario del Tribunal

Page 7: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

vii

A mi familia, en especial a mis padres,

porque sin ellos todo esto

no habría sido posible.

Page 8: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 9: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

ix

Agradecimientos

Quiero agradecer este proyecto en primer lugar a mi familia y sobre todo a mis padres, por haberme dado

la posibilidad de estudiar y haberme apoyado cada vez que lo necesitaba, y en cada decisión que he

tomado, aunque no estuviesen de acuerdo.

A mis amigos, por aguantarme después de tanto tiempo y saber sacarme siempre una sonrisa.

Y, por supuesto, a José Ángel Acosta Rodríguez mi tutor en este proyecto, por el apoyo y los consejos

que me ha dado en todo momento.

Page 10: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 11: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

xi

Resumen

En las máquinas controladas por sistemas informáticos, el lenguaje es el medio que utiliza el hombre para

gobernar su funcionamiento, por lo que su correcta adaptación a la tarea a realizar y la sencillez de manejo,

son factores determinantes del rendimiento obtenido en los robots.

Existen varias maneras de comunicarse con un robot y la elección del lenguaje de programación depende

del micropocesador del robot y las librerías disponibles para este último.

En este proyecto se describe el procedimiento y los pasos adoptados para programar el robot Escorpión

Bioloid Premium de la empresa ROBOTIS con un lenguaje de programación clásico, el lenguaje C ,por un

lado, se mencionarán las dificultades encontradas en su programación y por otro, se citarán las diferencias

encontradas en el lenguaje C respecto a la aplicación Roboplus.

Page 12: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 13: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

xiii

Abstract

In machines controlled by computer systems, language is the means used by humains to govern its operations,

so it is well adapted to the task and the simplicity of use are determinants of yield in robots.

There are several ways to communicate with a robot and the choice of programming language depends on the

microprocessor of the robot and the libraries availables for this one.

In this project it is described the procedure and steps taken to programme the Scorpion Robot Bioliod

Premium’s ROBOTIS Company, in the classic programming C language. On one hand we will mention the

difficulties found in its programmation and on the other hand, we will quote the differencies between C

Language and Roboplus application.

Page 14: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Índice

Agradecimientos ixx Resumen xi Abstract xiii Índice xiv Índice de Tablas xvi Índice de Figuras xvii 1 Introduccion 1

1.1. Motivacion 1 1.2. Objetivos 1 1.3. Estructura de memoria 1

2 Hardware 3 2.1. CM530 3 2.2. Dynamixel AX-12A 4 2.3. Sensores 7

2.3.1 Sensor IR 7 2.3.2 Sensor DMS 8 2.3.3 Sensor GYRO XY 9

2.4. RC-100A 10 2.7. ZIG110A 11 2.6. Microcontrolador STM32F103RE 13

3 Software 15 3.1. RoboPlus 15

3.1.1. RoboPlusTask 15 3.1.2. RoboPlusMotion 16 3.1.2. RoboPlusTerminal 16 3.1.2. RoboPlusManager 17

3.2. Cygwin 21 3.2.1. Instalacion del Cygwin 21 3.2.2. Descarga y compilación del paquete AVR-lib 26

4 Librerías 31 4.1. STM32F10x 31

4.1.1. Inicialización y Configuración de Periféricos Internos 32 4.1.1.1. GENERALPURPOSEI/OS(GPIO) 32 4.1.1.2. NVIC 33

4.1.1.3 ADC 34 4.1.1.4 USART 35 4.1.1.5. RESET AND CLOCK CONTROL (RCC) 35

4.1.1.6. SYSTEM TIMER (SysTick) 36 4.2. LIbrerias Externas 37

4.2.1. Inicialización y Configuración de Periféricos Externos 37 4.2.1.1. Dynamixel 37

4.2.1.2. ZigBee 38 5 Programacíon 41

5.1. Dynamixels 41

Page 15: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

xv

5.1.1. Bloque1 42 5.1.2. Bloque2 42

5.2. Dynamixels con botones 43 5.2.1. Bloque1 44 5.2.2. Bloque2 44 5.3. Sensores 45

5.3.1. Bloque1 46 5.3.2. Bloque2 46

5.4. RC100 48 5.4.1. Bloque1 49 5.4.2. Bloque2 49 5.5. Movimiento global 50

5.3.1. Bloque1 51 5.3.2. Bloque2 51

6 Conclusión 61 Bibiografia 63 Anexo 65

Page 16: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

ÍNDICE DE TABLAS

Tabla 2–1 Tabla de control de los dynamixels 5

Tabla 2–2 Valores de la velocidad angular en función de los valores de salida del gyrosensor 10

Tabla 5–1 Selección de entrada ADC 15

Tabla A-1 Mapeo de los puertos del CM530 66

Page 17: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

xvii

ÍNDICE DE FIGURAS

Figura 2-1. Escorpión Bioloid Premium 3

Figura 2-2. Controlador CM530 3

Figura 2-3.Dynamixel AX-12A 4

Figura 2-4. El control de los dynamixels 4

Figura 2-5. Posiciones en grados del dynamixel 6

Figura 2-6. Sensor IR 7

Figura 2-7. Modelo caja negra del sensor IR 7

Figura 2-8. Grafica representa los valores del sensor IR en función de la distancia del objeto 8

Figura 2-9. Sensor DMS 8

Figura 2-10. Grafica representa los valores del sensor DMS en función de la distancia del objeto 8

Figura 2-11. Sensor GYRO XY 9

Figura 2-12. RC-100A 10

Figura 2-13. Valores de los botones del RC-100A 10

Figura 2-14. ZIG 100 y ZIG 110 11

Figura 2-15. Conexión del modulo ZigBee 12

Figura 2-16. STM32F103RE 13

Figura 3-1. Ejemplo en RoboPlusTask 15

Figura 3-2. RoboPlusMotion 16

Figura 3-3. RoboPlus Terminal 16

Figura 3-4. Ventana de selección RoboPlus Terminal 17

Figura 3-5. Serial setup 17

Figura 3-6. Icono de administración del firmware 18

Figura 3-7. Controlador del firmware 18

Figura 3-8. Controlador del firmware 19

Figura 3-9. Controlador del firmware 19

Figura 3-10. Controlador del firmware 20

Figura 3-11. Controlador del firmware 20

Figura 3-12. Controlador del firmware 20

Figura 3-13. CygwinSetup 21

Page 18: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Figura 3-14. CygwinSetup 22

Figura 3-15. CygwinSetup 22

Figura 3-16. CygwinSetup 23

Figura 3-17. CygwinSetup 23

Figura 3-18. Cygwin Setup 24

Figura 3-19. Cygwin Setup 24

Figura 3-20. Cygwin Setup 25

Figura 3-21. Cygwin Setup 25

Figura 3-22. Consola Cygwin 25

Figura 3-23. Consola Cygwin 28

Figura 3-24. Consola Cygwin 28

Figura 3-25. Consola Cygwin 29

Figura 3-26. Archivo CM530.hex 29

Figura 4-1. Relacion entre los archivos del STM32F10x 31

Figura 4-2. Carpeta Inc 32

Figura 5-1. Función forward 53

Figura 5-2. Función forward1 53

Figura 5-3. Función forward2 54

Figura 5-4. Función forward3 54

Figura 5-5. Función attack 55

Figura 5-6. Función attack1 56

Figura 5-7. Función attack2 56

Figura 5-8. Función right 57

Figura 5-9. Función right1 57

Figura 5-10. Función left 58

Figura 5-11. Función left1 58

Figura 5-12. Función sleep 59

Figura A-1. Mapa de los puertos del CM530 65

Page 19: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

xix

Page 20: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 21: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

1

1 INTRODUCCIÓN

n este primer capitulo vamos introducir el proyecto describiendo el procedimiento y los pasos adoptados

para programar el robot. Para ello vamos a presentar las tres nociones que son la motivación de este

trabajo, los objetivos a cumplir y la estrutura de este documento.

.

1.1. Motivación

El motivo por el cual se ha elegido este proyecto fin de carrera es la puesta en práctica de los conocimientos de

programación adquiridos durante la carrera. Además nos ha parecido interesante y un nuevo mundo a explorar,

puesto que, es mi primer contacto con un robot.

1.2. Objetivos El objetivo principal de este proyecto es el estudio y análisis de la programación en lenguaje C de un

robot Escorpión de la empresa Robotis. En particular, se reproducen las funciones básicas de

programación en el lenguaje RoboPlus suministrado por Robotis mediante el uso del lenguaje C.

1.3. Estructura de la memoria Esta memoria está constituida por una serie de capítulos a lo largo de los cuales, se muestra el trabajo realizado

en las diferentes etapas de las que consta este proyecto.A continuacion se describe brevemente el contenido de

los capítulos del proyecto:

Hardware: se detallan en profundidad todos los componentes del robot escorpión empleados en el

proyecto sensores (IR , DMS y GYRO XY), un mando de control RC-100A, un módulo ZigBee, una

unidad de control CM530 basada en el microcontrolador STM32F103RE y 18 servomotores

dynamixels AX-12A.

Software: se explican la elección escogida y el funcionamiento tanto del software Cygwin usado

para la programación y la depuración en el lenguaje C como del software Roboplus.

Librerías: se presentan las librerías STM32F10x, dynamixel.h, zigbee.h, dxl_hal.h y zgb_hal usadas para la programación en C y se detalla la configuración de los periféricos internos del

microcontrolador precisamente el ADC, el NVIC, el USART, el RCC y el SYSTICK que son

elementos muy esenciales para lograr una respuesta de nuestro robot usando el lenguaje C.

Programación: este apartado es el núcleo de nuestro proyecto, en el cual se explican paso a paso

las rutinas programadas en C y se comparan con las hechas en Roboplus.Como nuestro robot se

E

Page 22: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Introducción

2

compone de varios componentes, empezamos con pequeñas rutinas para cada componente, hasta

llegar a un movimiento global (Dynamixels, Dynamixels con botones, Sensores: DMS /Gyro XY

/IR,RC100 y Movimiento global).

Page 23: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

3

2 HARDWARE

ara el desarrollo de este proyecto se utiliza un robot Bioloid Premium, diseñado por la compañía de

robots coreana denominada ROBOTIS . Es el robot más completo de ROBOTIS, tiene una peculiaridad

interesante de desarmarse para construir diferentes tipos de robots, cada uno de ellos puede ser

programado para las acciones específicas. Se trata de un kit de robots. En particular en la figura 2-1 se

muestra el Robot Escrorpion.

El proyecto se enfoca sobre el modelo escorpión que está formado por varios sensores, un mando de control,

un módulo ZigBee, una unidad de control CM530 basada en el microcontrolador STM32F103RE y 18

servomotores dynamixels AX-12A.

Figura 2-1. Escorpión Bioloid Premium

A continuación se detalla cada uno de los componentes mencionados arriba.

2.1 CM530

El cerebro del robot es operado por un controlador CM-530 basado en microcontrolador STM32F103RE, que

se puede programar a través de software Roboplus o mediante diversos lenguajes o herramientas de

programación que se suministra con el robot. Está equipado con seis botones de control e indicadores LED

que proporcionan una información visual sobre el estado actual del robot.

Figura 2-2. Controlador CM530

P

Page 24: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Hardware

4

El CM-530 (véase Figura 2-2) se conecta a los servos dynamixels en cadena margarita, lo que permite el

control sofisticado de cada articulación del robot.

2.2 Dynamixel AX-12A

El dynamixel es un actuador, un dispositivo capaz de transformar la energía en movimiento, el cual puede ser

utilizado para aplicar un par.Típicamente se trata de un dispositivo mecánico que toma la energía (energía

eléctrica) y la convierte en algún tipo de movimiento (lineal, rotatorio u oscilatorio).

El modelo del dynamixel que vamos a usar en este proyecto es el AX-12A (véase Figura 2-3) que es un

actuador inteligente y modular que incorpora un reductor de engranajes, un motor de corriente continua

precisión y un circuito de control con funciones de red, todo en un solo paquete.

Figura 2-3. Dynamixel AX-12A

Cada uno de estos actuadores tiene la capacidad de controlar su velocidad, temperatura, posición, tensión y

carga soportada mediante un microcontrolador (CM530) que modifica la tabla de control con varios

comandos indicando el ID (identificación personal) de los mismos (véase Figura 2-4).

Figura 2-4. El control de los Dynamixels

La tabla de control es una tabla informativa que contiene datos de situación actual y datos de funcionamiento

de los dynamixels.

Page 25: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

5

Programación en C del Robot Escorpión

Tabla 2-1.Tabla de control de los dynamixels

Respecto a la tabla de control (véase Tabla 2-1) se distinguen diferentes campos:

Page 26: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Hardware

6

EEPROM y RAM

Los datos en el área de memoria RAM se restablecen al valor inicial cada vez que se conecta la

alimentación en tanto que los datos en el área de la EEPROM se mantienen establecidos una vez

escritos incluso al apagar

Dirección

Representa la ubicación de los datos. Para leer o escribir los datos en la tabla de control, el usuario

debe asignar la dirección correcta en la serie de instrucciones.

A continuación, se explica el significado de algunas direcciones:

Dirección 0x00, 0x01 Número de modelo: Para AX-12, este valor es 0x000C (12).

Dirección 0x02 Versión del firmware.

Dirección 0x03ID: El número de identificación único asignado a cada uno de los actuadores

dynamixel para identificarlos. Se requieren diferentes identificadores para los actuadores dynamixels

que están en la misma red. El rango que se puede utilizar va de 0 a 252 (0xFC), y, especialmente, el

254 (0xFE) se utiliza como el broadcast ID.

Dirección 0x04 BaudRate: Determina la velocidad de comunicación. El cálculo se realiza con la

siguiente fórmula. Velocidad (BPS) = 2000000 / (Data+ 1).

Dirección 0x05 Tiempo de retardo de retorno: Es el tiempo de retardo por valor de datos que lleva

desde la transmisión de la serie de instrucciones hasta el regreso del estado de paquetes. El rango que

se puede utilizar es 0-254 (0xFE), y el tiempo de retardo por valor de datos es 2 usec.

Dirección 0x06, 0x07, 0x08, 0x09 CW/CWW Límite de ángulo: Establece el límite del ángulo de

funcionamiento del actuador dynamixel. El Objetivo Posición (Goal Position: Address 30, 31)

necesita estar dentro del rango de: Límite ángulo CW <= Meta Posición <= CCW Límite de ángulo.

Un error de límite de ángulo se producirá si la posición objetivo se establece fuera de este rango

estimado por los límites del ángulo de funcionamiento.

Dirección 0X10 Estado de Devolución Nivel: Determina el estado del paquete devuelto desde el

actuador después de recibir un paquete de instrucciones.

Dirección 0x18 Torque Habilitar: Cuando la alimentación se enciende por primera vez, el actuador

entra en la Condición de par Free Run (par cero). Al establecer el valor de Dirección 0x18 a 1

permite el par de torsión.

Dirección 0x19 LED: El led se enciende cuando se establece en 1 y se apaga si se establece en 0.

Dirección0x1E, 0x1F Posición objetivo: Es el valor objetivo de la posición del dynamixel. Rango

entre 0-1023 (0x3ff) (véase la Figur 2-5). Si la posición objetivo está fuera del rango, el límite de

ángulo da error y se devuelve un "1" en el estado del paquete.

Figura 2-5.Posiciones en grados del dynamixel

Dirección 0x20, 0x21 Velocidades de movimiento: Establece la velocidad angular de la salida de la

posición objetivo. Al establecer este valor a su valor máximo de 0x3ff (1023) mueve la salida con una

velocidad angular de 114 rpm, a condición de que haya suficiente energía suministrada.

Page 27: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

7

Programación en C del Robot Escorpión

Dirección 0x24, 0x25 Posición actual: Posición angular actual de la salida del actuador.

Dirección 0x26, 0x27 Velocidad actual: Velocidad angular actual de la salida del actuador.

Acceso

Tiene dos tipos de datos: por un lado, datos de sólo lectura que se utilizan principalmente para la

detección y por otro lado, datos de lectura y escritura que se utilizan para la conducción.

Valor Inicial

En el caso de los datos de la EEPROM, los valores iniciales son valores predeterminados de fábrica en

cuanto a los datos de la memoria RAM, los valores iniciales son los que se establecen cuando la

alimentación está encendida.

2.3 Sensores

Un sensor es un dispositivo que responde a un estimulo de entrada mediante la generación de una salida

funcionalmente relacionada, por lo general en la forma de una señal eléctrica u óptica. Se trata de un

dispositivo que mide y convierte una cantidad física en una señal que puede ser leída por un

observador.Pueden detectar magnitudes físicas o químicas, conocidas como variables de instrumentación y

transformarlas en variables eléctricas. Algunos ejemplos son: temperatura, intensidad lumínica, distancia,

aceleración, inclinación, presión, desplazamiento, fuerza, torsión, humedad, movimiento etc.

A continuación se citarán los sensores susceptibles utilizados en nuestro robot.

2.3.1 Sensor IR

El sensor infrarrojo es un dispositivo electrónico capaz de medir la radiación electromagnética infrarroja de los

cuerpos en su campo de visión (véase Figura 2-6), todos los cuerpos reflejan una cierta cantidad de radiación,

esta resulta invisible para nuestros ojos pero no para estos aparatos electrónicos, ya que se encuentran en el

rango del espectro justo debajo de la luz visible.

Figura 2-6. Sensor IR

Un sensor de IR se utiliza para detectar obstáculos en frente del robot o para diferenciar entre colores en

función de su configuración y se compone de un emisor, detector y circuitos asociados (véase Figura 2-6). El

circuito requerido para hacer un sensor IR consta de dos partes: el circuito emisor y el circuito receptor. El

emisor es simplemente un led IR (diodo emisor de luz) y el detector es simplemente un fotodiodo IR que es

sensible a la luz infrarroja de la misma longitud de onda que la emitida por el led IR. Cuando la luz IR cae en

el fotodiodo, su resistencia, correspondientemente, su voltaje de salida, cambia en proporción a la magnitud de

la luz IR recibida. Este es el principio fundamental de trabajo del sensor IR.

Figura 2-7. Modelo caja negra del sensor IR

Page 28: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Hardware

8

A continuación, se muestra una gráfica (véase Figura 2-8) que representa una estimación aproximada de los

cambios de valor del sensor frente a la distancia del objeto blanco. El valor del sensor está sujeto a cambios

dependiendo del color del objeto y el medio ambiente circundante como se muestra en la figura siguiente.

Figura 2-8. Grafica representa los valores del sensor IR

en función de la distancia del objeto

Cuando un objeto está demasiado cerca, el ángulo en que la luz infrarroja es reflejada, ni siquiera llega, por lo

que es difícil conocer la zona. Además, apenas se puede detectar objeto a más de 15 cm.

2.3.2 Sensor DMS

El sensor de proximidad (véase Figura 2-9) es un transductor que detecta objetos o señales que se encuentran

cerca del elemento sensor, puede ser usado para la detección de objetos próximos para agarrar o evitar un

objeto.

Figura 2-9. Sensor DMS

Permite detectar objetos o paredes dentro de una distancia fija y no se ve afectado por el color.

Figura 2-10. Grafica representa los valores del sensor DMS

en función de la distancia del objeto

Page 29: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

9

Programación en C del Robot Escorpión

Ésta es una gráfica (véase Figura 2-10), que muestra la tensión de salida analógica en RoboPlus, basado en los

cambios de distancia a partir de papel blanco que tiene un porcentaje de reflexión de 90% y papel gris que

tiene un porcentaje de reflexión de 18%. Incluso si se produce el cambio de color se puede ver que el

porcentaje de de reflexión del valor de salida para la distancia apenas cambia.

2.3.3 Sensor GYRO XY

Giroscopios XY son dispositivos que se utilizan para determinar la orientación en el espacio (ejes X, Y)

(véase Figura 2-11) y se encuentran en la mayoría de los sistemas de navegación autónomos. Por ejemplo, si

desea equilibrar un robot, un giroscopio puede ser usado para medir la rotación de la posición de equilibrio y

enviar correcciones a un motor.

Figura 2-11. Sensor GYRO XY

Este sensor calcula qué lado del robot está inclinado, mantiene el equilibrio del robot y puede ser utilizado para

otras aplicaciones de movimiento. Cuando la velocidad angular es 0, el valor de salida es de aproximadamente

250. La salida del valor max es 455 y el mínimo 45, que muestra una velocidad angular 300 ˚/ s (véase Tabla

2-2). Aquí la marca o signo representa la dirección del giro. Dependiendo de la temperatura, puede haber un

1% de diferencia. Asímismo, puede haber una diferencia en el valor en función del valor de voltaje estándar

VCC y el ruido de circuito. Por lo tanto, se recomienda promediar varios valores antes de su uso.

Tabla 2-2.Valores de la velocidad angular en función

de los valores de salida del gyrosensor

En la práctica, un giróscopo rara vez devolverá un valor expresado en deg/s, entonces el valor de ADC es

necesario convertirlo a deg/s usanso la siguiente fórmula Rate = (ADC* Vref / 1023 – VzeroRate) /

Sensitivity tal que Vref es es la tensión de referencia,VzeroRate es el voltaje de tasa cero que es 1.23 en

nuestro caso y la Sensitivity es la sensibilidad del giróscopio que es 3.33mV/dps.Estamos utilizando un

módulo ADC de 10bits, para un ADC de 8 bits serán 255 valores en lugar de 1023 o si es de 12 bits serán

4095 en lugar de 1023.

Page 30: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Hardware

10

2.4 RC-100A

El RC-100A es el control remoto para los sistemas Bioloid (véase Figura 2-12). Ha sido ergonómicamente

diseñado en forma de boomerang para adaptarse a las manos y dar un mejor agarre. La carcasa es

semitransparente y permite ver el estado de los LEDs. Tiene un modo de ahorro de energía que se activa

automáticamente cuando no se utiliza durante un tiempo determinado.

.

Figura 2-12. RC-100A

Se puede comunicar con el robot a través de infrarrojos, Zigbee o Bluetooth. Si nada se monta, las

comunicaciones por defecto se hacen a través de infrarrojos. En caso contrario, se tiene que montar la ZIG-

100 para comunicarse a través de ZigBee o bien el BT-100 si se desea comunicar a través de Bluetooth.Sus 10

botones soportan 1.024 combinaciones distintas, permitiendo cualquier combinación para controlar el robot.

Figura 2-13.Valores de los botones del RC-100A

Los valores correspondientes a cada botón o combinación de botones presionados son únicos (véase Figura 2-

13). Cada botón envía inalámbricamente un valor que puede ser leído por el Behavior Control Program

(interfaz grafica que permite crear la lógica de secuencia de eventos y movimientos para el robot), según los

Page 31: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

11

Programación en C del Robot Escorpión

siguientes valores decimales:

U : 1

D : 2

L : 4

R : 8

1 : 16

2 : 32

3 : 64

4 : 128

5 : 256

6 : 512

Así, cuando se presiona el botón "U" en el control remoto RC-100A, el valor "1" es enviado al robot. En el

Behavior Control Program se puede definir un movimiento, un estado o un comportamiento que será ejecutado

cuando el valor inalámbrico "1" sea recibido por el robot.

2.5 ZIG110A

El ZIG 100 y ZIG 110 son un par módulos inalámbricos (véase Figura 2-14), nos sirven para usar el ZigBee

que es un protocolo de comunicación con que se evitan las interferencias de señales cruzadas, frecuencias

espurias y cualquier problema del entorno que nosotros vamos a implementar como modo de comunicación

entre el control remoto y el robot.

Figura 2-14. ZIG 100 y ZIG 110.

Para poder implementar la comunicación, debemos instalar el primer módulo o sea el ZIG100 en el mando y

otro módulo ZIG110 en el CM530 (véase Figura 2-15).

Page 32: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Hardware

12

Figura 2-15. Conexión de los módulos

Para comprobar si esta bien hecha la instalacion se observa el led azul encendido en el mando y un parpadeo

rojo en el ZIG110 que es el módulo conectado al CM530.

2.6 Microcontrolador STM32F103RE

El STMicroelectronics STM32F103RE [8] incorpora a ARM [7] de 32 bits Cortex-M3 Microcontrolador que

funciona a una frecuencia de 72 MHz, memoria de alta velocidad (Flash de memoria de hasta 512 Kbyte y

SRAM hasta 64 Kbyte), y una amplia gama de E / S y dispositivos periféricos conectados a dos buses APB.

Todos los dispositivos ofrecen tres ADCs de 12 bits, seis temporizadores de 16 bits de propósito general y dos

temporizadores PWM, así como interfaces de comunicación estándar y avanzadas: hasta dos I2Cs, tres SPI,

dos I2Ss, uno SDIO, cinco USARTs, un USB y CAN.

Page 33: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

13

Programación en C del Robot Escorpión

Figura 2-16. STM32F103RE

La familia opera en un rango de temperatura que oscila entre -40 y 105 C °, con una fuente de alimentación

de un 2,0 a 3,6 V y contiene un amplio conjunto de modo de ahorro de energía que permite el diseño de

aplicaciones de baja potencia.

Page 34: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Hardware

14

Page 35: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

15

3 SOFTWARE

na de las cosas principales que tiene que tener en cuenta el programador antes de empezar a ejecutar

sus tareas es el software, ya que la elección de este último depende específicamente de una serie de

características que tiene que ofrecer para satisfacer las necesidades. En este apartado se detallarán los

softwares RoboPlus y Cygwin utilizados durante el desarrollo de este proyecto.

3.1 RoboPlus

RoboPlus es una aplicación gratuita diseñada para crear un programa personalizado para cada producto

ROBOTIS. Incluye los siguientes componentes que se detallan abajo:

RoboPlusTask.

RoboPlusMotion.

RoboPlusTerminal.

RoboPlusManager.

3.1.1 RoboPlusTask

RoboPlusTask es un programa que consta de instrucciones que sirven para escribir un código de tareas que

controla las acciones del robot. Ofrece un programa en extensión de archivo *.tsk que puede ser cargado en

CM 530 (Controlador Servo) con el software RoboPlus (véase Figura 3-1).

Figura 3-1. Ejemplo en RoboPlusTask

Los pasos de uso del terminal:

U

Page 36: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

16

Escribir el código de tareas a ejecutar o bien abrir el archivo *.tsk si está escrito.

Conectar el CM 530 al ordenador con cable susmistrado.

Seleccionar el puerto COM correcto.

Descargar el programa en CM 530 usando la descarga icono en el software.

3.1.2 RoboPlusMotion

RoboPlusMotion es una herramienta que posibilita gestionar los movimientos de su robot. Permite crear y

guardar secuencias que se pueden enviar al controlador (como un archivo de movimiento *.mtn ) y ejecutadas

por el robot (véase Figura 3-2).

Figura 3-2. RoboPlus Motion

Los pasos de uso del terminal son similares a los pasos de uso de RoboPlusTask.

3.1.3 RoboPlus Terminal

RoboPlus Terminal es una herramienta que ayuda los usuarios a manipular el controlador a través de texto .El

programa terminal se comunica con el controlador empleando el código ASCII e imprime una variedad de

información transmitida por el controlador (véase Figura 3-3).

Figura 3-3. RoboPlus Terminal

Los pasos de uso:

Page 37: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

17

Programación en C del Robot Escorpión

Configuración Puerto de comunicación :

El puerto de comunicación debe estar configurado para conectar el controlador usando RoboPlusTerminal,

entonces para hacerlo se ejecuta Connect mientras que el puerto de comunicación no está conectado (véase

Figura 3-4).

Figura 3-4. Ventana de selección RoboPlus Terminal

Después se selecciona el puerto serie y la velocidad de comunicación y se pulsa "Aceptar". La velocidad de

la conexión básica del controlador es 57600bps (véase Figura 3-5).

Figura 3-5. Serial setup

Transmisión del fichero *.hex:

Roboplus terminal puede transmitir el contenido de los archivos con una extención hexadecimal al controlador

conectado como formato binario, basándose en el formato HEX de INTEL. Otras extensiones se transmiten

sin cambiar. El procedimiento de transmisión de archivos es el siguiente:

Mantenga pulsado Alt Gr #.

Se debe ver:’SYSTEM OK’.

Escribir ‘ld’ para cargar el archivo *.hex.

En el menú de selección RoboPlus Terminal Files->Transmitir el archivo.

Seleccionar el archivo*.hex.

Pulsar “Abrir” para iniciar la transferencia.

Esperar a que la transferencia se complete.

3.1.4 RoboPlus Manager

RoboPlus Manager se utiliza para manejar los dispositivos utilizados por un robot. Las funciones principales

de este programa son las siguientes:

Administrar el firmware del controlador.

Inspeccionar el estado del controlador y los dispositivos periféricos.

Page 38: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

18

Establecer los modos requeridos.

El firmware del controlador puede ser restaurado mediante el Manager. Esto se utiliza cuando el firmware

actual está causando problemas y que le gustaría volver a una versión anterior. Se centra más en explicar esta

función del RoboPlusManger porque es la más usada en las pruebas del proyecto.

Pasos para restaurar el firmware:

Ejecutar el "Asistente Firmware Controlador".

Pulse el icono de controlador de administración del firmware (véase Figura 3-6 y 3-7)

Figura 3-6. Icono de la administración de firmware

Figura 3-7. Controlador del firmware

Seleccionar el puerto de comunicación a utilizar:

Debido a que el firmware no se puede detectar de forma automática, el usuario debe seleccionar manualmente

el puerto al que está conectado el controlador. Si el puerto de comunicación elegido está siendo utilizado por

otro programa, primero se debe encontrar y detener el programa. Pulse el botón "Buscar" después de

seleccionar el puerto (véase Figura 3-8).

Page 39: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

19

Programación en C del Robot Escorpión

Figura 3-8. Controlador del firmware

Reiniciar el controlador

El controlador se debe apagar y volver a reiniciar (véase Figura 3-9).

Figura 3-9. Controlador del firmware

Revisarla información del controlador

Cuando se detecta el controlador, se muestran el nombre de modelo y número de versión. Verifique que la

información del controlador es correcta (véase Figura 3-10).

Page 40: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

20

Figura 3-10. Controlador del firmware

Restaurar Firmware

Pulse el botón "Siguiente" para comenzar a restaurar el firmware. Tenga cuidado de no desconectar la

alimentación o desconectar el cable mientras se actualiza el firmware (véase Figura 3-11).

Figura 3-11. Controlador del firmware

Una vez que el firmware se ha actualizado, pulse el botón "Finalizar" para volver a la página de

mantenimiento de controlador (véase Figura 3-12).

Figura 3-12. Controlador del firmware

El resultado hecho por Embedded C es un firmware del controlador (archivo bin). Si lo instala, no se

puede utilizar RoboPlus ya que el firmware del controlador existente se borra. Si se desea volver a utilizar

Page 41: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

21

Programación en C del Robot Escorpión

RoboPlus, debe instalar el firmware del controlador original construido a partir de la fábrica. Puede

instalar el firmware del controlador original, fácilmente mediante el Administrador RoboPlus siguiendo

los pasos explicados arriba.

3.2 Cygwin

Cygwin es una colección de herramientas desarrollada por Cygnus Solutions para proporcionar un

comportamiento similar a los sistemas Unix en Microsoft Windows.

Ese compilador permite progamar y generar ejecutables en varios lenguajes entre ellos C, se elige por su facil

uso y por familiarizarme con él durante la carrera.

3.2.1 Instalación del Cygwin

Se tiene que descargar el instalador correspondiente de acuerdo con su versión de sistema operativo que es

Cygwin [3] para Windows de 32-bit en nuestro caso. Es compatible desde Windows XP hacía adelante.

El proceso de instalación es muy simple y consiste en los siguientes pasos (véase Figura 3-13 y siguientes):

Figura 3-13.Cygwin Setup

Page 42: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

22

Elegir un origen de descarga, si se quiere descargar desde internet o desde un directorio local (véase Figura

3-14).

Figura 3-14.Cygwin Setup

1. Seleccionar un directorio raíz donde se quiere instalar el Cywin (véase Figura 3-15).

Figura 3-15.Cygwin Setup

2. Selecionar un directorio en el que se desea almacenar los archivos de descarga (vease Figura 3-15)

Page 43: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

23

Programación en C del Robot Escorpión

Figura 3-16. Cygwin Setup

3. Seleccionar la conexión internet con la cual se quiere conectar (vease Figura 3-17).

Figura 3-17. Cygwin Setup

4. En este paso se debe seleccionar cualquier dirección de la lista. Éstos no son más que mirrors desde

donde Cygwin va a obtener los paquetes de instalación (vease Figura 3-18).

Page 44: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

24

Figura 3-18. Cygwin Setup

5. Para los programadores este paso es el más importante debido a que es donde podemos seleccionar las

herramientas que deseamos instalar. Sin duda necesitamos abrir la categoría "devel" (Desarrollo) y

seleccionar "gcc", "g ++", "gdb", "Make" que son las herramientas más importantes, y otros que no

forman parte de la selección por defecto (véase Figura 3-19).

Figura 3-19. Cygwin Setup

Page 45: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

25

Programación en C del Robot Escorpión

6. Esta ventana muestra el progreso de la instalación (vease Figura 3-20).

Figura 3-20. Cygwin Setup

7. Elegir si se desea crear un icono para un acceso comodo (vease Figura 3-21).

Figura 3-21. Cygwin Setup

Page 46: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

26

Una vez hemos realizado todos estos pasos, el resultado es una consola de este tipo (véase Figura 3-22) con la

cual podemos ejecutar y depurar el código.

Figura 3-22. Consola Cygwin

3.2.2 Descarga y compilación del paquete AVR-libc

Como se ha mencionado anteriormente, estamos usando una consola Linux bajo Windows. En Linux las

cosas se complican un poco porque a veces no existen los paquetes requeridos. En nuestro caso, nos hacen

falta, el“AVR-libc”, biblioteca estándar utilizada para el desarrollo de programas en C para los

microcontroladores Atmel AVR. Este paquete contiene las bibliotecas estáticas, así como los archivos de

cabecera necesarios. De forma que este último está relacionado con dos paquetes “avr-binutils” Utilidades

binarias que apoyan los objetivos de AVR de Atmel y AVR-GCC El compilador de C de GNU (compilador

cruzado para avr).

Entonces para poder obtener AVR-libc [5] en nuestro compilador debemos seguir los pasos explicados abajo y

disponer de:

Código fuente de Binutils: binutils-2.16.1.tar.bz2.

Código fuente de GCC: gcc-4.1.1.tar.bz2.

Código fuente de avr-libc: avr-libc-1.4.5.tar.bz2.

Pasos:

1) Se descomprime Binutils, se compila y se instala con los siguientes comandos:

tarxjvf binutils-2.16.1.tar.bz2

cd binutils-2.16.1

./configure --target=avr

make

make install

Si todo sale bien en /usr/local/bin tendremos instaladas utilidades como:

avr-as

avr-ld

avr-objdump

avr-objcopy

Page 47: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

27

Programación en C del Robot Escorpión

etc...

Se puede probar la instalación ejecutando:

/usr/local/bin/avr-ld–v

2) Compilación de gcc:

En primer lugar, se tiene que asegurar de tener el directorio /usr/local/bin en la variable "PATH". De no

ser el caso, debe añadirla:

export PATH=/usr/local/bin:$PATH

A continuación descomprimimos el gcc, lo configuramos, compilamos e instalamos:

tarxjvf gcc-4.1.1.tar.gz

cd gcc-4.1.1

./configure --target=avr --enable-languages=c

make

make install

Si no hay problemas el compilador va a instalarse en /usr/local/bin. También quedan instalados ficheros

en:

/usr/local/lib/gcc-lib (compilador y librerías)

/usr/local/avr (includes, linker-scripts, etc)

/usr/local/info (documentación en formato info)

También podemos probar la correcta instalación de gcc mediante:

avr-gcc -v

3) Compilación de avr-libc.

Descomprimimos avr-libc, lo compilamos e instalamos:

tarxjvf avr-libc-1.4.5.tar.bz2

./configure --build=`./config.guess` --host=avr

make

make install

La librería, junto con los ficheros de inicialización, crt.*, y de cabecera, *.h, quedarán instalados en el

directorio /usr/local/avr.

3.2.3 Generación del ejecutable *.hex

El ejecutable *.hex es un archivo hexadecimal que contiene el código maquina ejecutable para el dispositivo

designado, este archivo es el que se carga en el microcontrolador medianteRoboPlusTerminal, entonces para

poder obtener este último seguimos estos pasos:

Ejecutar Cygwin terminal y situarse en el directorio del Cygwin mediante el comando

“cd..”,orden para cambiar el directorio de trabajo al directorio superior de la jerarquía.

Page 48: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

28

Figura 3-23. Consola Cygwin

Para ejecutar cualquier cosa con Cygwin, se debe guardar dentro del directorio de este compilador.

Con un comando ls se puede observar un listado con los archivos del derictorioCygwin entre ellos el

archivo que queremos ejecutar, por ejemplo ADC.

Situarse dentro del archivo ADC mediante “cd ADC”.

Figura 3-24. Consola Cygwin

Mediante el comando “make”ejecutamos el código

Make es un herramienta que ejecuta las reglas del archivo makefile recompilando la modificación y enlaza

los módulos (librería y archivos de código C y archivos para las declaraciones) en el código objeto

constuyendo el ejecutable.

Page 49: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

29

Programación en C del Robot Escorpión

Figura 3-25. Consola Cygwin

Para ver el progreso, hay que comprobar la ventana de terminal. Si el resultado sale distinto de lo que se

muestra en la Figura 3-25 implica un fallo en el código.

Para asegurarse de que se ha generado correctamente el ejecutable se debe encontrar en la carpeta ADC.

Figura 3-26. Archivo CM530 .hex

Page 50: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Software

30

Page 51: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

31

Page 52: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf
Page 53: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

31

4 LIBRERÍAS

Un lenguaje de programación es de bajo nivel cuando requiere que

prestes atención a lo irrelevante

Alan J. Perlis

n este capítulo se van a definir las librerías usadas a la hora de programar en C. Posteriormente se

centrará en la descripción de las configuraciones de los periféricos empleados en este proyecto,en las

que haremos uso de los drivers de dichas librerías.

Se necesitarán diferentes librerías: una principal STM32F10x para manipular los periféricos internos del

crontrolador CM530,así como otras librerías externas de funciones básicas, que junto a la anterior harán

falta para los periféricos externos.

4.1 STM32F10x

El STM32F10x standard peripheral library,es una biblioteca diseñada por STMicroelectronics en lenguaje C

para sus microcontroladores STM32. Contiene funciones, estructuras y macros para facilitar el manejo de los

periféricos del microcontrolador. La biblioteca está documentada y su distribución está disponible para una

descarga gratuita [4].

La relación de los archivos de la biblioteca se muestra en la Figura 4-1:

Figura 4-1. Relacion entre los archivos del STM32F10x

E

Page 54: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Librerías

32

Esta última contiene dos carpetas que ofrecen para cada periférico un fichero fuente stm32f10x_ppp.c

contiene todas las funciones de firmware necesarias para utilizar el periférico ppp. Y un fichero cabecera

stm32f10x_ppp.h (ppp se refiere al nombre del periférico por ejemplo adc):

Carpeta inc: Contiene los ficheros de cabecera.

Carpeta src: Contiene los ficheros fuente.

Figura 4-1. Carpeta Inc

Sólo un fichero de mapeo de memoria stm32f10x_lib.h es necesario para todos los periféricos. Contiene todas

las declaraciones de registros y las definiciones de bit. Es el único fichero que debe de ser incluído en el main

para interaccionar con la librería.

El archivo stm32f10x_conf.h se utiliza para especificar el conjunto de parámetros para la interfaz con los

controladores de la biblioteca antes de ejecutar cualquier aplicación. Se puede activar y desactiar la inclusión

de determinados periféricos.

El fichero stm32f10x_it.c es el fichero que contiene rutinas de interrupción para las excepciones del Cortex-

M3. Permite añadir unas nuevas interrupciones para los diferentes periféricos. El fichero stm32f10x_it.h es el

fichero de cabecera con las declaraciones de las rutinas de interrupción.

4.1.1 INICIALIZACIÓN Y CONFIGURACIÓN DE PERIFÉRICOS INTERNOS

En este apartado se va a describir la inicialización y configuración de manera general de cualquier periférico

interno usado en este proyecto haciendo uso los drivers mencionados arriba.

4.1.1.2 GPIO (GENERAL PURPOSE I/Os)

GPIO es uno de los periféricos más sencillos de utilizar, pero tiene bastantes parámetros que configurar. Para

configurar un puerto GPIO se utiliza los drivers de la librería de STMicroelectronics correspondiente. Dicho

driver, proporciona GPIO_InitTypeDef una estructura para el periférico GPIO, GPIO_StructInit una función

que asigna valores por defecto a dicha estructura y GPIO_Init una función para inicializar el periférico.Esta

Page 55: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

33

Programación en C del Robot Escorpión

nomenclatura es común al resto de periféricos, lo único que cambia es el nombre del periférico.

En el caso de GPIO, la estructura tiene 3 campos a configurar:

GPIO_Pin: Con este campo referenciamos al pin que queremos inicializar. Podemos inicializar varios

pines a la vez utilizando el operador | (OR) o directamente inicializar todos los pines de un mismo

puerto con la sentencia GPIO_Pin_All.

GPIO_Mode: Configura el modo de dirección.

- GPIO_Mode_In modo de entrada.

- GPIO_Mode_OU T modo salida.

- GPIO_Mode_AF modo función alternativa.

- GPIO_MODE_AN modo analogo: para un ADC Channel, DAC Output o Comparador.

GPIO_Speed Define la velocidad máxima de trabajo. Puede ser: GPIO_Speed_400Khz,

GPIO_Speed_2MHz, GPIO_Speed_10Mhz, GPIO_Speed_40MHz.

Para restaurar los valores por defecto estos tres campos, se llama a la función GPIO_StructInit pasándo como

parámetro la dirección de la estructura GPIO_InitStructure.

Al rellenar los parámetros deseados, el siguiente paso es llamar a la función GPIO_Init() para que inicialice el

periférico con los datos que tenemos que configurar. En la estructura hemos determinado los datos para esos

pines y su modo de operación, velocidad, etc. A la hora de llamar a GPIO_Init() debemos indicar a qué puerto

queremos inicializarlo. Un ejemplo de llamada seria:

GPIO_Init(GPIOB, &GPIO_InitStructure);

La función GPIO _Configuration() pone en funcionamiento a todos lo pasos explicados arriba.

4.1.1.2 NVIC

El NVIC (NestedVectoredInterruptController) es el periférico que gestiona las interrupciones.Pertenece al

núcleo de ARM, es capaz de gestionar 45 canales enmascarables de interrupción sin contar las 16 líneas de

interrupción propias de ARM y puede asignar 16 niveles de prioridad.

Para el periférico NVIC la estructura es NVIC_InitTypeDef. El driver de NVIC viene en la librería en el

fichero misc.c. Los parámetros que tenemos que configurar en la estructura NVIC son los siguientes:

NVIC_IRQChannel: Especifica el Canal IRQ a ser activado.

NVIC_IRQChannelPreemptionPriority: Especifica la prioridad pre-emption para el canal IRQ. Este

valor puede ser cualquier valor entre 0 y 15.

NVIC_IRQChannelSubPriority: Especifica el nivel de subprioridad para el canal IRQ.Puede ser un

valor entre 0 y 15.

NVIC_IRQChannelCmd: Especifica si está activo o desactivo el canal. Admite: ENABLE o

DISABLE.

Para inicializar la estructura debemos llamar a NVIC_Init () pasándole por parámetro nuestra estructura

completada con la configuración deseada.

Un ejemplo es:

NVIC_Init(&NVIC_InitStructure);

Page 56: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Librerías

34

Antes de la activación de las interrupciones tengo que fijar la dirección de la tabla de vectores de la memoria

RAM y FLASH susivamente en 0x20000000 y 0x08003000 mediante la función:

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x3000);

La función NVIC _Configuration() llamada desde la función main pone en funcionamiento a todos los pasos

explicados arriba.

4.1.1.3 ADC

El siguiente paso es configurar el ADC convertidor analógico digital. Al igual que anteriores periféricos, el

driver de ADC dispone de su propia estructura de configuración conocida como ADC_InitTypeDef. Los

parámetros a configurar para esta estructura son los siguientes:

ADC_Mode: Hay dos modos de operación, independent mode y dual mode del ADC. Admite:

- ADC_Resolution_12b.

- ADC_Resolution_10b.

- ADC_Resolution_8b.

- ADC_Resolution_6b.

ADC_ScanConvMode: Especifica si la conversión esmodoScan o sencilla. Admite

ENABLE o DISABLE.

ADC_ContinuousConvMode: Especifica si la conversión es realizada en modo continuo o

discontinuo. Admite ENABLE o DISABLE.

ADC_ExternalTrigConvEdge: Selecciona si hay señal externa de conversión, y si es así, activar el

flanco de activación.

- ADC_ExternalTrigConvEdge_None. No hay conversión por señal externa.

- ADC_ExternalTrigConvEdge_Rising. Activo por flanco de subida.

- ADC_ExternalTrigConvEdge_Falling. Activo por flanco de bajada.

- ADC_ExternalTrigConvEdge_RisingFalling. Activo por ambos.

ADC_DataAlign: Alineación de los datos. Por defecto siempre es ADC_DataAlign_Right.

ADC_NbrOfConversion: Número de conversiones a realizar de cada grupo de canales. Admite un

número entre 1 y 27.

Una vez definida la estructura, pasamos a inicializarla con ADC_Init(). Un ejemplo sería:

ADC_Init(ADC1, &ADC_InitStructure);

Por último, una vez que hemos configurado el ADC, falta activar el ADC calibrarlo y comenzar a convertir:

ADC_Cmd(ADC1, ENABLE);

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

Page 57: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

35

Programación en C del Robot Escorpión

La función ADC_Configuration() llamada desde la función main pone en funcionamiento a todos lo pasos

explicados arriba.

4.1.1.4 USART

Cuando necesitamos alguna información de un microcontrolador normalmente se utiliza USART. Éste es un

periférico que me permite envíar y recibir datos y depurar la información a un terminal de pantalla. Para este

propósito los microcontroladores STM32 tienen más de una interfaz USART permitiendo tener múltiples

flujos de salida de datos y de entrada.

Para configurar USART se utiliza el driver de la librería de STMicroelectronics correspodiente. Dicho driver,

proporciona una estructura para el periférico USART, una función que da valores por defecto a dicha

estructura y una función para inicializar el periférico. En el caso de USART la estructura se llama USART

_InitTypeDef, la función que da valores se llama USART_StructInit (), y la que inicializa el periférico

USART _Init ().

Los parámetros a configurar para la estructura del USART son los siguientes:

USART_BaudRate: Este miembro configura la velocidad de transmisión de comunicación USART.

USART_WordLength: Especifica el número de bits de datos transmitidos o recibidos en un marco.

Este parámetro puede ser un valor de USART_WordLength_8b o de USART_WordLength_9b.

USART_StopBits: Especifica el número de bits de parada transmitidos. Este parámetro puede ser un

valor de USART_StopBits_1, USART_StopBits_2, USART_StopBits_1_5.

USART_Parity: Especifica el modo de paridad. Este parámetro puede ser un valor de

USART_Parity_No, USART_Parity_Eveno bien de USART_Parity_Odd ;

USART_HardwareFlowControl: Especifica si el modo de control de flujo por hardware está activado

o desactivado.

USART_Mode: Especifica si el modo de recibir o transmitir está activado o desactivado

USART_Mode_Rx ,USART_Mode_Tx.

Para restaurar los valores por defecto estos campos, se llama a la función USART_StructInit pasándo como

parámetro la direccion de la estructura USART_InitStructure.

Antes de inicializar debemos deinicializar la configuración anterior y se hace con la siguiente función

USART _Deinit() que recibe como parámetro de entrada el USARTx o el periférico UARTx que en

nuestro caso sería USART1, USART2, USART3, UART4 o UART5 .

USART_DeInit(USART1);

El siguiente paso es inicializar con los datos deseados.A la hora de llamar a USART_Init() debemos indicar

que USART queremos inicializarlo y la estructura. Un ejemplo de llamada seria:

USART_Init(USART3, &USART_InitStructure);

Por ultimo una vez finalizado la configuración y la inicialización queda activar al usart.

USART_Cmd(USART3, ENABLE);

La función USART _Configuration pone en funcionamiento a todos lo pasos explicados arriba admite como

parámetros el usart que queremos activar y la velocidad de trasmisión, por ejemplo, para activar el USART3

admite como parámetros USART_PC un macro para seleccionar USART3 y Baudrate_PC = 57600.

Page 58: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Librerías

36

4.1.1.5 RCC (RESET AND CLOCK CONTROL)

RCC es un periférico interno que nos sirve como indica su nombre resetear y configurar el reloj del sistema

.Nos centraremos en la parte del reloj que es la que nos interesa.

Su configuración consiste en:

Seleccionar una fuente de reloj para el SystemClock.

Configurar el preescalado de los buses AHB y APB

Los periféricos del microcontrolador están conectados a tres buses:

- Advanced High-Performance (AHB). A él están conectados: GPIOA, GPIOB, GPIOC,

GPIOD, GPIOE, GPIOH, RCC, DMA, entre otros.

- AdvancedPeripheral Bus (APB1). Están conectados a él: DAC, PWR, RTC, LCD, TIM7,

TIM6, etc.

- AdvancedPeripheral Bus (APB2).Están conectados a el: ADC, TIM9, TIM10, TIM11,

EXTI, SYSCFG, etc.

En esta parte se tiene que cumplir dos características .Dichas características son que el APB2 (bus

donde se conectan parte de los periféricos que vamos a utilizar) no puede ir a más de 72 MHz, por lo

que configuraremos el reloj del sistema a esa velocidad y sin modificarlo llega directamente al APB2.

La otra característica es que el APB1 (en el cual se conecta la otra parte de los periféricos utilizados)

no puede ir a más de 36 MHz. Para ver dónde se conecta cada periférico.

Habilitar los relojes de los periféricos que se utilizan.

Los periféricos más comunes se encuentran conectados a uno de los buses mencionados arriba y por

defecto están desactivados para evitar el consumo de energía. Debido a esto, deberemos activarles la

señal de reloj utilizando la función RCC_APB1PeriphClockCmd(), RCC_APB2PeriphClockCmd(),o

RCC_AHBPeriphClockCmd(), tal y como corresponda en su caso.

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx,ENABLE);

La función RCC_Configuration() pone en funcionamiento a todos los pasos explicados arriba.

4.1.1.6 SysTick (SYSTEM TIMER)

El ARM Cortex tiene un timer interno llamado SystemTimer (SysTick). Este timer es muy apropiado para

generar ticks o medir delays. Una de las grandes ventajas es que es común a todos los Cortex M3 por lo que

cualquier procesador de la serie M3 funcionará idénticamente.

El método de operación detallado viene explicado en la documentación de ARM Cortex M3, pero nosotros no

vamos a profundizar en su uso, sino solo vamos a ver como configurarlo.

Con la función SysTick_Configuration llamada desde el main configuramos el SysTick.Su configuración es

muy simple y consiste solamente en cargar el resgistro SysTickReload para generar interupcion cada 1 us con

una señal de entrada de 9MHz y activar SysTickinterupcion.

Void SysTick_Configuration(void)

{

SysTick_SetReload(9);

SysTick_ITConfig(ENABLE);

Page 59: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

37

Programación en C del Robot Escorpión

}

4.2 LIBRERÍAS EXTERNAS

Dynamixel y ZigBee son dos periféricos externos muy importantes para la implementación de este proyecto.Para configurarlos se necesitará, además de la librería STM32F10x otra fuentes indepentientes de la

plataforma escritas en c [5].

dynamixel.h, dynamixel.c, zigbee.h, zigbee.c: Archivos para La interfaz de programación de

aplicaciones API.

dxl_hal.h, dxl_hal.c, zgb_hal.h, zgb _hal.c: Archivos necesarios para La capa de abstracción

de hardware.

Estas bibiotecas sirven para esatablecer una comunicación con los servomotores dyamixel y el

control remoto (RC-100) usando el módulo ZigBee.

4.2.1 CONFIGURACIÓN DE PERIFÉRICOS EXTERNOS

4.2.1.1 Dynamixel

Para el buen funcionamiento del dynamixel se deben configurar primeramente otros periféricos de nuestro

controlador:

Configurar el pin GPIO del dynamixel de recepción en modo entrada floating y el pin de

transmisión en modo pushpull altérnate function:

GPIO_InitStructure.GPIO_Pin = PIN_DXL_RXD; // asignar el pin de recepción del dynamixel

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // modo input

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = PIN_DXL_TXD; // asignar el pin de transmicion del dynamixel

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //asignar una alta velocidad de Tx

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // modo alternate función ( permite que le

pin puede ser usado por los perifericos )

GPIO_Init(GPIOB, &GPIO_InitStructure);

La comunicación se realiza a través del puerto Serie USART esto implica una configuración para

que los puertos utilizados se vuelvan exclusivos :

USART_DeInit(USART1);

USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

Page 60: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Librerías

38

USART_Cmd(USART1, ENABLE);

Para poder ejecutar este paso, se llama a la función dxl_initialize(0,1), pertenece a la librería

dynamixel.h. Admite como parámetros 0 para seleccionar el usart correspondiente USART1 y 1 para

fijar la velocidad de transmición en 1000000.

Activar el reloj del USART 1 y del GPIOX el puerto al que pertenecen los pines que acabamos de

configurar, conectados al bus APB2.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOB, ENABLE);

Configurar su línea de interrupción externa IRQ NVIC

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; //eleccion del canal IRQ a activar

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // asignar la prioridad mas alta

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // asignar la subprioridad mas alta

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

Para poder enviar órdenes a los dynamixels o consultar la situación de estos últimos se usan dos principales

funciones que pertenecen al bibioteca dynamixel.h:

dxl_write_word( id, P_GOAL_POSITION_L, GoalPos[INDEX] ) ;

Recibe como parámetro el identificador del dynamixel al que se quiere ordenar la dirección y el

valor.

dxl_read_byte( id, P_MOVING );

Recibe como parámetro el identificador de dynamixel y la dirección de la tabla de control que

queremos consultar.

4.1.2.2 ZigBee

Para poder usar este periférico se deben configurar primeramente otros periféricos y elementos de nuestro

controlador.

Configurar el pin GPIO del ZigBee de recepción en modo entrada floating y el pin de transmisión

en modo pushpull altérnate function :

GPIO_InitStructure.GPIO_Pin= PIN_ZIGBEE_TXD; // asignar el pin de transmicion del ZigBee

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //asignar una alta velocidad de Tx

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // modo alternate función (permite que le

pin puede ser usado por los perifericos)

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = PIN_ZIGBEE_RXD; // asignar el pin de recepción del ZigBee

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //modo input

GPIO_Init(GPIOD, &GPIO_InitStructure);

Page 61: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

39

Programación en C del Robot Escorpión

La comunicación se realiza a través del puerto Serie UART , esto implica una configuración para

que los puertos utilizados vuelvan exclusivos :

USART_DeInit(UART5);

USART_Init(UART5, &USART_InitStructure);

USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);

USART_Cmd(UART5, ENABLE)

Este paso se ejecuta mediante zgb_initialize() función de la librería zigbee.h.

Activar el reloj del UART5 que está conectado al bus APB1 y del el puerto GPIOX al que pertenecen

los pines que acabamos de configurar , conectados al bus APB2:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd (RCC_APB1Periph_UART5, ENABLE);

Configurar su línea de interrupción externa IRQ NVIC :

NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; // eleccion del canal IRQ a activar

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // asignarle la prioridad mas alta

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // asignarle la subprioridad 2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

Para poder recibir ZigBee comandos desdeel mando de control (RC-100) al robot se usan dos funciones

principales de comunicación que pertenecen a la librería zigbee.h.

zgb_rx_check() se comprueba si los datos han llegado a los dispositivos de comunicación o no,

devuelve un 1 o 0 .

zgb_rx_data() devuelve los datos recibidos desde dispositivo de comunicación.

Page 62: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Librerías

40

Page 63: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

41

5 PROGRAMACIÓN

Primero resuelve el problema . Entonces, escribe el código.

John Johnson

n este capítulo se proponen varios ejemplos de programación en C . Los códigos en C se componen de

dos bloques, el primero hace referencia a la configuración de los periféricos cuyas funciones se han

explicado detalladamente en el aparatado inicialización y configuración de periféricos internos (apartado

4.1.1), el segundo bloque se corresponde con la tarea principal. Se incluye en este último bloque una

comparación del código en C con el código en RoboPlus. Para ello, se ha añadido el anexo con todos los

códigos en RoboPlus de los ejemplos.

Para poder realizar la programación del robot se ha seguido una metodología secuencial, paso a paso, ya que

nuestro robot se compone de varios componentes. Empezamos con pequeñas rutinas para cada componente,

hasta llegar a un movimiento global, el cual es el objetivo del trabajo.

Las rutinas a probar son las siguientes:

- Dynamixels: mover la cola del robot.

- Dynamixels con botones: mover la cola del robot mediante los botones.

- Sensores: DMS, Gyro sensor XY, IR sensor: imprimir los datos procesados por los sensores.

- RC100: imprimir los datos enviados desde el mando de control.

- Movimiento global: el robot camina al pulsar el botón U, ataca cuando detecta un objeto por el sensor

DMS, levanta las patas al detectar un levatamiento por el Gyro sensor y duerme pulsando el botón R.

5.1 Dynamixels

Esta prueba consiste en una simple rutina para mover la cola de abajo hacia arriba del escorpión, el cual se

compone de tres dynamixels.

E

.

Page 64: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

42

Código en C:

Int main(void) {

/* Bloque 1 */

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

SysTick_Configuration();

dxl_initialize( 0, 1 );

/* Bloque 2 */

dxl_write_word(16,32,100);

dxl_write_word(17,32,100);

dxl_write_word(18,32,100);

dxl_write_word(16,30,700);

dxl_write_word(17,30,600);

dxl_write_word(18,30,400);

return 0;

}

5.1.1 Bloque 1

Las funciones que aparecen en el bloque 1 han sido descritas en el apartado 4.1.1 .Por consiguiente, en

este punto solo se va a proceder a mencionarlas.

Configurar el sistema del reloj RCC_Configuration().

Configurar el reloj de interrupciones NVIC_Configuration().

Configuración de los puertos GPIO usados GPIO_Configuration().

Configuración del timer interno SysTick_Configuration().

Configuración de los dinamixels dxl_initialize( 0, 1 ).

5.1.2 Bloque 2

La cola de nuestro robot se compone de tres dynamixels, con los siguientes IDs (16 ,17 ,18). La combinación

de los tres dynamixels es lo que le proporciona a la cola los grados de libertad necesarios para realizar los

distintos movimientos, que son levantar y bajar la cola. El movimiento mecánico de la cola consistirá en fijar

la posición objetivo y la velocidad de movimiento de cada uno de estos dynamixels. Esto se consigue

mediante el comando dxl_write_word, incluido en la librería dynamixel.h, que nos permite enviar órdenes

de forma sencilla, únicamente tenemos que indicarle el ID del dynamixel, la dirección de la tabla de control

que queremos modificar (30: la posición objetivo y 32: la velocidad de movimiento) y los valores a fijar.

En el ejemplo del código de arriba se trata el caso de subida cola hasta una posición que viene definida por la

posición de los tres dynamixels, en nuestro caso (700,600, 400), la cual equivale a (205,175, 117) grados de

Page 65: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

43

Programación en C del Robot Escorpión

ángulo de giro los dynamixels. Por otro lado, la velocidad a (100,100 ,100) que corresponde a una velocidad

angular de (11.4, 11.4, 11.4) rpm.Para comprender de dónde se han sacado las conversiones de estas unidades

se puede consultar el apartado 2.2 (vease Figura 2-5 y el texto relacionado).

Para un caso de bajada de cola el proceso es análogo, fijamos la posición la velocidad de bajada para cada

dynamixel.

En cuanto al RoboPlus, no necesitamos la configuración de cualquier periférico ya que es automático.

El proceso de levantar la cola es muy simple, se da inicio a nuestro programa mediante START

PROGRAM. Todo lo que se ejecuta dentro de estos corchetes se realizará una vez y luego se detendrá.Por

lo que respecta las instrucciones para lograr el movimiento, se selecionan las variables necesarias

ID[X]:MOVING VELOCITY yID[X]:GOAL POSITION correspondientes, como indican sus

nombres, a la velocidad y a la posicion objetivo del dynamixel X y se les asignan los valores deseados .

5.2 Dynamixels con botones

En esta rutina, se combinan los dynamixels con los botones para realizar el mismo procedimiento anterior

(mover la cola del robot). De esta forma, pulsando el botón U se levanta la cola del escorpión y, por el

contrario, apretando el botón R la cola baja.

Código en C:

Int main(void)

{

/* Bloque 1 */

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

SysTick_Configuration();

dxl_initialize( 0, 1 );

USART_Configuration(USART_PC, Baudrate_PC);

/* Bloque 2 */

while(1)

{

if(GPIO_ReadInputDataBit(PORT_SW_UP, PIN_SW_UP) != SET)

{

dxl_write_word(16,32,100);

dxl_write_word(17,32,100);

dxl_write_word(18,32,100);

dxl_write_word(16,30,700);

dxl_write_word(17,30,600);

dxl_write_word(18,30,400);

}

else if( GPIO_ReadInputDataBit(PORT_SW_RIGHT, PIN_SW_RIGHT) != SET)

{

dxl_write_word(16,32,50);

dxl_write_word(17,32,50);

dxl_write_word(18,32,50);

Page 66: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

44

dxl_write_word(16, 30,500);

dxl_write_word(17, 30, 500 );

dxl_write_word(18, 30, 500);

}

}

return 0;

}

5.2.1 Bloque1

Las funciones que aparecen en el bloque 1 han sido descritas en el apartado 4.1.1.Por consiguiente, en

este punto solo se va a proceder a mencionarlas.

Configurar el sistema del reloj RCC_Configuration().

Configurar el reloj de interrupciones NVIC_Configuration().

Configuración de los puertos GPIO GPIO_Configuration().

Configuración del timer interno SysTick_Configuration().

Configuración de del dinamixel dxl_initialize( 0, 1 ).

Configuración de usart USART_Configuration(USART_PC, Baudrate_PC).

5.2.2 Bloque 2

Como se puede observar en el código de arriba, para implementar la segunda rutina, se utiliza un bucle

infinito While (1) para lograr el funcionamiento indefinido del proceso, dentro de este bucle se hace uso

de un formato condicional (if y elseif), con el cual construimos las dos condiciones requeridas. Si se

cumple la primera, que es la lectura del botón U, se ejecutará un bloque de instrucciones, que hará que la

cola suba tal y como se ha explicado en el apartado 5.1.2.

Obviamente si no se cumple esa primera condición y se cumple la segunda, pulsar el botón R, se pasa a

ejecutar el bloque de instrucciones correspondiente, que hará que la cola baje.

Las señales electrónicas de los dispositivos conectados al controlador pueden ser leídas a través del

puerto E / S del microcontrolador. Para que el robot pueda leer un botón pulsado, se dispone de la función

GPIO_ReadInputDataBit de la librería stm32f10x_gpio. Esta función recibe como parámetros el puerto y

el pin del puerto, correspondientes al botón que se requieren leer y devuelve el valor de este último.

El botón U está conectado al Puerto C Pin11 y el botón R está conectado al Puerto A Pin14, consultar el mapa

de los puertos del controlador en el anexo apartado 1.

En el ejemplo del código arriba, la función GPIO_ReadInputDataBit(PORT_SW_UP, PIN_SW_UP) !=

SET, para el caso de la subida de la cola ,recibe como parámetros PORT_SW_UP (macro del Puerto C) y

PIN_SW_UP (macro del Pin 11) y devuelve un valor lógico SET o RESET.

Para el caso de pulsar el botón de bajada de la cola el razonamiento es análogo.

Page 67: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

45

Programación en C del Robot Escorpión

En cuanto al RoboPlus la lectura de los botones es muy simple y básica, no necesita asignación ni del

puerto ni del pin como en C, sólo se usa la variable Button y se compara con un Usi se pulsa el botón

U , o bien, se compara con un R si se pulsa el botón R.

Con respecto a las demás instrucciones son parecidas, un ENDLESS LOOP para conseguir un bucle

infinito, un IF ELSE IF para el formato condicional y para el proceso de la subida y la bajada de la

cola se sigue el mismo procedimiento explicado en la comparación del apartado 5.1.2.

5.3 Sensores

En este apartado, el robot puede mover la cola a nuestra voluntad gracias a las dos rutinas anteriores

(dynamixels y dynamixels + botones). Sin embargo se quiere ir más allá traspasando un poco más la línea

de un objeto inerte y darle otra perspectiva, para ello, se decide aplicar sensores.

El primer sensor es el DMS, un sensor de distancia, que permite detectar otros objetos que se encuentren

alrededor del robot. El DMS permite reconocer la distancia a la que se encuentra un obstáculo con

respecto al escorpión, con un máximo de 70 cm de distancia del mismo.

El segundo sensor es el IR, un sensor infrarrojo es un dispositivo capaz de medir la radiación

electromagnética infrarroja de los cuerpos en su campo de visión.

El tercer sensor es el Giro Sensor, sirve para mantener el robot en equilibrio. Con este sensor se puede

saber la velocidad angular en la que ha girado el robot en el eje X y también en el eje Y.Se estudiara este

ultimo sensor solo para tener una idea general de su funcionamiento porque se sabe de antemano que el

robot esta en equilibrio y este sensor no es de gran utilidad.

.

Como estos sensores siguen la misma metodología de activación, vamos a tratar un solo ejemplo general

que servirá para los tres, si hay una diferencia se especificará.

Codigo en C:

Int main(void)

{

/* Bloque 1 */

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

SysTick_Configuration();

ADC_Configuration();

/* Bloque 2 */

GPIO_ResetBits(PORT_SIG_MOT1P,PIN_SIG_MOT1P);

GPIO_ResetBits(PORT_SIG_MOT1M,PIN_SIG_MOT1M);

while(1)

{

//GPIO_SetBits(PORT_SIG_MOT1P, PIN_SIG_MOT1P);

Page 68: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

46

//GPIO_ResetBits(PORT_SIG_MOT1M, PIN_SIG_MOT1M);

GPIO_ResetBits(PORT_ADC_SELECT0,PIN_ADC_SELECT0);

GPIO_ResetBits(PORT_ADC_SELECT1,PIN_ADC_SELECT1);

uDelay(30);

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

//ADC_SoftwareStartConvCmd(ADC2, ENABLE);

uDelay(5);

sensor = (ADC_GetConversionValue(ADC1)) >>2;

//sensor_1 = (ADC_GetConversionValue(ADC2)) >>2;

//GPIO_ResetBits(PORT_SIG_MOT1P, PIN_SIG_MOT1P);

//GPIO_ResetBits(PORT_SIG_MOT1M, PIN_SIG_MOT1M);

TxDWord16(sensor);

TxDByte_PC('\r');

TxDByte_PC('\n');

//TxDWord16(sensor_1);

//TxDByte_PC('\r');

//TxDByte_PC('\n');

}

return 0;

}

5.3.1 Bloque 1

Las funciones que aparecen en el bloque 1 han sido descritas en el apartado 4.1.1. Por consiguiente, en

este punto solo se va a proceder a mencionarlas.

Configurar el sistema del reloj RCC_Configuration().

Configurar el reloj de interrupciones NVIC_Configuration().

Configuración de los puertos GPIO GPIO_Configuration().

Configuración del timer interno SysTick_Configuration().

Configuración del convertidor analogico digital ADC_Configuration().

5.3.2 Bloque 2

Estos sensores son dispositivos externos, los cuales necesitan conectarse al robot mediante los puertos,

trabajan con señales analógicas y como se sabe el escorpión funciona solo con señales digitales, por ello

se requiere una conversión analógica digital (ADC).

El robot dispone de 6 puertos equivalente a 6 entradas ADC, entonces necesitamos seleccionar la entrada

del ADC correspondiente al puerto donde está conectado el sensor y activar el ADC correspondiente a

esta última (ADC1 o ADC2).

Page 69: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

47

Programación en C del Robot Escorpión

La selección de la entrada ADC se hace mediante las funciones GPIO_SetBits y GPIO_ResetBits, y

consiste en fijar a uno o a cero los valores de cada una de las siguientes señales ADC_SELECT0 y

ADC_SELECT1según la tabla lógica (véase Tabla 5-1), en cuanto, a los adcs se activa el ADC1 si se

trata de las entradas 1,2 y 3 e el ADC2 si se trata de las entradas 4,5 y 6:

Nº ENTRADA ADC 1 2 3 4 5 6

Estado ADC_SELECT0 0 0 1 0 0 1

EstadoADC_SELECT1 0 1 0 0 1 0

EstadoADC1 1 1 1 0 0 0

EstadoADC2 0 0 0 1 1 1

Tabla 5–1. Selección de entrada ADC

Para nuestro caso a modo de ejemplo, se ha conectado un sensor en el Puerto 1, por lo que se seleccionará

la primera entrada del ADC.

GPIO_ResetBits(PORT_ADC_SELECT0,PIN_ADC_SELECT0);

GPIO_ResetBits(PORT_ADC_SELECT1,PIN_ADC_SELECT1);

Si el sensor conectado es un IR sensor se debe activar al principio de todo eso las salidas que modulan al

led emisor externo,ya que este último emite luz infrarroja por medio de un led emisor de IR por lo tanto

hay que descomentar:

GPIO_SetBits(PORT_SIG_MOT1P, PIN_SIG_MOT1P);

GPIO_ResetBits(PORT_SIG_MOT1M, PIN_SIG_MOT1M);

Una vez seleccionadola entrada del ADC, el siguiente paso es activar el ADC correspondiente a la

entrada según la tabla arriba, para ello, utilizamos la función ADC_SoftwareStartConvCmd de la librería

stm32f10x_adc que recibe como parámetros el ADC y el estado, en nuestro caso el estado es Enable

(Activar).

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

Para obtener los valores de entrada del sensor, ya en digital, llamamos a la función

ADC_GetConversionValue de la libreria stm32f10x_adc admite como parámetro el ADC usado.

La visualización del valor convertido en pantalla se consigue llamando a la función TxDWord16 que

imprime el valor de las variables que recibe como entrada , pero antes de eso tenemos que transformar los

valores en un rango entre 0 y 9 y en modo de codificación ASCII (carácter) y esto se consigue dividiendo

el valor convertido por 4 (ADC_GetConversionValue(ADC1))>>2.

Como se observa en el código se ha hecho uso de la función uDelay, ya que los dispositivos no son

instantáneos, y tienen un retardo, el cual para tenerlo en cuenta consideramos un tiempo muerto. Esta

última hace uso a las funciones del timer interno SysTick, para generar un delay de X microsegundos tal

que X es el parámetro de entrada.

Para el caso del Giro sensor, se requerirá activar un ADC adicional ya que este último dispone de dos

señales de entrada una para el eje X y otra para el Y, por lo tanto hay que descomentar todas la líneas

Page 70: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

48

señaladas en rojo.

En este caso RoboPlus es muy simple, no se necesita ninguna activación solo se hace una lectura del

puerto X en el cual se conecta el sensor especificado (sensor y sensor 1 son variables declaradas).

Caso de los sensores IR Y DMS conectados al puerto 1:

sensor=√PORT[1]:IR Sensor

sensor=√PORT[1]:DMS

Caso del Gyro Sensor, puerto 1 para los valores del eje X y el puerto 6 para los valores del eje Y:

sensor= ∞PORT[1]:User Device

sensor2= ∞PORT[6]:User Device

Para visualizar los valores, usamos a Printwith Line y asignarle las variables a imprimir:

Printwith Line = sensor

5.4 RC100

En esta rutina se trata de probar la comunicación entre el mando RC100 y el controlador a través de

ZigBee. La prueba consiste en pulsar cualquier botón del mando, recibir los datos mandados e imprimir el

valor correspondiente a cada botón en la pantalla.

Codigo en C :

Int main(void)

{

/* Bloque 1 */

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

SysTick_Configuration();

zgb_initialize(0);

USART_Configuration(USART_PC, 57600);

/* Bloque 2 */

while(1)

{

if(zgb_rx_check() == 1)

{

RcvData = zgb_rx_data();

TxDWord16(RcvData);

TxDByte_PC('\r');

Page 71: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

49

Programación en C del Robot Escorpión

TxDByte_PC('\n');

}

}

return 0;

}

5.4.1 Bloque 1

Las funciones que aparecen en el bloque 1 han sido descritas en el apartado 4.1.1. Por consiguiente, en

este punto solo se va a proceder a mencionarlas.

Configurar el sistema del reloj RCC_Configuration().

Configurar el reloj de interrupciones NVIC_Configuration().

Configuración de los puertos GPIO GPIO_Configuration().

Configuración del timer interno SysTick_Configuration().

Configuración del modulo ZigBee zgb_initialize(0).

Configuración de usart USART_Configuration(USART_PC, Baudrate_PC).

5.4.2 Bloque 2

El código de arriba sigue este orden, se debe comprobar primero si los datos han llagado o no a nuestro

controlador, mediante la función zgb_rx_check() , la cual pertenece a la librería ,devuelve un cero sino se

recibe nada y un uno en caso afirmativo .

En caso de recepción, se lee el dato recibido mediante la función zgb_rx_data() que pertenece a la

librería y se imprime el mismo usando la función TxDWord16(RcvData) .

Los datos imprimidos serán:

1 botón U

2 botón D

4 botón L

8 botón R

16 botón 1

32 botón 2

64 botón 3

128 botón 4

256 botón 5

512 botón 6

En cuanto al Roboplus, el procedimiento es idéntico, se comprueba la llegada de los datos mediante

Remocon Data Received si es FALSE o TRUE, si se cumple la condición TRUE se lee el dato

mediante RemoconRXD, se asigna a la variable RcvData y se imprime mediante Printwith

Line.

Page 72: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

50

5.5. Movimiento global

En esta última rutina se llega a un movimiento en el que se agruparan casi todos los elementos analizados

arriba dinamixels, botones y sensores, reflejando una armonía en ellos. Nuestro movimiento consiste en lo

siguiente: El robot camina al pulsar el botón U, una vez encuentre un obstáculo entonces levanta la cola para

atacar. Al levantar el robot hacia arriba ; en el sentido alrededor del eje X, el robot subirá las patas del lado

opuesto, o sea las de la derecha si se levanta la parte izquierda,y las de la izquierda si se levanta la parte

derecha.Pasamos al modo sleep pulsando el botón R.

Codigo en C:

int main(void)

{

/* Bloque 1 */

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

SysTick_Configuration();

ADC_Configuration();

dxl_initialize( 0, 1 );

USART_Configuration(USART_PC, Baudrate_PC);

/* Bloque 2 */

while(1)

{

if ( GPIO_ReadInputDataBit(PORT_SW_UP, PIN_SW_UP) != SET)

{

while (GPIO_ReadInputDataBit(PORT_SW_RIGHT, PIN_SW_RIGHT) != RESET)

{

forward();

mDelay(500);

forward1();

mDelay(500);

forward2();

mDelay(500);

forward3();

mDelay(500);

GPIO_ResetBits(PORT_ADC_SELECT0,PIN_ADC_SELECT0);

GPIO_ResetBits(PORT_ADC_SELECT1,PIN_ADC_SELECT1);

mDelay(30);

Page 73: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

51

Programación en C del Robot Escorpión

/* Start ADC1 Software Conversion */

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

mDelay(30);

POT_1 = (ADC_GetConversionValue(ADC1))>>2;

/* Start ADC2 Software Conversion */

ADC_SoftwareStartConvCmd(ADC2, ENABLE);

mDelay(30);

POT_3= (ADC_GetConversionValue(ADC2))>>2;

/* Para compensar la diferencia en velocidades.

Sensores actuan mas rápido que los dynamixels */

mDelay(128);

if(POT_1>=200)

{

attack();

mDelay(50);

attack1();

mDelay(500);

attack2();

}

else if(POT_3>270)

{

left();

mDelay(300);

left1();

mDelay(1000);

PosIni();

}

else if(POT_3<245 )

{

right();

mDelay(300);

right1();

mDelay(1000);

PosIni();

}

}

}

Page 74: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

52

else if( GPIO_ReadInputDataBit(PORT_SW_RIGHT, PIN_SW_RIGHT) != SET)

{

sleep();

sleep1();

}

}

return 0;

}

5.4.1 Bloque 1

Las funciones que aparecen en el bloque 1 han sido descritas en el apartado 4.1.1. Por consiguiente, en

este punto solo se va a proceder a mencionarlas.

Configurar el sistema del reloj RCC_Configuration().

Configurar el reloj de interrupciones NVIC_Configuration().

Configuración de los puertos GPIO GPIO_Configuration().

Configuración del timer interno SysTick_Configuration().

Configuración del convertidor analogico digital ADC_Configuration().

Configuración de los dinamixels dxl_initialize( 0, 1 ).

Configuración de usart USART_Configuration(USART_PC, Baudrate_PC).

5.4.2 Bloque 2

Como se puede observar en el código de arriba, para implementar esta ultima rutina, se utiliza un bucle

infinito While (1) para lograr el funcionamiento indefinido del proceso, dentro de este bucle se hace uso

de un formato condicional (if ) y (elseif), con el cual construimos las dos condiciones requeridas.

Si se cumple la primera, que es la lectura del botón U, entramos en un bucle que hara que el robot ande

mientras que no se pulsa el botón R.

El movimiento andar consiste en la ejecución secuencial y repetitiva de cuatro bloques funcionales,

correspondientes a las funciones forward (véase Figura 5-1), forward1 (véase Figura 5-2), forward2

(véase Figura 5-3), y forward3 (véase Figura 5-4). Cada una de estas funciones describe un vector de

posiciones y velocidades de cada dinamixel a las que debe tender el robot.

Page 75: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

53

Programación en C del Robot Escorpión

Figura 5-1. Función forward

Figura 5-2. Función forward1

Page 76: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

54

Figura 5-3. Función forward2

Figura 5-4. Función forward3

Page 77: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

55

Programación en C del Robot Escorpión

Este comportamiento se vera afectado si el robot detecta un obstaculo o un levantamiento. A continuación

se explican cada una de estos casos.

En este mismo bucle se activaran el sensor de distancia DMS conectado al Puerto 1 y el Gyro-sensor XY

conectado solo al Puerto 4 ya que solo haremo uso del giro alrededor del eje X ,a partir de dichas lecturas

logramos sacar las conclusiones oportunas para tomar la decisión del acondicionamiento con un (if ).

La primera condición se forma a partir de la lectura del DMS. Si se detecta un obstaculo a una distancia

menor o igual que 200 esto equivale a 5 centimetros, el robot entra en modo ataque mediante las

funciones attack (véase Figura 5-5), attack1 (véase Figura 5-6) y attack2 (véase Figura 5-7) que

consisten en tres acciones sucesivas: inclinarse hacia delante, doblar la cola y levantarla.

Figura 5-5. Función attack

Page 78: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

56

Figura 5-6. Funcion attack1

Figura 5-7. Función attack2

En cuanto a las dos condiciones que quedan, se construyen apartir de las lecturas del Gyro sensor. Si se

detecta un valor menor que 245 esto quiere decir una velocidad angular de valor -9 grados por segundo,

entonces estamos detectando una elevación desde la izquierda, en consecuencia de esto, el robot levantara

las patas derechas en el siguiente orden, primero levanta la primera y la tercera pata aplicando la función

right (véase Figura 5-8) y después la segunda pata mediante right1 (véase Figura 5-9), luego con la

función PosIni el robot consigue volver a la posición de equilibrio.

Page 79: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

57

Programación en C del Robot Escorpión

Figura 5-8. Función right

Figura 5-9. Funcion right1

Si por lo contrario se detecta un valor mayor que 270 lo que equivale a una velocidad angular de valor 26

grados por segundo, es decir un levantamiento desde la derecha entonces la acción seria la opuesta o sea

el robot levanta las patas izquierdas con el mismo procedimiento explicado en la condición anterior

usando las funciones left (véase Figura 5-10) y left1 (véase Figura 5-11) y luego vuelve a la posición

de equilibrio

Page 80: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

58

Figura 5-10. Función left

Figura 5-11. Función left1

Page 81: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

59

Programación en C del Robot Escorpión

Tras pulsar el boton R, el robot pasa al modo reposo mediante las funciones sleep() (véase Figura 5-

12) y sleep1() (véase Figura 5-13), la primera hace que el robot se estire y la segunda es para un ligero

y suave levantamiento la cabeza hacia arriba .

Figura 5-12. Función sleep

Page 82: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación

60

Page 83: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

61

6 CONCLUSÍON

En este proyecto, se ha programado un robot Escorpión en el lenguaje C, logrando un movimiento global

del mismo, y por tanto, el objetivo del proyecto se ha cumplido satisfactoriamente.

En el desarrollo del proyecto se han encontrado las limitaciones de hardware y software que se comentan

a continuacion:

- Sensor IR: Al probar rutinas solo con el sensor, como en el apartado 5.3, su funcionamiento fue

correcto, pero al introducirlo en una rutina para el movimiento global no se ha podido detectar

ninguna lectura del sensor. el problema puede ser una causa por una limitación del software

(librería) o bien del hardware.

- Mando RC100: Al probar rutinas solo con el RC100, como en el apratado 5.4, su funcionamiento

fue correcto, pero al combinarlo con los dynamixels, se sale del bucle principal de control (bucle

infinito) justo al ejecutar las instrucciones correspondientes a los dynamixels. El problema podria

ser debido a, una incorrecta gestión de interrupciones por compartir algún recurso hardware, o a

una mala definición de interrupciones en la librería.

- Punto flotante: El controlador no soporta punto flotante lo que implica una limitación en el tipo

de variables empleadas en el desarrollo del proyecto.

Como desarollos futuros se propone cambiar el microcontrolador por otro más potente y desarollado, con una

librería más extensa, para incluir más funcionalidades y una versatilidad geomecanica además de lograr una

concurrencia entre rutinas para un movimiento correcto.

También me gustaría proponer otro proyecto sentando las bases de una nueva tecnología. En él se programaría

el robot de manera que respondiera a órdenes telepáticas sin necesidad de controlarlo manualmente. Sería

mirar más alla, como parteaguas de un nuevo mañana y de una nueva visión del futuro que nos espera.

Como conclusión personal puedo decir que el desarrollo de este proyecto me ha permitido adquirir más

conocimientos y mejorar los que tenía sobre el lenguaje C. Este lenguaje que he tenido la suerte de usar

durante toda mi carrera, y me he dado cuenta de lo potente que es después de la realización de este trabajo.

Ademas gracias a este proyecto he podido ampliar mis conocimientos en robótica y microcontroladores y

experimentar el funcionamiento de un robot comercial.

Por último, aparte de de lo anterior, ha sido un verdadero placer realizar un proyecto fin de carrera como este,

por su aspecto divertido y instructivo. Ya que siempre he estado atraída por el mundo de la robotica.

Page 84: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

62

Programación en C del Robot Escorpión

Page 85: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

63

BIBLIOGRAFÍA

[1] ROBOTIS site: http://support.robotis.com/.

[2] Tutorial bioloid site :http://softwaresouls.com/.

[3] Cygwin site: https://www.cygwin.com/.

[4] Deascarga de librerias site : http://support.robotis.com/en/.

[5] AVR LIBC site: http://www.nongnu.org/avr-libc/user-manual/overview.html.

[6] BIO_PRM_Scorpion_ASM_EN(pdf).

[7] ARM site : https://www.arm.com/products/processors/.

[8] STM32F103RE site : http://www2.st.com/.

Page 86: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación en C del Robot Escorpión

Page 87: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

ANEXOS

1 Hardware Port Map cm530

El siguiente mapa (véase FiguraA-1) muestra la funciónes principales de los pines del controlador CM530.

Para cada puertoy funcionalidad interna se propocionan macros y librerías para un fácil acceso y control

(véase Tabla A-1).

Figura A-1. Mapa de los puertos del CM530

Page 88: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación en C del Robot Escorpión

Tabla A-1 Mapeo de los puertos del CM530

Page 89: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

2 Codigo en RoboPlus

Page 90: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

Programación en C del Robot Escorpión

Page 91: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

[CM-530]-Dynamixels

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

Page 92: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

[CM-530]-Botones

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

18:

19:

20:

21:

22:

23:

24:

Page 93: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

[CM-530]-Sensores

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

18:

19:

20:

21:

22:

23:

24:

25:

26:

27:

28:

Page 94: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

[CM-530]-RC100

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

Page 95: Proyecto fin de carrera. Programacion en C del robot Escorpion..pdf

[CM-530]-Movimiento global

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

18:

19:

20:

21:

22:

23:

24:

25:

26:

27:

28:

29: