102
BRAZO DE ROBOT INDICE iÍNDICE 1. INTRODUCCIÓN ................................................................................................... 4 1.1. ANTECEDENTES ............................................................................................ 4 1.2. OBJETIVOS ..................................................................................................... 4 1.3. ESPECIFICACIONES ...................................................................................... 5 1.4. HERRAMIENTAS DE DESARROLLO ............................................................. 5 2. MEMORIA TÉCNICA ............................................................................................. 7 2.1. ESTUDIO DE VIABILIDAD .... ......................................................................... 7 2.2. BRAZO ROBOT ............................................................................................... 8 2.2.1. ESPECIFICACIONES ............................................................................... 9 2.2.2. CARACTERÍSTICAS ESTRUCTURALES ................................................ 9 2.2.3. CAMPO DE TRABAJO Y DIMENSIONES ................................................ 10 2.2.4. CARACTERISTICAS DE LA UNIDAD DE CONTROL .............................. 11 2.2.5. MODOS DE FUNCIONAMIENTO ............................................................. 12 2.2.6. ALIMENTACIÓN ....................................................................................... 12 2.2.7. ANÁLISIS Y PUESTA EN MARCHA ........................................................ 13 2.2.8. TAREAS REALIZABLES Y APLICACIONES ........................................... 13 2.3. SERVOS ......................................................................................................... 14 2.3.1. ¿POR QUÉ SERVOS? ............................................................................ 14 2.3.2. CARACTERÍSTICAS TÉCNICAS ............................................................. 16 2.3.3. ¿CÓMO ES UN SERVO MECÁNICAMENTE? ...................................... ..16 2.3.4. FUNCIONAMIENTO ................................................................................. 17 2.3.5. CONEXIONADO ....................................................................................... 18 2.4. CEREBRO ....................................................................................................... 18 2.4.1. ELECTRONICA DE CONTROL ................................................................ 18 2.4.1.1. CONCEPTO DE MICROCONTROLADOR ........................................ 18 2.4.1.2. APLICACIONES DE LOS MICROCONTROLADORES ................... . 20 2.4.1.3. ALTERNATIVAS DE DISEÑO ........................................................... 21 2.4.1.4. PIC 16F873 ....................................................................................... 22 2.4.1.5. CRISTAL DE CUARZO ...................................................................... 23 2.4.1.6. MAX 232 ............................................................................................. 25 2.4.1.7. EEPROM ............................................................................................ 26

construir un robot con pic

Embed Size (px)

Citation preview

Page 1: construir un robot con pic

BRAZO DE ROBOT INDICE

iÍNDICE

1. INTRODUCCIÓN ................................................................................................... 4

1.1. ANTECEDENTES ............................................................................................ 4

1.2. OBJETIVOS ..................................................................................................... 4

1.3. ESPECIFICACIONES ...................................................................................... 5

1.4. HERRAMIENTAS DE DESARROLLO ............................................................. 5

2. MEMORIA TÉCNICA ............................................................................................. 7

2.1. ESTUDIO DE VIABILIDAD .... ......................................................................... 7

2.2. BRAZO ROBOT ............................................................................................... 8

2.2.1. ESPECIFICACIONES ............................................................................... 9

2.2.2. CARACTERÍSTICAS ESTRUCTURALES ................................................ 9

2.2.3. CAMPO DE TRABAJO Y DIMENSIONES ................................................ 10

2.2.4. CARACTERISTICAS DE LA UNIDAD DE CONTROL .............................. 11

2.2.5. MODOS DE FUNCIONAMIENTO ............................................................. 12

2.2.6. ALIMENTACIÓN ....................................................................................... 12

2.2.7. ANÁLISIS Y PUESTA EN MARCHA ........................................................ 13

2.2.8. TAREAS REALIZABLES Y APLICACIONES ........................................... 13

2.3. SERVOS ......................................................................................................... 14

2.3.1. ¿POR QUÉ SERVOS? ............................................................................ 14

2.3.2. CARACTERÍSTICAS TÉCNICAS ............................................................. 16

2.3.3. ¿CÓMO ES UN SERVO MECÁNICAMENTE? ...................................... ..16

2.3.4. FUNCIONAMIENTO ................................................................................. 17

2.3.5. CONEXIONADO ....................................................................................... 18

2.4. CEREBRO ....................................................................................................... 18

2.4.1. ELECTRONICA DE CONTROL ................................................................ 18

2.4.1.1. CONCEPTO DE MICROCONTROLADOR ........................................ 18

2.4.1.2. APLICACIONES DE LOS MICROCONTROLADORES ................... . 20

2.4.1.3. ALTERNATIVAS DE DISEÑO ........................................................... 21

2.4.1.4. PIC 16F873 ....................................................................................... 22

2.4.1.5. CRISTAL DE CUARZO ...................................................................... 23

2.4.1.6. MAX 232 ............................................................................................. 25

2.4.1.7. EEPROM ............................................................................................ 26

Page 2: construir un robot con pic

BRAZO DE ROBOT INDICE

- 2 -

2.4.2. SOFTWARE DE CONTROL ..................................................................... 29

2.4.2.1. PWM PARA LOS SERVOS ................................................................ 29

2.4.2.2. MOVIMIENTO LINEAL ....................................................................... 31

2.4.2.3. TRAMA DE COMUNICACIÓN RS-232 .............................................. 32

2.5. ELECCION DE LA BATERIA ........................................................................... 33

2.5.1. EFECTO MEMORIA .................................................................................. 33

2.5.2. TIPOS DE BATERIAS RECARGABLES ................................................... 33

2.5.3. AUTONOMIA ............................................................................................. 34

2.5.4. ¿QUÉ HACER CON LAS BATERIAS USADAS? ...................................... 37

3. INSTALACION DEL SOFTWARE .......................................................................... 38

3.1. REQUERIMIENTOS ........................................................................................ 38

3.2. INSTALACION ................................................................................................. 38

4. CONCLUSIONES ................................................................................................... 39

5. PRESUPUESTO ..................................................................................................... 40

6. BIBLIOGRAFÍA ...................................................................................................... 43

7. ANEXOS ................................................................................................................. 44

7.1. ANEXO 1. COMUNICACIÓN RS-232 .............................................................. 44

7.1.1. FUNCIONAMIENTO DEL INTERFACE RS-232 ....................................... 44

7.1.2. COMUNICACIÓN RS-232 CON VISUAL BASIC ...................................... 47

7.1.3. COMUNICACIÓN RS-232 CON PIC 16F873 ........................................... 47

7.1.4. CONEXIONADO ....................................................................................... 49

7.2. ANEXO 2. BUS I2C ......................................................................................... 51

7.2.1. DESCRIPCIÓN Y FUNCIONAMIENTO .................................................... 51

7.2.2. PROTOCOLO ........................................................................................... 54

7.2.3. APLICACIONES ....................................................................................... 55

7.2.4. PIC 16F873 .............................................................................................. 55

7.2.5. EEPROM .................................................................................................. 56

7.2.5.1. DIRECCIONAMIENTO DE LA MEMORIA ......................................... 56

7.2.5.2. BYTE WRITE ..................................................................................... 57

Page 3: construir un robot con pic

BRAZO DE ROBOT INDICE

- 3 -

7.2.5.3. PAGE WRITE .................................................................................... 58

7.2.5.4. CURRENT ADDRESS READ ............................................................ 58

7.2.5.5. RANDOM READ ................................................................................ 59

7.2.5.6. SEQUENTIAL READ ......................................................................... 59

7.3. ANEXO 4. METODO DE LA BURBUJA .......................................................... 60

7.4. ANEXO 5. PLACA DE CIRCUITO IMPRESO ................................................. 61

7.4.1. ESQUEMA ................................................................................................ 62

7.4.2. PCB ........................................................................................................... 63

7.5. ANEXO 6. LISTADO DE PROGRAMA Y ORGANIGRAMAS ......................... 66

7.6. ANEXO 7. DATA SHEET´S ............................................................................102

7.7. ANEXO 8. CD-ROM .......................................................................................103

Page 4: construir un robot con pic

BRAZO DE ROBOT INTRODUCCION

1. Introducción

1.1. Antecedentes

Hace algunos años realicé un cursillo de programación de autómatas en el instituto

donde estudié la Formación Profesional de segundo grado.

En este cursillo había una maqueta que tenía un brazo de robot que se podía

controlar desde un ordenador personal.

Aunque el cursillo no contenía en su temario realizar ninguna práctica con el brazo

de robot, el profesor viendo, el interés que mostraban mis compañeros y yo mismo,

nos dio unas nociones básicas de robótica.

Después ese interés por los robots se fue incrementando por algunos trabajos que

he tenido, que aunque yo no he programado los robots, mis compañeros me han

enseñado los robots funcionando en algunas empresas importantes.

Por estos motivos decidí construir un brazo de robot, para que cualquier persona

que lo desee de cualquier edad, pueda entrar en este apasionante mundo.

1.2. Objetivos

El objetivo de este proyecto es el de conseguir construir un brazo de robot. Se

pretende implementar el brazo mecánico con toda su lógica de control.

El brazo de robot tendrá varios elementos que hay que diseñar e implementar:

♦ Brazo mecánico: Es el brazo propiamente dicho, es decir, el elemento que

interactuará físicamente con su entorno.

♦ Circuito electrónico de control: Es toda la electrónica necesaria para el

control del brazo mecánico.

♦ Software: Son los programas y rutinas necesarios para que el brazo de

robot funcione de manera correcta.

El brazo de robot debe funcionar de manera autónoma, aunque para su

programación se utilizará un ordenador personal.

Page 5: construir un robot con pic

BRAZO DE ROBOT INTRODUCCION

- 5 -

1.3. Especificaciones

La implementación del brazo robot se ha dividido en tres partes o módulos:

1) Hardware: Esta parte del proyecto consiste en el diseño y desarrollo físico

de la placa de circuito impreso que contendrá toda la electrónica del brazo

robot.

2) Software: Es la parte donde se desarrolla por un lado, el programa que irá

grabado en el Pic controlando el brazo robot y por otro lado el programa

que se ejecutará en el PC para poder decidir la secuéncia que ejecutará el

robot.

3) Mecánica: Aquí es donde se construirá toda la estructura mecánica del

robot, es decir, todas las articulaciones del brazo con su correspondientes

motores actuadores.

1.4. Herramientas de desarrollo Para desarrollar las diferentes partes que corresponden al brazo robot, se han

utilizado una serie de herramientas de trabajo. El motivo de utilizar estas herramientas

se explica a continuación:

♦ MPLAB: Es una herramienta que se utiliza para el desarrollo de aplicaciones

Page 6: construir un robot con pic

BRAZO DE ROBOT INTRODUCCION

- 6 -

con microcontrolador. Esta herramienta permite la creación y simulación del

código que posteriormente se ejecutará dentro de un microcontrolador. Este

entorno, funciona tipo container, es decir, sus distintas opciones son asociadas a

programas que serán ejecutados cuando se las pulse. De este modo bastará con

definirle un ensamblador, un emulador o un grabador distinto a los que lleva por

defecto para incorporarlo inmediatamente. El hecho de haber utilizado el MPLAB

es la disponibilidad de adquisición, podiéndose bajar directamente a través de

www.microchip.com.

♦ Visual Basic: Los sistemas operativos encargados de gestionar los

primeros ordenadores estaban basados en texto y eran gobernados mediante

complejas líneas de comandos.

Actualmente manejar un ordenador es algo sumamente sencillo gracias a

los entornos gráficos, que de una forma muy intuitiva representan los distintos

elementos con los que es posible trabajar.

La aparición de Windows no simplificó las cosas al programador. La única

forma de escribir una aplicación para Windows, pasaba por conocer de forma

exhaustiva el extenso conjunto de funciones de Windows.

La aparición de Visual Basic supuso un giro total, no es necesario conocer el

interior de Windows ni ninguna de sus funciones, bastando con diseñar la

interfaz de una forma muy intuitiva, principalmente con operaciones de ratón y

escribir algo de código, utilizando un lenguaje tan fácil como es el Basic.

♦ Ranger: Este es un entorno gráfico para el diseño de las placas de circuito

impreso. Primeramente se debe dibujar el esquema teórico y una vez se

han subsanado todos los errores que se hayan podido producir se pasa a

colocar los encapsulados de los componentes en el lugar dentro de la placa

que posteriormente se fabricará.

El hecho de haber utilizado Ranger para el desarrollo de la placa, se

debe a que es el software que está instalado en la escuela para tal fin.

♦ Programador de pic´s y emulador: Para grabar el código en el Pic, es

necesario haberlo escrito y depurado con anterioridad. Una vez se ha visto

que el código realiza realmente las tareas para las que se ha escrito, es

necesario grabarlo en el microcontrolador o en una EEPROM externa,

según cada aplicación. Para grabar código en el pic se ha utilizado “Micro

Page 7: construir un robot con pic

BRAZO DE ROBOT INTRODUCCION

- 7 -

Pic Trainer”, se pueden ver sus características en

www.microcontroladores.es.

Page 8: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

2. Memoria Técnica

2.1. Estudio de viabilidad

Después de analizar detenidamente la idea original, observé que me enfrentaba a

varías circunstancias que debía decidir, antes de ponerme a trabajar en el brazo de

robot. Estas decisiones debían ser muy precisas, ya que de ellas dependería mi

trabajo posterior.

Uno de los factores más críticos era la parte mecánica. Estudiando la mecánica vi

que necesitaba poder mover varias articulaciones y definir que actuador iba a utilizar.

Me decidí por unos motores con engranajes para multiplicar el par del eje, denominado

“servos”.

Otra dificultad era el peso, debía utilizar un material lo más ligero que pudiese

encontrar y que a la vez me proporcionara la robustez mecánica.

Debía conseguir también una manera de disminuir en lo posible cargar

excesivamente peso sobre el motor instalado en la base, para ello tuve que buscar un

cojinete que aguantara todo el peso, mientras que el motor solo acompañaba el giro.

Para la parte electrónica de control, tuve que buscar un microcontrolador acorde

con las características que necesitaba.

Page 9: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 9 -

2.2. Brazo robot

En este apartado realizaremos un estudio de las características físicas, eléctricas,

mecánicas y funcionales del brazo robot y del controlador.

Page 10: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 10 -

2.2.1. Especificaciones

En la siguiente tabla se desglosan las características físicas del brazo robot

que hemos construido en este proyecto:

BRAZO ROBOT

Estructura mecánica: Articulado

Número de ejes: 3

Radio máximo de operación: 160 mm

Mano: 20 mm

Movimiento de los ejes:

Eje 1: base:

Eje 2: hombro:

Eje 3: codo:

Rango Velocidad máxima

0º -- 180º 36º/seg.

0º -- 180º 36º/seg.

0º -- 180º 36º/seg.

Referencia (sincronismo): Posición fija en todos los ejes en 0º

Exactitud: +/- 1º

Actuadores: 3 servos controlados con PWM

Consumo máximo: 300 mA

Alimentación: Batería NiMH, 4´8 V y 650 mAh

Capacidad de carga: 75 g. (Carga útil)

Peso: 1 Kg

Rango de temperatura: 0ºC – 85ºC

Tabla 2.2. Características técnicas del brazo robot.

2.2.2. Características estructurales

El brazo robot construido para este proyecto, es un robot de estructura articulada.

Está compuesto por 3 ejes de movimiento: la base que gira el brazo en el plano

horizontal, el hombro y el codo que varían la inclinación correspondiente al plano

vertical.

La muñeca y mano son fijas, es decir, sin movimiento alguno, aunque tampoco es

necesario, ya que el brazo se utiliza para desplazar objetos de un lugar a otro con la

ayuda de algún soporte, es un robot transportador de objetos.

Como consecuencia tendrá 3 grados de libertad. Esto permitirá alcanzar posiciones

y orientaciones pertenecientes a un amplio campo de trabajo.

Page 11: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 11 -

Eje nº Nombre Movimiento Motor nº

1 Base Gira el cuerpo 1

2 Hombro Eleva y baja el brazo superior 2

3 Codo Eleva y baja el antebrazo 3

Tabla 2.3. Elementos que forman el sistema.

Los motores utilizados en este robot son los que se denominan “servos” y se

explican en detalle en el punto en el punto 2.3.

2.2.3. Campo de trabajo y dimensiones

La longitud de los elementos y los grados de rotación de las articulaciones

determinan el campo de trabajo del robot. En las siguientes figuras se muestra las

dimensiones del brazo de robot y su campo de trabajo:

Dimensiones:

Figura 2.4. Dimensiones del brazo de robot.

CONTROL

130

30

40

40

80 80 20

Eje 1

Eje 3

Eje 2

Page 12: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 12 -

Campo de trabajo:

Figura 2.5. Campo de trabajo del brazo de robot.

2.2.4. Características y funciones de la unidad de control

Las funciones del controlador son gestionar que el brazo de robot realice todas las

funciones para las que fue construido, es decir:

♦ Ejecutar infinitamente la secuencia grabada en la EEPROM1, lo que se ha

denominado “Modo autónomo de funcionamiento”.

♦ Ser capaz de grabar en la EEPROM la secuencia deseada desde el

interfície de programación creado, utilizando el protocolo de comunicación

RS-2322.

1 Memoria de solo lectura programable electricamente. 2 Ver anexo 1.

