P. 1
construir un robot con pic

construir un robot con pic

|Views: 4.477|Likes:

More info:

Published by: Israel Quispe Zarate on Apr 02, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/03/2013

pdf

text

original

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-

microcontroladores. se pueden ver sus características en www.BRAZO DE ROBOT INTRODUCCION Pic Trainer”. -7- .es.

Otra dificultad era el peso. para ello tuve que buscar un cojinete que aguantara todo 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. Estudio de viabilidad Después de analizar detenidamente la idea original.1. antes de ponerme a trabajar en el brazo de robot. denominado “servos”. Estudiando la mecánica vi que necesitaba poder mover varias articulaciones y definir que actuador iba a utilizar. Memoria Técnica 2.BRAZO DE ROBOT MEMORIA TECNICA 2. Estas decisiones debían ser muy precisas. . observé que me enfrentaba a varías circunstancias que debía decidir. Uno de los factores más críticos era la parte mecánica. tuve que buscar un microcontrolador acorde con las características que necesitaba. Debía conseguir también una manera de disminuir en lo posible cargar excesivamente peso sobre el motor instalado en la base. ya que de ellas dependería mi trabajo posterior. Me decidí por unos motores con engranajes para multiplicar el par del eje. Para la parte electrónica de control. mientras que el motor solo acompañaba el giro.

Brazo robot En este apartado realizaremos un estudio de las características físicas. mecánicas y funcionales del brazo robot y del controlador. -9- .BRAZO DE ROBOT MEMORIA TECNICA 2. eléctricas.2.

1º 3 servos controlados con PWM 300 mA Batería NiMH.2. 2. Características estructurales El brazo robot construido para este proyecto.180º +/.2.10 - . (Carga útil) 1 Kg 0ºC – 85ºC Velocidad máxima 36º/seg. es decir. . 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: Número de ejes: Radio máximo de operación: Mano: Movimiento de los ejes: Eje 1: base: Eje 2: hombro: Eje 3: codo: Referencia (sincronismo): Exactitud: Actuadores: Consumo máximo: Alimentación: Capacidad de carga: Peso: Rango de temperatura: Articulado 3 160 mm 20 mm Rango 0º -. ya que el brazo se utiliza para desplazar objetos de un lugar a otro con la ayuda de algún soporte. aunque tampoco es necesario. es un robot transportador de objetos. Como consecuencia tendrá 3 grados de libertad. 36º/seg. es un robot de estructura articulada. 4´8 V y 650 mAh 75 g. sin movimiento alguno.180º 0º -.1. Esto permitirá alcanzar posiciones y orientaciones pertenecientes a un amplio campo de trabajo. Posición fija en todos los ejes en 0º Tabla 2. Está compuesto por 3 ejes de movimiento: la base que gira el brazo en el plano horizontal.BRAZO DE ROBOT MEMORIA TECNICA 2. Características técnicas del brazo robot.2.2. el hombro y el codo que varían la inclinación correspondiente al plano vertical.180º 0º -. La muñeca y mano son fijas. 36º/seg.

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.3.BRAZO DE ROBOT MEMORIA TECNICA Eje nº 1 2 3 Base Nombre Hombro Codo Movimiento Gira el cuerpo Eleva y baja el brazo superior Eleva y baja el antebrazo Motor nº 1 2 3 Tabla 2. 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. Elementos que forman el sistema.11 - . .2.3.4. Dimensiones del brazo de 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 30 CONTROL 130 Eje 1 Eje 3 Figura 2.

es decir: ♦ Ejecutar infinitamente la secuencia grabada en la EEPROM1. 2.12 - .4.2. 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. 1 2 Memoria de solo lectura programable electricamente. ♦ Ser capaz de grabar en la EEPROM la secuencia deseada desde el interfície de programación creado.BRAZO DE ROBOT MEMORIA TECNICA Campo de trabajo: Figura 2. Campo de trabajo del brazo de robot. . Ver anexo 1. utilizando el protocolo de comunicación RS-2322. lo que se ha denominado “Modo autónomo de funcionamiento”.5.

se graba una secuencia de ejecución en la memoria con ayuda de un ordenador personal o portátil. .2. Alimentación La alimentación de la lógica de control y los motores de cada articulación. ejecuta indefinidamente. para poder grabar una nueva secuencia de movimientos. PIC 16F873.2. 2.5. la secuencia grabada en la memoria con anterioridad.6. cuando se le dé la orden desde el interfície de programación. ♦ EEPROM de 2K para guardar la secuencia que tendrá que ejecutar.BRAZO DE ROBOT MEMORIA TECNICA ♦ Borrar la EEPROM. esta dispone de: ♦ Una unidad central de proceso. se realiza con una batería que tiene unas características de tensión e intensidad: 4´8 V y 650 mAh. ♦ Batería de alimentación. que posibilitan la transmisión y recepción de la información según el estándar RS-232. Modos de funcionamiento El robot dispone de dos modos de funcionamiento: 1) Modo autónomo: El brazo mecánico del robot. ♦ 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. 2) Modo programación: Si la lógica de control está en este estado. ♦ Componentes para la comunicación. 2.13 - . en modo de funcionamiento autónomo y transportando el peso máximo de carga útil. Con esta batería se consigue una autonomía de 3´5 horas.

BRAZO DE ROBOT MEMORIA TECNICA 2. . en una tienda de informática en continuo funcionamiento. repitiendo el ciclo indefinidamente. debido a sus dimensiones. Tareas realizables y aplicaciones El robot construido tiene fines educativos principalmente. Análisis y puesta en marcha La instalación y manejo del robot está sujeta a una serie de normas de seguridad. Tales factores hacen referencia al estudio previo de las tareas que se quiere automatizar. en el escaparate de alguna tienda. ya que no permite definir diferentes precisiones en función del movimiento.8. ya que siempre trabaja con la misma de 1 grado. cambiando de sitio un disco CD y efectuando un saludo.14 - . Este robot también se podría utilizar como reclamo publicitario.7. rango de articulaciones. 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.2. 2. Estas normas hacen referencia a peligros de tipo eléctrico. si se quiere que la utilización del robot sea lo más provechosa y segura posible. precisión en los movimientos y peso que puede desplazar. por ejemplo.2. Las tareas más adecuadas son las que no requieran demasiada precisión.

Fotografía de un servo. que tiene que poder llevar. ¿Por qué servos? El brazo de robot está pensado para poder desplazar un peso máximo de 75 gramos. pero puede ser fácilmente modificado para tener un recorrido libre de 360º. Fotografía 2.7.3. Se ha definido que la palanca del brazo será de 18 cm. Centros de gravedad de las articulaciones y carga del brazo.BRAZO DE ROBOT MEMORIA TECNICA 2.6. y el peso de la estructura de aproximadamente 200 gramos. además de la carga útil. El recorrido del eje de salida es de 180º en la mayoría de ellos. También sabemos que el motor que necesitará tener más par de giro.15 - .3. 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.1. al contrario que los otros. 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. 4 cm 4 cm 4 cm 5 cm MOTOR Hombro 50 gram os ARTICULACION 1 50 gram os MOTOR Codo 50 gram os ARTICULACION 2 50 gram os CARGA UTIL 75 gram os Figura 2. que solo han de actuar sobre una parte de la estructura. será el de la base. 2. toda la estructura del brazo. . distribuidos como muestra la figura siguiente. Dispone también de un circuito que gobierna el sistema.

Vemos que cada articulación pesa 50 gramos. así como los motores. que es el que más fuerza tiene que realizar.16 - . puesto que es el que debe actuar sobre todo el brazo y su carga.BRAZO DE ROBOT MEMORIA TECNICA La figura muestra las distribuciones del centro de gravedad de la estructura mecánica y de la carga útil.475 g × cm Si miramos las características del servo cuando está alimentado con la tensión más baja de funcionamiento. En los cálculos realizados anteriormente de la estructura y la carga útil. con un coeficiente de seguridad de: Coeficiente de seguridad = Par del motor 3´3 Kg * cm = = 1´33 Par necesario 2´475 Kg * cm . vemos que a 4´8 V puede dar 3´3 Kg*cm. para poder realizar el cálculo del par que el motor de base. Así se ve que el motor podrá con el peso que tiene que llevar. se ve que el motor necesita un par mínimo de 2´475 Kg*cm. Par motor base = 4 1 ( peso × longitud palanca ) Par motor base = 50 g × 4cm + 50 g × 8cm + 50 g × 12cm + 75 g × 17cm = 2.

♦ Control control. ♦ Potenciómetro solidario al eje. electrónico de . Características técnicas del servo utilizado.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. Servo desmontado.9. ♦ Engranajes reductores.3. Fotografía 2. concretamente “HS-325BB” que es el utilizado en este brazo de robot: Hitec HS-325BB Tensión de alimentación: Par a 6 V: Par a 4´8 V: Velocidad máxima: Medidas (longitud x anchura x altura): Peso: Tipo de rodamiento: 4´8 V – 6 V 3´7 Kg / cm 3´3 Kg / cm 60º /seg 41 x 20 x 37 mm 44´5 gramos Bolas Tabla 2. Estos son: ♦ Carcasa exterior. 2.17 - .8.2. ♦ Motor eléctrico. ¿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.

el motor deja de consumir corriente y tan solo circula una pequeña corriente hasta el circuito interno. entonces el eje de salida se para en la posición indicada. el control diferencial interno lo detecta y envía la corriente necesaria al motor para corregir la posición. interna desde Con con el el se compara la señal otra señal PWM que llega exterior.3. 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. 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. moviendo el eje de salida.18 - . resultado obtenido en esta comparación. A continuación se muestra la señal de control y como actúa sobre el servo: Figura 2. 1 Pulse Width Modulate. Si forzamos el servo. Relación entre la señal PWM y el eje de salida. Cuando el servo llega a la posición destino deseada. Mediante un sistema PWM le diferencial.3. Para controlar el servo hay que aplicar un pulso de duración y frecuencia específicas. Señal Modulada en Anchura .BRAZO DE ROBOT MEMORIA TECNICA 2.11.

