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.es.BRAZO DE ROBOT INTRODUCCION Pic Trainer”. -7- .

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

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

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

3. 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.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.11 - .3. 2. Dimensiones del brazo de robot. 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. Elementos que forman el sistema.4.2.

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

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

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

1. También sabemos que el motor que necesitará tener más par de giro. ¿Por qué servos? El brazo de robot está pensado para poder desplazar un peso máximo de 75 gramos. distribuidos como muestra la figura siguiente. Dispone también de un circuito que gobierna el sistema. El recorrido del eje de salida es de 180º en la mayoría de ellos. el tipo de motores que se utilizan son los denominados “servos” que a continuación se explican con detalle. que solo han de actuar sobre una parte de la estructura. Servos Como ya se ha comentado con anterioridad. Centros de gravedad de las articulaciones y carga del brazo. será el de la base.6.15 - . y el peso de la estructura de aproximadamente 200 gramos.7. Fotografía de un servo. que tiene que poder llevar. Fotografía 2. 2. . 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.BRAZO DE ROBOT MEMORIA TECNICA 2. toda la estructura del brazo. pero puede ser fácilmente modificado para tener un recorrido libre de 360º. además de la carga útil. Se ha definido que la palanca del brazo será de 18 cm.3.3. al contrario que los otros. 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.

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

♦ Motor eléctrico. ♦ Potenciómetro solidario al eje. ¿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.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.17 - . Fotografía 2.8. Estos son: ♦ Carcasa exterior. ♦ Engranajes reductores. Características técnicas del servo utilizado.3. 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. ♦ Control control. electrónico de .9.2. Servo desmontado.

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

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

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

♦ Diseño de placa: Debe tenerse en cuenta que usar un microcontrolador de gama baja. ♦ 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.21 - . se tiene que separar en memoria no volátil1 y memoria volátil2. .14. Teléfono Módem Industria Control de motores Compresor Termostatos Robótica Lector de tarjetas Detector de humo Reproductor de CD ABS Tabla 2. puede implicar tener que colocar más componentes externos. 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.2.1.4. Tabla de aplicaciones que requieren microcontroladores. Aplicaciones de los microcontroladores Cada vez existen más productos que incorporan un microcontrolador. 2. por todas las prestaciones que añaden a un diseño.BRAZO DE ROBOT MEMORIA TECNICA ♦ Memoria: Para detectar las necesidades de memoria de la aplicación.

BRAZO DE ROBOT MEMORIA TECNICA 2.15.3. 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.16.4.1. ♦ Alternativa 2: PC RS 232 microcontrolador 1 I2C EEPROM Actuador Base Actuador Hombro Actuador Codo Figura 2.22 - . Diagrama de bloques de la primera alternativa. . Diagrama de bloques de la segunda alternativa.

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

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

25 - . START + 8 bits de datos + STOP.500 instrucciones aproximadamente. .600 baudios1. Tiempo de bit = 1 = 1´041667 x 10 − 4 segundos = 104´1667 µS 9600 La recepción consta de 10 bits.600 bits por segundo. 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. 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. Esta se realiza a 9.BRAZO DE ROBOT MEMORIA TECNICA Se realizan los siguientes cálculos: Velocidad de transmisión: 9.

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

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

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 . Formato de grabación utilizado en la EEPROM. Cada movimiento consta de 6 bytes como puede observarse en la figura anterior.19.28 - Número de movimientos = . Con el formato de grabación descrito. se consigue grabar hasta 42 movimientos diferentes.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.

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

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

esta posición leída estará comprendida entre 0º y 180º que es el recorrido que tiene el servo. 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. varíe desde 0´9 mS hasta 2´1 mS según la posición a la que tiene que ir el servo.BRAZO DE ROBOT MEMORIA TECNICA servo. Temporización de interrupciones y articulaciones. el tiempo de la segunda interrupción denominada INT2.31 - . y que recordemos que es 0º hasta 180º respectivamente. . que carga un valor en un registro especial de la segunda interrupción. provocada por el otro temporizador. Señal PWM para cada servo. se lee una tabla con esa posición.20. 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. con este valor se conseguirá que según la posición.21.

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

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