Page 13: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 13 -

♦ Borrar la EEPROM, para poder grabar una nueva secuencia de

movimientos, cuando se le dé la orden desde el interfície de programación.

♦ Controlar que todas las articulaciones se muevan correctamente a la

posición indicada.

Para conseguir que el brazo de robot pueda realizar con éxito todas las funciones

para las que la unidad de control se ha implementado, esta dispone de:

♦ Una unidad central de proceso, PIC 16F873.

♦ EEPROM de 2K para guardar la secuencia que tendrá que ejecutar.

♦ Componentes para la comunicación, que posibilitan la transmisión y

recepción de la información según el estándar RS-232.

♦ Batería de alimentación.

2.2.5. Modos de funcionamiento

El robot dispone de dos modos de funcionamiento:

1) Modo autónomo: El brazo mecánico del robot, ejecuta indefinidamente,

la secuencia grabada en la memoria con anterioridad.

2) Modo programación: Si la lógica de control está en este estado, se

graba una secuencia de ejecución en la memoria con ayuda de un ordenador

personal o portátil.

2.2.6. Alimentación

La alimentación de la lógica de control y los motores de cada articulación, se realiza

con una batería que tiene unas características de tensión e intensidad: 4´8 V y 650

mAh. Con esta batería se consigue una autonomía de 3´5 horas, en modo de

funcionamiento autónomo y transportando el peso máximo de carga útil.

Page 14: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 14 -

2.2.7. Análisis y puesta en marcha

La instalación y manejo del robot está sujeta a una serie de normas de seguridad.

Estas normas hacen referencia a peligros de tipo eléctrico, a colisiones del robot con

objetos próximos a él e incluso a la colisión con personas que permanezcan cerca del

campo de acción.

Existen una serie de requisitos previos que afectan al modo en que se va a utilizar

el robot antes de su propia instalación. Estos requisitos tienen que cumplirse en la

medida de lo posible, si se quiere que la utilización del robot sea lo más provechosa y

segura posible. Tales factores hacen referencia al estudio previo de las tareas que se

quiere automatizar.

2.2.8. Tareas realizables y aplicaciones

El robot construido tiene fines educativos principalmente, debido a sus

dimensiones, rango de articulaciones, precisión en los movimientos y peso que puede

desplazar.

Las tareas más adecuadas son las que no requieran demasiada precisión, ya que

no permite definir diferentes precisiones en función del movimiento, ya que siempre

trabaja con la misma de 1 grado.

Este robot también se podría utilizar como reclamo publicitario, en el escaparate de

alguna tienda, por ejemplo, en una tienda de informática en continuo funcionamiento,

cambiando de sitio un disco CD y efectuando un saludo, repitiendo el ciclo

indefinidamente.

Page 15: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 15 -

2.3. Servos

Como ya se ha comentado con anterioridad, el tipo de motores que se utilizan

son los denominados “servos” que a continuación se explican con detalle.

El servo es un potente dispositivo que dispone en su interior de un pequeño

motor con un reductor de velocidad y

multiplicador de fuerza. Dispone también de

un circuito que gobierna el sistema. El

recorrido del eje de salida es de 180º en la

mayoría de ellos, pero puede ser fácilmente

modificado para tener un recorrido libre de

360º.

Fotografía 2.6. Fotografía de un servo.

2.3.1. ¿Por qué servos?

El brazo de robot está pensado para poder desplazar un peso máximo de 75

gramos.

También sabemos que el motor que necesitará tener más par de giro, será el de la

base, que tiene que poder llevar, además de la carga útil, toda la estructura del brazo,

al contrario que los otros, que solo han de actuar sobre una parte de la estructura.

Se ha definido que la palanca del brazo será de 18 cm, y el peso de la estructura de

aproximadamente 200 gramos, distribuidos como muestra la figura siguiente.

Figura 2.7. Centros de gravedad de las articulaciones y carga del brazo.

MOTOR Hombro

50 gramos

ARTICULACION 150 gramos MOTOR Codo

50 gramos

ARTICULACION 250 gramos

CARGA UTIL75 gramos

4 cm 4 cm 4 cm 5 cm

Page 16: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 16 -

La figura muestra las distribuciones del centro de gravedad de la estructura

mecánica y de la carga útil, para poder realizar el cálculo del par que el motor de base,

que es el que más fuerza tiene que realizar, puesto que es el que debe actuar sobre

todo el brazo y su carga. Vemos que cada articulación pesa 50 gramos, así como los

motores.

Si miramos las características del servo cuando está alimentado con la tensión más

baja de funcionamiento, vemos que a 4´8 V puede dar 3´3 Kg*cm.

En los cálculos realizados anteriormente de la estructura y la carga útil, se ve que el

motor necesita un par mínimo de 2´475 Kg*cm. Así se ve que el motor podrá con el

peso que tiene que llevar, con un coeficiente de seguridad de:

� �×=4