temporizadores. Detalle del conector. 2. Conexionado Todos los servos disponen de tres cables.4. ♦ Líneas de E/S para comunicarse con el exterior. puertas serie.1. Estos pueden ser.19 - . .12.BRAZO DE ROBOT MEMORIA TECNICA 2. Electrónica de control Es el hardware necesario. Concepto de microcontrolador Un microcontrolador es un circuito integrado. 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. ♦ Memoria RAM para contener los datos. con alta escala de integración y usualmente dispone de los siguientes componentes: ♦ Unidad central de proceso. Cerebro En este punto se trata en detalle la unidad de control y todas las funciones que debe realizar: 2. dos para la alimentación Vcc y Gnd y otro cable para aplicar el tren de pulsos de control.4.4. F F i Figura 2.4. para poder tener un control exacto del brazo de robot: 2. ♦ Periféricos. ♦ Memoria para programa tipo ROM/PROM/EEPROM/FLASH.3.1. modulador de anchura de pulsos entre otros.1.

disminuye el riesgo de averías y se precisan menos ajustes. ♦ 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. Figura 2.20 - . El microcontrolador es un sistema cerrado.BRAZO DE ROBOT MEMORIA TECNICA ♦ Generador de impulsos de reloj que sincronizan el funcionamiento del sistema.13. Aumento de la fiabilidad: Al reemplazar un elevado número de elementos por un microcontrolador. ♦ Reducción del tamaño del producto acabado: La integración del microcontrolador en un chip disminuye. Entrada/Salida: Se tiene que identificar la cantidad y tipo de señales a controlar. el volumen. . 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. 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. la mano de obra y los stocks. Consumo: Algunos productos que incorporan microcontroladores están alimentados con baterías.

2. 2.BRAZO DE ROBOT MEMORIA TECNICA ♦ Memoria: Para detectar las necesidades de memoria de la aplicación. por todas las prestaciones que añaden a un diseño. 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. Tabla de aplicaciones que requieren microcontroladores.4. puede implicar tener que colocar más componentes externos. ♦ Diseño de placa: Debe tenerse en cuenta que usar un microcontrolador de gama baja. . algunas de estas aplicaciones se muestran en la tabla siguiente: Aplicaciones Consumo Equipo de TV Receptor de radio Control remoto Consola de juegos Microondas Lavadora Aparatos de cocina Aspiradora Automoción Alarma antirrobo Detector de radar Velocímetro Climatizador Inyección Airbag Ofimática Mouse Teclado Escáner Impresora Plóter Fotocopiadora Telecomunicac.1.14.21 - . Aplicaciones de los microcontroladores Cada vez existen más productos que incorporan un microcontrolador. Teléfono Módem Industria Control de motores Compresor Termostatos Robótica Lector de tarjetas Detector de humo Reproductor de CD ABS Tabla 2.

Diagrama de bloques de la segunda alternativa. ♦ Alternativa 2: PC RS 232 microcontrolador 1 I2C EEPROM Actuador Base Actuador Hombro Actuador Codo Figura 2.BRAZO DE ROBOT MEMORIA TECNICA 2.16. Diagrama de bloques de la primera alternativa.22 - .4.15. Alternativas de diseño Se analizaron las alternativas siguientes para la implementación del brazo de robot: ♦ Alternativa 1: PC RS 232 m icrocontrolador 1 I2C microcontrolador 2 microcontrolador 3 m icrocontrolador 4 EEPROM Actuador Base Actuador Hombro Actuador Codo Figura 2. .1.3.

4. ♦ Conversor A/D de 5 canales de entrada.BRAZO DE ROBOT MEMORIA TECNICA En principio la mejor alternativa es la que necesita menos microcontroladores para su funcionamiento. la número 2. más sencilla y económica. ♦ Encapsulado DIP de 28 patillas. 8 niveles de pila y su arquitectura es del tipo harvard. . ♦ 3 contadores/temporizadores. al disponer de menos componentes y un desarrollo software más sencillo. PIC 16F873 El cerebro del brazo de robot es un microcontrolador PIC 16F873 de microchip. dispone de un repertorio de 35 instrucciones. 2. ♦ 1 canal de comunicación serie para I2C. ♦ Memoria RAM de datos de 192 bytes. 1 Ver anexo 2. 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. las características técnicas más importantes son: ♦ Memoria Flash de programa de 4K.1. ♦ 2 canales PWM. En los siguientes apartados se verá que era posible el diseño tanto de hardware como de software con un solo microcontrolador. ♦ 3 puertos de I/O. ♦ 1 canal de comunicación serie USART.4. es decir. ♦ Perro guardián.23 - . que se explica en el siguiente párrafo. utilizando a la vez las comunicaciones RS232 e I2C1. 1 vector de interrupción. ♦ Memoria EEPROM de datos de 128 bytes. Este es un microcontrolador de 8 bits. ♦ Frecuencia de trabajo máxima: 20MHz.

también llamado tiempo de instrucción. Cuando el pic recibe un dato completo. 2. el dato anterior ya ha sido leído para no perder bits de la transmisión. porque del cristal de cuarzo depende la velocidad de ejecución de las instrucciones. Cristal de cuarzo Este es un punto crítico de la aplicación.1. es la correspondiente a la comunicación por RS-232.4.600 bits por segundo. es decir. 8 bits que corresponde al dato y un bit de STOP.24 - . 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. que se realiza a 9.17. 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. la parte a la que hay que prestar más atención. .5. Figura 2. se debe asegurar un cristal de cuarzo. En el diseño del software que controla el brazo de robot.BRAZO DE ROBOT MEMORIA TECNICA La arquitectura harvard dispone de dos memorias independientes. un bit de START. que actúa como reloj. Arquitectura harvard. Para lo que se ha explicado en las líneas anteriores. pasa el dato (8 bits) a un buffer y puede seguir recibiendo a través de RS-232. una contiene sólo instrucciones y otra sólo datos. Entonces el programa tiene que asegurar que cuando se reciba el siguiente dato completo y sé reescriba el buffer.

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. START + 8 bits de datos + STOP. . Esta se realiza a 9.500 instrucciones aproximadamente. por lo tanto: Tiempo de ejecución de cada instrucción = Tiempo disponible Número de instrucciones Tiempo de ejecución de cada instrucción = 1041´667 µS = 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: Frecuencia de cristal = 1 1 x4= × 4 = 5´759 MHz Tc 0´695µS 1 Se refiere a la velocidad de transmisión. Tiempo de bit = 1 = 1´041667 x 10 − 4 segundos = 104´1667 µS 9600 La recepción consta de 10 bits.25 - .BRAZO DE ROBOT MEMORIA TECNICA Se realizan los siguientes cálculos: Velocidad de transmisión: 9.600 bits por segundo.600 baudios1.

El cristal elegido es de una frecuencia de 9´8340 MHz.26 - . simplemente hay que implementarlo tal como se muestra en la figura siguiente: . Su encapsulado es un DIP de 16 patillas y para utilizarlo. MAX232 El MAX232 es un circuito integrado sin el cuál. con los que utilizan otros circuitos integrados. menor será el tiempo de ejecución. en este caso el Pic 16F873. mientras más rápido sea menos tardará en ejecutar las instrucciones. TTL y CMOS.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. Por lo que realizamos nuevos cálculos: Frecuenciade cristal = 4 Tc Tc = 4 Frecuenciade cristal Tc = 4 = 0´4067µS 9´8340 MHz Como: Número de instrucciones = Tiempo disponible 1041´6667 µS = = 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.4. no podría establecerse la comunicación RS-232 entre el PC y el Pic 16F873. es decir.6. Este componente se utiliza para poder adaptar los niveles lógicos de la línea de comunicación (anexo 1). 2.1.

♦ En un bus del tipo I2C se pueden controlar hasta un máximo de 8 memorias de este tipo. A1. EEPROM La memoria elegida para guardar la secuencia de funcionamiento del brazo de robot. Las características de esta memoria son: ♦ Es una memoria de 2 Kbits (2. puede controlar toda la memoria en un solo banco. como en ancho de palabra del microcontrolador es de 8 bits.27 - . se encarga de generar la señal de reloj. El cálculo es: 28 = 256 bytes. El direccionamiento se realiza a través de: A2.1.4. según palabra de direccionamiento (ver anexo).048 bits) organizada en un banco de 256 bytes. concretamente es la EEPROM 24LC02. es una memoria EEPROM1 del tipo I2C (ver anexo). Esta conversión sale de dividir: 2. A0. Es decir.BRAZO DE ROBOT MEMORIA TECNICA Figura 2.18. . mientras que la memoria actúa como slave.048 bits / 8 bits que tiene un byte = 256 bytes. Circuito típico de conexión del MAX232. ♦ El bus se controla mediante el master2.7. 2. es decir: 23 = 8.

Con el formato de grabación descrito. Cada movimiento consta de 6 bytes como puede observarse en la figura anterior. se consigue grabar hasta 42 movimientos diferentes. si hacemos el cálculo siguiente vemos: Número de movimientos = Bytes totales de la memoria Bytes usados en cada movimiento 256 bytes = 42´66 movimientos 6 bytes .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 Movimiento 2 Movimiento 3 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh Nº Pasos 1 Destino 1 Nº Pasos 2 Destino 2 Nº Pasos 3 Destino 3 Nº Pasos 1 Destino 1 Nº Pasos 2 Destino 2 Nº Pasos 3 Destino 3 Nº Pasos 1 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.28 - Número de movimientos = . Formato de grabación utilizado en la EEPROM.19.

se utilizan 2 para los apuntadores que se necesitan para realizar correctamente las operaciones de lectura y escritura. Entonces todas las posiciones para grabar movimientos sé reescribiran desde la posición “00h” cuando se realice la operación de grabación. se va leyendo así hasta que se llega a igualar el número total de movimientos. apunta donde debe seguir con la lectura o escritura. Un byte. lo que se hace. Para grabar.29 - . Si el número grabado es 0. dirección “FCh” guarda el número total de movimientos que tiene la secuencia y puede variar desde 0 hasta 42. es poner el número total de movimientos y la posición actual a 0. el robot no ejecutará movimiento alguno. Cuando se tiene que leer. lo que se hace es ir leyendo donde indica la posición actual. 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.BRAZO DE ROBOT MEMORIA TECNICA Es decir. lo que se hace es ir escribiendo los movimientos en el punto de memoria que va indicando posición actual. Cuando se realiza una operación de borrado. . El segundo byte es decir. se leen 6 bytes cada vez (1 movimiento). el de la dirección “FDh”. instante en el que el puntero. “posición actual” se reinicia a “0” y vuelve a leer desde la posición de memoria “00h”. que con cada movimiento que se graba aumenta de valor 6 unidades (6 bytes consta el movimiento) como se explicó anteriormente.