los cristales de níquel y cadmio se acumulan y crecen. 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. por esto hay que tener cuidado a la hora de elegir el modo de alimentación.34 - . un polo positivo con hidróxido de níquel y uno negativo con hidróxido de cadmio. Efecto memoria El efecto memoria se produce en algunos tipos de baterías. 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.5. Tipos de baterías recargables Existen muchos tipos de baterías recargables.BRAZO DE ROBOT MEMORIA TECNICA 2. es con una batería recargable. Con este tipo de batería podemos tener el brazo de robot disponible para colocarlo en una plataforma móvil y además respetamos el medio ambiente al no desechar tantas baterías no recargables. Si una batería se ha descargado hasta el 20% de su capacidad de recarga.5. especialmente en las de níquel-cadmio y ocurre al recargar una batería que no se ha agotado suficientemente. sin ella no es posible que el brazo de robot funcione de manera alguna. A lo largo de la vida de la batería su capacidad máxima va disminuyendo debido al efecto memoria. su capacidad se reducirá hasta el 80% del valor inicial.2.1. Este tipo de batería es muy contaminante.5. Elección de la batería Una parte muy importante del proyecto es la alimentación. las más interesantes son: ♦ Baterías de plomo (Pb): Normalmente utilizadas en automóviles. . 2. lo que termina por romper el separador aislante y producir altos niveles de autodescarga o un cortocircuito. ♦ Baterías de níquel-cadmio (Ni-Cd): Constan de dos polos que se encuentran en el mismo recipiente. 2.

La elegida es una batería cuyas características son: 4´8 V y 650 mAh. se decidió por una batería de NiMH. 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. ♦ Baterías de litio-ion (LiIon): Con mayor capacidad que las de NiMH. pero proporcionan aproximadamente un 50% más de energía a igualdad del peso. Además estas no tienen efecto memoria.25. ya que para menor peso es capaz de proporcionar más autonomía al brazo de robot.35 - . . no tienen efecto memoria y apenas se observa efecto autodescarga. Para este cálculo se ha medido la intensidad que consume el sistema con un amperímetro.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. Ventajas y desventajas de los tipos de baterías.3. 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. zirconio o vanadio. 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. 2.

BRAZO DE ROBOT MEMORIA TECNICA Consumo medido: 205 mA. 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% .36 - .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. 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. 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% . 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.27. transportando el peso máximo: Consumo medido: 260 mA.37 - .

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

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

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

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. Si fabricamos en serie los costes se disminuyen mucho.71 . si sumamos estos tres conceptos obtendremos el coste total del un brazo robot. La moneda utilizada para calcular los importes es el euro. 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. como ejemplo. como puede verse a continuación. el mecánico y las horas empleadas en la elaboración. Presupuesto Para realizar el presupuesto del proyecto. se estudiará un pedido de 5 unidades. para otra cantidad habría que estudiar el coste de forma similar. En las siguientes páginas se desglosa cada concepto.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.BRAZO DE ROBOT PRESUPUESTO 5. 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). se han separado los diferentes conceptos de la siguiente forma: El material electrónico.

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

43 - .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.00 150´00 150´00 1750´00 490´00 280´00 140’00 3030´00 484´8 3514´8 .

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

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

♦ CD (Carrier Detect): El módem indica al driver que la línea ha sido activada en el extremo remoto. ♦ RTS (Request To Send): Indica al módem que pase a modo transmisión. ♦ CTS (Clear To Send): Respuesta a RTS. 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. Comunicación serie RS-232. . por lo que pueden llegar datos en cualquier momento. El módem indica al driver que está preparado para recibir datos y enviarlos a la línea. RS-232 ♦ DSR (Data Set Ready): Respuesta a la señal de DTR. El módem indica al driver que está conectado y preparado para transmitir. ♦ RI (Ring Indicator): El módem indica al driver que se ha producido una llamada desde un módem externo.BRAZO DE ROBOT ANEXO 1.46 - .1.

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

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

se usa la norma RS-232 donde cada palabra de información o dato se envía independientemente de los demás. Líneas de comunicación RS-232 del Pic 16F873.49 - . En la forma de comunicación asíncrona que es la que se emplea en este proyecto. RS-232 Figura 7. Envío de 1 byte a través de RS-232.4.BRAZO DE ROBOT ANEXO 1. .3. Suele constar de 8 o 9 bits y van precedidos por un bit de START y detrás de ellos se coloca un bit de STOP. Figura 7.

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

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 5: Que es la masa de referencia para que la comunicación pueda establecerse.51 - . ♦ Pin 3: Conocido como Tx y es por donde se transmiten caracteres.BRAZO DE ROBOT ANEXO 1. .

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

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

La línea de datos toma un estado lógico alto mientras que la de reloj permanece en ese estado. ♦ Slave: Cualquier dispositivo conectado al bus incapaz de generar pulsos de reloj. A cada byte le sigue el noveno pulso de reloj durante el cuál. el dispositivo receptor del byte debe generar un pulso de reconocimiento. ♦ STOP: Un dispositivo maestro puede generar esta condición dejando libre el bus. generando esta condición. Reciben señales de comando y de reloj proveniente del dispositivo maestro. Cuando se conectan varios dispositivos maestros a un mismo bus la configuración obtenida se denomina “multi-maestro”. presentando un estado lógico alto. ♦ START: Sucede cuando un dispositivo maestro hace ocupación del bus. . La línea de datos (SDA) toma un estado bajo mientras que la línea de reloj (SCL) permanece alta.8. ♦ Valid Data: Sucede cuando un dato presente en la línea SDA es estable mientras la línea SCL está a nivel lógico alto ♦ Data Format: La transmisión de datos a través de este bus consta de 8 bits de datos. A continuación se muestra un diagrama que muestran las condiciones de START y STOP en modo gráfico: Figura 7. ♦ Bus desocupado: Estado en el cual ambas líneas (SDA y SCL) están inactivas. Unicamente en este momento es cuando un dispositivo maestro puede comenzar a hacer uso del bus. BUS I2C SCL.54 - . Condiciones de START y STOP.BRAZO DE ROBOT ANEXO 2.

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

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

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

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

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

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

BRAZO DE ROBOT ANEXO 3. Este es un método para ordenar un vector. Método de la burbuja. Anexo 3.16. . Método de la burbuja. desplazando hacia la última posición el dato mayor o menor. 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. según si la clasificación es ascendente o descendente.3. Consiste en ir comparando parejas contiguas de datos. METODO DE LA BURBUJA 7. En este caso se ordena de forma ascendente un vector de 3 posiciones.

2. PCB 7.2.4. Placa de circuito impreso. Vista Bottom . Esquema 7.1. Anexo 4.4. CD-ROM 7.1. Vista Top 7. Vista de Componentes 7.3.4.BRAZO DE ROBOT ANEXO 7.2.4. 7.4.2.4.2.

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

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

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

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

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

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

18.17.69 - . Interficie de programación. Cálculo del número de pasos que debe esperar cada servo. . ANEXO 2. 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.BRAZO DE ROBOT Organigrama 7.

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

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

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

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

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

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

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

77 - . Rutina principal del brazo de robot. .19.BRAZO DE ROBOT ANEXO 2. 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.

78 - .20. 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. . Rutina grabar memoria.BRAZO DE ROBOT ANEXO 2.

BUS I2C RUTINA LEER MEMORIA: Rutina Leer Memoria Leer en EEPROM: Posición servo1 y nº de pasos1 Posición servo2 y nº de pasos2 Posición servo3 y nº de pasos3 Incrementar número de movimiento actual 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.

22. . Atención de interrupción.BRAZO DE ROBOT ANEXO 2.1 Fin RSI Organigrama 7. genera PWM para los servos. 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 .80 - .

Grado al que debe ir el servo 1. con intervalo de 5 mS. . . .81 - . . . El duty-cycle sera una interrupcion provocada por TMR1. después de restar 30h ASCI I. .Necesario en el Delay de 4.Nº de pasos de espera para servo 1.servo para repetir cada grado. .serie. .Los 3 servos incrementan y decrementan grados según una tabla.debe ir cada servo.INC" .interrupcion provocada por el TMR0. en cada INT. que se necesitara una variable contador que cada 4 veces que se produzca una TMR0 . de aproximadamente 1 .Grado al que debe ir el servo 3. estas acciones son: Controlar servos.Nº de servo para actuar el PWM.Paso actual en el que se encuentra cada .Centena leída de RS-232. .Tarea a realizar. . El resto del periodo será una . desde el programa hecho en VB para tal tarea. BUS I2C LISTADO DEL PROGRAMA GRABADO EN EL PIC 16F873 .interrupción actuará sobre cada servo. .Idem para servo 2 y 3. .Tipo de procesador. . .BRAZO DE ROBOT ANEXO 2. para .servos.para para que no se afecte el PWM de los demás servos.Grado para leer tabla.Programa para realizar las siguientes operaciones pertenecientes al brazo de robot con 3 .Grado al que debe ir el servo 2.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 .sincronizar con los servos.Variables para saber el grado destino al que . por lo . El TMR0 provoca interrupcion cada 5 milisegundos.al ejecutar el servicio de interrupción.7mS . grabar y leer la EEPROM I2C.Leido de RCREG. .Unidad leída de RS-232. . borrar. LIST P=16F873 . INCLUDE "P16F873. .Para guardar el Counter program y registro W.Mira si se puede sumar pasos o grados.Además se le pasaran las posiciones a la que debe ir cada servo desde el PC. . por el puerto .grado.Obtiene la cifra real. Dejando así tiempo de sobra . . .Decena leída de RS-232.

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 -

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

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

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

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

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

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

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

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

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

w MOVWF Pasos_Servo MOVF Pas_act_Servo2.94 - .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.C GOTO I NCREMENTAR GOTO Fin_Modo_Autonomo .w MOVWF Pas_act_Servo MOVF GRADOS_SERVO.w MOVWF Pas_act_Servo GOTO Calculo_Servo MOVF GRADOS_SERVO2.Z MOVF Pasos_Servo.w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO1.antes de incrementar un grado GOTO INCREMENTAR_GRADO INCF Pas_act_Servo.w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO2.w MOVWF Pas_act_Servo GOTO Calculo_Servo MOVF GRADOS_SERVO3.GRADOS_SERVO<GRADOS_DESTINO SUBWF GRADOS_SERVO.w BTFSS STATUS.w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO3.Caso que sean iguales BCF STATUS.w .w .que ha dado es el que hay que dar BTFSC STATUS.w BTFSS STATUS.w MOVWF GR_DEST_SERVO MOVF Pasos_Servo3.w MOVWF GR_DEST_SERVO MOVF Pasos_Servo1.w .GRADOS_SERVO>GRADOS_DESTINO SUBWF GR_DEST_SERVO.f GOTO Guardar_Servo GRADOS_SERVO.Comprueba si el numero de pasos SUBWF Pas_act_Servo.C GOTO DECREMENTAR BCF STATUS.C MOVF GR_DEST_SERVO.w MOVWF Pasos_Servo MOVF Pas_act_Servo1.w MOVWF GR_DEST_SERVO MOVF Pasos_Servo2.BRAZO DE ROBOT ANEXO 2.f .w .w MOVWF Pasos_Servo MOVF Pas_act_Servo3.Z .

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

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

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

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

*********** 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 .RSEN $-1 STATUS.Z Retardo_1.252 I2C_ENVIAR RESTART b' 10100001' I2C_ENVIAR I2C_LEER kk I2C_MAN_NO_ACK STOP BCF PCLATH.RP1 SSPCON2.lineas I2C Retardo_1 0xFF Retardo_2 STATUS.RSEN SSPCON2.RP0 STATUS.SSPIF STATUS.f Delay_2 STATUS.SEN $-1 STATUS.RP0 .f Delay_1 PIR1.RP0 PIR1.2 RETURN .BRAZO DE ROBOT ANEXO 2.SEN SSPCON2. BUS I2C CALL I2C_ENVIAR MOVLW .RP1 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 .10 START RESTART .Retardo que necesita estar como minimo a nivel 0.RP0 STATUS.Z Retardo_2.99 - .Graba Total_Mov = 0 CALL STOP MOVLW . las .0 CALL I2C_ENVIAR .SSPIF STATUS.

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

ACKSTAT $-5 STATUS.siguiente posicion BCF MOVF SUBWF BTFSC GOTO GOTO STATUS.w STATUS.RP0 SSPCON2.ACKSTAT STATUS.0 Leer_Memoria PCLATH.f Delay_I2C START b' 10100000' I2C_ENVIAR WORD_ADDRESS.w .w GRADOS_SERVO2.RP0 START $+2 RESTART b' 10100000' I2C_ENVIAR STATUS.BRAZO DE ROBOT ANEXO 2.f WORD_ADDRESS. BUS I2C ORG Fin_Modo_Auton 0x500 .w GRADOS_SERVO3.w STATUS.RP0 PCLATH.Z SEGUIR_LEER_3 Fin_Modo_Aut_1 PCLATH.w STATUS.Z SEGUIR_LEER_1 Fin_Modo_Aut_1 STATUS.RP0 STATUS.Comparar si todos los servos estan en su destino.101 - .w GRADOS_SERVO1.0 WORD_ADDRESS.Z GR_DEST_SERVO3.Z SEGUIR_LEER_2 Fin_Modo_Aut_1 STATUS.0 PCLATH. si es asi leer .Z GR_DEST_SERVO2.RP1 SSPCON2.Z GR_DEST_SERVO1.f 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.

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.f PCLATH.f WORD_ADDRESS.f WORD_ADDRESS.1 ANEXO 2. BUS I2C .

Sign up to vote on this title
UsefulNot useful