1

)( palancalongitudpesobasemotorPar

cmgcmgcmgcmgcmgbasemotorPar ×=×+×+×+×= 475.217751250850450

331́*4752́

*33́===

cmKgcmKg

necesarioParmotordelPar

seguridaddeeCoeficient

Page 17: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 17 -

Características técnicas

En la siguiente tabla pueden observarse las características que posee un servo de

la marca Hitec, concretamente “HS-325BB” que es el utilizado en este brazo de robot:

Hitec HS-325BB

Tensión de alimentación: 4´8 V – 6 V

Par a 6 V: 3´7 Kg / cm

Par a 4´8 V: 3´3 Kg / cm

Velocidad máxima: 60º /seg

Medidas (longitud x anchura x altura): 41 x 20 x 37 mm

Peso: 44´5 gramos

Tipo de rodamiento: Bolas

Tabla 2.8. Características técnicas del servo utilizado.

2.3.2. ¿Cómo es un servo mecánicamente?

A continuación se muestra la fotografía de un servo desmontado en la que

se puede apreciar los distintos dispositivos de los que está compuesto. Estos

son:

♦ Carcasa exterior.

♦ Engranajes reductores.

♦ Motor eléctrico.

♦ Potenciómetro solidario al

eje.

♦ Control electrónico de

control.

Fotografía 2.9. Servo desmontado.

Page 18: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 18 -

2.3.3. Funcionamiento

El control de posición lo efectúa el servo internamente mediante un

potenciómetro que está conectado mecánicamente al eje de salida y controla

una señal PWM1

interna. Mediante un

sistema diferencial,

se compara la señal

PWM interna con

otra señal PWM que

le llega desde el

exterior. Con el

resultado obtenido en esta comparación, el control electrónico interno actúa

sobre el eje de salida hasta que los valores de las señales PWM interna y

externa se igualen, entonces el eje de salida se para en la posición indicada.

Cuando el servo llega a la posición destino deseada, el motor deja de

consumir corriente y tan solo circula una pequeña corriente hasta el circuito

interno. Si forzamos el servo, moviendo el eje de salida, el control diferencial

interno lo detecta y envía la corriente necesaria al motor para corregir la

posición. Para controlar el servo hay que aplicar un pulso de duración y

frecuencia específicas. A continuación se muestra la señal de control y como

actúa sobre el servo:

Figura 2.11. Relación entre la señal PWM y el eje de salida.

1 Pulse Width Modulate. Señal Modulada en Anchura

Page 19: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 19 -

2.3.4. Conexionado

Todos los servos disponen de tres cables, dos para la alimentación Vcc y Gnd y

otro cable para aplicar el tren de pulsos de

control, con este tren de pulsos se conseguirá

que el circuito interno de control ponga el servo

en la posición indicada por la anchura de pulso.

F

F

i

Figura 2.12. Detalle del conector.

2.4. Cerebro

En este punto se trata en detalle la unidad de control y todas las funciones que

debe realizar:

2.4.1. Electrónica de control

Es el hardware necesario, para poder tener un control exacto del brazo de robot:

2.4.1.1. Concepto de microcontrolador

Un microcontrolador es un circuito integrado, con alta escala de integración y

usualmente dispone de los siguientes componentes:

♦ Unidad central de proceso.

♦ Memoria RAM para contener los datos.

♦ Memoria para programa tipo ROM/PROM/EEPROM/FLASH.

♦ Líneas de E/S para comunicarse con el exterior.

♦ Periféricos. Estos pueden ser, temporizadores, puertas serie, modulador de

anchura de pulsos entre otros.

Page 20: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 20 -

♦ Generador de impulsos de reloj que sincronizan el funcionamiento del

sistema.

Figura 2.13. El microcontrolador es un sistema cerrado.

Al utilizar un microcontrolador se dispone de las siguientes ventajas:

♦ Aumento de prestaciones: Un mayor control sobre un determinado

elemento que representa una mejora considerable del mismo.

♦ Aumento de la fiabilidad: Al reemplazar un elevado número de elementos

por un microcontrolador, disminuye el riesgo de averías y se precisan

menos ajustes.

♦ Reducción del tamaño del producto acabado: La integración del

microcontrolador en un chip disminuye, el volumen, la mano de obra y los

stocks.

♦ Mayor flexibilidad: Las características de control están programadas por lo

que su modificación sólo necesita cambio en el programa de instrucciones.

Antes de seleccionar un microcontrolador es imprescindible analizar los requisitos

de la aplicación:

♦ Procesamiento de datos: Puede ser que el microcontrolador realice cálculos

críticos en un tiempo limitado.

♦ Entrada/Salida: Se tiene que identificar la cantidad y tipo de señales a

controlar.

♦ Consumo: Algunos productos que incorporan microcontroladores están

alimentados con baterías.

Page 21: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 21 -

♦ Memoria: Para detectar las necesidades de memoria de la aplicación, se

tiene que separar en memoria no volátil1 y memoria volátil2.

♦ Ancho de palabra: El criterio de diseño debe ser seleccionar el

microcontrolador de menor ancho de palabra que satisfaga los

requerimientos de la aplicación.

♦ Diseño de placa: Debe tenerse en cuenta que usar un microcontrolador de

gama baja, puede implicar tener que colocar más componentes externos.

2.4.1.2. Aplicaciones de los microcontroladores

Cada vez existen más productos que incorporan un microcontrolador, por todas las

prestaciones que añaden a un diseño, algunas de estas aplicaciones se muestran en

la tabla siguiente:

Aplicaciones

Consumo Automoción Ofimática Telecomunicac. Industria

Equipo de TV

Receptor de radio

Reproductor de CD

Control remoto

Consola de juegos

Microondas

Lavadora

Aparatos de cocina

Aspiradora

Alarma antirrobo

Detector de radar

ABS

Velocímetro

Climatizador

Inyección

Airbag

Mouse

Teclado

Escáner

Impresora

Plóter

Fotocopiadora

Teléfono

Módem

Control de motores

Compresor

Termostatos

Robótica

Lector de tarjetas

Detector de humo

Tabla 2.14. Tabla de aplicaciones que requieren microcontroladores.

Page 22: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 22 -

2.4.1.3. Alternativas de diseño

Se analizaron las alternativas siguientes para la implementación del brazo de robot:

♦ Alternativa 1:

Figura 2.15. Diagrama de bloques de la primera alternativa.

♦ Alternativa 2:

Figura 2.16. Diagrama de bloques de la segunda alternativa.

PC

microcontrolador 2 EEPROM

microcontrolador 1

microcontrolador 3 microcontrolador 4

Actuador Hombro Actuador CodoActuador Base

RS 232

I2C

PC

EEPROMmicrocontrolador 1

Actuador Hombro Actuador CodoActuador Base

RS 232

I2C

Page 23: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 23 -

En principio la mejor alternativa es la que necesita menos microcontroladores para

su funcionamiento, es decir, la número 2, más sencilla y económica, al disponer de

menos componentes y un desarrollo software más sencillo. Pero antes de tomar la

decisión tenía que comprobar si esta implementación sería capaz de actuar sobre

cada articulación del robot, utilizando a la vez las comunicaciones RS232 e I2C1. En

los siguientes apartados se verá que era posible el diseño tanto de hardware como de

software con un solo microcontrolador.

2.4.1.4. PIC 16F873

El cerebro del brazo de robot es un microcontrolador PIC 16F873 de microchip,

las características técnicas más importantes son:

♦ Memoria Flash de programa de 4K.

♦ Memoria EEPROM de datos de 128 bytes.

♦ Memoria RAM de datos de 192 bytes.

♦ 3 contadores/temporizadores.

♦ Conversor A/D de 5 canales de entrada.

♦ 2 canales PWM.

♦ 1 canal de comunicación serie USART.

♦ 1 canal de comunicación serie para I2C.

♦ Frecuencia de trabajo máxima: 20MHz.

♦ 3 puertos de I/O.

♦ Perro guardián.

♦ Encapsulado DIP de 28 patillas.

Este es un microcontrolador de 8 bits, dispone de un repertorio de 35 instrucciones,

1 vector de interrupción, 8 niveles de pila y su arquitectura es del tipo harvard, que se

explica en el siguiente párrafo.

1 Ver anexo 2.

Page 24: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 24 -

La arquitectura harvard dispone de dos memorias independientes, una contiene

sólo instrucciones y otra sólo datos. Ambas disponen de sus respectivos sistemas de

buses de acceso y es posible realizar operaciones de acceso (lectura o escritura)

simultáneamente en ambas memorias.

Figura 2.17. Arquitectura harvard.

2.4.1.5. Cristal de cuarzo

Este es un punto crítico de la aplicación, porque del cristal de cuarzo depende la

velocidad de ejecución de las instrucciones, también llamado tiempo de instrucción.

En el diseño del software que controla el brazo de robot, la parte a la que hay que

prestar más atención, es la correspondiente a la comunicación por RS-232, que se

realiza a 9.600 bits por segundo.

Cuando el pic recibe un dato completo, es decir, un bit de START, 8 bits que

corresponde al dato y un bit de STOP, pasa el dato (8 bits) a un buffer y puede seguir

recibiendo a través de RS-232. Entonces el programa tiene que asegurar que cuando

se reciba el siguiente dato completo y sé reescriba el buffer, el dato anterior ya ha sido

leído para no perder bits de la transmisión.

Para lo que se ha explicado en las líneas anteriores, se debe asegurar un cristal de

cuarzo, que actúa como reloj, suficientemente rápido para que las instrucciones que se

tienen que ejecutar entre dato y dato recibido tengan un tiempo de ejecución menor

que el tiempo de la recepción entre datos.

Page 25: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 25 -

Se realizan los siguientes cálculos:

Velocidad de transmisión: 9.600 baudios1.

La recepción consta de 10 bits, START + 8 bits de datos + STOP, tenemos que el

tiempo que tarda el pic en cargar el buffer es:

Se pensó que entre cada escritura del buffer se necesitaría ejecutar 1.500

instrucciones aproximadamente, por lo tanto:

La relación entre la frecuencia del cristal de cuarzo y el tiempo de instrucción del pic

viene determinada por:

1 Se refiere a la velocidad de transmisión. Esta se realiza a 9.600 bits por segundo.

SsegundosxbitdeTiempo µ1667´104100416671́9600

1 4 === −

�= bitsdeNúmeroxbitdeTiempodisponibleTiempo

SbitsxSdisponibleTiempo µµ 667´1041101667´104 ==

�=nesinstrucciodeNúmero

disponibleTiemponinstrucciócadadeejecucióndeTiempo

SS

ninstrucciócadadeejecucióndeTiempo µµ6950́

1500667´1041 ==

MHzS

xT

cristaldeFrecuenciac

7595́46950́

14

1 =×==µ

Page 26: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 26 -

Entonces se deduce que el cristal que se elija debe ser de una frecuencia de 5´759

MHz o superior, mientras más rápido sea menos tardará en ejecutar las instrucciones,

es decir, menor será el tiempo de ejecución.

El cristal elegido es de una frecuencia de 9´8340 MHz. Por lo que realizamos

nuevos cálculos:

Como:

El número de instrucciones obtenido se considera que es más que suficiente para la

recepción RS-232 sin perdida de bits.

2.4.1.6. MAX232

El MAX232 es un circuito integrado sin el cuál, no podría establecerse la

comunicación RS-232 entre el PC y el Pic 16F873. Este componente se utiliza para

poder adaptar los niveles lógicos de la línea de comunicación (anexo 1), con los que

utilizan otros circuitos integrados, TTL y CMOS, en este caso el Pic 16F873. Su

encapsulado es un DIP de 16 patillas y para utilizarlo, simplemente hay que

implementarlo tal como se muestra en la figura siguiente:

SMHz

TccristaldeFrecuencia

TcTc

cristaldeFrecuencia µ40670́83409́

444 ==�=�=

nesinstruccioS

STcdisponibleTiempo

nesinstrucciodeNúmero 256140670́

6667´1041===

µµ

Page 27: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 27 -

Figura 2.18. Circuito típico de conexión del MAX232.

2.4.1.7. EEPROM

La memoria elegida para guardar la secuencia de funcionamiento del brazo de

robot, es una memoria EEPROM1 del tipo I2C (ver anexo), concretamente es la

EEPROM 24LC02. Las características de esta memoria son:

♦ Es una memoria de 2 Kbits (2.048 bits) organizada en un banco de 256

bytes. Esta conversión sale de dividir:

2.048 bits / 8 bits que tiene un byte = 256 bytes. Es decir, como en ancho

de palabra del microcontrolador es de 8 bits, puede controlar toda la

memoria en un solo banco. El cálculo es: 28 = 256 bytes.

♦ El bus se controla mediante el master2, se encarga de generar la señal de

reloj, mientras que la memoria actúa como slave.

♦ En un bus del tipo I2C se pueden controlar hasta un máximo de 8 memorias

de este tipo, según palabra de direccionamiento (ver anexo). El

direccionamiento se realiza a través de: A2, A1, A0, es decir: 23 = 8.

Page 28: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 28 -

A continuación se muestra el formato de grabación de los datos utilizados dentro

de la memoria:

Figura 2.19. Formato de grabación utilizado en la EEPROM.

Con el formato de grabación descrito, se consigue grabar hasta 42 movimientos

diferentes. Cada movimiento consta de 6 bytes como puede observarse en la figura

anterior, si hacemos el cálculo siguiente vemos:

Nº Pasos 100h01h02h03h04h05h06h07h08h09h0Ah0Bh0Ch0Dh

Destino 1Nº Pasos 2Destino 2

Nº Pasos 3Destino 3

Nº Pasos 1

Nº Pasos 1

Destino 2

Destino 1Nº Pasos 2

Nº Pasos 3Destino 3

Movimiento 1

Movimiento 2

Movimiento 3

F6hF7hF8hF9hFAhFBhFChFDhFEhFFh

Movimiento 42Nº Pasos 1Destino 1

Nº Pasos 2Destino 2

Nº Pasos 3Destino 3

Total movimientosPosición actual

LibreLibre

�=movimientocadaenusadosBytesmemorialadetotalesBytes

smovimientodeNúmero

smovimientobytes

bytessmovimientodeNúmero 66´42

6256

==

Page 29: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 29 -

Es decir, tenemos 42 movimientos completos y quedan 4 bytes libres en el banco:

De estos 4 bytes que libres, se utilizan 2 para los apuntadores que se necesitan

para realizar correctamente las operaciones de lectura y escritura.

Un byte, dirección “FCh” guarda el número total de movimientos que tiene la

secuencia y puede variar desde 0 hasta 42. Si el número grabado es 0, el robot no

ejecutará movimiento alguno.

El segundo byte es decir, el de la dirección “FDh”, apunta donde debe seguir con la

lectura o escritura.

Cuando se realiza una operación de borrado, lo que se hace, es poner el número

total de movimientos y la posición actual a 0. Entonces todas las posiciones para

grabar movimientos sé reescribiran desde la posición “00h” cuando se realice la

operación de grabación.

Para grabar, lo que se hace es ir escribiendo los movimientos en el punto de

memoria que va indicando posición actual, que con cada movimiento que se graba

aumenta de valor 6 unidades (6 bytes consta el movimiento) como se explicó

anteriormente.

Cuando se tiene que leer, lo que se hace es ir leyendo donde indica la posición

actual, se leen 6 bytes cada vez (1 movimiento), se va leyendo así hasta que se llega

a igualar el número total de movimientos, instante en el que el puntero, “posición

actual” se reinicia a “0” y vuelve a leer desde la posición de memoria “00h”.

�×= movimientoporBytessmovimientodeNúmerosmovimientoguardarparausadosBytes

�−= smovimientodeBytestotalesBytesmemoriadebancoelenlibresBytes

bancoelenlibresBytesBytesBytesmemoriadebancoelenlibresBytes 4252256 =−=

BytessmovimientoguardarparausadosBytes 252642 =×=

Page 30: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 30 -

2.4.2. Software de control

Aquí se muestra la programación de las tareas más críticas de los programas:

2.4.2.1. PWM para los servos

En este punto se va a tratar, como se generan las señales de control para los

servos. Para controlar los servos se necesita además de las tensiones de alimentación

y GND, la señal PWM tal como se explicó en el punto 2.3.3.

La señal PWM para controlar los servos, tiene un periodo de 20 mS y un tiempo en

estado lógico “1” que varía desde 0´9 mS hasta 2´1 mS, posición de 0º y 180º

respectivamente.

El microcontrolador Pic 16F873, dispone de varias fuentes de interrupción, pero las

que se utilizan para generar la señal PWM son dos, provocadas por dos

temporizadores configurados para esta finalidad.

La señal PWM se genera a través de pines de entrada/salida generales

configurados como salida, correspondiendo cada pin de salida a un servo, por eso se

utilizan temporizadores que provocan interrupción, para tener un control exacto del

tiempo.

Al provocarse la interrupción, el microcontrolador finaliza la instrucción que se está

ejecutando y atiende la rutina de interrupción, que en este caso solo se ha programado

para actuar sobre las señales PWM de los servos.

Una característica primordial que se debe tener en cuenta al generar la señal PWM

es, que la señal de cada servo no puede interferir con la de otros, ya que si se está

atendiendo una interrupción y se provoca otra, esta última no se atenderá, estando los

tiempos de la señal PWM desajustados y actuando el servo de manera incontrolada.

Para evitar interferencias entre señales utilizamos una variable que tendrá 4

posibles valores, es decir, se decrementará desde 3 hasta 0, al llegar a 0 se vuelve a

inicializar con el valor 3.

Se configura un temporizador para provocar una interrupción cada 5 mS. En el

servicio de atención de interrupción, se mira el valor que tiene la variable en ese

momento, actuando sobre el pin de salida correspondiente y por lo tanto sobre el

servo. Como la variable puede tener 4 valores diferentes, se obtiene el periodo de la

señal PWM de control, es decir, 20 mS.

Cuando se atiende esta primera interrupción denominada INT1, el programa decide

sobre que servo tiene que actuar, a continuación lee la posición a la que debe ir ese

Page 31: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 31 -

servo, esta posición leída estará comprendida entre 0º y 180º que es el recorrido que

tiene el servo, se lee una tabla con esa posición, que carga un valor en un registro

especial de la segunda interrupción, con este valor se conseguirá que según la

posición, el tiempo de la segunda interrupción denominada INT2, provocada por el otro

temporizador, varíe desde 0´9 mS hasta 2´1 mS según la posición a la que tiene que ir

el servo, y que recordemos que es 0º hasta 180º respectivamente.

Se muestra a continuación una tabla en la que se observa lo explicado en los

párrafos anteriores:

Valor variable INT1 INT2 Servo Nivel lógico pin

3 Si No Base “1”

3 No Si Base “0”

2 Si No Hombro “1”

2 No Si Hombro “0”

1 Si No Codo “1”

1 No Si Codo “0”

0 Si No XXX XXX

0 No XXX XXX XXX

Tabla 2.20. Temporización de interrupciones y articulaciones.

Ahora se podrá observar un ejemplo de la constitución de estas señales en modo

gráfico:

Figura 2.21. Señal PWM para cada servo.

0 5 10 15 20 ms

PW MServos

Servo 1

Servo 2

Servo 3

INT 1

INT 2

INT 1

INT 2

INT 1

INT 2

Page 32: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 32 -

En la figura se pueden ver las señales de cada servo. En el servo 1 se aprecia una

señal con nivel lógico “1” de 0´9 mS, es decir, el servo está en la posición 0º. En el

servo 2 tenemos un nivel lógico “1” de duración 1´5 mS, el servo 2 está en posición

90º y en el servo número 3 tenemos 2´1 mS que corresponde a la posición de 180º,

según la figura 2.11.

2.4.2.2. Movimiento lineal

El movimiento lineal se produce cuando el servo que actúa de motor en cada

articulación es capaz de variar su velocidad en función del desplazamiento que deben

realizar los otros. Para conseguirlo hay que esperar un número de veces antes de

incrementar o decrementar un grado, a este número de veces, se ha llamado pasos.

A continuación se muestra lo descrito con un ejemplo:

Articulación Desplazamiento Número de pasos

Base 180º 1

Hombro 90º 2

Codo 45º 4

Tabla 2.22. Ejemplo de movimiento lineal.

Según el ejemplo se puede ver que el más rápido es el de mayor recorrido, por lo

tanto, tendrá el tiempo de espera entre grados más pequeño, en este caso

corresponde a la articulación de la base.

El número de pasos lo calcula el interfície de programación.

Para realizar este cálculo, se ordena el recorrido de cada articulación de menor a

mayor, con el método de la burbuja, que consiste en comparar pares de elementos

adyacentes e intercambiarlos en caso que no estén en el orden correcto. Después se

divide el desplazamiento del servo de mayor recorrido entre el desplazamiento de

todos los servos.

Siguiendo con el ejemplo:

Articulación División Nº de pasos obtenidos

Base Desplazam. Base / Desplazam. Base 1

Hombro Desplazam. Base / Desplazam. Hombro 2

Codo Desplazam. Base / Desplazam. Codo 4

Tabla 2.23. Cálculo del número de pasos en el movimiento lineal.

Page 33: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 33 -

2.4.2.3. Trama de comunicación RS-232

El modo de comunicación entre el emisor y el receptor es mediante el protocolo RS-

232 y cada dato que se envía se componen de:

♦ 1 bit de START.

♦ 8 bits de datos.

♦ 1 bit de STOP.

♦ Ninguno de paridad.

El PC por el puerto serie, si el brazo de robot esta en modo programación, envía

tramas que son recogidas por el Pic.

El formato de trama enviado es:

Figura 2.24. Trama de comunicación RS-232.

El significado es el siguiente:

♦ Sincronismo: Son tres bytes que se han de enviar al inicio de cada trama

para sincronizar el emisor y el receptor. Se envía el valor decimal “255”.

♦ Tarea: Consta de un byte, con el cuál el cerebro del brazo de robot, sabe

que función debe realizar y a continuación se detalla:

� Tarea = 0: Aplicar el destino a los servos.

� Tarea = 1: Grabar coordenada en la EEPROM.

� Tarea = 2: Borrar memoria.

� Tarea = 3: Reset. Inicializa servos a posición 0º y borra la memoria.

♦ Nº de pasos 1: Son tres bytes, centena, decena y unidad y corresponde al

tiempo que debe esperar el servo 1 en incrementar o decrementar cada

grado para conseguir el movimiento lineal.

♦ Destino 1: Es el destino al que debe ir el servo 1. Consta de 3 bytes,

centena, decena y unidad.

♦ Los otros números de pasos y destino, son iguales que los dos anteriores

pero correspondientes al servo 2 y 3 respectivamente.

La trama total consta de 22 bytes de datos, además de los correspondientes bits de

control.

Sincronismo T area Nº pasos 1 Destino 1 Nº pasos 2 Destino 2 Nº pasos 3 Destino 3

Page 34: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 34 -

2.5. Elección de la batería

Una parte muy importante del proyecto es la alimentación, sin ella no es posible que

el brazo de robot funcione de manera alguna, por esto hay que tener cuidado a la hora

de elegir el modo de alimentación. Lo que está claro es que la mejor forma de

alimentación, es con una batería recargable. Con este tipo de batería podemos tener

el brazo de robot disponible para colocarlo en una plataforma móvil y además

respetamos el medio ambiente al no desechar tantas baterías no recargables.

2.5.1. Efecto memoria

El efecto memoria se produce en algunos tipos de baterías, especialmente en las

de níquel-cadmio y ocurre al recargar una batería que no se ha agotado

suficientemente. Si una batería se ha descargado hasta el 20% de su capacidad de

recarga, su capacidad se reducirá hasta el 80% del valor inicial. Esto se debe a que si

se recarga antes de que se haya descargado en su totalidad, los cristales de níquel y

cadmio se acumulan y crecen, lo que termina por romper el separador aislante y

producir altos niveles de autodescarga o un cortocircuito.

2.5.2. Tipos de baterías recargables

Existen muchos tipos de baterías recargables, las más interesantes son:

♦ Baterías de plomo (Pb): Normalmente utilizadas en automóviles, sus

elementos constitutivos son pilas individualmente formadas por un ánodo

de plomo, un cátodo de óxido de plomo y ácido sulfúrico como medio

electrolítico.

♦ Baterías de níquel-cadmio (Ni-Cd): Constan de dos polos que se

encuentran en el mismo recipiente, un polo positivo con hidróxido de níquel

y uno negativo con hidróxido de cadmio. A lo largo de la vida de la batería

su capacidad máxima va disminuyendo debido al efecto memoria. Este tipo

de batería es muy contaminante.

Page 35: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 35 -

♦ Baterías de níquel metal hidruro (NiMH): Son más caras que las anteriores

porque usan metales como titanio, zirconio o vanadio, pero proporcionan

aproximadamente un 50% más de energía a igualdad del peso. Además

estas no tienen efecto memoria.

♦ Baterías de litio-ion (LiIon): Con mayor capacidad que las de NiMH, no

tienen efecto memoria y apenas se observa efecto autodescarga.

Se muestra una tabla con las ventajas y desventajas de diversos tipos de baterías:

Tipo de batería: Ventajas: Desventajas:

Pb -Precio -Peso

-Muy contaminantes

-Efecto memoria

Ni-Cd -Precio -Efecto memoria

-Muy contaminantes

NiMH -No tienen efecto memoria

-Capacidad de almacenamiento

-Sensibles a la temperatura

Tabla 2.25. Ventajas y desventajas de los tipos de baterías.

Después de analizar las ventajas y desventajas de los diversos tipos de baterías, se

decidió por una batería de NiMH, ya que para menor peso es capaz de proporcionar

más autonomía al brazo de robot. La elegida es una batería cuyas características son:

4´8 V y 650 mAh.

2.5.3. Autonomía

A continuación se realiza el cálculo de autonomía en dos situaciones:

1) Cuando el brazo de robot trabaja moviendo todas las articulaciones pero

sin transportar ningún peso. Para este cálculo se ha medido la intensidad que

consume el sistema con un amperímetro.

Page 36: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 36 -

Consumo medido: 205 mA.

Gráfica 2.26. Gráfico de autonomía de la batería con un consumo de 205 mA.

minyhmA

horamAreceptorcircuitodelConsumo

bateríaladeCapacidadautonomíadeTiempo 103

205650

=•

==

Autonomía de la batería (205 mA)

0

24

6

0 30 60 90 120

150

180

Tiempo (minutos)

Tens

ión

(V)

Gráficateórica

Gráfica real

%12100832́

832́173́100 =×

−=×

−=

realValorrealValorteóricoValor

Perdidas

%88%12%100dimRe =−=−= pérdidasTotalienton

Page 37: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 37 -

2) Cuando el brazo de robot trabaja, transportando el peso máximo:

Consumo medido: 260 mA.

Gráfica 2.27. Gráfico de autonomía de la batería con un consumo de 260 mA.

minyhmA

horamAreceptorcircuitodelConsumo

bateríaladeCapacidadautonomíadeTiempo 302

260650

=•

==

%251002

252́100 =×

−=×

−=

realValorrealValorteóricoValor

Perdidas

%75%25%100dimRe =−=−= pérdidasTotalienton

Autonomía de la batería (260mA)

0

2

4

6

1 4 7 10 13 16

Tiempo minutos (x10)

Tens

ión

(V) Gráfica

Teórica

Gráfica Real

Page 38: construir un robot con pic

BRAZO DE ROBOT MEMORIA TECNICA

- 38 -

2.5.4. ¿Qué hacer con las baterías usadas?

Las pilas y baterías constituyen un residuo peligroso por varios aspectos:

♦ Hay un gran tipo de pilas, desde el punto de vista químico, por lo que se

multiplica enormemente la cantidad de contaminantes que se generan.

♦ Algunos de los constituyentes peligrosos de las pilas son: mercurio, cadmio y

plomo. Estos elementos son los más peligrosos.

Idealmente las pilas y baterías, deberían volver al fabricante para que éste se

encargue de reciclar y reutilizar lo que le sea útil mediante la implementación de

tecnologías adecuadas a tal fin. En términos prácticos, la gestión de las pilas usadas

comienza por la recolección en forma separada y continua, enviándolas a continuación

a plantas donde se realice su reciclado.

Page 39: construir un robot con pic

BRAZO DE ROBOT INSTALACION

3. Instalación del software

3.1. Requerimientos

Para poder ejecutar la interfície de programación, se necesita únicamente un

ordenador en el que se pueda ejecutar el Windows, este puede ser:

♦ Procesador 486 DX II a 66 Mhz.

♦ 8 Mbytes de memoria.

♦ Disco duro de 540 Mb.

3.2. Instalación

Para instalar la interfície de programación solo se tiene que ejecutar el software

de instalación del brazo de robot, denominado “carby” y seguir todos los pasos que

se indiquen. A continuación se conecta el cable de comunicación RS-232 y el brazo

de robot, ya está listo para ser programado.

Page 40: construir un robot con pic

BRAZO DE ROBOT CONCLUSIONES

4. Conclusiones

En este punto del proyecto, debo decir, que estoy muy satisfecho con el trabajo

realizado, ya que he conseguido llevar a la realidad gran parte de los objetivos que

inicialmente me había planteado.

Para poder realizar mecánicamente este proyecto, se ha conseguido reciclar un

viejo disco duro de 40 Mb sin utilidad alguna en los tiempos actuales, así como

poder reutilizar también la batería de un teléfono móvil ya en desuso. Al reutilizar

estos elementos se ha conseguido respetar el medio ambiente, si no estos

elementos hubiesen ido a la basura.

También he podido aprender el funcionamiento de algunos protocolos de

comunicación serie como son, el RS-232 y el I2C. Respecto al RS-232 su

utilización es conocida por todas las personas que utilizamos el ordenador

personal, ya que está implementado para la comunicación con el ratón como cosa

más significativa, aunque tiene muchas más aplicaciones. Dado que no siempre se

requiere alta velocidad de transferencia de datos, el bus I2C es ideal para sistemas

donde es necesario manejar información entre muchos dispositivos, al mismo

tiempo se requiere poco espacio y líneas de circuito impreso.

Tengo que destacar la sencillez del interfície de programación para que

cualquier persona inexperta pueda programar y manejar el brazo robot en un corto

espacio de tiempo, acercando este proyecto de esta manera a un gran número de

personas de todas las edades.

Otro punto que no quiero dejar de comentar, es la posibilidad de poder

comercializar el producto, realizando algunas mejoras, como añadirle una pinza

que pueda coger objetos como si de una mano se tratase.

Finalmente puedo concluir que el proyecto ha cubierto todas las expectativas

que inicialmente me había planteado, alcanzando así los objetivos educativos

requeridos al plantearse el reto de realizar un proyecto fin de carrera.

Page 41: construir un robot con pic

BRAZO DE ROBOT PRESUPUESTO

5. Presupuesto

Para realizar el presupuesto del proyecto, se han separado los diferentes conceptos

de la siguiente forma: El material electrónico, el mecánico y las horas empleadas en la

elaboración, si sumamos estos tres conceptos obtendremos el coste total del un brazo

robot, como puede verse a continuación. Si fabricamos en serie los costes se

disminuyen mucho. En las siguientes páginas se desglosa cada concepto. La moneda

utilizada para calcular los importes es el euro.

Coste total del proyecto (una unidad):

Descripción Cant Precio/Ud Importe + 16%IVA

Material electrónico 1 87´40 101´39

Material mecánico 1 6´00 6´96

Trabajo profesionales 1 3030´00 3514´80

Coste total del proyecto (sí solo se fabrica un producto): 3623´15

Si se pide más de una unidad, los gastos relativos a los profesionales se reducirían

mucho, como ejemplo, se estudiará un pedido de 5 unidades, para otra cantidad

habría que estudiar el coste de forma similar.

Descripción Horas Precio/Ud Importe

Estudio de viabilidad 1 14´00 14,00

Montar Brazo y ajustar 10 10´00 100´00

Diseñar y montar placa circuito impreso 5 10´00 50´00

Diseñar y programar software aplicación 25 14´00 350´00

Diseñar y programar interfície de programación 7 14´00 98´00

Verificar funcionamiento 4 14´00 56´00

Confeccionar memoria y recopilar información 2 14´00 28’00

Base imponible: 696´00

IVA (16%): 111´36

Total profesionales: 807´36

Total proyecto (5 unidades), materiales + profesionales: 915.71

Page 42: construir un robot con pic

BRAZO DE ROBOT PRESUPUESTO

- 42 -

Material electrónico:

Descripción Cant Precio/Ud Importe

Microprocesador PIC 16F873 1 10´50 10´50

Circuito Integrado MAX 232 1 1´30 1´30

EEPROM 24LC02B 1 1´10 1´10

Servomotor HITEC 300BB 3 15´50 46´5

Resistencia 10K / 0´25W 2 0´01 0´02

Cristal de cuarzo 9´8340 MHz 1 0´67 0´67

Condensador cerámico 22pF 2 0´03 0´06

Condensador electrolítico 1µF / 63V 4 0´05 0´20

Zócalo 28 pins 1 0, 12 0´12

Zócalo 16 pins 1 0´08 0´08

Zócalo 8 pins 1 0´05 0´05

Tira 40 pins hembra 2 1´30 2´60

Tira 40 pins macho 1 1´30 1´30

Conector bus 20pins 1 1´90 1´90

Conector alimentación placa 2 pins 1 0´60 0´60

Conector DB9 1 0´65 0´65

Conector aéreo DB9 macho 1 1´10 1´10

Conector aéreo DB9 hembra 1 1´10 1´10

Tornillos M3 8 0´01 0´08

Separador placa M3 4 0´04 0´16

Arandela aislante 0´5mm 4 0´03 0´12

Placa de circuito impreso 1 9,00 9´00

Interruptor aéreo 2 pins 1 0´47 0´47

Conmutador aéreo 3 pins 1 0´69 0´69

Cableado vario 1 3´05 3´05

Batería NiMH 4´8V 650mAh (Reciclada) 1 4´00 4´00

Base imponible: 87´40

IVA (16%): 13´99

Total electrónica: 101´39

Page 43: construir un robot con pic

BRAZO DE ROBOT PRESUPUESTO

- 43 -

Material mecánico:

Descripción Cant Precio/Ud Importe

Caja módem externo 33K (Reciclada) 1 2´00 2´00

Disco Duro 44Mb (Reciclado) 1 1´00 1´00

Pieza de aluminio 200x400 1 3´00 3´00

Base imponible: 6´00

IVA (16%): 0´96

Total mecánica: 6´96

Trabajo profesionales:

Descripción Horas Precio/Ud Importe

Estudio de viabilidad 5 14´00 70,00

Montar Brazo y ajustar 15 10´00 150´00

Diseñar y montar placa circuito impreso 15 10´00 150´00

Diseñar y programar software aplicación 125 14´00 1750´00

Diseñar y programar interfície de programación 35 14´00 490´00

Verificar funcionamiento 20 14´00 280´00

Confeccionar memoria y recopilar información 10 14´00 140’00

Base imponible: 3030´00

IVA (16%): 484´8

Total profesionales: 3514´8

Page 44: construir un robot con pic

BRAZO DE ROBOT BIBLIOGRAFIA

6. Bibliografía

Citación bibliográfica de los libros y recursos en línea utilizados para la

implementación del proyecto:

♦ Libros:

� Fundamentos de robótica: Mc Graw Hill, 1997.

Antonio Barrientos, Luís Felipe Peñín, Carlos Balaguer,Rafael Aracil.

� Robótica industrial: Marcombo Boixareu Editores, 1986.

J. Amat, J. Ayza, L. Basañez, F. Ferrer, R. Huber, C. Torres.

� Electricidad del Automóvil-I: CEAC, 1997.

Miguel de Castro Vicente.

� PIC16F87x Data Sheet: Microchip, 2001.

� 24AA02/24LC02B Data Sheet: Microchip, 2002.

� MAX232 Data Sheet: Texas Instruments, 1997.

♦ Recursos en línea:

� http://www.maxim-ic.com

� http://www.microchip.com

� http://www.google.com

� http://www.lynxmotion.com

� http://www.microcontroladores.es

Page 45: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

7. Anexos

7.1. Anexo 1. Comunicación RS-232

La comunicación serie, es el tipo de comunicación más utilizada. Es muy empleado

en la industria, aunque la velocidad no es tan rápida como la comunicación en

paralelo los costes por cableado se reducen mucho.

Los estándares de comunicación establecen una serie de normas en el nivel físico

(mecánico y eléctrico) en los enlaces. Estas normas afectan sobre todo a los aspectos

siguientes:

♦ Frecuencia de transmisión.

♦ Características eléctricas.

♦ Definición y características de la línea.

7.1.1. Funcionamiento de la interface RS-232

La transmisión serie se realiza enviando bit a bit por lo que se necesita un interfaz

que pase la información de paralelo, que es el formato en el que trabaja la CPU, al

formato serie requerido por el dispositivo.

Las señales disponibles en un conector RS-232 están pensadas únicamente para

asegurar la correcta transmisión y recepción de datos, desde un equipo DTE1 a un

equipo DCE2. El tipo DCE más conocido es el módem y el DTE es generalmente un

ordenador.

El estándar RS-232 cuenta con una serie de señales de datos y control. Entre las

más importantes están:

♦ GND: Tierra de protección.

♦ TxD: Línea de transmisión de datos.

♦ RxD: Línea de recepción de datos.

♦ DTR (Data Terminal Ready): Indica al módem que se conecte a la línea.

1 Data Terminal Equipment. Normalmente un ordenador. 2 Data Comunication Equipment. El más conocido es el modem.

Page 46: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

- 46 -

♦ DSR (Data Set Ready): Respuesta a la señal de DTR. El módem indica al

driver que está conectado y preparado para transmitir.

♦ RTS (Request To Send): Indica al módem que pase a modo transmisión.

♦ CTS (Clear To Send): Respuesta a RTS. El módem indica al driver que está

preparado para recibir datos y enviarlos a la línea.

♦ RI (Ring Indicator): El módem indica al driver que se ha producido una

llamada desde un módem externo.

♦ CD (Carrier Detect): El módem indica al driver que la línea ha sido activada

en el extremo remoto, por lo que pueden llegar datos en cualquier

momento.

A continuación tenemos un esquema básico de un programa para comunicaciones

serie:

Organigrama 7.1. Comunicación serie RS-232.

Abrir puerta serie

Configurar puerta serie

Enviar datos por la puerta serie

Recibir datos por la puerta serie

¿Terminar?

Cerrar puerta serie

Salir

N

S

Page 47: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

- 47 -

La gestión de los puertos de comunicaciones es una tarea compleja. Los datos

llegan a los puertos de forma síncrona, es decir, su llegada es imprevisible. Por lo que

el dato que llega tiene que procesarse inmediatamente, ya que pueden llegar otros

datos en cuyo caso se producirían pérdidas de bits. De esta tarea se encarga el

hardware, de forma que cuando detecta la llegada de un dato, interrumpe el flujo

normal de proceso para ceder el control a la rutina de comunicaciones.

Cuando un emisor manda un mensaje transmitiendo los sucesivos bits que lo

componen, el emisor debe ser capaz de reconocer el principio y el final del mensaje

transmitido, además debe conocer la duración de cada bit para muestrear la línea en

el instante adecuado, esta duración se obtiene de la velocidad de transmisión (número

de bits por segundo).

En la transmisión asíncrona se mandan caracteres independientemente unos de

otros, comenzando cada carácter con la sincronización del emisor y el receptor.

Mientras no se transmite ningún carácter la línea se encuentra a nivel alto, por tanto,

antes de enviar un carácter se manda un bit a “0” lógico (bit de START) cuyo pulso de

bajada sincronizará el reloj del receptor con el del emisor. Asimismo tras la transmisión

de un carácter es necesario un período de seguridad que permita distinguir el siguiente

bit de START. Este período que puede durar desde 1 hasta 2 bits, se le denomina bit

de STOP.

Los bits de START y STOP proporcionan el sincronismo de bit, al sincronizar los

relojes y el sincronismo de carácter al delimitar al mismo. Como consecuencia es

necesario para conseguir una correcta comunicación, que tanto el emisor como el

receptor estén de acuerdo con los parámetros de la comunicación.

Figura 7.1. Niveles lógicos del interface RS-232.

Page 48: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

- 48 -

7.1.2. Comunicación RS-232 con Visual Basic

En Visual Basic existe un control denominado MSCOMM que se utiliza para poder

realizar la comunicación serie. En este control hay que configurar varios parámentros

como son:

♦ La velocidad de comunicación.

♦ La paridad.

♦ El número de bits.

♦ El número de bits de STOP.

7.1.3. Comunicación RS-232 con Pic 16F873

Este microcontrolador contiene un módulo llamado MSSP con dos puertas para la

comunicación serie asíncrona. Además dispone de un módulo USART capaz de

soportar la comunicación serie síncrona y asíncrona.

La USART, llamado SCI1 puede funcionar como un sistema de comunicación full

dúplex o bidireccional asíncrono, adaptándose a multitud de periféricos. También

puede trabajar en modo síncrono unidireccional o half dúplex para soportar periféricos

como memorias, conversores, etc. En resumen, la USART puede trabajar de tres

maneras:

♦ Asíncrona (full dúplex, bidireccional).

♦ Síncrona - maestro (half dúplex, unidireccional).

♦ Síncrona – esclavo (half dúplex, unidireccional).

A continuación se muestra un esquema del comportamiento de la USART en modo

asíncrono, donde las transferencias de información se realizan sobre dos líneas Tx

(transmisión) y Rx (recepción), saliendo y entrando los bits por dichas líneas al ritmo

de una frecuencia controlada internamente por la USART.

Page 49: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

- 49 -

Figura 7.3. Líneas de comunicación RS-232 del Pic 16F873.

En la forma de comunicación asíncrona que es la que se emplea en este proyecto,

se usa la norma RS-232 donde cada palabra de información o dato se envía

independientemente de los demás. Suele constar de 8 o 9 bits y van precedidos por un

bit de START y detrás de ellos se coloca un bit de STOP.

Figura 7.4. Envío de 1 byte a través de RS-232.

Page 50: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

- 50 -

7.1.4. Conexionado del cable

La unidad de control se utiliza un conector delta de 9 pines como el que se aprecia

en la siguiente figura:

Fotografía 7.5. Conector DB9

A continuación se aprecia la configuración de los pines:

Figura 7.6. Configuración de los pines en el conector DB9.

Page 51: construir un robot con pic

BRAZO DE ROBOT ANEXO 1. RS-232

- 51 -

Los pines más significativos para la comunicación son:

♦ Pin 2: También conocido como Rx y es por donde se reciben los diferentes

caracteres.

♦ Pin 3: Conocido como Tx y es por donde se transmiten caracteres.

♦ Pin 5: Que es la masa de referencia para que la comunicación pueda

establecerse.

Page 52: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

7.2. Anexo 2. Bus I2C

La comunicación serie es una forma muy apreciada de transferir datos digitales

entre sistemas y circuitos integrados, dada la reducida cantidad de líneas que precisa.

En algunas aplicaciones, se deben establecer ciertos criterios:

♦ Cierto tipo de microcontroladores no son ampliables desde el exterior.

♦ Normalmente, un sistema completo, además de un microcontrolador,

necesita de otros circuitos periféricos como memorias, ampliación de las

líneas de E/S, conversores A/D y D/A, entre otros.

♦ El coste de conexión de todos estos periféricos con el microcontrolador

deben reducirse al mínimo.

♦ Normalmente, la aplicación no requiere de una gran velocidad de

transferencia entre el microcontrolador y los diferentes periféricos.

♦ La eficacia general del sistema depende de la versatilidad de los

dispositivos conectados al mismo.

Los distintos dispositivos conectados al bus deben comunicarse entre sí mediante

un protocolo que evite el bloqueo de la información y garantice la comunicación entre

todos ellos.

El sistema debe ser independientemente de los distintos dispositivos conectados al

bus, con objeto de poder realizar futuras ampliaciones y modificaciones. Mediante el

protocolo adecuado se decide qué dispositivo se hace cargo del bus y cuándo.

7.2.1. Descripción y funcionamiento

Diseñado por Philips, este intercambio de información a través de tan solo dos

cables permite a circuitos integrados y módulos OEM interactuar entre sí a velocidades

relativamente lentas. Emplea comunicación serie, utilizando un conductor para

manejar los pulsos de reloj que actúan de sincronismo y otro para intercambiar datos.

El bus se basa en tres señales:

♦ SDA (System Data) por la cual viajan los datos entre los dispositivos.

♦ SCL (System Clock) por la cual transitan los pulsos de reloj que sincronizan

el sistema.

♦ GND (masa) interconecta entre todos los dispositivos conectados al bus.

Page 53: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 53 -

Las líneas SDA y SCL son del tipo drenador abierto, similares a las de colector

abierto pero asociadas a un transistor de efecto de campo1. Se deben poner en estado

alto2 para construir una estructura de bus tal que se permita conectar en paralelo

múltiples entradas y salidas.

Figura 7.7. Conexión de dispositivos usando el bus I2C.

En la figura se puede observar la configuración eléctrica básica del bus. Las dos

líneas de comunicación disponen de niveles lógicos altos cuando están inactivas, de

eso se encargan las resistencias de pull-up Rp, Rs son las impedáncias de las líneas

de conexión. Inicialmente el número de dispositivos que se puede conectar al bus es

limitado, pero obsérvese que las líneas tienen una especificación máxima de 400 pF

en lo que respecta a capacidad de carga. La máxima velocidad de transmisión de

datos que se puede obtener es de aproximadamente 100 Kbits por segundo.

Las definiciones o términos utilizados en relación con las funciones del bus I2C son

las siguientes:

♦ Master: Dispositivo que determina la temporización y la dirección del tráfico

de datos en el bus. Es el único que aplica los pulsos de reloj en la línea

Page 54: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 54 -

SCL. Cuando se conectan varios dispositivos maestros a un mismo bus la

configuración obtenida se denomina “multi-maestro”.

♦ Slave: Cualquier dispositivo conectado al bus incapaz de generar pulsos de

reloj. Reciben señales de comando y de reloj proveniente del dispositivo

maestro.

♦ Bus desocupado: Estado en el cual ambas líneas (SDA y SCL) están

inactivas, presentando un estado lógico alto. Unicamente en este momento

es cuando un dispositivo maestro puede comenzar a hacer uso del bus.

♦ START: Sucede cuando un dispositivo maestro hace ocupación del bus,

generando esta condición. La línea de datos (SDA) toma un estado bajo

mientras que la línea de reloj (SCL) permanece alta.

♦ STOP: Un dispositivo maestro puede generar esta condición dejando libre

el bus. La línea de datos toma un estado lógico alto mientras que la de reloj

permanece en ese estado.

A continuación se muestra un diagrama que muestran las condiciones de START y

STOP en modo gráfico:

Figura 7.8. Condiciones de START y STOP.

♦ Valid Data: Sucede cuando un dato presente en la línea SDA es estable

mientras la línea SCL está a nivel lógico alto

♦ Data Format: La transmisión de datos a través de este bus consta de 8 bits

de datos. A cada byte le sigue el noveno pulso de reloj durante el cuál, el

dispositivo receptor del byte debe generar un pulso de reconocimiento,

Page 55: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 55 -

conocido como ACK1. Esto se logra situando la línea de datos a un nivel

lógico bajo, mientras transcurre el noveno pulso de reloj.

♦ Address: Cada dispositivo diseñado para funcionar con este bus dispone de

su propia y única dirección de acceso, que viene preestablecida por el

fabricante. Hay dispositivos que permiten establecer externamente parte de

la dirección de acceso. Esto permite que una serie del mismo tipo de

dispositivos se puedan conectar en un mismo bus sin problemas de

identificación. La dirección 00 es la denominada “de acceso general”, por la

cual responden todos los dispositivos conectados al bus.

♦ Lectura/Escritura (Bit R/W): Cada dispositivo dispone de una dirección de 7

bits. El octavo bit, el LSB2 enviado durante la operación de

direccionamiento corresponde al bit que indica el tipo de operación a

realizar. Si este bit es alto, el dispositivo maestro lee información

proveniente de un dispositivo esclavo. En cambio, si este bit fuese bajo el

dispositivo maestro escribe información en un dispositivo esclavo.

Debido a la variedad de tecnologías empleadas en los dispositivos diseñados para

conectarse al bus I2C (CMOS, NMOS, TTL) los niveles lógicos “0” y “1” de los bits

transferidos no tienen una tensión fija, sino que dependen de la tensión Vdd de

alimentación. Cada bit que se transfiere por la línea SDA debe ir acompañado de un

pulso de reloj por la línea SCL.

7.2.2. Protocolo

Como es lógico, para iniciar una comunicación entre dispositivos conectados al bus

I2C se debe respetar un protocolo. Tan pronto como el bus esté libre, un dispositivo

maestro puede ocuparlo generando una condición de inicio. El primer byte transmitido

después de la condición de inicio contiene los siete bits que componen la dirección del

dispositivo destino seleccionado y un octavo bit correspondiente a la operación

deseada (lectura y escritura). Si el dispositivo cuya dirección se apuntó en los siete bits

está presente en el bus, éste responde enviando el pulso de reconocimiento ACK.

Seguidamente puede comenzar el intercambio de información entre los dispositivos.

1 Acknowledge. Reconocimiento. 2 Low Significative Bit. Bit de menos peso.

Page 56: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 56 -

Cuando la señal R/W está previamente a nivel lógico bajo, el dispositivo maestro

envía datos al dispositivo esclavo hasta que deja de recibir los pulsos de

reconocimiento, o hasta que se hayan transmitido todos los datos.

En el caso contrario, es decir, cuando la señal R/W estaba a nivel lógico alto, el

dispositivo maestro genera pulsos de reloj durante los cuales el dispositivo esclavo

puede enviar datos. Luego de cada byte recibido, el dispositivo maestro (que en este

momento está recibiendo datos) genera un pulso de reconocimiento.

El dispositivo maestro puede dejar libre el bus, generando una condición de STOP.

Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condición

de START, en lugar del STOP. Esta nueva condición de START se denomina “inicio

repetitivo” y se puede emplear para direccionar un dispositivo esclavo diferente o para

alterar el estado del bit de lectura/escritura (R/W).

7.2.3. Aplicaciones

Tanto Philips como otros fabricantes de dispositivos compatibles con I2C disponen

de una amplia gama de circuitos integrados, incluyendo memorias RAM y EEPROM,

microcontroladores, puertos de E/S, codificadores DTMF, transceptores IR,

conversores A/D y D/A, relojes de tiempo real y calendarios.

Dado que no siempre se requiere alta velocidad de transferencia de datos, este bus

es ideal para sistemas donde es necesario interconectar muchos dispositivos.

7.2.4. PIC 16F873

En este pic, el fabricante ha implementado el módulo MSSP1 que proporciona una

excelente interfaz de comunicación de los microcontroladores y diversos periféricos.

En este pic el usuario puede utilizar 2 patillas que correctamente programadas se

utilizan para manejar directamente el bus I2C.

El módulo MSSP consta básicamente de dos registros: El SSPSR, que es un

registro de desplazamiento que transforma la información serie en paralelo y

viceversa, también consta del registro SSPBUF, que actúa como buffer de la

información que recibe o transmite.

El funcionamiento del módulo MSSP es muy sencillo. En transmisión, el byte que se

quiere transmitir se carga en el registro SSPBUF a través del bus de datos interno y

automáticamente se traspasa al registro SSPSR, que va desplazando bit a bit el dato,

sacándolo ordenadamente al exterior al ritmo de los impulsos de reloj. En recepción,

Page 57: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 57 -

los bits van entrando al ritmo del reloj por una patita y se van desplazando en el

SSPSR hasta que lo llenan, en cuyo momento la información se traspasa al SSPBUF,

donde queda lista para su lectura. Este doble almacenamiento del dato recibido

permite iniciar la recepción de un nuevo dato antes de que se haya leído el último.

Cuando se han recibido 8 bits durante la recepción en SSPSR, se traspasa dicha

información a SSPBUF y entonces el bit señalizador BF (Buffer Full) se pone a “1”, al

igual que el flag de interrupción SSPIF. Cualquier escritura en el SSPBUF se ignora

durante una transferencia de información y se señaliza poniendo a “1” el bit WCOL,

que advierte de este tipo de colisiones. Recae en la responsabilidad del programador

pasar el bit WCOL a “0” una vez completada la escritura en SSPBUF.

En la siguiente figura se muestra un esquema básico sobre la estructura interna del

módulo MSSP.

7.2.5. EEPROM

Una memoria del tipo EEPROM1 es un tipo de memoria que una vez se le quita la

corriente eléctrica mantiene la información de forma indefinida y además puede

reprogramarse borrando su contenido de forma eléctrica.

Figura 7.7. Configuración típica del bus I2C.

7.2.5.1. Direccionamiento de la memoria

Después del START se envía un byte de control, este consiste en 8 bits, de los

cuáles los 4 primeros (mayor peso) indican la operación que se quiere realizar, en el

caso de la memoria es 1010, los tres siguientes (A2,A1,A0), indican el número de

Page 58: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 58 -

dispositivo dentro de la misma operación u banco de memoria dentro del mismo

dispositivo y el último bit indica la operación de lectura o escritura, si ese bit es “1”

realizaremos una lectura y si es “0” realizaremos escritura. Una vez enviado, el

dispositivo responde con un ACK.

Figura 7.10. Direccionamiento de la memoria.

7.2.5.2. Byte write

Este tipo de escritura se produce cuando solo es necesario grabar un dato. La

escritura comienza con un START, direccionamiento del dispositivo, dirección del byte

y el byte a escribir, después de cada elemento se añade un ACK por parte de la

memoria. La dirección del byte o word address, indica la dirección de la celda de

memoria a la que se quiere acceder dentro de cada bloque.

Figura 7.11. Escritura como byte write.

Page 59: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 59 -

7.2.5.3. Page write

Este tipo de escritura es del tipo secuencial, es decir, se pueden escribir más de un

byte sin tener que mandar un START y STOP para cada byte.

Figura 7.12. Escritura como page write.

7.2.5.4. Current address read

Este tipo de lectura, lee la posición actual de la memoria, esta posición está

apuntada por un puntero interno que la incrementa cada vez.

Figura 7.13. Current address read.

Page 60: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 60 -

7.2.5.5. Random read

En este tipo de lectura se indica la posición de donde debe leer la información, hay

que destacar que primero se ha de enviar la dirección y después se recibe el dato.

Figura 7.14. Random read.

7.2.5.6. Sequential read

En este tipo de lectura, se leen varias posiciones, hay que darle la dirección a partir

de la cual queremos leer y a continuación se leen los bytes que se necesiten leer en

la aplicación. Para conseguirlo debemos implementar la trama que se muestra en la

figura siguiente:

Figura 7.15. Sequential read.

Page 61: construir un robot con pic

BRAZO DE ROBOT ANEXO 3. METODO DE LA BURBUJA

7.3. Anexo 3. Método de la burbuja.

Este es un método para ordenar un vector. Consiste en ir comparando parejas

contiguas de datos, desplazando hacia la última posición el dato mayor o menor,

según si la clasificación es ascendente o descendente. En este caso se ordena de

forma ascendente un vector de 3 posiciones.

Organigrama 7.16. Método de la burbuja.

BURBUJA

I = 0

I = I + 1

V(I) > V(I+1)

I = 3

FIN

Aux = V(I)V(I) = V(I+1)V(I+1) = Aux

S

N

S

N

Page 62: construir un robot con pic

BRAZO DE ROBOT ANEXO 7. CD-ROM

7.4. Anexo 4. Placa de circuito impreso.

7.4.1. Esquema

7.4.2. PCB

7.4.2.1. Vista de Componentes 7.4.2.2. Vista Top 7.4.2.3. Vista Bottom

Page 63: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 63 -

Page 64: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 64 -

Page 65: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 65 -

Page 66: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 66 -

Page 67: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 67 -

7.5. Anexo 5. Listados de programa y organigramas.

A continuación se entregan los listados del software desarrollado para la aplicación,

es decir, del interfície de programación y del cerebro del brazo de robot. También se

entregan los organigramas seguidos para desarrollar el software y poder entender

mejor los programas.

Page 68: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 68 -

INTERFICIE DE PROGRAMACION:

Interfície de programación

¿Cambio de posición para servo 1?

¿Cambio de posición

para servo 2?

¿Cambio de posición para servo 3?

¿Grabar Memoria?

Tarea a Realizar = 0

Tarea a Realizar = 1

¿Reset?

¿Borrar Memoria?

Tarea a Realizar = 2

Tarea a Realizar = 3

Enviar trama de comunicación por el puerto serie

N

Fin Interfície

S

S

N

N

S

S

N

N

S

S N

Page 69: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 69 -

Organigrama 7.17. Interficie de programación. CALCULO DEL NUMERO DE PASOS A ENVIAR:

Organigrama 7.18. Cálculo del número de pasos que debe esperar cada servo.

CALCULO PASOS

I = 0

I = I + 1

V(I) > V(I+1)

I = 3

FIN PASOS

Aux = V(I)V(I) = V(I+1)V(I+1) = Aux

S

N

S

N

I = 0

V(I) = Grados_BaseV(I+1) = Grados_Hombro

V(I+2) = Grados_Codo

Nº Pasos_Base = V(I+2) / Incremento_ Grados_BaseNº Pasos_Hombro = V(I+2) / Incremento_Grados_Hombro

Nº Pasos_Codo = V(I+2) / Incremento_Grados_Codo

Page 70: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 70 -

LISTADO DEL PROGRAMA DE LA INTERFICIE: Formulario Principal: Private Sub Pantallaprincipal_Load() ‘Inicializa todas las variables del programa Memorizarrutina.RutinaSumarRestar(0).Value = 0 ‘Variables de los text box de los Memorizarrutina.RutinaSumarRestar(1).Value = 0 ‘grados donde debe ir cada servo. Memorizarrutina.RutinaSumarRestar(2).Value = 0 Memorizarrutina.RutinaGrados(0).Text = 0 Memorizarrutina.RutinaGrados(1).Text = 0 Memorizarrutina.RutinaGrados(2).Text = 0 Grados_Base = 0 ‘Variables de los grados que tiene cada servo. Grados_Hombro = 0 Grados_Codo = 0 Grados_Base_Anterior = 255 Grados_Hombro_Anterior = 255 Grados_Codo_Anterior = 255 Numero_Puerto = 1 ‘Inicializa el puerto serie de transmisión, como COM1. Call Memorizarrutina.enviar End Sub Private Sub Menumemorizacionderutina_Click() ‘Muestra el formulario de rutinas, si ha sido Memorizarrutina.Show vbModal, Me ‘seleccionado con el menu del formulario End Sub ‘principal. Private Sub Menuopcionesdecomunicacion_Click() ‘Muestra el formulario para cambiar el OpcionesComunicacion.Show vbModal, Me ‘el puerto de comunicación. End Sub Private Sub Menusalir_Click() ‘Para finalizar el programa, se selecciona desde el menu End ‘del formulario principal. End Sub Formulario opciones de comunicación: Private Sub OpcionesAceptar_Click(Index As Integer) ´Acepta el COM seleccionado como Unload Me ‘valido. End Sub Private Sub OpcionPuerto1_Click() ‘Selecciona el COM1 como activo. Numero_Puerto = 1 End Sub Private Sub OpcionPuerto2_Click() ‘Selecciona el COM2 como activo. Numero_Puerto = 2 End Sub

Page 71: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 71 -

Formulario para grabar, borrar y resetear el brazo de robot: Private Sub Borrar_Click() ‘Rutina para borrar la memoria I2C. Para ello se manda como Tarea_Realizar = "3" ‘Tarea a realizar el número 3. Mov_Text1.Text = 0 Mov_Text2.Text = 42 Grados_Base_Anterior = 255 Grados_Hombro_Anterior = 255 Grados_Codo_Anterior = 255 Call enviar End Sub Private Sub RutinaGrabar_Click() ‘Esta rutina sirve para grabar una secuencia de movimientos ‘en la memoria I2C. If (Grados_Base <> Grados_Base_Anterior Or Grados_Hombro <> Grados_Hombro_Anterior Or Grados_Codo <> Grados_Codo_Anterior) And (Mov_Text1.Text < 42) Then Mov_Text1 = Mov_Text1 + 1 Mov_Text2 = Mov_Text2 - 1 Grados_Base_Anterior = Grados_Base Grados_Hombro_Anterior = Grados_Hombro Grados_Codo_Anterior = Grados_Codo Tarea_Realizar = "1" ‘Para dar la orden de grabación de la posición actual del brazo. Call enviar End If End Sub If (RutinaGrados(0).Text >= 0 And RutinaGrados(0).Text <= 180) Or (RutinaGrados(1).Text >= 0 And RutinaGrados(1) <= 180) Or (RutinaGrados(2).Text >= 0 And RutinaGrados(2).Text <= 180) Then Grados_Base = RutinaGrados(0).Text RutinaSumarRestar(0).Value = RutinaGrados(0).Text ‘En esta rutina se actualiza la Grados_Hombro = RutinaGrados(1).Text ‘variable que contiene el valor RutinaSumarRestar(1).Value = RutinaGrados(1).Text ‘de los grados de cada servo a Grados_Codo = RutinaGrados(2).Text ‘partir del valor del campo de RutinaSumarRestar(2).Value = RutinaGrados(2).Text ‘texto de cada servo. End If End Sub Private Sub RutinaReset_Click() ‘Rutina para resetear el brazo de robot, es decir, RutinaGrados(0).Text = 0 ‘lleva todos los servos a la posición 0º, borra memoria RutinaGrados(1).Text = 0 ‘e inicializa todas las variables del interfície. RutinaGrados(2).Text = 0 RutinaSumarRestar(0).Value = 0 ‘Texto que indica la posición de cada servo. RutinaSumarRestar(1).Value = 0 RutinaSumarRestar(2).Value = 0 Grados_Base = 0 ‘Variable que guarda la posición de cada servo. Grados_Hombro = 0 Grados_Codo = 0 Grados_Base_Anterior = 255 ‘Posición anterior, cuando se inicializa se pone a Grados_Hombro_Anterior = 255 ‘valor 255. Grados_Codo_Anterior = 255 Mov_Text1.Text = 0 ‘Movimientos actuales grabados en memoria I2C. Mov_Text2.Text = 42 ‘Movimientos que faltan para llenar banco de memoria I2C. Tarea_Realizar = "2" ‘Indica al Brazo de robot que resetee la memoria y los servos. Call enviar

Page 72: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 72 -

End Sub Private Sub RutinaSalir_Click() ‘Vuelta al formulario principal. Unload Me End Sub Private Sub RutinaSumarRestar_Change(Index As Integer) If RutinaSumarRestar(0).Value <> Grados_Base Then ‘Texto de la posición del servo1, Grados_Base = RutinaSumarRestar(0).Value ‘Base. RutinaGrados(0).Text = RutinaSumarRestar(0).Value End If If RutinaSumarRestar(1).Value <> Grados_Hombro Then ‘Texto de la posición del servo Grados_Hombro = RutinaSumarRestar(1).Value ‘del Hombro. RutinaGrados(1).Text = RutinaSumarRestar(1).Value End If If RutinaSumarRestar(2).Value <> Grados_Codo Then ‘Texto de la posición del servo del Grados_Codo = RutinaSumarRestar(2).Value ‘Codo. RutinaGrados(2).Text = RutinaSumarRestar(2).Value End If Tarea_Realizar = "0" 'Aplicar a los servos sin grabar en EEPROM Call enviar End Sub Sub enviar() Inicio_Transmision_Centena = "2" ‘Bytes de sincronización. Inicio_Transmision_Decena = "5" Inicio_Transmision_Unidad = "5" If Grados_Base >= 0 And Grados_Base <= 180 Then ‘Se prepara la centena, decena y unidad If Grados_Base >= 0 And Grados_Base < 10 Then ‘Base < 10 Centena(0) = "0" Decena(0) = "0" Unidad(0) = Grados_Base End If If Grados_Base >= 10 And Grados_Base < 100 Then ‘Base <100 Centena(0) = "0" '_Base = "0" Decena(0) = Left(Grados_Base, 1) Unidad(0) = Right(Grados_Base, 1) End If If Grados_Base >= 100 Then ‘Base > 100 Centena(0) = Left(Grados_Base, 1) Decena(0) = Mid(Grados_Base, 2, 1) Unidad(0) = Right(Grados_Base, 1) End If End If If Grados_Hombro >= 0 And Grados_Hombro <= 180 Then If Grados_Hombro >= 0 And Grados_Hombro < 10 Then ‘Hombro <10 Centena(1) = "0" Decena(1) = "0" Unidad(1) = Grados_Hombro End If If Grados_Hombro >= 10 And Grados_Hombro < 100 Then ‘Hombro <100 Centena(1) = "0" Decena(1) = Left(Grados_Hombro, 1)

Page 73: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 73 -

Unidad(1) = Right(Grados_Hombro, 1) End If If Grados_Hombro >= 100 Then ‘Hombro > 99 Centena(1) = Left(Grados_Hombro, 1) Decena(1) = Mid(Grados_Hombro, 2, 1) Unidad(1) = Right(Grados_Hombro, 1) End If End If If Grados_Codo >= 0 And Grados_Codo <= 180 Then ‘Codo < 10 If Grados_Codo >= 0 And Grados_Codo < 10 Then Centena(2) = "0" Decena(2) = "0" Unidad(2) = Grados_Codo End If If Grados_Codo >= 10 And Grados_Codo < 100 Then ‘Codo < 100 Centena(2) = "0" Decena(2) = Left(Grados_Codo, 1) Unidad(2) = Right(Grados_Codo, 1) End If If Grados_Codo >= 100 Then ‘Codo > 99 Centena(2) = Left(Grados_Codo, 1) Decena(2) = Mid(Grados_Codo, 2, 1) Unidad(2) = Right(Grados_Codo, 1) End If End If 'Rutina de ordenacion del valor de grado de cada servo, según la diferencia entre el valor ‘siguiente y el anterior, para así saber el mayor desplazamiento y calcular el número de ‘pasos. If Grados_Base_Anter > Grados_Base Then Grados_Base_Resta = Grados_Base_Anter - Grados_Base End If If Grados_Base_Anter < Grados_Base Then Grados_Base_Resta = Grados_Base - Grados_Base_Anter End If Grados_Base_Anter = Grados_Base If Grados_Hombro_Anter > Grados_Hombro Then Grados_Hombro_Resta = Grados_Hombro_Anter - Grados_Hombro End If If Grados_Hombro_Anter < Grados_Hombro Then Grados_Hombro_Resta = Grados_Hombro - Grados_Hombro_Anter End If Grados_Hombro_Anter = Grados_Hombro If Grados_Codo_Anter > Grados_Codo Then Grados_Codo_Resta = Grados_Codo_Anter - Grados_Codo End If If Grados_Codo_Anter < Grados_Codo Then Grados_Codo_Resta = Grados_Codo - Grados_Codo_Anter End If Grados_Codo_Anter = Grados_Codo

Page 74: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 74 -

Ordenados(0) = Grados_Base_Resta Ordenados(1) = Grados_Hombro_Resta Ordenados(2) = Grados_Codo_Resta For J = 0 To 2 ‘Ordenación por el método de la burbuja, el mayor queda For I = 0 To 1 ‘al final del vector. If Ordenados(I) > Ordenados(I + 1) Then aux = Ordenados(I) Ordenados(I) = Ordenados(I + 1) Ordenados(I + 1) = aux End If Next I Next J 'calculo del número de paso de cada servo dividiendo el mayor desplazamiento entre los ‘los otros. 'Evita la division por cero Grados_Base_Paso = Grados_Base_Resta Grados_Hombro_Paso = Grados_Hombro_Resta Grados_Codo_Paso = Grados_Codo_Resta If Grados_Base_Paso = 0 Then Grados_Base_Paso = Grados_Base_Paso + 1 End If If Grados_Hombro_Paso = 0 Then Grados_Hombro_Paso = Grados_Hombro_Paso + 1 End If If Grados_Codo_Paso = 0 Then Grados_Codo_Paso = Grados_Codo_Paso + 1 End If 'Cuidado que Str mete un signo a la izda, caracter blanco si es positivo '- si es negativo. Pasos_Servo(0) = Str(Int(Ordenados(2) / Grados_Base_Paso)) ‘Cálculo de pasos. Pasos_Servo(1) = Str(Int(Ordenados(2) / Grados_Hombro_Paso)) Pasos_Servo(2) = Str(Int(Ordenados(2) / Grados_Codo_Paso)) 'Aqui elimino el signo de la izquierda que se coloca con Str() If Pasos_Servo(0) >= 0 And Pasos_Servo(0) <= 180 Then If Pasos_Servo(0) >= 0 And Pasos_Servo(0) < 10 Then Pasos_Servo_Centena(0) = "0" Pasos_Servo_Decena(0) = "0" Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0), 2, 1) End If If Pasos_Servo(0) >= 10 And Pasos_Servo(0) < 100 Then Pasos_Servo_Centena(0) = "0" Pasos_Servo_Decena(0) = Mid(Pasos_Servo(0), 2, 1) Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0), 3, 1) End If If Pasos_Servo(0) >= 100 Then Pasos_Servo_Centena(0) = Mid(Pasos_Servo(0), 2, 1) Pasos_Servo_Decena(0) = Mid(Pasos_Servo(0), 3, 1) Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0), 4, 1) End If End If

Page 75: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 75 -

If Pasos_Servo(1) >= 0 And Pasos_Servo(1) <= 180 Then If Pasos_Servo(1) >= 0 And Pasos_Servo(1) < 10 Then Pasos_Servo_Centena(1) = "0" Pasos_Servo_Decena(1) = "0" Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1), 2, 1) End If If Pasos_Servo(1) >= 10 And Pasos_Servo(1) < 100 Then Pasos_Servo_Centena(1) = "0" Pasos_Servo_Decena(1) = Mid(Pasos_Servo(1), 2, 1) Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1), 3, 1) End If If Pasos_Servo(1) >= 100 Then Pasos_Servo_Centena(1) = Mid(Pasos_Servo(1), 2, 1) Pasos_Servo_Decena(1) = Mid(Pasos_Servo(1), 3, 1) Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1), 4, 1) End If End If If Pasos_Servo(2) >= 0 And Pasos_Servo(2) <= 180 Then If Pasos_Servo(2) >= 0 And Pasos_Servo(2) < 10 Then Pasos_Servo_Centena(2) = "0" Pasos_Servo_Decena(2) = "0" Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2), 2, 1) End If If Pasos_Servo(2) >= 10 And Pasos_Servo(2) < 100 Then Pasos_Servo_Centena(2) = "0" Pasos_Servo_Decena(2) = Mid(Pasos_Servo(2), 2, 1) Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2), 3, 1) End If If Pasos_Servo(2) >= 100 Then Pasos_Servo_Centena(2) = Mid(Pasos_Servo(2), 2, 1) Pasos_Servo_Decena(2) = Mid(Pasos_Servo(2), 3, 1) Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2), 4, 1) End If End If ‘Se manda la trama de comunicación por el puerto serie RS-232. CommSerie.CommPort = Numero_Puerto CommSerie.Settings = "9600,N,8,1" CommSerie.PortOpen = True CommSerie.Output = Inicio_Transmision_Centena CommSerie.Output = Inicio_Transmision_Decena CommSerie.Output = Inicio_Transmision_Unidad CommSerie.Output = Tarea_Realizar For x = 0 To 2 '3 CommSerie.Output = Pasos_Servo_Centena(x) CommSerie.Output = Pasos_Servo_Decena(x) CommSerie.Output = Pasos_Servo_Unidad(x) CommSerie.Output = Centena(x) CommSerie.Output = Decena(x) CommSerie.Output = Unidad(x) Next x

Page 76: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 76 -

CommSerie.PortOpen = False Tarea_Realizar = "0" End Sub

Page 77: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 77 -

CEREBRO DEL BRAZO DE ROBOT: PROGRAMA PRINCIPAL DE LA APLICACIÓN:

Organigrama 7.19. Rutina principal del brazo de robot.

Programa principal

¿Modo Autonómo?

¿Recibido por el puerto serie el valor

"255"?

Recibir trama por el puerto serie: Tarea a

Realizar yPosición de los servos

¿Tarea a Realizar = 0?

Actuar sobre servos

¿Tarea a Realizar = 1?Grabar memoria

¿Tarea a Realizar = 2?

Posicionar servos en posicion 0º y borrar memoria

Borrar memoria¿Tarea a

Realizar = 3?

Leer memoriaActuar sobre servos

¿Todos los servos en posición?

N S

Modo AutonómoModo Programación

N S

N SS

N

S

S

S

N

N

N

Page 78: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 78 -

RUTINA PARA GRABAR EN LA MEMORIA I2C

Organigramas 7.20. Rutina grabar memoria.

Rutina Grabar Memoria

¿Memoria llena?

Fin Rutina Grabar

Grabar: Posición servo1 y nº de pasos 1Posición servo2 y nº de pasos 2Posición servo3 y nº de pasos 3

Numero Total Movimientos+1y grabar en memoria

S

N

Page 79: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 79 -

RUTINA LEER MEMORIA:

Organigrama 7.21. Rutina leer de EEPROM.

Rutina Leer Memoria

¿Número de movimiento actual > número total de

movimientos?

Fin Rutina Leer

Leer en EEPROM: Posición servo1 y nº de pasos1 Posición servo2 y nº de pasos2 Posición servo3 y nº de pasos3

Incrementar número de movimiento actual

¿Número de movimiento actual = número total de

movimientos?

Inicializar: Número de movimiento actual

S

N

S

N

Page 80: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 80 -

RUTINA SERVICIO DE INTERRUPCION (PWM):

Organigrama 7.22. Atención de interrupción, genera PWM para los servos.

RSI

¿Interrupcion por TMR1?

¿Variable = 2? Subir pin servo 1Cargar TMR1

¿Interrupcion por TMR0?

¿Variable = 2?Bajar pin servo 1

¿Variable = 1?Subir pin servo 2

Cargar TMR1

Subir pin servo 3Cargar TMR1

¿Variable = 1?Bajar pin servo 2

Bajar pin servo 3Variable = 3

Desactivar TMR1Variable = Variable - 1

Fin RSI

S N

N

S

S

S

N

NN

N

S

S

Page 81: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 81 -

LISTADO DEL PROGRAMA GRABADO EN EL PIC 16F873 ;Programa para realizar las siguientes operaciones pertenecientes al brazo de robot con 3 ;servos, estas acciones son: Controlar servos, borrar, grabar y leer la EEPROM I2C. ;Los 3 servos incrementan y decrementan grados según una tabla, de aproximadamente 1 ;grado. El duty-cycle sera una interrupcion provocada por TMR1. El resto del periodo será una ;interrupcion provocada por el TMR0. El TMR0 provoca interrupcion cada 5 milisegundos, por lo ; que se necesitara una variable contador que cada 4 veces que se produzca una TMR0 ;interrupción actuará sobre cada servo, con intervalo de 5 mS. Dejando así tiempo de sobra ;para para que no se afecte el PWM de los demás servos. ;Además se le pasaran las posiciones a la que debe ir cada servo desde el PC, por el puerto ;serie, desde el programa hecho en VB para tal tarea. LIST P=16F873 ;Tipo de procesador. INCLUDE "P16F873.INC" ;Variables N_SERVO EQU 20h ;Nº de servo para actuar el PWM, en cada INT. Leido EQU 21h ;Leido de RCREG, después de restar 30h ASCI I. GRADOS_SERVO1 EQU 22h ;Grado al que debe ir el servo 1. GRADOS_SERVO2 EQU 23h ;Grado al que debe ir el servo 2. GRADOS_SERVO3 EQU 24h ;Grado al que debe ir el servo 3. GRADO_LECTURA EQU 26h ;Grado para leer tabla. Tarea_Realizar EQU 27h ;Tarea a realizar. W_TEMP EQU 30h ;Para guardar el Counter program y registro W. STATUS_TEMP EQU 31h ;al ejecutar el servicio de interrupción. PCLATH_TEMP EQU 32h Unidad EQU 33h ;Unidad leída de RS-232. Decena EQU 34h ;Decena leída de RS-232. Centena EQU 35h ;Centena leída de RS-232. Cifra_Leida EQU 36h ;Obtiene la cifra real. Pasos_Servo1 EQU 38h ;Nº de pasos de espera para servo 1. Pasos_Servo2 EQU 39h ;Idem para servo 2 y 3. Pasos_Servo3 EQU 3Ah GR_DEST_SERVO1 EQU 42h ;Variables para saber el grado destino al que GR_DEST_SERVO2 EQU 43h ;debe ir cada servo. GR_DEST_SERVO3 EQU 44h Pas_act_Servo1 EQU 46h ;Paso actual en el que se encuentra cada Pas_act_Servo2 EQU 47h ;servo para repetir cada grado. Pas_act_Servo3 EQU 48h Pas_act_Servo4 EQU 49h GRADOS_SERVO EQU 4Bh Pasos_Servo EQU 4Ch GR_DEST_SERVO EQU 4Dh Pas_act_Servo EQU 4Eh Mira_si_Paso EQU 4Fh ;Mira si se puede sumar pasos o grados, para ;sincronizar con los servos. Retardo_1 EQU 50h ;Necesario en el Delay de 4,7mS

Page 82: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 82 -

Retardo_2 EQU 51h ;el I2C y la EEPROM 24LC02B WORD_ADDRESS EQU 52h ;Palabra de direccion para el I2C. Total_Mov EQU 53h ;Total movimientos de la secuencia. N_Mov_Act EQU 54h ;El numero por el que va en la secuencia de lectura. ;********** Programa. ORG 00h ;Vector de reset GOTO Inicio ORG 04h ;Vector de interrupcion GOTO RSI ;Configuración de registros página 1 de memoria. Inicio BCF STATUS,RP1 ;PAGINA 1 BSF STATUS,RP0 MOVLW b'00000111' ;TMR0 con preescaler 1:256 MOVWF OPTION_REG MOVLW 0x06 ;PORTA como salidas/entradas digitales MOVWF ADCON1 MOVLW b'00110000' ;RA0,1,2,3 salida, el resto son entradas MOVWF TRISA MOVLW b'00000000' ;PORTB como salidas digitales MOVWF TRISB MOVLW b'10111111' ;RC7/Rx entrada, RC6/Tx salida MOVWF TRISC ;RC3/SCL entrada, RC4/SDA entrada MOVLW .15 ;9600 baudios con FREC=9,830400 MOVWF SPBRG ;segun la formula MOVLW b'10000000' ;Velocidad estandard con niveles I2C MOVWF SSPSTAT MOVLW .24 ;Velocidad del bus aprox 100 khz MOVWF SSPADD ;Cristal de 9,8340 Mhz MOVLW b'11100000' ;Interrupciones generales, perifericas y MOVWF INTCON ;de TMR0 por overflow MOVLW b'00000001' ;Habilita INT por TMR1 overflow MOVWF PIE1 ;Configuración de registros página 0 de memoria. BCF STATUS,RP0 ;Pagina 0 MOVLW b'00101000' ;Modulo MSSP en ON MOVWF SSPCON MOVLW .207 ;TMR0 provocara INT cada 5 mS MOVWF TMR0

CLRF PORTA ;Borrar la puerta A,B y C CLRF PORTB CLRF PORTC MOVLW b'10010000' ;Configura recepcion asincrona MOVWF RCSTA ;de 8 bits sin paridad MOVLW b'00000000' ;Resetea FLAG de int por tmr1 overflow y el MOVWF PIR1 ;que indica que el buffer de recepcion esta lleno MOVLW b'00110000' ;Desactiva TMR1 y preescaler 1:8 MOVWF T1CON MOVLW 02h ;Inicializa la variable N_SERVO MOVWF N_SERVO ;para actuar sobre los 3 servos MOVLW .1 ;Si se puede incrementar/decrementar grado MOVWF Mira_si_Paso movlw 0x00 ;Inicializa la Tarea a Realizar movwf Tarea_Realizar

Page 83: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 83 -

;Condiciones iniciales del brazo de robot Condi_Inicial MOVLW .0 ;Servos a posición de 0º MOVWF GRADOS_SERVO1 MOVWF GR_DEST_SERVO1 MOVLW .0 MOVWF GRADOS_SERVO2 MOVWF GR_DEST_SERVO2 MOVLW .0 MOVWF GRADOS_SERVO3 MOVWF GR_DEST_SERVO3 MOVLW .0 ;Empezará la secuencia desde el

MOVWF N_Mov_Act ;principio de la memoria. MOVWF WORD_ADDRESS

;****Rutina Principal Principal BTFSC PORTC,0 ;Si es 0 entra en el modo programacion GOTO Modo_Autonomo ;Aqui en realidad tiene que ir Modo Autonomo GOTO Modo_Programacion ;Interruptor externo. Fin_Principal GOTO Principal Modo_Autonomo BCF STATUS,Z MOVLW .1 ;Comprueba si puede seguir mirando pasos o ;incrementando/decrementando grados SUBWF Mira_si_Paso,w ;segun la condicion de sincronizacion BTFSC STATUS,Z GOTO Modo_Aut_1 BSF PCLATH,0 ;Cambio de banco de memoria BSF PCLATH,1 CALL Modo_Autonomo_1 Modo_Aut_1 BSF PCLATH,0 BSF PCLATH,2 CALL Fin_Modo_Auton Fin_Modo_Auton_1 GOTO Modo_Autonomo Modo_Programacion ;En este bucle leeremos continuamente si llega algo por el puerto ;serie, en este orden: ;1º,2º y 3º byte, de start, si es 255 se sigue la lectura sino a esperar que ;llegue. ;4º , tarea a realizar, 0 es mover servo ;5º, 6º y 7º byte, numero de pasos que debe esperar el Servo1 ;8º, 9º y 10º numero de grado al que debe ir el servo1 (0...180º) ;11º, 12º y 13º byte, numero de pasos que debe esperar el Servo2 ;14º, 15º y 16º numero de grado al que debe ir el servo2 (0...180º) ;17º, 18º y 19º byte, numero de pasos que debe esperar el Servo3 ;20º, 21º y 22º numero de grado al que debe ir el servo3 (0...180º) ;Se leen 3 bytes y a continuacion cuando se comprueba si es el byte de start 255, ;si es ese byte se sigue con la lectura, si no se vuelve a esperar que llegue. BCF STATUS,Z CALL Obtiene_Cifra_3bytes MOVLW .255

Page 84: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 84 -

SUBWF Cifra_Leida,w BTFSC STATUS,Z GOTO Leer_Tarea GOTO Principal Leer_Tarea CALL Obtiene_Cifra_1byte MOVF Cifra_Leida,w MOVWF Tarea_Realizar Leer_Pasos_Servo1 CALL Obtiene_Cifra_3bytes ;3 bytes, centena, decena y unidad MOVF Cifra_Leida,w MOVWF Pasos_Servo1 ;Se guarda en la variable Leer_Grados_Servo1 CALL Obtiene_Cifra_3bytes ;Centena, decena y unidad MOVF Cifra_Leida,w MOVWF GRADOS_SERVO1 Leer_Pasos_Servo2 CALL Obtiene_Cifra_3bytes ;3bytes MOVF Cifra_Leida,w MOVWF Pasos_Servo2 Leer_Grados_Servo2 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO2 Leer_Pasos_Servo3 CALL Obtiene_Cifra_3bytes ;3byte MOVF Cifra_Leida,w MOVWF Pasos_Servo3 Leer_Grados_Servo3 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO3 Comprobar_Tarea MOVF Tarea_Realizar,w ADDWF PCL,f ;Se comprueba si la tarea a realizar es: GOTO Principal ;0 -> Al Servo GOTO Grabar_Posicion ;1 -> Grabar Coordenada en la EEPROM GOTO Reset ;2 -> Inicializa puntero memoria, borrandola, ;y posicionando el servo a 0º GOTO Borrar_Memoria ;3 -> Borra Memoria Obtiene_Cifra_1byte CALL Leer_Rx ;Obtiene la cifra leída de Tarea a Realizar MOVWF Unidad BSF PCLATH,1 MOVF Unidad,w CALL TABLA_UNIDADES MOVWF Cifra_Leida BCF PCLATH,1 RETURN Obtiene_Cifra_3bytes CALL Leer_Rx ;Obtiene la cifra leída MOVWF Centena CALL Leer_Rx MOVWF Decena CALL Leer_Rx MOVWF Unidad BSF PCLATH,1 MOVF Centena,w CALL TABLA_CENTENAS MOVWF Cifra_Leida MOVF Decena,w CALL TABLA_DECENAS ADDWF Cifra_Leida,f MOVF Unidad,w CALL TABLA_UNIDADES

Page 85: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 85 -

ADDWF Cifra_Leida,f BCF PCLATH,1 RETURN Leer_Rx BTFSS PIR1,5 ;Lee el buffer de entrada, RS-232 GOTO Leer_Rx BCF PIR1,5 MOVF RCREG,w MOVWF Leido MOVLW 30h SUBWF Leido,f MOVF Leido,w RETURN Grabar_Posicion BSF PCLATH,2 ;Grabar los pasos y grados en CALL Grabar_Memoria ;la memoria GOTO Principal Reset ;Lleva todo el sistema a condiciones iniciales, los servos y el puntero de ;memoria tambien, borrandola de esta manera MOVLW .0 MOVWF GR_DEST_SERVO1 MOVWF GR_DEST_SERVO2 MOVWF GR_DEST_SERVO3 MOVWF GRADOS_SERVO1 MOVWF GRADOS_SERVO2 MOVWF GRADOS_SERVO3 BSF PCLATH,2 CALL Reset_Total_Mov GOTO Principal Borrar_Memoria BSF PCLATH,2 CALL Reset_Total_Mov GOTO Principal RSI ;Rutina de servicio de interrupcion, genera PWM movwf W_TEMP ;Guarda Contador de programa swapf STATUS,w ;acumulador y registro de banderas CLRF STATUS movwf STATUS_TEMP movf PCLATH,w movwf PCLATH_TEMP clrf PCLATH MIRAR_INT BTFSS INTCON,2 GOTO TMR1_INT ;Se ha producido INT por overflow de TMR1 GOTO TMR0_INT ;Se ha producido INT por overflow de TMR0 TMR1_INT BTFSS PIR1,0 ;INT por TMR1 ? GOTO FIN_RSI ;Falsa INT ;TMR1_int, bajar PWM MOVLW .207 ;TMR0 cada 5 mS MOVWF TMR0

MOVF N_SERVO,W ADDWF PCL,F

Page 86: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 86 -

GOTO BAJAR_SER3 GOTO BAJAR_SER2 GOTO BAJAR_SER1

GOTO FIN_RSI ;Si hay alguna cosa incontrolada BAJAR_SER1 BCF PORTA,0 ;Nivel bajo del PWM de cada servo GOTO TMR1_INT_1 ;segun corresponda BAJAR_SER2 BCF PORTA,1 GOTO TMR1_INT_1 BAJAR_SER3 BCF PORTA,2 MOVLW 03h ;Inicializa N_SERVO MOVWF N_SERVO TMR1_INT_1 DECF N_SERVO,F

BCF T1CON,0 ;Desactiva TMR1 BCF PIR1,0 ;Habilita INT por TMR1 overflow GOTO FIN_RSI TMR0_INT movlw .0 ;Para sincronizar para que todos los servos movwf Mira_si_Paso ;lleguen juntos a la posicion destino MOVF N_SERVO,W ADDWF PCL,F GOTO SUBIR_SER3 ;pwm a nivel alto GOTO SUBIR_SER2 GOTO SUBIR_SER1 SUBIR_SER1 BSF PORTA,0 MOVF GRADOS_SERVO1,W GOTO CARGAR_TMR1 SUBIR_SER2 BSF PORTA,1 MOVF GRADOS_SERVO2,W GOTO CARGAR_TMR1 SUBIR_SER3 BSF PORTA,2 MOVF GRADOS_SERVO3,W CARGAR_TMR1 MOVWF GRADO_LECTURA BSF PCLATH,0 CALL DUTY_LOW MOVWF TMR1L

MOVF GRADO_LECTURA,W BCF PCLATH,0 BSF PCLATH,1 CALL DUTY_HIGH MOVWF TMR1H BCF PCLATH,1 FIN_TMR1 BSF T1CON,0 ;Activar TMR1 BCF INTCON,2 ;Restablece FLAG de TMR0 FIN_RSI movf PCLATH_TEMP,w movwf PCLATH swapf STATUS_TEMP,w movwf STATUS swapf W_TEMP,F swapf W_TEMP,w RETFIE ;Retorno de interrupcion

Page 87: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 87 -

ORG 100h DUTY_LOW ADDWF PCL,F ;Carga en TMR1 la parte baja, "LOW" del duty ;del pwm correspondiente. TMR1 es de 16 bits. RETLW low .65259 ;0º RETLW low .65257 ;1º RETLW low .65255 ;2º RETLW low .65253 ;3º RETLW low .65251 ;4º RETLW low .65249 ;5º RETLW low .65247 ;6º RETLW low .65245 ;7º RETLW low .65243 ;8º RETLW low .65241 ;9º RETLW low .65239 ;10º RETLW low .65237 ;11º RETLW low .65235 ;12º RETLW low .65233 ;13º RETLW low .65231 ;14º RETLW low .65229 ;15º RETLW low .65227 ;16º RETLW low .65225 ;17º RETLW low .65223 ;18º RETLW low .65221 ;19º RETLW low .65219 ;20º RETLW low .65217 ;21º RETLW low .65215 ;22º RETLW low .65213 ;23º RETLW low .65211 ;24º RETLW low .65209 ;25º RETLW low .65207 ;26º RETLW low .65205 ;27º RETLW low .65203 ;28º RETLW low .65201 ;29º RETLW low .65199 ;30º RETLW low .65197 ;31º RETLW low .65195 ;32º RETLW low .65193 ;33º RETLW low .65191 ;34º RETLW low .65189 ;35º RETLW low .65187 ;36º RETLW low .65185 ;37º RETLW low .65183 ;38º RETLW low .65181 ;39º RETLW low .65179 ;40º RETLW low .65177 ;41º RETLW low .65175 ;42º RETLW low .65173 ;43º RETLW low .65171 ;44º RETLW low .65169 ;45º RETLW low .65167 ;46º RETLW low .65165 ;47º RETLW low .65163 ;48º RETLW low .65161 ;49º RETLW low .65159 ;50º RETLW low .65157 ;51º RETLW low .65155 ;52º RETLW low .65153 ;53º RETLW low .65151 ;54º

Page 88: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 88 -

RETLW low .65149 ;55º RETLW low .65147 ;56º RETLW low .65145 ;57º RETLW low .65143 ;58º RETLW low .65141 ;59º RETLW low .65139 ;60º RETLW low .65137 ;61º RETLW low .65135 ;62º RETLW low .65133 ;63º RETLW low .65131 ;64º RETLW low .65129 ;65º RETLW low .65127 ;66º RETLW low .65125 ;67º RETLW low .65121 ;68º RETLW low .65119 ;69º RETLW low .65117 ;70º RETLW low .65115 ;71º RETLW low .65113 ;72º RETLW low .65111 ;73º RETLW low .65109 ;74º RETLW low .65107 ;75º RETLW low .65105 ;76º RETLW low .65103 ;77º RETLW low .65101 ;78º RETLW low .65099 ;79º RETLW low .65097 ;80º RETLW low .65095 ;81º RETLW low .65093 ;82º RETLW low .65091 ;83º RETLW low .65089 ;84º RETLW low .65087 ;85º RETLW low .65085 ;86º RETLW low .65083 ;87º RETLW low .65081 ;88º RETLW low .65079 ;89º RETLW low .65077 ;90º RETLW low .65075 ;91º RETLW low .65073 ;92º RETLW low .65071 ;93º RETLW low .65069 ;94º RETLW low .65067 ;95º RETLW low .65065 ;96º RETLW low .65063 ;97º RETLW low .65061 ;98º RETLW low .65059 ;99º RETLW low .65057 ;100º RETLW low .65055 ;101º RETLW low .65053 ;102º RETLW low .65051 ;103º RETLW low .65049 ;104º RETLW low .65047 ;105º RETLW low .65045 ;106º RETLW low .65043 ;107º RETLW low .65041 ;108º RETLW low .65039 ;109º RETLW low .65037 ;110º RETLW low .65035 ;111º RETLW low .65033 ;112º RETLW low .65031 ;113º RETLW low .65029 ;114º

Page 89: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 89 -

RETLW low .65027 ;115º RETLW low .65025 ;116º RETLW low .65023 ;117º RETLW low .65021 ;118º RETLW low .65019 ;119º RETLW low .65017 ;120º RETLW low .65015 ;121º RETLW low .65013 ;122º RETLW low .65011 ;123º RETLW low .65009 ;124º RETLW low .65007 ;125º RETLW low .65005 ;126º RETLW low .65003 ;127º RETLW low .65001 ;128º RETLW low .64999 ;129º RETLW low .64997 ;130º RETLW low .64995 ;131º RETLW low .64993 ;132º RETLW low .64991 ;133º RETLW low .64989 ;134º RETLW low .64987 ;135º RETLW low .64985 ;136º RETLW low .64983 ;137º RETLW low .64981 ;138º RETLW low .64979 ;139º RETLW low .64977 ;140º RETLW low .64975 ;141º RETLW low .64973 ;142º RETLW low .64971 ;143º RETLW low .64969 ;144º RETLW low .64967 ;145º RETLW low .64965 ;146º RETLW low .64963 ;147º RETLW low .64961 ;148 RETLW low .64959 ;149º RETLW low .64957 ;150º RETLW low .64955 ;151º RETLW low .64953 ;152º RETLW low .64951 ;153º RETLW low .64949 ;154º RETLW low .64947 ;155º RETLW low .64945 ;156º RETLW low .64943 ;157º RETLW low .64941 ;158º RETLW low .64939 ;159º RETLW low .64937 ;160º RETLW low .64935 ;161º RETLW low .64933 ;162º RETLW low .64931 ;163º RETLW low .64929 ;164º RETLW low .64927 ;165º RETLW low .64925 ;166º RETLW low .64923 ;167º RETLW low .64921 ;168º RETLW low .64919 ;169º RETLW low .64917 ;170º RETLW low .64915 ;171º RETLW low .64913 ;172º RETLW low .64911 ;173º RETLW low .64909 ;174º

Page 90: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 90 -

RETLW low .64907 ;175º RETLW low .64905 ;176º RETLW low .64903 ;177º RETLW low .64901 ;178º RETLW low .64899 ;179º RETLW low .64897 ;180º ORG 200h DUTY_HIGH ADDWF PCL,F ;Carga en TMR1 la parte alta, "HIGH" del duty ;del PWM correspondiente. RETLW high .65259 ;0º RETLW high .65257 ;1º RETLW high .65255 ;2º RETLW high .65253 ;3º RETLW high .65251 ;4º RETLW high .65249 ;5º RETLW high .65247 ;6º RETLW high .65245 ;7º RETLW high .65243 ;8º RETLW high .65241 ;9º RETLW high .65239 ;10º RETLW high .65237 ;11º RETLW high .65235 ;12º RETLW high .65233 ;13º RETLW high .65231 ;14º RETLW high .65229 ;15º RETLW high .65227 ;16º RETLW high .65225 ;17º RETLW high .65223 ;18º RETLW high .65221 ;19º RETLW high .65219 ;20º RETLW high .65217 ;21º RETLW high .65215 ;22º RETLW high .65213 ;23º RETLW high .65211 ;24º RETLW high .65209 ;25º RETLW high .65207 ;26º RETLW high .65205 ;27º RETLW high .65203 ;28º RETLW high .65201 ;29º RETLW high .65199 ;30º RETLW high .65197 ;31º RETLW high .65195 ;32º RETLW high .65193 ;33º RETLW high .65191 ;34º RETLW high .65189 ;35º RETLW high .65187 ;36º RETLW high .65185 ;37º RETLW high .65183 ;38º RETLW high .65181 ;39º RETLW high .65179 ;40º RETLW high .65177 ;41º RETLW high .65175 ;42º RETLW high .65173 ;43º RETLW high .65171 ;44º RETLW high .65169 ;45º RETLW high .65167 ;46º RETLW high .65165 ;47º

Page 91: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 91 -

RETLW high .65163 ;48º RETLW high .65161 ;49º RETLW high .65159 ;50º RETLW high .65157 ;51º RETLW high .65155 ;52º RETLW high .65153 ;53º RETLW high .65151 ;54º RETLW high .65149 ;55º RETLW high .65147 ;56º RETLW high .65145 ;57º RETLW high .65143 ;58º RETLW high .65141 ;59º RETLW high .65139 ;60º RETLW high .65137 ;61º RETLW high .65135 ;62º RETLW high .65133 ;63º RETLW high .65131 ;64º RETLW high .65129 ;65º RETLW high .65127 ;66º RETLW high .65125 ;67º RETLW high .65121 ;68º RETLW high .65119 ;69º RETLW high .65117 ;70º RETLW high .65115 ;71º RETLW high .65113 ;72º RETLW high .65111 ;73º RETLW high .65109 ;74º RETLW high .65107 ;75º RETLW high .65105 ;76º RETLW high .65103 ;77º RETLW high .65101 ;78º RETLW high .65099 ;79º RETLW high .65097 ;80º RETLW high .65095 ;81º RETLW high .65093 ;82º RETLW high .65091 ;83º RETLW high .65089 ;84º RETLW high .65087 ;85º RETLW high .65085 ;86º RETLW high .65083 ;87º RETLW high .65081 ;88º RETLW high .65079 ;89º RETLW high .65077 ;90º RETLW high .65075 ;91º RETLW high .65073 ;92º RETLW high .65071 ;93º RETLW high .65069 ;94º RETLW high .65067 ;95º RETLW high .65065 ;96º RETLW high .65063 ;97º RETLW high .65061 ;98º RETLW high .65059 ;99º RETLW high .65057 ;100º RETLW high .65055 ;101º RETLW high .65053 ;102º RETLW high .65051 ;103º RETLW high .65049 ;104º RETLW high .65047 ;105º RETLW high .65045 ;106º RETLW high .65043 ;107º

Page 92: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 92 -

RETLW high .65041 ;108º RETLW high .65039 ;109º RETLW high .65037 ;110º RETLW high .65035 ;111º RETLW high .65033 ;112º RETLW high .65031 ;113º RETLW high .65029 ;114º RETLW high .65027 ;115º RETLW high .65025 ;116º RETLW high .65023 ;117º RETLW high .65021 ;118º RETLW high .65019 ;119º RETLW high .65017 ;120º RETLW high .65015 ;121º RETLW high .65013 ;122º RETLW high .65011 ;123º RETLW high .65009 ;124º RETLW high .65007 ;125º RETLW high .65005 ;126º RETLW high .65003 ;127º RETLW high .65001 ;128º RETLW high .64999 ;129º RETLW high .64997 ;130º RETLW high .64995 ;131º RETLW high .64993 ;132º RETLW high .64991 ;133º RETLW high .64989 ;134º RETLW high .64987 ;135º RETLW high .64985 ;136º RETLW high .64983 ;137º RETLW high .64981 ;138º RETLW high .64979 ;139º RETLW high .64977 ;140º RETLW high .64975 ;141º RETLW high .64973 ;142º RETLW high .64971 ;143º RETLW high .64969 ;144º RETLW high .64967 ;145º RETLW high .64965 ;146º RETLW high .64963 ;147º RETLW high .64961 ;148 RETLW high .64959 ;149º RETLW high .64957 ;150º RETLW high .64955 ;151º RETLW high .64953 ;152º RETLW high .64951 ;153º RETLW high .64949 ;154º RETLW high .64947 ;155º RETLW high .64945 ;156º RETLW high .64943 ;157º RETLW high .64941 ;158º RETLW high .64939 ;159º RETLW high .64937 ;160º RETLW high .64935 ;161º RETLW high .64933 ;162º RETLW high .64931 ;163º RETLW high .64929 ;164º RETLW high .64927 ;165º RETLW high .64925 ;166º RETLW high .64923 ;167º

Page 93: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 93 -

RETLW high .64921 ;168º RETLW high .64919 ;169º RETLW high .64917 ;170º RETLW high .64915 ;171º RETLW high .64913 ;172º RETLW high .64911 ;173º RETLW high .64909 ;174º RETLW high .64907 ;175º RETLW high .64905 ;176º RETLW high .64903 ;177º RETLW high .64901 ;178º RETLW high .64899 ;179º RETLW high .64897 ;180º TABLA_CENTENAS ADDWF PCL,F RETLW 0x00 ;Devuelve 0 RETLW .100 ;Devuelve el 100 decimal RETLW .200 ;Devuelve el 200 decimal TABLA_DECENAS ADDWF PCL,F RETLW .0 ;Devuelve el 0 RETLW .10 ;Devuelve el 10 RETLW .20 ;Devuelve el 20 RETLW .30 ;Devuelve el 30 RETLW .40 ;Devuelve el 40 RETLW .50 ;Devuelve el 50 RETLW .60 ;Devuelve el 60 RETLW .70 ;Devuelve el 70 RETLW .80 ;Devuelve el 80 RETLW .90 ;Devuelve el 90 TABLA_UNIDADES ADDWF PCL,F RETLW .0 ;Devuelve el 0

RETLW .1 ;Devuelve el 1 RETLW .2 ;Devuelve el 2 RETLW .3 ;Devuelve el 3 RETLW .4 ;Devuelve el 4 RETLW .5 ;Devuelve el 5 RETLW .6 ;Devuelve el 6 RETLW .7 ;Devuelve el 7 RETLW .8 ;Devuelve el 8 RETLW .9 ;Devuelve el 9 ORG 300h Modo_Autonomo_1 BCF STATUS,C ;Aquí se va incrementando o decrementando MOVF N_SERVO,w ;los grados, teniendo en cuenta el nº de pasos ADDWF PCL,f ;que el servo tiene que esperar cada vez. GOTO Calculo_Servo3 GOTO Calculo_Servo2 GOTO Calculo_Servo1

Page 94: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 94 -

Calculo_Servo1 MOVF GRADOS_SERVO1,w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO1,w MOVWF GR_DEST_SERVO MOVF Pasos_Servo1,w MOVWF Pasos_Servo MOVF Pas_act_Servo1,w MOVWF Pas_act_Servo GOTO Calculo_Servo Calculo_Servo2 MOVF GRADOS_SERVO2,w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO2,w MOVWF GR_DEST_SERVO MOVF Pasos_Servo2,w MOVWF Pasos_Servo MOVF Pas_act_Servo2,w MOVWF Pas_act_Servo GOTO Calculo_Servo Calculo_Servo3 MOVF GRADOS_SERVO3,w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO3,w MOVWF GR_DEST_SERVO MOVF Pasos_Servo3,w MOVWF Pasos_Servo MOVF Pas_act_Servo3,w MOVWF Pas_act_Servo Calculo_Servo MOVF GRADOS_SERVO,w ;GRADOS_SERVO>GRADOS_DESTINO SUBWF GR_DEST_SERVO,w BTFSS STATUS,C GOTO DECREMENTAR BCF STATUS,C

MOVF GR_DEST_SERVO,w ;GRADOS_SERVO<GRADOS_DESTINO SUBWF GRADOS_SERVO,w BTFSS STATUS,C GOTO I NCREMENTAR GOTO Fin_Modo_Autonomo ;Caso que sean iguales INCREMENTAR BCF STATUS,Z MOVF Pasos_Servo,w ;Comprueba si el numero de pasos SUBWF Pas_act_Servo,w ;que ha dado es el que hay que dar BTFSC STATUS,Z ;antes de incrementar un grado GOTO INCREMENTAR_GRADO INCF Pas_act_Servo,f GOTO Guardar_Servo INCREMENTAR_GRADO

INCF GRADOS_SERVO,f MOVLW .1 MOVWF Pas_act_Servo GOTO Guardar_Servo

Page 95: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 95 -

DECREMENTAR BCF STATUS,Z MOVF Pasos_Servo,w ;Comprueba si el numero de pasos SUBWF Pas_act_Servo,w ;que ha dado es el que hay que dar BTFSC STATUS,Z ;antes de decrementar un grado GOTO DECREMENTAR_GRADO INCF Pas_act_Servo,f GOTO Guardar_Servo DECREMENTAR_GRADO

DECF GRADOS_SERVO,f MOVLW .1 MOVWF Pas_act_Servo GOTO Guardar_Servo Guardar_Servo MOVF N_SERVO,w ADDWF PCL,f GOTO Guardar_Servo3 GOTO Guardar_Servo2 GOTO Guardar_Servo1 Guardar_Servo1 MOVF GRADOS_SERVO,w MOVWF GRADOS_SERVO1 MOVF Pas_act_Servo,w MOVWF Pas_act_Servo1 GOTO Fin_Modo_Autonomo Guardar_Servo2 MOVF GRADOS_SERVO,w MOVWF GRADOS_SERVO2 MOVF Pas_act_Servo,w MOVWF Pas_act_Servo2 GOTO Fin_Modo_Autonomo Guardar_Servo3 MOVF GRADOS_SERVO,w MOVWF GRADOS_SERVO3 MOVF Pas_act_Servo,w MOVWF Pas_act_Servo3 Fin_Modo_Autonomo movlw .1 ;No realiza ningun incremento/decremento hasta movwf Mira_si_Paso ;nueva interrupción BCF PCLATH,0 BCF PCLATH,1 RETURN ORG 0x400 ;Tratamiento de memoria EEPROM Grabar_Memoria ;Random Read para leer el numero de movimientos totales, antes de ;grabar y la palabra de dirección actual CALL Delay_I2C ;Lee los movimientos totales, si son menores CALL START ;de 42 graba MOVLW b'10100000' CALL I2C_ENVIAR ;Envia el Control Byte como escritura ;(datagrama) MOVLW .252

Page 96: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 96 -

CALL I2C_ENVIAR ;Envia la Word Address del total de ;movimientos CALL RESTART MOVLW b'10100001' CALL I2C_ENVIAR ;Manda el nuevo Control Byte como lectura ;(datagrama) CALL I2C_LEER ;Lee el total de movimientos MOVWF Total_Mov CALL I2C_MAN_NO_ACK CALL STOP ;Lee como CURRENT ADDRESS READ la Word Address ;Empieza la grabacion de los diferentes valores de Servo1,2,3 BCF STATUS,Z ;Comprueba si hay 42 movimientos grabados MOVLW .42 SUBWF Total_Mov,w BTFSC STATUS,Z GOTO Fin_Grabar Grabar_Mem ;Graba como 'PAGE WRITE' los 6 valores correspondientes a los 3 Servos

;Graba el numero de movimientos como 'BYTE WRITE' INCF Total_Mov,f CALL Delay_I2C

BSF PCLATH,0 CALL START_GRABACION MOVLW .252 CALL I2C_ENVIAR ;Manda la WORD ADDRESS de la posicion de ;grabación MOVF Total_Mov,w CALL I2C_ENVIAR ;Manda la el Total de movimientos de la ;secuencia actual del movimiento CALL STOP ;'PAGE WRITE' CALL Delay_I2C

BSF PCLATH,0 CALL START_GRABACION MOVF WORD_ADDRESS,w CALL I2C_ENVIAR MOVF Pasos_Servo1,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f MOVF GRADOS_SERVO1,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f call STOP

bsf PCLATH,0 call START_GRABACION movf WORD_ADDRESS,w call I2C_ENVIAR MOVF Pasos_Servo2,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f MOVF GRADOS_SERVO2,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f

call STOP

Page 97: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 97 -

bsf PCLATH,0 call START_GRABACION movf WORD_ADDRESS,w call I2C_ENVIAR MOVF Pasos_Servo3,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f MOVF GRADOS_SERVO3,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f CALL STOP bsf PCLATH,1 Fin_Grabar BCF PCLATH,2 movlw 0x00 movwf Tarea_Realizar RETURN Leer_Memoria CALL Delay_I2C ;'Random Read' para Total_Mov CALL START MOVLW b'10100000' CALL I2C_ENVIAR MOVLW .252 CALL I2C_ENVIAR CALL RESTART MOVLW b'10100001' CALL I2C_ENVIAR CALL I2C_LEER MOVWF Total_Mov CALL I2C_MAN_NO_ACK CALL STOP ;Compara si Total_Mov = 0, si es así ir al final de la lectura porque no hay ningun movimiento BCF STATUS,Z MOVLW .0 SUBWF Total_Mov,w BTFSC STATUS,Z GOTO Fin_Leer_Mem ;Leer 6 posiciones de la memoria ;La primera como 'Random Read' para posicionar el puntero en WORD_ADDRESS CALL Delay_I2C ;'Random Read' CALL START MOVLW b'10100000' CALL I2C_ENVIAR MOVF WORD_ADDRESS,w CALL I2C_ENVIAR CALL RESTART MOVLW b'10100001' CALL I2C_ENVIAR CALL I2C_LEER MOVWF Pasos_Servo1 CALL I2C_MAN_NO_ACK CALL STOP INCF WORD_ADDRESS,f

Page 98: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 98 -

;Leer siguientes como 'Sequential Read' CALL Delay_I2C CALL START MOVLW b'10100001' CALL I2C_ENVIAR CALL I2C_LEER MOVWF GR_DEST_SERVO1 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK

CALL I2C_LEER MOVWF Pasos_Servo2 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF GR_DEST_SERVO2 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF Pasos_Servo3 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF GR_DEST_SERVO3 INCF WORD_ADDRESS,f CALL I2C_MAN_NO_ACK CALL STOP INCF N_Mov_Act,f ;Compara si N_Mov_Act = Total_Mov, si son iguales iniciar WORD_ADDRESS = 0 ;y N_Mov_Act = 0 BCF STATUS,Z MOVF Total_Mov,w SUBWF N_Mov_Act,w BTFSC STATUS,Z GOTO Iniciar_WORD_ADDRESS GOTO Fin_Leer_Mem Iniciar_WORD_ADDRESS MOVLW .0 MOVWF WORD_ADDRESS MOVWF N_Mov_Act ;Graba WORD_ADDRESS como 'BYTE WRITE' Fin_Leer_Mem BSF PCLATH,0 RETURN ;Resetea la variable Total_Mov y el WORD ADDRESS, y los graba en la posicion ;correspondiente de la EEPROM, borrando asi la memoria Reset_Total_Mov ;Graba posiciones 252d y 253d como 'PAGE WRITE' CALL Delay_I2C CALL START MOVLW b'10100000' CALL I2C_ENVIAR MOVLW .252

Page 99: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 99 -

CALL I2C_ENVIAR MOVLW .0 CALL I2C_ENVIAR ;Graba Total_Mov = 0 CALL STOP MOVLW .0 MOVWF Tarea_Realizar MOVWF N_Mov_Act movwf Total_Mov call Delay_I2C call START movlw b'10100000' call I2C_ENVIAR movlw .252 call I2C_ENVIAR call RESTART movlw b'10100001' call I2C_ENVIAR call I2C_LEER movwf kk call I2C_MAN_NO_ACK call STOP BCF PCLATH,2 RETURN ;*********** RUTINAS I2C **************** Delay_I2C movlw .10 ;Retardo que necesita estar como minimo a nivel 0, las ;lineas I2C Movwf Retardo_1 Delay_1 movlw 0xFF movwf Retardo_2 Bcf STATUS,Z Delay_2 nop nop DECFSZ Retardo_2,f goto Delay_2 bcf STATUS,Z DECFSZ Retardo_1,f goto Delay_1 Return START BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,SEN BTFSC SSPCON2,SEN GOTO $-1 BCF STATUS,RP0 RETURN RESTART BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,RSEN BTFSC SSPCON2,RSEN GOTO $-1 BCF STATUS,RP0 RETURN

Page 100: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 100 -

STOP BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,PEN BTFSC SSPCON2,PEN GOTO $-1 BCF STATUS,RP0 RETURN I2C_ENVIAR MOVWF SSPBUF BSF STATUS,RP0 BTFSC SSPSTAT,R_W GOTO $-1 BCF STATUS,RP0 RETURN I2C_LEER BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,RCEN BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BSF STATUS,RP0 BCF SSPCON2,RCEN BCF STATUS,RP0 MOVF SSPBUF,w RETURN I2C_MAN_ACK BSF STATUS,RP0 BCF STATUS,RP1 BCF SSPCON2,ACKDT BSF SSPCON2,ACKEN BTFSC SSPCON2,ACKEN GOTO $-1 BCF STATUS,RP0 RETURN I2C_MAN_NO_ACK

BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,ACKDT BSF SSPCON2,ACKEN BTFSC SSPCON2,ACKEN GOTO $-1 BCF STATUS,RP0 RETURN

Page 101: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 101 -

ORG 0x500 Fin_Modo_Auton ;Comparar si todos los servos estan en su destino, si es asi leer ;siguiente posicion

BCF STATUS,Z MOVF GR_DEST_SERVO1,w SUBWF GRADOS_SERVO1,w BTFSC STATUS,Z GOTO SEGUIR_LEER_1 GOTO Fin_Modo_Aut_1 SEGUIR_LEER_1 BCF STATUS,Z MOVF GR_DEST_SERVO2,w SUBWF GRADOS_SERVO2,w BTFSC STATUS,Z GOTO SEGUIR_LEER_2 GOTO Fin_Modo_Aut_1 SEGUIR_LEER_2 BCF STATUS,Z MOVF GR_DEST_SERVO3,w SUBWF GRADOS_SERVO3,w BTFSC STATUS,Z GOTO SEGUIR_LEER_3 GOTO Fin_Modo_Aut_1 SEGUIR_LEER_3 BCF PCLATH,0 CALL Leer_Memoria Fin_Modo_Aut_1 BCF PCLATH,0 BCF PCLATH,2 RETURN START_GRABACION BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,ACKSTAT BCF STATUS,RP0 CALL START GOTO $+2 CALL RESTART MOVLW b'10100000' CALL I2C_ENVIAR BSF STATUS,RP0 BTFSC SSPCON2,ACKSTAT GOTO $-5 BCF STATUS,RP0 BCF PCLATH,0 RETURN org 0x600 decf WORD_ADDRESS,f decf WORD_ADDRESS,f decf WORD_ADDRESS,f call Delay_I2C call START movlw b'10100000' call I2C_ENVIAR movf WORD_ADDRESS,w

Page 102: construir un robot con pic

BRAZO DE ROBOT ANEXO 2. BUS I2C

- 102 -

call I2C_ENVIAR call RESTART movlw b'10100001' call I2C_ENVIAR call I2C_LEER call I2C_MAN_NO_ACK call STOP incf WORD_ADDRESS,f incf WORD_ADDRESS,f incf WORD_ADDRESS,f

bcf PCLATH,1 return END