es decir. pero las que se utilizan para generar la señal PWM son dos. el programa decide sobre que servo tiene que actuar. PWM para los servos En este punto se va a tratar. posición de 0º y 180º respectivamente. Una característica primordial que se debe tener en cuenta al generar la señal PWM es. actuando sobre el pin de salida correspondiente y por lo tanto sobre el servo.2. ya que si se está atendiendo una interrupción y se provoca otra. estando los tiempos de la señal PWM desajustados y actuando el servo de manera incontrolada. 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. la señal PWM tal como se explicó en el punto 2. El microcontrolador Pic 16F873.4. provocadas por dos temporizadores configurados para esta finalidad. 20 mS.2.30 - .BRAZO DE ROBOT MEMORIA TECNICA 2. Para evitar interferencias entre señales utilizamos una variable que tendrá 4 posibles valores. como se generan las señales de control para los servos.3. el microcontrolador finaliza la instrucción que se está ejecutando y atiende la rutina de interrupción. Para controlar los servos se necesita además de las tensiones de alimentación y GND. Al provocarse la interrupción. es decir. al llegar a 0 se vuelve a inicializar con el valor 3. La señal PWM se genera a través de pines de entrada/salida generales configurados como salida. que la señal de cada servo no puede interferir con la de otros. a continuación lee la posición a la que debe ir ese . para tener un control exacto del tiempo. La señal PWM para controlar los servos.1. dispone de varias fuentes de interrupción. por eso se utilizan temporizadores que provocan interrupción. se obtiene el periodo de la señal PWM de control. Como la variable puede tener 4 valores diferentes. Cuando se atiende esta primera interrupción denominada INT1. correspondiendo cada pin de salida a un servo. En el servicio de atención de interrupción. se decrementará desde 3 hasta 0.4. Software de control Aquí se muestra la programación de las tareas más críticas de los programas: 2. esta última no se atenderá.3. se mira el valor que tiene la variable en ese momento. Se configura un temporizador para provocar una interrupción cada 5 mS. que en este caso solo se ha programado para actuar sobre las señales PWM de los servos.

. varíe desde 0´9 mS hasta 2´1 mS según la posición a la que tiene que ir el servo. provocada por el otro temporizador.BRAZO DE ROBOT MEMORIA TECNICA servo. con este valor se conseguirá que según la posición. Señal PWM para cada servo.31 - . se lee una tabla con esa posición. Temporización de interrupciones y articulaciones. el tiempo de la segunda interrupción denominada INT2.20. esta posición leída estará comprendida entre 0º y 180º que es el recorrido que tiene 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 3 3 2 2 1 1 0 0 INT1 Si No Si No Si No Si No INT2 No Si No Si No Si No XXX Servo Base Base Hombro Hombro Codo Codo XXX XXX Nivel lógico pin “1” “0” “1” “0” “1” “0” XXX XXX Tabla 2. 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 INT 1 INT 2 5 INT 1 INT 2 10 INT 1 INT 2 15 20 ms Figura 2. que carga un valor en un registro especial de la segunda interrupción.21.

Para conseguirlo hay que esperar un número de veces antes de incrementar o decrementar un grado. se ha llamado pasos. 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. Hombro Desplazam. tendrá el tiempo de espera entre grados más pequeño.22.23. Base / Desplazam. es decir. Para realizar este cálculo.2.11. Base Desplazam. . el servo está en la posición 0º. Codo Nº de pasos obtenidos 1 2 4 Tabla 2.2. En el servo 2 tenemos un nivel lógico “1” de duración 1´5 mS. Base / Desplazam.4. 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. Ejemplo de movimiento lineal. en este caso corresponde a la articulación de la base. a este número de veces. Después se divide el desplazamiento del servo de mayor recorrido entre el desplazamiento de todos los servos. Base / Desplazam. Cálculo del número de pasos en el movimiento lineal. con el método de la burbuja. se ordena el recorrido de cada articulación de menor a mayor. A continuación se muestra lo descrito con un ejemplo: Articulación Base Hombro Codo Desplazamiento 180º 90º 45º Número de pasos 1 2 4 Tabla 2. En el servo 1 se aprecia una señal con nivel lógico “1” de 0´9 mS. El número de pasos lo calcula el interfície de programación. que consiste en comparar pares de elementos adyacentes e intercambiarlos en caso que no estén en el orden correcto. por lo tanto.32 - . 2.BRAZO DE ROBOT MEMORIA TECNICA En la figura se pueden ver las señales de cada servo. Según el ejemplo se puede ver que el más rápido es el de mayor recorrido. Siguiendo con el ejemplo: Articulación Base Hombro Codo División Desplazam.

Tarea = 1: Grabar coordenada en la EEPROM. ♦ 1 bit de STOP.BRAZO DE ROBOT MEMORIA TECNICA 2.33 - . con el cuál el cerebro del brazo de robot. envía tramas que son recogidas por el Pic. si el brazo de robot esta en modo programación. decena y unidad y corresponde al tiempo que debe esperar el servo 1 en incrementar o decrementar cada grado para conseguir el movimiento lineal. Trama de comunicación RS-232. Se envía el valor decimal “255”. Tarea = 2: Borrar memoria.4.2. ♦ 8 bits de datos. ♦ Tarea: Consta de un byte. ♦ Los otros números de pasos y destino. ♦ Nº de pasos 1: Son tres bytes. . La trama total consta de 22 bytes de datos. decena y unidad. 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. además de los correspondientes bits de control. sabe que función debe realizar y a continuación se detalla: Tarea = 0: Aplicar el destino a los servos. 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. Trama de comunicación RS-232 El modo de comunicación entre el emisor y el receptor es mediante el protocolo RS232 y cada dato que se envía se componen de: ♦ 1 bit de START.24. Inicializa servos a posición 0º y borra la memoria. ♦ Ninguno de paridad. centena. El PC por el puerto serie. Consta de 3 bytes. centena.3. son iguales que los dos anteriores pero correspondientes al servo 2 y 3 respectivamente. ♦ Destino 1: Es el destino al que debe ir el servo 1. Tarea = 3: Reset.

Lo que está claro es que la mejor forma de alimentación. Esto se debe a que si se recarga antes de que se haya descargado en su totalidad.34 - .2.5. especialmente en las de níquel-cadmio y ocurre al recargar una batería que no se ha agotado suficientemente. las más interesantes son: ♦ Baterías de plomo (Pb): Normalmente utilizadas en automóviles. Si una batería se ha descargado hasta el 20% de su capacidad de recarga. es con una batería recargable. A lo largo de la vida de la batería su capacidad máxima va disminuyendo debido al efecto memoria. un cátodo de óxido de plomo y ácido sulfúrico como medio electrolítico. sus elementos constitutivos son pilas individualmente formadas por un ánodo de plomo. Tipos de baterías recargables Existen muchos tipos de baterías recargables.5. su capacidad se reducirá hasta el 80% del valor inicial. 2. ♦ Baterías de níquel-cadmio (Ni-Cd): Constan de dos polos que se encuentran en el mismo recipiente.1.5.BRAZO DE ROBOT MEMORIA TECNICA 2. 2. sin ella no es posible que el brazo de robot funcione de manera alguna. . Efecto memoria El efecto memoria se produce en algunos tipos de baterías. lo que termina por romper el separador aislante y producir altos niveles de autodescarga o un cortocircuito. Este tipo de batería es muy contaminante. por esto hay que tener cuidado a la hora de elegir el modo de alimentación. los cristales de níquel y cadmio se acumulan y crecen. Elección de la batería Una parte muy importante del proyecto es la alimentación. 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. un polo positivo con hidróxido de níquel y uno negativo con hidróxido de cadmio.

♦ Baterías de litio-ion (LiIon): Con mayor capacidad que las de NiMH. Además estas no tienen efecto memoria. Para este cálculo se ha medido la intensidad que consume el sistema con un amperímetro. pero proporcionan aproximadamente un 50% más de energía a igualdad del peso. 2. ya que para menor peso es capaz de proporcionar más autonomía al brazo de robot.3. no tienen efecto memoria y apenas se observa efecto autodescarga. Desventajas: -Efecto memoria -Muy contaminantes -Sensibles a la temperatura Después de analizar las ventajas y desventajas de los diversos tipos de baterías. .5.35 - .25. Se muestra una tabla con las ventajas y desventajas de diversos tipos de baterías: Tipo de batería: Pb -Precio Ventajas: -Peso -Muy contaminantes -Efecto memoria Ni-Cd NiMH -Precio -No tienen efecto memoria -Capacidad de almacenamiento Tabla 2. Ventajas y desventajas de los tipos de baterías.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. La elegida es una batería cuyas características son: 4´8 V y 650 mAh. 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. se decidió por una batería de NiMH. zirconio o vanadio.

26. Tiempo de autonomía = Capacidad de la batería 650 mA • hora = = 3 h y 10 min Consumo del circuito receptor 205 mA Autonomía de la batería (205 mA) Tensión (V) 6 4 2 0 90 12 0 15 0 18 0 0 30 60 Gráfica teórica Gráfica real Tiempo (minutos) Gráfica 2.36 - . Perdidas = Valor teórico − Valor real 3´17 − 2´83 × 100 = × 100 = 12% Valor real 2´83 Re n dim iento = Total − pérdidas = 100% − 12% = 88% .BRAZO DE ROBOT MEMORIA TECNICA Consumo medido: 205 mA. Gráfico de autonomía de la batería con un consumo de 205 mA.

BRAZO DE ROBOT MEMORIA TECNICA 2) Cuando el brazo de robot trabaja.37 - . Tiempo de autonomía = Capacidad de la batería 650 mA • hora = = 2 h y 30 min Consumo del circuito receptor 260 mA Autonomía de la batería (260mA) Tensión (V) 6 4 2 0 10 13 Tiempo minutos (x10) Gráfica 2. Gráfico de autonomía de la batería con un consumo de 260 mA. Gráfica Teórica Gráfica Real 16 1 4 7 Perdidas = Valor teórico − Valor real 2´5 − 2 × 100 = × 100 = 25% Valor real 2 Re n dim iento = Total − pérdidas = 100% − 25% = 75% .27. transportando el peso máximo: Consumo medido: 260 mA.

cadmio y plomo. ♦ Algunos de los constituyentes peligrosos de las pilas son: mercurio. . 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. por lo que se multiplica enormemente la cantidad de contaminantes que se generan. enviándolas a continuación a plantas donde se realice su reciclado. En términos prácticos.4. Estos elementos son los más peligrosos. Idealmente las pilas y baterías. la gestión de las pilas usadas comienza por la recolección en forma separada y continua.BRAZO DE ROBOT MEMORIA TECNICA 2. desde el punto de vista químico.5.38 - . ¿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.

Instalación Para instalar la interfície de programación solo se tiene que ejecutar el software de instalación del brazo de robot.2. ♦ Disco duro de 540 Mb. A continuación se conecta el cable de comunicación RS-232 y el brazo de robot.BRAZO DE ROBOT INSTALACION 3. denominado “carby” y seguir todos los pasos que se indiquen. se necesita únicamente un ordenador en el que se pueda ejecutar el Windows. ya está listo para ser programado.1. 3. Instalación del software 3. este puede ser: ♦ Procesador 486 DX II a 66 Mhz. ♦ 8 Mbytes de memoria. Requerimientos Para poder ejecutar la interfície de programación. .

como añadirle una pinza que pueda coger objetos como si de una mano se tratase. También he podido aprender el funcionamiento de algunos protocolos de comunicación serie como son. se ha conseguido reciclar un viejo disco duro de 40 Mb sin utilidad alguna en los tiempos actuales. es la posibilidad de poder comercializar el producto. 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. si no estos elementos hubiesen ido a la basura. debo decir. ya que he conseguido llevar a la realidad gran parte de los objetivos que inicialmente me había planteado. así como poder reutilizar también la batería de un teléfono móvil ya en desuso. Respecto al RS-232 su utilización es conocida por todas las personas que utilizamos el ordenador personal. Finalmente puedo concluir que el proyecto ha cubierto todas las expectativas que inicialmente me había planteado. que estoy muy satisfecho con el trabajo realizado. alcanzando así los objetivos educativos requeridos al plantearse el reto de realizar un proyecto fin de carrera. . Al reutilizar estos elementos se ha conseguido respetar el medio ambiente. 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. Otro punto que no quiero dejar de comentar.BRAZO DE ROBOT CONCLUSIONES 4. realizando algunas mejoras. ya que está implementado para la comunicación con el ratón como cosa más significativa. al mismo tiempo se requiere poco espacio y líneas de circuito impreso. Para poder realizar mecánicamente este proyecto. Conclusiones En este punto del proyecto. aunque tiene muchas más aplicaciones. el RS-232 y el I2C. acercando este proyecto de esta manera a un gran número de personas de todas las edades.

Coste total del proyecto (una unidad): Descripción Material electrónico Material mecánico Trabajo profesionales Cant 1 1 1 Precio/Ud 87´40 6´00 3030´00 Importe + 16%IVA 101´39 6´96 3514´80 3623´15 Coste total del proyecto (sí solo se fabrica un producto): Si se pide más de una unidad.00 100´00 50´00 350´00 98´00 56´00 28’00 696´00 111´36 807´36 915. los gastos relativos a los profesionales se reducirían mucho.71 . si sumamos estos tres conceptos obtendremos el coste total del un brazo robot. como ejemplo. Presupuesto Para realizar el presupuesto del proyecto. para otra cantidad habría que estudiar el coste de forma similar. Descripción Estudio de viabilidad Montar Brazo y ajustar Diseñar y montar placa circuito impreso Diseñar y programar software aplicación Diseñar y programar interfície de programación Verificar funcionamiento Confeccionar memoria y recopilar información Base imponible: IVA (16%): Total profesionales: Total proyecto (5 unidades). En las siguientes páginas se desglosa cada concepto. se han separado los diferentes conceptos de la siguiente forma: El material electrónico. como puede verse a continuación. Si fabricamos en serie los costes se disminuyen mucho. materiales + profesionales: Horas 1 10 5 25 7 4 2 Precio/Ud 14´00 10´00 10´00 14´00 14´00 14´00 14´00 Importe 14. se estudiará un pedido de 5 unidades. La moneda utilizada para calcular los importes es el euro.BRAZO DE ROBOT PRESUPUESTO 5. el mecánico y las horas empleadas en la elaboración.

00 0´47 0´69 3´05 4´00 Importe 10´50 1´30 1´10 46´5 0´02 0´67 0´06 0´20 0´12 0´08 0´05 2´60 1´30 1´90 0´60 0´65 1´10 1´10 0´08 0´16 0´12 9´00 0´47 0´69 3´05 4´00 87´40 13´99 101´39 .42 - .BRAZO DE ROBOT PRESUPUESTO Material electrónico: Descripción Microprocesador PIC 16F873 Circuito Integrado MAX 232 EEPROM 24LC02B Servomotor HITEC 300BB Resistencia 10K / 0´25W Cristal de cuarzo 9´8340 MHz Condensador cerámico 22pF Condensador electrolítico 1µF / 63V Zócalo 28 pins Zócalo 16 pins Zócalo 8 pins Tira 40 pins hembra Tira 40 pins macho Conector bus 20pins Conector alimentación placa 2 pins Conector DB9 Conector aéreo DB9 macho Conector aéreo DB9 hembra Tornillos M3 Separador placa M3 Arandela aislante 0´5mm Placa de circuito impreso Interruptor aéreo 2 pins Conmutador aéreo 3 pins Cableado vario Batería NiMH 4´8V 650mAh (Reciclada) Base imponible: IVA (16%): Total electrónica: Cant 1 1 1 3 2 1 2 4 1 1 1 2 1 1 1 1 1 1 8 4 4 1 1 1 1 1 Precio/Ud 10´50 1´30 1´10 15´50 0´01 0´67 0´03 0´05 0. 12 0´08 0´05 1´30 1´30 1´90 0´60 0´65 1´10 1´10 0´01 0´04 0´03 9.

00 150´00 150´00 1750´00 490´00 280´00 140’00 3030´00 484´8 3514´8 .BRAZO DE ROBOT PRESUPUESTO Material mecánico: Descripción Caja módem externo 33K (Reciclada) Disco Duro 44Mb (Reciclado) Pieza de aluminio 200x400 Base imponible: IVA (16%): Total mecánica: Cant 1 1 1 Precio/Ud 2´00 1´00 3´00 Importe 2´00 1´00 3´00 6´00 0´96 6´96 Trabajo profesionales: Descripción Estudio de viabilidad Montar Brazo y ajustar Diseñar y montar placa circuito impreso Diseñar y programar software aplicación Diseñar y programar interfície de programación Verificar funcionamiento Confeccionar memoria y recopilar información Base imponible: IVA (16%): Total profesionales: Horas 5 15 15 125 35 20 10 Precio/Ud 14´00 10´00 10´00 14´00 14´00 14´00 14´00 Importe 70.43 - .

PIC16F87x Data Sheet: Microchip. 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. 1986. MAX232 Data Sheet: Texas Instruments.es . Carlos Balaguer. 1997. J. Ayza. ♦ Recursos en línea: http://www. 2001. Miguel de Castro Vicente. 2002. L. Huber. C.com http://www.microchip. Ferrer.lynxmotion.maxim-ic. Basañez. F. Robótica industrial: Marcombo Boixareu Editores. 24AA02/24LC02B Data Sheet: Microchip. Antonio Barrientos. R.com http://www. 1997.google.com http://www. Electricidad del Automóvil-I: CEAC.BRAZO DE ROBOT BIBLIOGRAFIA 6. Amat.Rafael Aracil.com http://www.microcontroladores. J. Torres. Luís Felipe Peñín.

BRAZO DE ROBOT ANEXO 1. El tipo DCE más conocido es el módem y el DTE es generalmente un ordenador. al formato serie requerido por el dispositivo. Normalmente un ordenador. Data Comunication Equipment. . aunque la velocidad no es tan rápida como paralelo los costes por cableado se reducen mucho. Comunicación RS-232 La comunicación serie. El estándar RS-232 cuenta con una serie de señales de datos y control. El más conocido es el modem. Las señales disponibles en un conector RS-232 están pensadas únicamente para asegurar la correcta transmisión y recepción de datos. RS-232 7.1. Es muy empleado en la industria. Anexo 1. Entre las más importantes están: ♦ GND: Tierra de protección. la comunicación en 7. que es el formato en el que trabaja la CPU. 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. ♦ TxD: Línea de transmisión de datos.1.1. es el tipo de comunicación más utilizada. ♦ Características eléctricas. Estas normas afectan sobre todo a los aspectos siguientes: ♦ Frecuencia de transmisión. ♦ RxD: Línea de recepción de datos. ♦ DTR (Data Terminal Ready): Indica al módem que se conecte a la línea. Los estándares de comunicación establecen una serie de normas en el nivel físico (mecánico y eléctrico) en los enlaces. 1 2 Data Terminal Equipment. desde un equipo DTE1 a un equipo DCE2. ♦ Definición y características de la línea. Anexos 7.

Comunicación serie RS-232. ♦ RTS (Request To Send): Indica al módem que pase a modo transmisión. El módem indica al driver que está conectado y preparado para transmitir. por lo que pueden llegar datos en cualquier momento. RS-232 ♦ DSR (Data Set Ready): Respuesta a la señal de DTR. ♦ RI (Ring Indicator): El módem indica al driver que se ha producido una llamada desde un módem externo. El módem indica al driver que está preparado para recibir datos y enviarlos a la línea.1. .46 - . ♦ CTS (Clear To Send): Respuesta a RTS. ♦ CD (Carrier Detect): El módem indica al driver que la línea ha sido activada en el extremo remoto. A continuación tenemos un esquema básico de un programa para comunicaciones serie: Abrir puerta serie Configurar puerta serie Enviar datos por la puerta serie Recibir datos por la puerta serie ¿Terminar? S Cerrar puerta serie N Salir Organigrama 7.BRAZO DE ROBOT ANEXO 1.

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. por tanto. En la transmisión asíncrona se mandan caracteres independientemente unos de otros. además debe conocer la duración de cada bit para muestrear la línea en el instante adecuado. Niveles lógicos del interface RS-232. es decir. que tanto el emisor como el receptor estén de acuerdo con los parámetros de la comunicación.47 - . su llegada es imprevisible. Mientras no se transmite ningún carácter la línea se encuentra a nivel alto.BRAZO DE ROBOT ANEXO 1. el emisor debe ser capaz de reconocer el principio y el final del mensaje transmitido. Este período que puede durar desde 1 hasta 2 bits. de forma que cuando detecta la llegada de un dato. Los bits de START y STOP proporcionan el sincronismo de bit. RS-232 La gestión de los puertos de comunicaciones es una tarea compleja. se le denomina bit de STOP. Como consecuencia es necesario para conseguir una correcta comunicación. interrumpe el flujo normal de proceso para ceder el control a la rutina de comunicaciones. Figura 7. al sincronizar los relojes y el sincronismo de carácter al delimitar al mismo. De esta tarea se encarga el hardware.1. Los datos llegan a los puertos de forma síncrona. Asimismo tras la transmisión de un carácter es necesario un período de seguridad que permita distinguir el siguiente bit de START. ya que pueden llegar otros datos en cuyo caso se producirían pérdidas de bits. . esta duración se obtiene de la velocidad de transmisión (número de bits por segundo). Cuando un emisor manda un mensaje transmitiendo los sucesivos bits que lo componen. Por lo que el dato que llega tiene que procesarse inmediatamente. comenzando cada carácter con la sincronización del emisor y el receptor.

maestro (half dúplex. la USART puede trabajar de tres maneras: ♦ Asíncrona (full dúplex. La USART. ♦ La paridad. En este control hay que configurar varios parámentros como son: ♦ La velocidad de comunicación. 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.1. ♦ El número de bits. bidireccional). RS-232 7.1. A continuación se muestra un esquema del comportamiento de la USART en modo asíncrono.48 - . donde las transferencias de información se realizan sobre dos líneas Tx (transmisión) y Rx (recepción).2. También puede trabajar en modo síncrono unidireccional o half dúplex para soportar periféricos como memorias. Además dispone de un módulo USART capaz de soportar la comunicación serie síncrona y asíncrona. ♦ Síncrona – esclavo (half dúplex.BRAZO DE ROBOT ANEXO 1. saliendo y entrando los bits por dichas líneas al ritmo de una frecuencia controlada internamente por la USART. unidireccional). adaptándose a multitud de periféricos. conversores. En resumen. unidireccional). ♦ Síncrona . 7. ♦ El número de bits de STOP. llamado SCI1 puede funcionar como un sistema de comunicación full dúplex o bidireccional asíncrono.3. . etc. 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.

BRAZO DE ROBOT ANEXO 1.3. se usa la norma RS-232 donde cada palabra de información o dato se envía independientemente de los demás.49 - . En la forma de comunicación asíncrona que es la que se emplea en este proyecto. Envío de 1 byte a través de RS-232. Líneas de comunicación RS-232 del Pic 16F873.4. Figura 7. 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. RS-232 Figura 7. .

Configuración de los pines en el conector DB9.6. 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.4.50 - . Conector DB9 A continuación se aprecia la configuración de los pines: Figura 7.5. .BRAZO DE ROBOT ANEXO 1.1. RS-232 7.

BRAZO DE ROBOT ANEXO 1. ♦ Pin 5: Que es la masa de referencia para que la comunicación pueda establecerse. 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.51 - .

se deben establecer ciertos criterios: ♦ Cierto tipo de microcontroladores no son ampliables desde el exterior. entre otros. Mediante el protocolo adecuado se decide qué dispositivo se hace cargo del bus y cuándo. Anexo 2. conversores A/D y D/A. la aplicación no requiere de una gran velocidad de transferencia entre el microcontrolador y los diferentes periféricos. 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. El sistema debe ser independientemente de los distintos dispositivos conectados al bus. ♦ SCL (System Clock) por la cual transitan los pulsos de reloj que sincronizan el sistema. . 7. 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.2. necesita de otros circuitos periféricos como memorias. ampliación de las líneas de E/S. ♦ Normalmente. El bus se basa en tres señales: ♦ SDA (System Data) por la cual viajan los datos entre los dispositivos. dada la reducida cantidad de líneas que precisa. con objeto de poder realizar futuras ampliaciones y modificaciones. Emplea comunicación serie. además de un microcontrolador. En algunas aplicaciones. ♦ GND (masa) interconecta entre todos los dispositivos conectados al bus. utilizando un conductor para manejar los pulsos de reloj que actúan de sincronismo y otro para intercambiar datos.BRAZO DE ROBOT ANEXO 2. BUS I2C 7. un sistema completo.1. Descripción y funcionamiento Diseñado por Philips. ♦ El coste de conexión de todos estos periféricos con el microcontrolador deben reducirse al mínimo.2. ♦ Normalmente. Bus I2C La comunicación serie es una forma muy apreciada de transferir datos digitales entre sistemas y circuitos integrados. ♦ La eficacia general del sistema depende de la versatilidad de los dispositivos conectados al mismo.

53 - . BUS I2C Las líneas SDA y SCL son del tipo drenador abierto. pero obsérvese que las líneas tienen una especificación máxima de 400 pF en lo que respecta a capacidad de carga. Se deben poner en estado alto2 para construir una estructura de bus tal que se permita conectar en paralelo múltiples entradas y salidas. similares a las de colector abierto pero asociadas a un transistor de efecto de campo1. Es el único que aplica los pulsos de reloj en la línea . Las dos líneas de comunicación disponen de niveles lógicos altos cuando están inactivas.7. Figura 7. 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. Inicialmente el número de dispositivos que se puede conectar al bus es limitado. La máxima velocidad de transmisión de datos que se puede obtener es de aproximadamente 100 Kbits por segundo. En la figura se puede observar la configuración eléctrica básica del bus. de eso se encargan las resistencias de pull-up Rp.BRAZO DE ROBOT ANEXO 2. Rs son las impedáncias de las líneas de conexión. Conexión de dispositivos usando el bus I2C.

♦ STOP: Un dispositivo maestro puede generar esta condición dejando libre el bus.54 - . generando esta condición. A cada byte le sigue el noveno pulso de reloj durante el cuál. . La línea de datos (SDA) toma un estado bajo mientras que la línea de reloj (SCL) permanece alta. ♦ START: Sucede cuando un dispositivo maestro hace ocupación del bus. La línea de datos toma un estado lógico alto mientras que la de reloj permanece en ese estado. Reciben señales de comando y de reloj proveniente del dispositivo maestro. ♦ 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.8. Unicamente en este momento es cuando un dispositivo maestro puede comenzar a hacer uso del bus. ♦ Bus desocupado: Estado en el cual ambas líneas (SDA y SCL) están inactivas.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”. Condiciones de START y STOP. ♦ Slave: Cualquier dispositivo conectado al bus incapaz de generar pulsos de reloj. el dispositivo receptor del byte debe generar un pulso de reconocimiento. A continuación se muestra un diagrama que muestran las condiciones de START y STOP en modo gráfico: Figura 7. presentando un estado lógico alto.

si este bit fuese bajo el dispositivo maestro escribe información en un dispositivo esclavo. Reconocimiento. TTL) los niveles lógicos “0” y “1” de los bits transferidos no tienen una tensión fija. éste responde enviando el pulso de reconocimiento ACK. 1 2 Acknowledge. sino que dependen de la tensión Vdd de alimentación. Si este bit es alto. Low Significative Bit. ♦ Address: Cada dispositivo diseñado para funcionar con este bus dispone de su propia y única dirección de acceso. 7. Cada bit que se transfiere por la línea SDA debe ir acompañado de un pulso de reloj por la línea SCL.55 - . Si el dispositivo cuya dirección se apuntó en los siete bits está presente en el bus. un dispositivo maestro puede ocuparlo generando una condición de inicio. BUS I2C conocido como ACK1. que viene preestablecida por el fabricante. el LSB2 enviado durante la operación de direccionamiento corresponde al bit que indica el tipo de operación a realizar. para iniciar una comunicación entre dispositivos conectados al bus I2C se debe respetar un protocolo. La dirección 00 es la denominada “de acceso general”. ♦ Lectura/Escritura (Bit R/W): Cada dispositivo dispone de una dirección de 7 bits. mientras transcurre el noveno pulso de reloj. 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). Tan pronto como el bus esté libre. NMOS.BRAZO DE ROBOT ANEXO 2. El octavo bit.2. Bit de menos peso. En cambio. Protocolo Como es lógico. . Seguidamente puede comenzar el intercambio de información entre los dispositivos. por la cual responden todos los dispositivos conectados al bus. Esto permite que una serie del mismo tipo de dispositivos se puedan conectar en un mismo bus sin problemas de identificación. Debido a la variedad de tecnologías empleadas en los dispositivos diseñados para conectarse al bus I2C (CMOS. Hay dispositivos que permiten establecer externamente parte de la dirección de acceso.2. el dispositivo maestro lee información proveniente de un dispositivo esclavo. Esto se logra situando la línea de datos a un nivel lógico bajo.

Si se desea seguir transmitiendo.4. el dispositivo maestro envía datos al dispositivo esclavo hasta que deja de recibir los pulsos de reconocimiento. puertos de E/S. 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).56 - . transceptores IR. PIC 16F873 En este pic. . cuando la señal R/W estaba a nivel lógico alto. generando una condición de STOP. el fabricante ha implementado el módulo MSSP1 que proporciona una excelente interfaz de comunicación de los microcontroladores y diversos periféricos. el dispositivo maestro (que en este momento está recibiendo datos) genera un pulso de reconocimiento. en lugar del STOP. BUS I2C Cuando la señal R/W está previamente a nivel lógico bajo. conversores A/D y D/A. 7. 7. El dispositivo maestro puede dejar libre el bus. este bus es ideal para sistemas donde es necesario interconectar muchos dispositivos. es decir. relojes de tiempo real y calendarios. el dispositivo maestro genera pulsos de reloj durante los cuales el dispositivo esclavo puede enviar datos. microcontroladores. que es un registro de desplazamiento que transforma la información serie en paralelo y viceversa. El módulo MSSP consta básicamente de dos registros: El SSPSR. incluyendo memorias RAM y EEPROM. Aplicaciones Tanto Philips como otros fabricantes de dispositivos compatibles con I2C disponen de una amplia gama de circuitos integrados. En el caso contrario. Luego de cada byte recibido. que va desplazando bit a bit el dato. sacándolo ordenadamente al exterior al ritmo de los impulsos de reloj. también consta del registro SSPBUF.BRAZO DE ROBOT ANEXO 2.3. En transmisión. Dado que no siempre se requiere alta velocidad de transferencia de datos. El funcionamiento del módulo MSSP es muy sencillo. o hasta que se hayan transmitido todos los datos.2. En recepción. En este pic el usuario puede utilizar 2 patillas que correctamente programadas se utilizan para manejar directamente el bus I2C. 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. codificadores DTMF. el dispositivo maestro puede generar otra condición de START.2. que actúa como buffer de la información que recibe o transmite.

1. BUS I2C los bits van entrando al ritmo del reloj por una patita y se van desplazando en el SSPSR hasta que lo llenan. 7.A1.BRAZO DE ROBOT ANEXO 2. donde queda lista para su lectura. Figura 7.5. los tres siguientes (A2.2.7. Configuración típica del bus I2C. al igual que el flag de interrupción SSPIF. En la siguiente figura se muestra un esquema básico sobre la estructura interna del módulo MSSP. Direccionamiento de la memoria Después del START se envía un byte de control.5. que advierte de este tipo de colisiones. 7.2. en cuyo momento la información se traspasa al SSPBUF.57 - . en el caso de la memoria es 1010. de los cuáles los 4 primeros (mayor peso) indican la operación que se quiere realizar. indican el número de . 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. se traspasa dicha información a SSPBUF y entonces el bit señalizador BF (Buffer Full) se pone a “1”. Cuando se han recibido 8 bits durante la recepción en SSPSR. Recae en la responsabilidad del programador pasar el bit WCOL a “0” una vez completada la escritura en SSPBUF. Este doble almacenamiento del dato recibido permite iniciar la recepción de un nuevo dato antes de que se haya leído el último. este consiste en 8 bits. Cualquier escritura en el SSPBUF se ignora durante una transferencia de información y se señaliza poniendo a “1” el bit WCOL.A0).

5. Una vez enviado. después de cada elemento se añade un ACK por parte de la memoria. 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.58 - . . Direccionamiento de la memoria. La dirección del byte o word address. el dispositivo responde con un ACK. Figura 7.11.2.2. Figura 7. Escritura como byte write. indica la dirección de la celda de memoria a la que se quiere acceder dentro de cada bloque. dirección del byte y el byte a escribir.10.BRAZO DE ROBOT ANEXO 2. 7. direccionamiento del dispositivo. Byte write Este tipo de escritura se produce cuando solo es necesario grabar un dato. si ese bit es “1” realizaremos una lectura y si es “0” realizaremos escritura. La escritura comienza con un START.

7.4. es decir. se pueden escribir más de un byte sin tener que mandar un START y STOP para cada byte.2. Current address read Este tipo de lectura.BRAZO DE ROBOT ANEXO 2. Figura 7.13.5.59 - .5. Figura 7. Escritura como page write. lee la posición actual de la memoria. Page write Este tipo de escritura es del tipo secuencial. Current address read.12. BUS I2C 7. esta posición está apuntada por un puntero interno que la incrementa cada vez.2. .3.

Sequential read En este tipo de lectura. .6.2. Para conseguirlo debemos implementar la trama que se muestra en la figura siguiente: Figura 7.14. 7. Random read.5. Random read En este tipo de lectura se indica la posición de donde debe leer la información.5. se leen varias posiciones.15. Sequential read. hay que destacar que primero se ha de enviar la dirección y después se recibe el dato. BUS I2C 7.5. 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. Figura 7.2.BRAZO DE ROBOT ANEXO 2.60 - .

Este es un método para ordenar un vector.BRAZO DE ROBOT ANEXO 3. METODO DE LA BURBUJA 7. BURBUJA I= 0 I =I+ 1 V(I) > V(I+1) N S Aux = V(I) V(I) = V(I+1) V(I+1) = Aux N I= 3 S FIN Organigrama 7. . Anexo 3. Método de la burbuja. según si la clasificación es ascendente o descendente.3. Método de la burbuja. Consiste en ir comparando parejas contiguas de datos. En este caso se ordena de forma ascendente un vector de 3 posiciones. desplazando hacia la última posición el dato mayor o menor.16.

BRAZO DE ROBOT ANEXO 7.2.3. CD-ROM 7. Vista de Componentes 7. Vista Bottom .2.4. Placa de circuito impreso.1.4. PCB 7.2.2. 7.4.1.4.2. Anexo 4.4. Vista Top 7. Esquema 7.4.

63 - . BUS I2C .BRAZO DE ROBOT ANEXO 2.

BUS I2C .64 - .BRAZO DE ROBOT ANEXO 2.

BUS I2C .BRAZO DE ROBOT ANEXO 2.65 - .

BUS I2C .BRAZO DE ROBOT ANEXO 2.66 - .

67 - . .BRAZO DE ROBOT ANEXO 2. Anexo 5. BUS I2C 7.5. Listados de programa y organigramas. A continuación se entregan los listados del software desarrollado para la aplicación. También se entregan los organigramas seguidos para desarrollar el software y poder entender mejor los programas. es decir. del interfície de programación y del cerebro del brazo de robot.

68 - . BUS I2C INTERFICIE DE PROGRAMACION: Interfície de programación ¿Cambio de posición para servo 1? N ¿Cambio de posición para servo 2? N ¿Cambio de posición para servo 3? N ¿Grabar Memoria? N ¿Reset? N N ¿Borrar Memoria? S S Tarea a Realizar = 0 S S Tarea a Realizar = 1 S Tarea a Realizar = 2 S Tarea a Realizar = 3 Enviar trama de comunicación por el puerto serie Fin Interfície .BRAZO DE ROBOT ANEXO 2.

17. BUS I2C 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 V(I) > V(I+1) N N S Aux = V(I) V(I) = V(I+1) V(I+1) = Aux I= 3 S 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.69 - . ANEXO 2. Interficie de programación. Cálculo del número de pasos que debe esperar cada servo. .BRAZO DE ROBOT Organigrama 7.

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

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

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

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

3. 2. 4. 3. 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). 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. caracter blanco si es positivo ' si es negativo. el mayor queda For I = 0 To 1 ‘al final del vector. 1) Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0).BRAZO DE ROBOT ANEXO 2. . 1) Pasos_Servo_Decena(0) = Mid(Pasos_Servo(0). 2. 1) End If End If ‘Cálculo de pasos. 1) Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0). 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. Pasos_Servo(0) = Str(Int(Ordenados(2) / Grados_Base_Paso)) 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). 1) End If If Pasos_Servo(0) >= 100 Then Pasos_Servo_Centena(0) = Mid(Pasos_Servo(0). 2.74 - .

Output = Inicio_Transmision_Decena CommSerie. 1) Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1).Output = Inicio_Transmision_Unidad CommSerie. 4.CommPort = Numero_Puerto CommSerie.N. 1) Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1). 2.1" CommSerie.Output = Decena(x) CommSerie.BRAZO DE ROBOT ANEXO 2. 3.8. 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). 3. CommSerie.PortOpen = True CommSerie. 2.75 - .Settings = "9600. 1) Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2).Output = Pasos_Servo_Unidad(x) CommSerie. 1) Pasos_Servo_Decena(1) = Mid(Pasos_Servo(1). 1) Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2).Output = Inicio_Transmision_Centena CommSerie. 2. 1) End If End If ‘Se manda la trama de comunicación por el puerto serie RS-232.Output = Pasos_Servo_Centena(x) CommSerie. 1) End If If Pasos_Servo(2) >= 100 Then Pasos_Servo_Centena(2) = Mid(Pasos_Servo(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). 3.Output = Centena(x) CommSerie. 2. 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. 3. 4.Output = Unidad(x) Next x . 1) Pasos_Servo_Decena(2) = Mid(Pasos_Servo(2).Output = Tarea_Realizar For x = 0 To 2 ' 3 CommSerie. 1) End If If Pasos_Servo(1) >= 100 Then Pasos_Servo_Centena(1) = Mid(Pasos_Servo(1).Output = Pasos_Servo_Decena(x) CommSerie.

BUS I2C CommSerie.BRAZO DE ROBOT ANEXO 2.76 - .PortOpen = False Tarea_Realizar = "0" End Sub .

. BUS I2C CEREBRO DEL BRAZO DE ROBOT: PROGRAMA PRINCIPAL DE LA APLICACIÓN: Programa principal N ¿Modo Autonómo? S Modo Programación Modo Autonómo N ¿Recibido por el puerto serie el valor "255"? S Recibir trama por el puerto serie: Tarea a Realizar y Posición de los servos Leer memoria Actuar sobre servos Actuar sobre servos S ¿Tarea a Realizar = 0? N N ¿Todos los servos en posición? S Grabar memoria S ¿Tarea a Realizar = 1? N Posicionar servos en posicion 0º y borrar memoria S ¿Tarea a Realizar = 2? N Borrar memoria S ¿Tarea a Realizar = 3? N Organigrama 7.19. Rutina principal del brazo de robot.77 - .BRAZO DE ROBOT ANEXO 2.

BRAZO DE ROBOT ANEXO 2.78 - . BUS I2C RUTINA PARA GRABAR EN LA MEMORIA I2C Rutina Grabar Memoria S ¿Memoria llena? N 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.

. 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 S ¿Número de movimiento actual > número total de movimientos? N ¿Número de movimiento actual = número total de movimientos? N S Inicializar: Número de movimiento actual Fin Rutina Leer Organigrama 7.BRAZO DE ROBOT ANEXO 2.21.79 - . Rutina leer de EEPROM.

1 Fin RSI Organigrama 7.BRAZO DE ROBOT ANEXO 2. BUS I2C RUTINA SERVICIO DE INTERRUPCION (PWM): RSI S ¿Interrupcion por TMR1? N ¿Interrupcion por TMR0? N S S S Bajar pin servo 1 ¿Variable = 2? ¿Variable = 2? Subir pin servo 1 Cargar TMR1 N S N S Bajar pin servo 2 ¿Variable = 1? ¿Variable = 1? Subir pin servo 2 Cargar TMR1 N N Bajar pin servo 3 Variable = 3 Subir pin servo 3 Cargar TMR1 Desactivar TMR1 Variable = Variable . Atención de interrupción. .22. genera PWM para los servos.80 - .

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

BRAZO DE ROBOT Retardo_2 WORD_ADDRESS Total_Mov EQU N_Mov_Act EQU ;********** Programa. ORG GOTO ORG GOTO 00h Inicio 04h RSI ;Vector de reset ;Vector de interrupcion EQU EQU 53h 54h 51h 52h

ANEXO 2. BUS I2C ;el I2C y la EEPROM 24LC02B ;Palabra de direccion para el I2C. ;Total movimientos de la secuencia. ;El numero por el que va en la secuencia de lectura.

;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 MOVLW b' 00101000' MOVWF SSPCON MOVLW .207 MOVWF TMR0 CLRF PORTA CLRF PORTB CLRF PORTC MOVLW b' 10010000' MOVWF RCSTA MOVLW b' 00000000' MOVWF PIR1 MOVLW b' 00110000' MOVWF T1CON MOVLW 02h MOVWF N_SERVO MOVLW .1 MOVWF Mira_si_Paso movlw 0x00 movwf Tarea_Realizar ;Pagina 0 ;Modulo MSSP en ON ;TMR0 provocara INT cada 5 mS ;Borrar la puerta A,B y C ;Configura recepcion asincrona ;de 8 bits sin paridad ;Resetea FLAG de int por tmr1 overflow y el ;que indica que el buffer de recepcion esta lleno ;Desactiva TMR1 y preescaler 1:8 ;Inicializa la variable N_SERVO ;para actuar sobre los 3 servos ;Si se puede incrementar/decrementar grado ;Inicializa la Tarea a Realizar

- 82 -

BRAZO DE ROBOT

ANEXO 2. BUS I2C

;Condiciones iniciales del brazo de robot Condi_Inicial MOVLW MOVWF MOVWF MOVLW MOVWF MOVWF MOVLW MOVWF MOVWF MOVLW MOVWF MOVWF ;****Rutina Principal Principal Fin_Principal BTFSC PORTC,0 GOTO Modo_Autonomo GOTO Modo_Programacion GOTO Principal BCF STATUS,Z MOVLW .1 ;Si es 0 entra en el modo programacion ;Aqui en realidad tiene que ir Modo Autonomo ;Interruptor externo. .0 GRADOS_SERVO1 GR_DEST_SERVO1 .0 GRADOS_SERVO2 GR_DEST_SERVO2 .0 GRADOS_SERVO3 GR_DEST_SERVO3 .0 N_Mov_Act WORD_ADDRESS ;Servos a posición de 0º

;Empezará la secuencia desde el ;principio de la memoria.

Modo_Autonomo

Modo_Aut_1 Fin_Modo_Auton_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 BSF PCLATH,0 BSF PCLATH,2 CALL Fin_Modo_Auton 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 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 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF Pasos_Servo1 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO1 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF Pasos_Servo2 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO2 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF Pasos_Servo3 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO3 MOVF ADDWF GOTO GOTO GOTO GOTO Obtiene_Cifra_1byte

ANEXO 2. BUS I2C

Leer_Pasos_Servo1 Leer_Grados_Servo1 Leer_Pasos_Servo2 Leer_Grados_Servo2 Leer_Pasos_Servo3 Leer_Grados_Servo3

;3 bytes, centena, decena y unidad ;Se guarda en la variable ;Centena, decena y unidad ;3bytes

;3byte

Comprobar_Tarea

Tarea_Realizar,w PCL,f ;Se comprueba si la tarea a realizar es: Principal ;0 -> Al Servo Grabar_Posicion ;1 -> Grabar Coordenada en la EEPROM Reset ;2 -> Inicializa puntero memoria, borrandola, ;y posicionando el servo a 0º Borrar_Memoria ;3 -> Borra Memoria

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 Leer_Rx ;Obtiene la cifra leída Centena Leer_Rx Decena Leer_Rx Unidad PCLATH,1 Centena,w TABLA_CENTENAS Cifra_Leida Decena,w TABLA_DECENAS Cifra_Leida,f Unidad,w TABLA_UNIDADES

Obtiene_Cifra_3bytes CALL MOVWF CALL MOVWF CALL MOVWF BSF MOVF CALL MOVWF MOVF CALL ADDWF MOVF CALL

- 84 -

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

w PCLATH STATUS_TEMP.2 GRADOS_SERVO3. BUS I2C .1 GRADOS_SERVO2.Nivel bajo del PWM de cada servo .Habilita INT por TMR1 overflow TMR0_INT movlw .Si hay alguna cosa incontrolada .F GOTO SUBIR_SER3 .0 GRADOS_SERVO1.0 .Restablece FLAG de TMR0 FIN_TMR1 FIN_RSI PCLATH_TEMP.w STATUS W_TEMP.BRAZO DE ROBOT GOTO GOTO GOTO GOTO BAJAR_SER1 BAJAR_SER2 BAJAR_SER3 BAJAR_SER3 BAJAR_SER2 BAJAR_SER1 FIN_RSI ANEXO 2.W SUBIR_SER1 SUBIR_SER2 SUBIR_SER3 CARGAR_TMR1 MOVWF GRADO_LECTURA BSF PCLATH.W ADDWF PCL.Activar TMR1 .2 .Desactiva TMR1 .Inicializa N_SERVO TMR1_INT_1 .lleguen juntos a la posicion destino MOVF N_SERVO.F T1CON.0 FIN_RSI .W BCF PCLATH.1 CALL DUTY_HIGH MOVWF TMR1H BCF PCLATH.F W_TEMP.0 BSF PCLATH.W CARGAR_TMR1 PORTA.0 INTCON.segun corresponda BCF PORTA.w .2 MOVLW 03h MOVWF N_SERVO DECF BCF BCF GOTO N_SERVO.1 BSF BCF movf movwf swapf movwf swapf swapf T1CON.0 CALL DUTY_LOW MOVWF TMR1L MOVF GRADO_LECTURA.Retorno de interrupcion RETFIE .Para sincronizar para que todos los servos movwf Mira_si_Paso .0 GOTO TMR1_INT_1 BCF PORTA.W CARGAR_TMR1 PORTA.0 PIR1.1 GOTO TMR1_INT_1 BCF PORTA.pwm a nivel alto GOTO SUBIR_SER2 GOTO SUBIR_SER1 BSF MOVF GOTO BSF MOVF GOTO BSF MOVF PORTA.86 - .

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

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

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

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

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

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

177º .0 .Devuelve el 1 .64899 high .170º .64913 high .Devuelve el 8 .Devuelve el 6 .F .4 .64915 high .168º .200 PCL.Devuelve el 30 .30 .que el servo tiene que esperar cada vez.5 .64901 high .20 .64921 high .9 .w .7 . GOTO Calculo_Servo3 GOTO Calculo_Servo2 GOTO Calculo_Servo1 .64905 high .Devuelve el 10 .Devuelve el 0 .3 .40 .Devuelve el 20 .Aquí se va incrementando o decrementando MOVF N_SERVO.Devuelve el 90 TABLA_UNIDADES .Devuelve el 70 .93 - .70 .172º .Devuelve el 200 decimal TABLA_DECENAS .BRAZO DE ROBOT RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW high .Devuelve el 5 .Devuelve el 100 decimal .179º .64911 high .Devuelve el 7 .169º .Devuelve el 40 .Devuelve el 0 .los grados.80 .64897 .F 0x00 .174º .8 .64919 high .Devuelve el 9 ORG Modo_Autonomo_1 300h BCF STATUS.175º .Devuelve el 80 .Devuelve el 3 .173º .F .C . teniendo en cuenta el nº de pasos ADDWF PCL.171º .90 PCL.64907 high .0 .180º ANEXO 2.100 .10 .Devuelve el 50 .f .50 .178º .64917 high .6 .Devuelve el 60 .Devuelve 0 .2 .60 .Devuelve el 2 .176º . BUS I2C TABLA_CENTENAS ADDWF RETLW RETLW RETLW ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW PCL.64903 high .64909 high .1 .Devuelve el 4 .

w .w MOVWF Pasos_Servo MOVF Pas_act_Servo1.C GOTO I NCREMENTAR GOTO Fin_Modo_Autonomo .w BTFSS STATUS.w .C MOVF GR_DEST_SERVO.que ha dado es el que hay que dar BTFSC STATUS.w MOVWF Pas_act_Servo MOVF GRADOS_SERVO.w MOVWF Pas_act_Servo GOTO Calculo_Servo MOVF GRADOS_SERVO2.w MOVWF GR_DEST_SERVO MOVF Pasos_Servo2.1 Pas_act_Servo Guardar_Servo Calculo_Servo2 Calculo_Servo3 Calculo_Servo INCREMENTAR INCREMENTAR_GRADO INCF MOVLW MOVWF GOTO . BUS I2C Calculo_Servo1 MOVF GRADOS_SERVO1.Z .GRADOS_SERVO>GRADOS_DESTINO SUBWF GR_DEST_SERVO.BRAZO DE ROBOT ANEXO 2.94 - .w MOVWF GR_DEST_SERVO MOVF Pasos_Servo1.w BTFSS STATUS.antes de incrementar un grado GOTO INCREMENTAR_GRADO INCF Pas_act_Servo.w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO3.w MOVWF Pasos_Servo MOVF Pas_act_Servo2.f GOTO Guardar_Servo GRADOS_SERVO.w MOVWF GR_DEST_SERVO MOVF Pasos_Servo3.w MOVWF Pasos_Servo MOVF Pas_act_Servo3.Caso que sean iguales BCF STATUS.w MOVWF Pas_act_Servo GOTO Calculo_Servo MOVF GRADOS_SERVO3.f .Z MOVF Pasos_Servo.C GOTO DECREMENTAR BCF STATUS.Comprueba si el numero de pasos SUBWF Pas_act_Servo.w .GRADOS_SERVO<GRADOS_DESTINO SUBWF GRADOS_SERVO.w .w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO2.w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO1.

0 PCLATH. BUS I2C DECREMENTAR BCF STATUS.que ha dado es el que hay que dar BTFSC STATUS.f GOTO Guardar_Servo GRADOS_SERVO.w GRADOS_SERVO1 Pas_act_Servo.(datagrama) MOVLW .nueva interrupción PCLATH.w .w .Comprueba si el numero de pasos SUBWF Pas_act_Servo. si son menores CALL START .Envia el Control Byte como escritura .antes de decrementar un grado GOTO DECREMENTAR_GRADO INCF Pas_act_Servo.grabar y la palabra de dirección actual CALL Delay_I2C .1 Fin_Modo_Autonomo movlw movwf BCF BCF RETURN ORG 0x400 .Tratamiento de memoria EEPROM .w Pas_act_Servo1 Fin_Modo_Autonomo GRADOS_SERVO.w GRADOS_SERVO2 Pas_act_Servo.f .Lee los movimientos totales.w Pas_act_Servo2 Fin_Modo_Autonomo DECREMENTAR_GRADO DECF MOVLW MOVWF GOTO Guardar_Servo MOVF ADDWF GOTO GOTO GOTO MOVF MOVWF MOVF MOVWF GOTO MOVF MOVWF MOVF MOVWF GOTO Guardar_Servo1 Guardar_Servo2 Guardar_Servo3 MOVF GRADOS_SERVO. antes de .Z .95 - .Z MOVF Pasos_Servo.1 .1 Pas_act_Servo Guardar_Servo N_SERVO.f Guardar_Servo3 Guardar_Servo2 Guardar_Servo1 GRADOS_SERVO.Random Read para leer el numero de movimientos totales.w PCL.No realiza ningun incremento/decremento hasta Mira_si_Paso .de 42 graba MOVLW b' 10100000' CALL I2C_ENVIAR .BRAZO DE ROBOT ANEXO 2.w MOVWF Pas_act_Servo3 .252 Grabar_Memoria .w MOVWF GRADOS_SERVO3 MOVF Pas_act_Servo.

w I2C_ENVIAR WORD_ADDRESS.secuencia actual del movimiento CALL STOP CALL BSF CALL MOVF CALL MOVF CALL INCF MOVF CALL INCF call bsf call movf call MOVF CALL INCF MOVF CALL INCF call Delay_I2C PCLATH.Graba el numero de movimientos como ' BYTE WRITE' INCF CALL BSF CALL MOVLW CALL Total_Mov.w I2C_ENVIAR WORD_ADDRESS.w I2C_ENVIAR WORD_ADDRESS.f STOP PCLATH.Manda el nuevo Control Byte como lectura .Comprueba si hay 42 movimientos grabados . BUS I2C I2C_ENVIAR .Lee el total de movimientos MOVWF Total_Mov CALL I2C_MAN_NO_ACK CALL STOP .0 START_GRABACION .Z .f GRADOS_SERVO2.252 I2C_ENVIAR .movimientos CALL RESTART MOVLW b' 10100001' CALL I2C_ENVIAR .w CALL I2C_ENVIAR .Z Fin_Grabar .f Delay_I2C PCLATH.w STATUS.Lee como CURRENT ADDRESS READ la Word Address .Envia la Word Address del total de .grabación MOVF Total_Mov.42 Total_Mov.BRAZO DE ROBOT CALL ANEXO 2.Graba como ' PAGE WRITE' 6 valores correspondientes a los 3 Servos los .2.w I2C_ENVIAR WORD_ADDRESS.Empieza la grabacion de los diferentes valores de Servo1.f GRADOS_SERVO1.0 START_GRABACION WORD_ADDRESS.f STOP .0 START_GRABACION WORD_ADDRESS.(datagrama) CALL I2C_LEER .3 BCF MOVLW SUBWF BTFSC GOTO Grabar_Mem STATUS.96 - .w I2C_ENVIAR Pasos_Servo2.' PAGE WRITE' .Manda la el Total de movimientos de la .Manda la WORD ADDRESS de la posicion de .w I2C_ENVIAR Pasos_Servo1.

f GRADOS_SERVO3.Leer 6 posiciones de la memoria .w I2C_ENVIAR WORD_ADDRESS.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 Leer_Memoria .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.' Random Read' CALL START MOVLW b' 10100000' CALL I2C_ENVIAR MOVF WORD_ADDRESS.w STATUS.w I2C_ENVIAR WORD_ADDRESS.0 START_GRABACION WORD_ADDRESS.w I2C_ENVIAR Pasos_Servo3.' Random Read' para Total_Mov CALL START MOVLW b' 10100000' CALL I2C_ENVIAR MOVLW .f STOP PCLATH.2 movlw 0x00 movwf Tarea_Realizar RETURN CALL Delay_I2C .0 Total_Mov.La primera como ' Random Read' para posicionar el puntero en WORD_ADDRESS CALL Delay_I2C . si es así ir al final de la lectura porque no hay ningun movimiento BCF MOVLW SUBWF BTFSC GOTO STATUS.Compara si Total_Mov = 0.f .BRAZO DE ROBOT ANEXO 2.Z .1 BCF PCLATH.Z Fin_Leer_Mem . BUS I2C bsf call movf call MOVF CALL INCF MOVF CALL INCF CALL bsf Fin_Grabar PCLATH.97 - .

w N_Mov_Act.f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF GR_DEST_SERVO3 INCF WORD_ADDRESS.BRAZO DE ROBOT ANEXO 2.f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF GR_DEST_SERVO2 INCF WORD_ADDRESS.Graba WORD_ADDRESS como ' BYTE WRITE' Fin_Leer_Mem BSF PCLATH.252 .0 RETURN .y N_Mov_Act = 0 BCF MOVF SUBWF BTFSC GOTO GOTO Iniciar_WORD_ADDRESS STATUS.f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF Pasos_Servo2 INCF WORD_ADDRESS.f .Resetea la variable Total_Mov y el WORD ADDRESS.f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF Pasos_Servo3 INCF WORD_ADDRESS. borrando asi la memoria Reset_Total_Mov . y los graba en la posicion .Z Total_Mov.Graba posiciones 252d y 253d como ' PAGE WRITE' CALL CALL MOVLW CALL MOVLW Delay_I2C START b' 10100000' I2C_ENVIAR .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. BUS I2C .w STATUS.0 WORD_ADDRESS N_Mov_Act MOVLW MOVWF MOVWF .correspondiente de la EEPROM.Z Iniciar_WORD_ADDRESS Fin_Leer_Mem .98 - . si son iguales iniciar WORD_ADDRESS = 0 .Compara si N_Mov_Act = Total_Mov.f CALL I2C_MAN_NO_ACK CALL STOP INCF N_Mov_Act.

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

ACKEN SSPCON2.SSPIF STATUS.RP1 SSPCON2.PEN $-1 STATUS.w STATUS.100 - .RP1 SSPCON2.RP0 I2C_ENVIAR MOVWF BSF BTFSC GOTO BCF RETURN BCF BSF BCF BSF BCF BTFSS GOTO BSF BCF BCF MOVF RETURN SSPBUF STATUS.ACKEN $-1 STATUS.RP0 SSPBUF. BUS I2C STOP BCF BSF BCF BSF BTFSC GOTO BCF RETURN PIR1.SSPIF STATUS.ACKDT SSPCON2.RP0 I2C_MAN_ACK BSF BCF BCF BSF BTFSC GOTO BCF RETURN I2C_MAN_NO_ACK BSF BCF BSF BSF BTFSC GOTO BCF RETURN STATUS.RP1 SSPCON2.RP0 PIR1.ACKDT SSPCON2.RP0 SSPSTAT.PEN SSPCON2.RP0 STATUS.BRAZO DE ROBOT ANEXO 2.RP0 STATUS.RP0 STATUS.RP0 STATUS.RP1 SSPCON2.R_W $-1 STATUS.ACKEN $-1 STATUS.RP0 SSPCON2.RCEN STATUS.ACKEN SSPCON2.RP0 I2C_LEER PIR1.SSPIF $-1 STATUS.RCEN STATUS.RP0 .

Z GR_DEST_SERVO2.w .f Delay_I2C START b' 10100000' I2C_ENVIAR WORD_ADDRESS.w GRADOS_SERVO3.f WORD_ADDRESS.siguiente posicion BCF MOVF SUBWF BTFSC GOTO GOTO STATUS.BRAZO DE ROBOT ANEXO 2.0 PCLATH.0 Leer_Memoria PCLATH.Z GR_DEST_SERVO3.RP0 START $+2 RESTART b' 10100000' I2C_ENVIAR STATUS.f WORD_ADDRESS.RP1 SSPCON2.w GRADOS_SERVO1.101 - .w GRADOS_SERVO2.Z GR_DEST_SERVO1. si es asi leer .Z SEGUIR_LEER_2 Fin_Modo_Aut_1 STATUS.ACKSTAT $-5 STATUS. BUS I2C ORG Fin_Modo_Auton 0x500 .0 WORD_ADDRESS.2 SEGUIR_LEER_1 BCF MOVF SUBWF BTFSC GOTO GOTO BCF MOVF SUBWF BTFSC GOTO GOTO BCF CALL BCF BCF RETURN SEGUIR_LEER_2 SEGUIR_LEER_3 Fin_Modo_Aut_1 START_GRABACION BSF BCF BSF BCF CALL GOTO CALL MOVLW CALL BSF BTFSC GOTO BCF BCF RETURN org 0x600 decf decf decf call call movlw call movf STATUS.w STATUS.Z SEGUIR_LEER_3 Fin_Modo_Aut_1 PCLATH.Z SEGUIR_LEER_1 Fin_Modo_Aut_1 STATUS.RP0 SSPCON2.w STATUS.RP0 PCLATH.RP0 STATUS.w STATUS.ACKSTAT STATUS.Comparar si todos los servos estan en su destino.

1 ANEXO 2.f PCLATH. BUS I2C .f WORD_ADDRESS.f WORD_ADDRESS.102 - .BRAZO DE ROBOT call call movlw call call call call incf incf incf bcf return END I2C_ENVIAR RESTART b' 10100001' I2C_ENVIAR I2C_LEER I2C_MAN_NO_ACK STOP WORD_ADDRESS.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->