Upload
votruc
View
230
Download
4
Embed Size (px)
Citation preview
, 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
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
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
El Secretario del Tribunal
vii
A mi familia, en especial a mis padres,
porque sin ellos todo esto
no habría sido posible.
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.
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.
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.
Í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
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
Í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
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
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
xix
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
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).
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
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.
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:
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.
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
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
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.
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
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).
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.
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.
Hardware
14
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
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:
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.
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).
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).
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
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
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)
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).
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
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
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
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.
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.
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
Software
30
31
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
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
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);
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);
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.
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);
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);
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);
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.
Librerías
40
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
.
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
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);
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.
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);
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).
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
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');
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.
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);
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();
}
}
}
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.
53
Programación en C del Robot Escorpión
Figura 5-1. Función forward
Figura 5-2. Función forward1
Programación
54
Figura 5-3. Función forward2
Figura 5-4. Función forward3
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
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.
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
Programación
58
Figura 5-10. Función left
Figura 5-11. Función left1
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
Programación
60
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.
62
Programación en C del Robot Escorpión
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/.
Programación en C del Robot Escorpión
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
Programación en C del Robot Escorpión
Tabla A-1 Mapeo de los puertos del CM530
2 Codigo en RoboPlus
Programación en C del Robot Escorpión
[CM-530]-Dynamixels
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
[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:
[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:
[CM-530]-RC100
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
[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: