Sie sind auf Seite 1von 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
BRAZO DE ROBOT INDICE

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

-2-
BRAZO DE ROBOT INDICE

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

-3-
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.
BRAZO DE ROBOT INTRODUCCION

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

-5-
BRAZO DE ROBOT INTRODUCCION

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

-6-
BRAZO DE ROBOT INTRODUCCION

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


www.microcontroladores.es.

-7-
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.
BRAZO DE ROBOT MEMORIA TECNICA

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.

-9-
BRAZO DE ROBOT MEMORIA TECNICA

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: Rango Velocidad máxima
Eje 1: base: 0º -- 180º 36º/seg.
Eje 2: hombro: 0º -- 180º 36º/seg.
Eje 3: codo: 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.

- 10 -
BRAZO DE ROBOT MEMORIA TECNICA

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:

Eje 2
80 80 20

40

40
Eje 3

Eje 1
30 CONTROL

130

Figura 2.4. Dimensiones del brazo de robot.

- 11 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 12 -
BRAZO DE ROBOT MEMORIA TECNICA

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

- 13 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 14 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

4 cm 4 cm 4 cm 5 cm

ARTICULACION 1 ARTICULACION 2 CARGA UTIL


MOTOR MOTOR Codo
50 gram os 50 gram os 75 gram os
Hombro 50 gram os
50 gram os

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

- 15 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

4
Par motor base = ( peso × longitud palanca )
1

Par motor base = 50 g × 4cm + 50 g × 8cm + 50 g × 12cm + 75 g × 17cm = 2.475 g × cm

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:

Par del motor 3´3 Kg * cm


Coeficiente de seguridad = = = 1´33
Par necesario 2´475 Kg * cm

- 16 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 17 -
BRAZO DE ROBOT MEMORIA TECNICA

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

- 18 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 19 -
BRAZO DE ROBOT MEMORIA TECNICA

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

- 20 -
BRAZO DE ROBOT MEMORIA TECNICA

♦ 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 Alarma antirrobo Mouse Teléfono Control de motores
Receptor de radio Detector de radar Teclado Módem Compresor
Reproductor de CD ABS Escáner Termostatos
Control remoto Velocímetro Impresora Robótica
Consola de juegos Climatizador Plóter Lector de tarjetas
Microondas Inyección Fotocopiadora Detector de humo
Lavadora Airbag
Aparatos de cocina
Aspiradora
Tabla 2.14. Tabla de aplicaciones que requieren microcontroladores.

- 21 -
BRAZO DE ROBOT MEMORIA TECNICA

2.4.1.3. Alternativas de diseño

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

♦ Alternativa 1:

RS 232
PC m icrocontrolador 1

I2C

microcontrolador 2 microcontrolador 3 m icrocontrolador 4 EEPROM

Actuador Base Actuador Hombro Actuador Codo

Figura 2.15. Diagrama de bloques de la primera alternativa.

♦ Alternativa 2:

PC

RS 232

I2C
microcontrolador 1 EEPROM

Actuador Base Actuador Hombro Actuador Codo

Figura 2.16. Diagrama de bloques de la segunda alternativa.

- 22 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 23 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 24 -
BRAZO DE ROBOT MEMORIA TECNICA

Se realizan los siguientes cálculos:


Velocidad de transmisión: 9.600 baudios1.

1
Tiempo de bit = = 1´041667 x 10 − 4 segundos = 104´1667 µS
9600

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:

Tiempo disponible = Tiempo de bit x Número de bits

Tiempo disponible = 104´1667 µS x 10bits = 1041´667 µS

Se pensó que entre cada escritura del buffer se necesitaría ejecutar 1.500
instrucciones aproximadamente, por lo tanto:

Tiempo disponible
Tiempo de ejecución de cada instrucción =
Número de instrucciones

1041´667 µS
Tiempo de ejecución de cada instrucción = = 0´695 µS
1500

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

1 1
Frecuencia de cristal = x4= × 4 = 5´759 MHz
Tc 0´695µS

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

- 25 -
BRAZO DE ROBOT MEMORIA TECNICA

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:

4 4 4
Frecuenciade cristal = Tc = Tc = = 0´4067µS
Tc Frecuenciade cristal 9´8340 MHz

Como:

Tiempo disponible 1041´6667 µS


Número de instrucciones = = = 2561 instrucciones
Tc 0´4067 µS

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:

- 26 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 27 -
BRAZO DE ROBOT MEMORIA TECNICA

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


de la memoria:

Movimiento 1 00h
Nº Pasos 1
01h
Destino 1
02h
Nº Pasos 2
03h
Destino 2
04h
Nº Pasos 3
05h
Destino 3
Movimiento 2 06h
Nº Pasos 1
07h
Destino 1
08h
Nº Pasos 2
09h
Destino 2
0Ah
Nº Pasos 3
0Bh
Destino 3
Movimiento 3 0Ch
Nº Pasos 1
0Dh

Movimiento 42 F6h
Nº Pasos 1
F7h
Destino 1
F8h
Nº Pasos 2
F9h
Destino 2
FAh
Nº Pasos 3
FBh
Destino 3
FCh
Total movimientos
FDh
Posición actual
FEh
Libre
FFh
Libre

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:

Bytes totales de la memoria


Número de movimientos =
Bytes usados en cada movimiento

256 bytes
Número de movimientos = = 42´66 movimientos
6 bytes

- 28 -
BRAZO DE ROBOT MEMORIA TECNICA

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

Bytes usados para guardar movimientos = Número de movimientos × Bytes por movimiento

Bytes usados para guardar movimientos = 42 × 6 = 252 Bytes

Bytes libres en el banco de memoria = Bytes totales − Bytes de movimientos

Bytes libres en el banco de memoria = 256 Bytes − 252 Bytes = 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”.

- 29 -
BRAZO DE ROBOT MEMORIA TECNICA

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

- 30 -
BRAZO DE ROBOT MEMORIA TECNICA

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:

PW M
Servos

Servo 3

Servo 2

Servo 1

0 5 10 15 20 ms

INT 1 INT 1 INT 1

INT 2 INT 2 INT 2

Figura 2.21. Señal PWM para cada servo.

- 31 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 32 -
BRAZO DE ROBOT MEMORIA TECNICA

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:

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

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.

- 33 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 34 -
BRAZO DE ROBOT MEMORIA TECNICA

♦ 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 -Sensibles a la temperatura
-Capacidad de almacenamiento
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.

- 35 -
BRAZO DE ROBOT MEMORIA TECNICA

Consumo medido: 205 mA.

Capacidad de la batería 650 mA • hora


Tiempo de autonomía = = = 3 h y 10 min
Consumo del circuito receptor 205 mA

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

6
Tensión (V)

4
Gráfica
2 teórica
0 Gráfica real
0
0
0
30
60
90
0

12
15
18

Tiempo (minutos)

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

Valor teórico − Valor real 3´17 − 2´83


Perdidas = × 100 = × 100 = 12%
Valor real 2´83

Re n dim iento = Total − pérdidas = 100% − 12% = 88%

- 36 -
BRAZO DE ROBOT MEMORIA TECNICA

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

Consumo medido: 260 mA.

Capacidad de la batería 650 mA • hora


Tiempo de autonomía = = = 2 h y 30 min
Consumo del circuito receptor 260 mA

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

6
Gráfica
Tensión (V)

4 Teórica
2 Gráfica Real

0
10

13

16
1

Tiempo minutos (x10)

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

Valor teórico − Valor real 2´5 − 2


Perdidas = × 100 = × 100 = 25%
Valor real 2

Re n dim iento = Total − pérdidas = 100% − 25% = 75%

- 37 -
BRAZO DE ROBOT MEMORIA TECNICA

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.

- 38 -
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.
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.
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
BRAZO DE ROBOT PRESUPUESTO

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

- 42 -
BRAZO DE ROBOT PRESUPUESTO

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

- 43 -
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
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.
BRAZO DE ROBOT ANEXO 1. RS-232

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

Abrir puerta serie

Configurar puerta
serie

Enviar datos por la Recibir datos por la


puerta serie puerta serie

N
¿Terminar?

Cerrar puerta serie

Salir

Organigrama 7.1. Comunicación serie RS-232.

- 46 -
BRAZO DE ROBOT ANEXO 1. RS-232

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.

- 47 -
BRAZO DE ROBOT ANEXO 1. RS-232

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.

- 48 -
BRAZO DE ROBOT ANEXO 1. RS-232

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.

- 49 -
BRAZO DE ROBOT ANEXO 1. RS-232

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.

- 50 -
BRAZO DE ROBOT ANEXO 1. RS-232

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.

- 51 -
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.
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 53 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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,

- 54 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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.

- 55 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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,

- 56 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 57 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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.

- 58 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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.

- 59 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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.

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

BURBUJA

I= 0

I =I+ 1

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

N
I= 3

FIN

Organigrama 7.16. Método de la burbuja.


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


BRAZO DE ROBOT ANEXO 2. BUS I2C

- 63 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

- 64 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

- 65 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

- 66 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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.

- 67 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

INTERFICIE DE PROGRAMACION:

Interfície de programación

¿Cambio de posición S
para servo 1?

¿Cambio de posición S
Tarea a Realizar = 0
para servo 2?

¿Cambio de posición S
para servo 3?

S
¿Grabar Memoria? Tarea a Realizar = 1

S
¿Reset? Tarea a Realizar = 2

N S
¿Borrar Memoria? Tarea a Realizar = 3

Enviar trama de comunicación


por el puerto serie

Fin Interfície

- 68 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

Organigrama 7.17. Interficie de programación.


CALCULO DEL NUMERO DE PASOS A ENVIAR:

CALCULO
PASOS

I= 0

V(I) = Grados_Base
V(I+1) = Grados_Hombro
V(I+2) = Grados_Codo

I= 0

I= I+ 1

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

N
I= 3

Nº Pasos_Base = V(I+2) / Incremento_ Grados_Base


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

FIN PASOS

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

- 69 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 70 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 71 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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)

- 72 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 73 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 74 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 75 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 76 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

CEREBRO DEL BRAZO DE ROBOT:

PROGRAMA PRINCIPAL DE LA APLICACIÓN:

Programa principal

N ¿Modo S
Autonómo?

Modo Programación Modo Autonómo

Recibir trama por el


¿Recibido por el Leer memoria
N S puerto serie: Tarea a
puerto serie el valor Actuar sobre servos
Realizar y
"255"?
Posición de los servos

Actuar sobre S ¿Tarea a N ¿Todos los servos S


servos Realizar = 0? en posición?

S ¿Tarea a
Grabar memoria
Realizar = 1?

Posicionar servos
S ¿Tarea a
en posicion 0º y
Realizar = 2?
borrar memoria

S ¿Tarea a
Borrar memoria
Realizar = 3?

Organigrama 7.19. Rutina principal del brazo de robot.

- 77 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

RUTINA PARA GRABAR EN LA MEMORIA I2C

Rutina Grabar Memoria

S
¿Memoria llena?

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

Numero Total Movimientos+1


y grabar en memoria

Fin Rutina Grabar

Organigramas 7.20. Rutina grabar memoria.

- 78 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

RUTINA LEER MEMORIA:

Rutina Leer Memoria

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
S
actual > número total de
movimientos?

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

Inicializar:
Número de movimiento actual

Fin Rutina Leer

Organigrama 7.21. Rutina leer de EEPROM.

- 79 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

RUTINA SERVICIO DE INTERRUPCION (PWM):

RSI

S ¿Interrupcion por N
TMR1?

¿Interrupcion por N
TMR0?

S S Subir pin servo 1


Bajar pin servo 1 ¿Variable = 2? ¿Variable = 2?
Cargar TMR1

N N

S S Subir pin servo 2


Bajar pin servo 2 ¿Variable = 1? ¿Variable = 1?
Cargar TMR1

N N

Bajar pin servo 3 Subir pin servo 3


Variable = 3 Cargar TMR1

Desactivar TMR1
Variable = Variable - 1

Fin RSI

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

- 80 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 81 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 82 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

;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

- 83 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 84 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 85 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 86 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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º

- 87 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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º

- 88 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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º

- 89 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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º

- 90 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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º

- 91 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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º

- 92 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 93 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 94 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 95 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 96 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 97 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

;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

- 98 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 99 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 100 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 101 -
BRAZO DE ROBOT ANEXO 2. BUS I2C

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

- 102 -

Das könnte Ihnen auch gefallen