construir un robot con pic
-
Upload
israel-quispe-zarate -
Category
Documents
-
view
4.413 -
download
0
Transcript of construir un robot con pic
BRAZO DE ROBOT INDICE
iÍNDICE
1. INTRODUCCIÓN ................................................................................................... 4
1.1. ANTECEDENTES ............................................................................................ 4
1.2. OBJETIVOS ..................................................................................................... 4
1.3. ESPECIFICACIONES ...................................................................................... 5
1.4. HERRAMIENTAS DE DESARROLLO ............................................................. 5
2. MEMORIA TÉCNICA ............................................................................................. 7
2.1. ESTUDIO DE VIABILIDAD .... ......................................................................... 7
2.2. BRAZO ROBOT ............................................................................................... 8
2.2.1. ESPECIFICACIONES ............................................................................... 9
2.2.2. CARACTERÍSTICAS ESTRUCTURALES ................................................ 9
2.2.3. CAMPO DE TRABAJO Y DIMENSIONES ................................................ 10
2.2.4. CARACTERISTICAS DE LA UNIDAD DE CONTROL .............................. 11
2.2.5. MODOS DE FUNCIONAMIENTO ............................................................. 12
2.2.6. ALIMENTACIÓN ....................................................................................... 12
2.2.7. ANÁLISIS Y PUESTA EN MARCHA ........................................................ 13
2.2.8. TAREAS REALIZABLES Y APLICACIONES ........................................... 13
2.3. SERVOS ......................................................................................................... 14
2.3.1. ¿POR QUÉ SERVOS? ............................................................................ 14
2.3.2. CARACTERÍSTICAS TÉCNICAS ............................................................. 16
2.3.3. ¿CÓMO ES UN SERVO MECÁNICAMENTE? ...................................... ..16
2.3.4. FUNCIONAMIENTO ................................................................................. 17
2.3.5. CONEXIONADO ....................................................................................... 18
2.4. CEREBRO ....................................................................................................... 18
2.4.1. ELECTRONICA DE CONTROL ................................................................ 18
2.4.1.1. CONCEPTO DE MICROCONTROLADOR ........................................ 18
2.4.1.2. APLICACIONES DE LOS MICROCONTROLADORES ................... . 20
2.4.1.3. ALTERNATIVAS DE DISEÑO ........................................................... 21
2.4.1.4. PIC 16F873 ....................................................................................... 22
2.4.1.5. CRISTAL DE CUARZO ...................................................................... 23
2.4.1.6. MAX 232 ............................................................................................. 25
2.4.1.7. EEPROM ............................................................................................ 26
BRAZO DE ROBOT INDICE
- 2 -
2.4.2. SOFTWARE DE CONTROL ..................................................................... 29
2.4.2.1. PWM PARA LOS SERVOS ................................................................ 29
2.4.2.2. MOVIMIENTO LINEAL ....................................................................... 31
2.4.2.3. TRAMA DE COMUNICACIÓN RS-232 .............................................. 32
2.5. ELECCION DE LA BATERIA ........................................................................... 33
2.5.1. EFECTO MEMORIA .................................................................................. 33
2.5.2. TIPOS DE BATERIAS RECARGABLES ................................................... 33
2.5.3. AUTONOMIA ............................................................................................. 34
2.5.4. ¿QUÉ HACER CON LAS BATERIAS USADAS? ...................................... 37
3. INSTALACION DEL SOFTWARE .......................................................................... 38
3.1. REQUERIMIENTOS ........................................................................................ 38
3.2. INSTALACION ................................................................................................. 38
4. CONCLUSIONES ................................................................................................... 39
5. PRESUPUESTO ..................................................................................................... 40
6. BIBLIOGRAFÍA ...................................................................................................... 43
7. ANEXOS ................................................................................................................. 44
7.1. ANEXO 1. COMUNICACIÓN RS-232 .............................................................. 44
7.1.1. FUNCIONAMIENTO DEL INTERFACE RS-232 ....................................... 44
7.1.2. COMUNICACIÓN RS-232 CON VISUAL BASIC ...................................... 47
7.1.3. COMUNICACIÓN RS-232 CON PIC 16F873 ........................................... 47
7.1.4. CONEXIONADO ....................................................................................... 49
7.2. ANEXO 2. BUS I2C ......................................................................................... 51
7.2.1. DESCRIPCIÓN Y FUNCIONAMIENTO .................................................... 51
7.2.2. PROTOCOLO ........................................................................................... 54
7.2.3. APLICACIONES ....................................................................................... 55
7.2.4. PIC 16F873 .............................................................................................. 55
7.2.5. EEPROM .................................................................................................. 56
7.2.5.1. DIRECCIONAMIENTO DE LA MEMORIA ......................................... 56
7.2.5.2. BYTE WRITE ..................................................................................... 57
BRAZO DE ROBOT INDICE
- 3 -
7.2.5.3. PAGE WRITE .................................................................................... 58
7.2.5.4. CURRENT ADDRESS READ ............................................................ 58
7.2.5.5. RANDOM READ ................................................................................ 59
7.2.5.6. SEQUENTIAL READ ......................................................................... 59
7.3. ANEXO 4. METODO DE LA BURBUJA .......................................................... 60
7.4. ANEXO 5. PLACA DE CIRCUITO IMPRESO ................................................. 61
7.4.1. ESQUEMA ................................................................................................ 62
7.4.2. PCB ........................................................................................................... 63
7.5. ANEXO 6. LISTADO DE PROGRAMA Y ORGANIGRAMAS ......................... 66
7.6. ANEXO 7. DATA SHEET´S ............................................................................102
7.7. ANEXO 8. CD-ROM .......................................................................................103
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
- 5 -
1.3. Especificaciones
La implementación del brazo robot se ha dividido en tres partes o módulos:
1) Hardware: Esta parte del proyecto consiste en el diseño y desarrollo físico
de la placa de circuito impreso que contendrá toda la electrónica del brazo
robot.
2) Software: Es la parte donde se desarrolla por un lado, el programa que irá
grabado en el Pic controlando el brazo robot y por otro lado el programa
que se ejecutará en el PC para poder decidir la secuéncia que ejecutará el
robot.
3) Mecánica: Aquí es donde se construirá toda la estructura mecánica del
robot, es decir, todas las articulaciones del brazo con su correspondientes
motores actuadores.
1.4. Herramientas de desarrollo Para desarrollar las diferentes partes que corresponden al brazo robot, se han
utilizado una serie de herramientas de trabajo. El motivo de utilizar estas herramientas
se explica a continuación:
♦ MPLAB: Es una herramienta que se utiliza para el desarrollo de aplicaciones
BRAZO DE ROBOT INTRODUCCION
- 6 -
con microcontrolador. Esta herramienta permite la creación y simulación del
código que posteriormente se ejecutará dentro de un microcontrolador. Este
entorno, funciona tipo container, es decir, sus distintas opciones son asociadas a
programas que serán ejecutados cuando se las pulse. De este modo bastará con
definirle un ensamblador, un emulador o un grabador distinto a los que lleva por
defecto para incorporarlo inmediatamente. El hecho de haber utilizado el MPLAB
es la disponibilidad de adquisición, podiéndose bajar directamente a través de
www.microchip.com.
♦ Visual Basic: Los sistemas operativos encargados de gestionar los
primeros ordenadores estaban basados en texto y eran gobernados mediante
complejas líneas de comandos.
Actualmente manejar un ordenador es algo sumamente sencillo gracias a
los entornos gráficos, que de una forma muy intuitiva representan los distintos
elementos con los que es posible trabajar.
La aparición de Windows no simplificó las cosas al programador. La única
forma de escribir una aplicación para Windows, pasaba por conocer de forma
exhaustiva el extenso conjunto de funciones de Windows.
La aparición de Visual Basic supuso un giro total, no es necesario conocer el
interior de Windows ni ninguna de sus funciones, bastando con diseñar la
interfaz de una forma muy intuitiva, principalmente con operaciones de ratón y
escribir algo de código, utilizando un lenguaje tan fácil como es el Basic.
♦ Ranger: Este es un entorno gráfico para el diseño de las placas de circuito
impreso. Primeramente se debe dibujar el esquema teórico y una vez se
han subsanado todos los errores que se hayan podido producir se pasa a
colocar los encapsulados de los componentes en el lugar dentro de la placa
que posteriormente se fabricará.
El hecho de haber utilizado Ranger para el desarrollo de la placa, se
debe a que es el software que está instalado en la escuela para tal fin.
♦ Programador de pic´s y emulador: Para grabar el código en el Pic, es
necesario haberlo escrito y depurado con anterioridad. Una vez se ha visto
que el código realiza realmente las tareas para las que se ha escrito, es
necesario grabarlo en el microcontrolador o en una EEPROM externa,
según cada aplicación. Para grabar código en el pic se ha utilizado “Micro
BRAZO DE ROBOT INTRODUCCION
- 7 -
Pic Trainer”, se pueden ver sus características en
www.microcontroladores.es.
BRAZO DE ROBOT MEMORIA TECNICA
2. Memoria Técnica
2.1. Estudio de viabilidad
Después de analizar detenidamente la idea original, observé que me enfrentaba a
varías circunstancias que debía decidir, antes de ponerme a trabajar en el brazo de
robot. Estas decisiones debían ser muy precisas, ya que de ellas dependería mi
trabajo posterior.
Uno de los factores más críticos era la parte mecánica. Estudiando la mecánica vi
que necesitaba poder mover varias articulaciones y definir que actuador iba a utilizar.
Me decidí por unos motores con engranajes para multiplicar el par del eje, denominado
“servos”.
Otra dificultad era el peso, debía utilizar un material lo más ligero que pudiese
encontrar y que a la vez me proporcionara la robustez mecánica.
Debía conseguir también una manera de disminuir en lo posible cargar
excesivamente peso sobre el motor instalado en la base, para ello tuve que buscar un
cojinete que aguantara todo el peso, mientras que el motor solo acompañaba el giro.
Para la parte electrónica de control, tuve que buscar un microcontrolador acorde
con las características que necesitaba.
BRAZO DE ROBOT MEMORIA TECNICA
- 9 -
2.2. Brazo robot
En este apartado realizaremos un estudio de las características físicas, eléctricas,
mecánicas y funcionales del brazo robot y del controlador.
BRAZO DE ROBOT MEMORIA TECNICA
- 10 -
2.2.1. Especificaciones
En la siguiente tabla se desglosan las características físicas del brazo robot
que hemos construido en este proyecto:
BRAZO ROBOT
Estructura mecánica: Articulado
Número de ejes: 3
Radio máximo de operación: 160 mm
Mano: 20 mm
Movimiento de los ejes:
Eje 1: base:
Eje 2: hombro:
Eje 3: codo:
Rango Velocidad máxima
0º -- 180º 36º/seg.
0º -- 180º 36º/seg.
0º -- 180º 36º/seg.
Referencia (sincronismo): Posición fija en todos los ejes en 0º
Exactitud: +/- 1º
Actuadores: 3 servos controlados con PWM
Consumo máximo: 300 mA
Alimentación: Batería NiMH, 4´8 V y 650 mAh
Capacidad de carga: 75 g. (Carga útil)
Peso: 1 Kg
Rango de temperatura: 0ºC – 85ºC
Tabla 2.2. Características técnicas del brazo robot.
2.2.2. Características estructurales
El brazo robot construido para este proyecto, es un robot de estructura articulada.
Está compuesto por 3 ejes de movimiento: la base que gira el brazo en el plano
horizontal, el hombro y el codo que varían la inclinación correspondiente al plano
vertical.
La muñeca y mano son fijas, es decir, sin movimiento alguno, aunque tampoco es
necesario, ya que el brazo se utiliza para desplazar objetos de un lugar a otro con la
ayuda de algún soporte, es un robot transportador de objetos.
Como consecuencia tendrá 3 grados de libertad. Esto permitirá alcanzar posiciones
y orientaciones pertenecientes a un amplio campo de trabajo.
BRAZO DE ROBOT MEMORIA TECNICA
- 11 -
Eje nº Nombre Movimiento Motor nº
1 Base Gira el cuerpo 1
2 Hombro Eleva y baja el brazo superior 2
3 Codo Eleva y baja el antebrazo 3
Tabla 2.3. Elementos que forman el sistema.
Los motores utilizados en este robot son los que se denominan “servos” y se
explican en detalle en el punto en el punto 2.3.
2.2.3. Campo de trabajo y dimensiones
La longitud de los elementos y los grados de rotación de las articulaciones
determinan el campo de trabajo del robot. En las siguientes figuras se muestra las
dimensiones del brazo de robot y su campo de trabajo:
Dimensiones:
Figura 2.4. Dimensiones del brazo de robot.
CONTROL
130
30
40
40
80 80 20
Eje 1
Eje 3
Eje 2
BRAZO DE ROBOT MEMORIA TECNICA
- 12 -
Campo de trabajo:
Figura 2.5. Campo de trabajo del brazo de robot.
2.2.4. Características y funciones de la unidad de control
Las funciones del controlador son gestionar que el brazo de robot realice todas las
funciones para las que fue construido, es decir:
♦ Ejecutar infinitamente la secuencia grabada en la EEPROM1, lo que se ha
denominado “Modo autónomo de funcionamiento”.
♦ Ser capaz de grabar en la EEPROM la secuencia deseada desde el
interfície de programación creado, utilizando el protocolo de comunicación
RS-2322.
1 Memoria de solo lectura programable electricamente. 2 Ver anexo 1.
BRAZO DE ROBOT MEMORIA TECNICA
- 13 -
♦ Borrar la EEPROM, para poder grabar una nueva secuencia de
movimientos, cuando se le dé la orden desde el interfície de programación.
♦ Controlar que todas las articulaciones se muevan correctamente a la
posición indicada.
Para conseguir que el brazo de robot pueda realizar con éxito todas las funciones
para las que la unidad de control se ha implementado, esta dispone de:
♦ Una unidad central de proceso, PIC 16F873.
♦ EEPROM de 2K para guardar la secuencia que tendrá que ejecutar.
♦ Componentes para la comunicación, que posibilitan la transmisión y
recepción de la información según el estándar RS-232.
♦ Batería de alimentación.
2.2.5. Modos de funcionamiento
El robot dispone de dos modos de funcionamiento:
1) Modo autónomo: El brazo mecánico del robot, ejecuta indefinidamente,
la secuencia grabada en la memoria con anterioridad.
2) Modo programación: Si la lógica de control está en este estado, se
graba una secuencia de ejecución en la memoria con ayuda de un ordenador
personal o portátil.
2.2.6. Alimentación
La alimentación de la lógica de control y los motores de cada articulación, se realiza
con una batería que tiene unas características de tensión e intensidad: 4´8 V y 650
mAh. Con esta batería se consigue una autonomía de 3´5 horas, en modo de
funcionamiento autónomo y transportando el peso máximo de carga útil.
BRAZO DE ROBOT MEMORIA TECNICA
- 14 -
2.2.7. Análisis y puesta en marcha
La instalación y manejo del robot está sujeta a una serie de normas de seguridad.
Estas normas hacen referencia a peligros de tipo eléctrico, a colisiones del robot con
objetos próximos a él e incluso a la colisión con personas que permanezcan cerca del
campo de acción.
Existen una serie de requisitos previos que afectan al modo en que se va a utilizar
el robot antes de su propia instalación. Estos requisitos tienen que cumplirse en la
medida de lo posible, si se quiere que la utilización del robot sea lo más provechosa y
segura posible. Tales factores hacen referencia al estudio previo de las tareas que se
quiere automatizar.
2.2.8. Tareas realizables y aplicaciones
El robot construido tiene fines educativos principalmente, debido a sus
dimensiones, rango de articulaciones, precisión en los movimientos y peso que puede
desplazar.
Las tareas más adecuadas son las que no requieran demasiada precisión, ya que
no permite definir diferentes precisiones en función del movimiento, ya que siempre
trabaja con la misma de 1 grado.
Este robot también se podría utilizar como reclamo publicitario, en el escaparate de
alguna tienda, por ejemplo, en una tienda de informática en continuo funcionamiento,
cambiando de sitio un disco CD y efectuando un saludo, repitiendo el ciclo
indefinidamente.
BRAZO DE ROBOT MEMORIA TECNICA
- 15 -
2.3. Servos
Como ya se ha comentado con anterioridad, el tipo de motores que se utilizan
son los denominados “servos” que a continuación se explican con detalle.
El servo es un potente dispositivo que dispone en su interior de un pequeño
motor con un reductor de velocidad y
multiplicador de fuerza. Dispone también de
un circuito que gobierna el sistema. El
recorrido del eje de salida es de 180º en la
mayoría de ellos, pero puede ser fácilmente
modificado para tener un recorrido libre de
360º.
Fotografía 2.6. Fotografía de un servo.
2.3.1. ¿Por qué servos?
El brazo de robot está pensado para poder desplazar un peso máximo de 75
gramos.
También sabemos que el motor que necesitará tener más par de giro, será el de la
base, que tiene que poder llevar, además de la carga útil, toda la estructura del brazo,
al contrario que los otros, que solo han de actuar sobre una parte de la estructura.
Se ha definido que la palanca del brazo será de 18 cm, y el peso de la estructura de
aproximadamente 200 gramos, distribuidos como muestra la figura siguiente.
Figura 2.7. Centros de gravedad de las articulaciones y carga del brazo.
MOTOR Hombro
50 gramos
ARTICULACION 150 gramos MOTOR Codo
50 gramos
ARTICULACION 250 gramos
CARGA UTIL75 gramos
4 cm 4 cm 4 cm 5 cm
BRAZO DE ROBOT MEMORIA TECNICA
- 16 -
La figura muestra las distribuciones del centro de gravedad de la estructura
mecánica y de la carga útil, para poder realizar el cálculo del par que el motor de base,
que es el que más fuerza tiene que realizar, puesto que es el que debe actuar sobre
todo el brazo y su carga. Vemos que cada articulación pesa 50 gramos, así como los
motores.
Si miramos las características del servo cuando está alimentado con la tensión más
baja de funcionamiento, vemos que a 4´8 V puede dar 3´3 Kg*cm.
En los cálculos realizados anteriormente de la estructura y la carga útil, se ve que el
motor necesita un par mínimo de 2´475 Kg*cm. Así se ve que el motor podrá con el
peso que tiene que llevar, con un coeficiente de seguridad de:
� �×=4
1
)( palancalongitudpesobasemotorPar
cmgcmgcmgcmgcmgbasemotorPar ×=×+×+×+×= 475.217751250850450
331́*4752́
*33́===
cmKgcmKg
necesarioParmotordelPar
seguridaddeeCoeficient
BRAZO DE ROBOT MEMORIA TECNICA
- 17 -
Características técnicas
En la siguiente tabla pueden observarse las características que posee un servo de
la marca Hitec, concretamente “HS-325BB” que es el utilizado en este brazo de robot:
Hitec HS-325BB
Tensión de alimentación: 4´8 V – 6 V
Par a 6 V: 3´7 Kg / cm
Par a 4´8 V: 3´3 Kg / cm
Velocidad máxima: 60º /seg
Medidas (longitud x anchura x altura): 41 x 20 x 37 mm
Peso: 44´5 gramos
Tipo de rodamiento: Bolas
Tabla 2.8. Características técnicas del servo utilizado.
2.3.2. ¿Cómo es un servo mecánicamente?
A continuación se muestra la fotografía de un servo desmontado en la que
se puede apreciar los distintos dispositivos de los que está compuesto. Estos
son:
♦ Carcasa exterior.
♦ Engranajes reductores.
♦ Motor eléctrico.
♦ Potenciómetro solidario al
eje.
♦ Control electrónico de
control.
Fotografía 2.9. Servo desmontado.
BRAZO DE ROBOT MEMORIA TECNICA
- 18 -
2.3.3. Funcionamiento
El control de posición lo efectúa el servo internamente mediante un
potenciómetro que está conectado mecánicamente al eje de salida y controla
una señal PWM1
interna. Mediante un
sistema diferencial,
se compara la señal
PWM interna con
otra señal PWM que
le llega desde el
exterior. Con el
resultado obtenido en esta comparación, el control electrónico interno actúa
sobre el eje de salida hasta que los valores de las señales PWM interna y
externa se igualen, entonces el eje de salida se para en la posición indicada.
Cuando el servo llega a la posición destino deseada, el motor deja de
consumir corriente y tan solo circula una pequeña corriente hasta el circuito
interno. Si forzamos el servo, moviendo el eje de salida, el control diferencial
interno lo detecta y envía la corriente necesaria al motor para corregir la
posición. Para controlar el servo hay que aplicar un pulso de duración y
frecuencia específicas. A continuación se muestra la señal de control y como
actúa sobre el servo:
Figura 2.11. Relación entre la señal PWM y el eje de salida.
1 Pulse Width Modulate. Señal Modulada en Anchura
BRAZO DE ROBOT MEMORIA TECNICA
- 19 -
2.3.4. Conexionado
Todos los servos disponen de tres cables, dos para la alimentación Vcc y Gnd y
otro cable para aplicar el tren de pulsos de
control, con este tren de pulsos se conseguirá
que el circuito interno de control ponga el servo
en la posición indicada por la anchura de pulso.
F
F
i
Figura 2.12. Detalle del conector.
2.4. Cerebro
En este punto se trata en detalle la unidad de control y todas las funciones que
debe realizar:
2.4.1. Electrónica de control
Es el hardware necesario, para poder tener un control exacto del brazo de robot:
2.4.1.1. Concepto de microcontrolador
Un microcontrolador es un circuito integrado, con alta escala de integración y
usualmente dispone de los siguientes componentes:
♦ Unidad central de proceso.
♦ Memoria RAM para contener los datos.
♦ Memoria para programa tipo ROM/PROM/EEPROM/FLASH.
♦ Líneas de E/S para comunicarse con el exterior.
♦ Periféricos. Estos pueden ser, temporizadores, puertas serie, modulador de
anchura de pulsos entre otros.
BRAZO DE ROBOT MEMORIA TECNICA
- 20 -
♦ Generador de impulsos de reloj que sincronizan el funcionamiento del
sistema.
Figura 2.13. El microcontrolador es un sistema cerrado.
Al utilizar un microcontrolador se dispone de las siguientes ventajas:
♦ Aumento de prestaciones: Un mayor control sobre un determinado
elemento que representa una mejora considerable del mismo.
♦ Aumento de la fiabilidad: Al reemplazar un elevado número de elementos
por un microcontrolador, disminuye el riesgo de averías y se precisan
menos ajustes.
♦ Reducción del tamaño del producto acabado: La integración del
microcontrolador en un chip disminuye, el volumen, la mano de obra y los
stocks.
♦ Mayor flexibilidad: Las características de control están programadas por lo
que su modificación sólo necesita cambio en el programa de instrucciones.
Antes de seleccionar un microcontrolador es imprescindible analizar los requisitos
de la aplicación:
♦ Procesamiento de datos: Puede ser que el microcontrolador realice cálculos
críticos en un tiempo limitado.
♦ Entrada/Salida: Se tiene que identificar la cantidad y tipo de señales a
controlar.
♦ Consumo: Algunos productos que incorporan microcontroladores están
alimentados con baterías.
BRAZO DE ROBOT MEMORIA TECNICA
- 21 -
♦ Memoria: Para detectar las necesidades de memoria de la aplicación, se
tiene que separar en memoria no volátil1 y memoria volátil2.
♦ Ancho de palabra: El criterio de diseño debe ser seleccionar el
microcontrolador de menor ancho de palabra que satisfaga los
requerimientos de la aplicación.
♦ Diseño de placa: Debe tenerse en cuenta que usar un microcontrolador de
gama baja, puede implicar tener que colocar más componentes externos.
2.4.1.2. Aplicaciones de los microcontroladores
Cada vez existen más productos que incorporan un microcontrolador, por todas las
prestaciones que añaden a un diseño, algunas de estas aplicaciones se muestran en
la tabla siguiente:
Aplicaciones
Consumo Automoción Ofimática Telecomunicac. Industria
Equipo de TV
Receptor de radio
Reproductor de CD
Control remoto
Consola de juegos
Microondas
Lavadora
Aparatos de cocina
Aspiradora
Alarma antirrobo
Detector de radar
ABS
Velocímetro
Climatizador
Inyección
Airbag
Mouse
Teclado
Escáner
Impresora
Plóter
Fotocopiadora
Teléfono
Módem
Control de motores
Compresor
Termostatos
Robótica
Lector de tarjetas
Detector de humo
Tabla 2.14. Tabla de aplicaciones que requieren microcontroladores.
BRAZO DE ROBOT MEMORIA TECNICA
- 22 -
2.4.1.3. Alternativas de diseño
Se analizaron las alternativas siguientes para la implementación del brazo de robot:
♦ Alternativa 1:
Figura 2.15. Diagrama de bloques de la primera alternativa.
♦ Alternativa 2:
Figura 2.16. Diagrama de bloques de la segunda alternativa.
PC
microcontrolador 2 EEPROM
microcontrolador 1
microcontrolador 3 microcontrolador 4
Actuador Hombro Actuador CodoActuador Base
RS 232
I2C
PC
EEPROMmicrocontrolador 1
Actuador Hombro Actuador CodoActuador Base
RS 232
I2C
BRAZO DE ROBOT MEMORIA TECNICA
- 23 -
En principio la mejor alternativa es la que necesita menos microcontroladores para
su funcionamiento, es decir, la número 2, más sencilla y económica, al disponer de
menos componentes y un desarrollo software más sencillo. Pero antes de tomar la
decisión tenía que comprobar si esta implementación sería capaz de actuar sobre
cada articulación del robot, utilizando a la vez las comunicaciones RS232 e I2C1. En
los siguientes apartados se verá que era posible el diseño tanto de hardware como de
software con un solo microcontrolador.
2.4.1.4. PIC 16F873
El cerebro del brazo de robot es un microcontrolador PIC 16F873 de microchip,
las características técnicas más importantes son:
♦ Memoria Flash de programa de 4K.
♦ Memoria EEPROM de datos de 128 bytes.
♦ Memoria RAM de datos de 192 bytes.
♦ 3 contadores/temporizadores.
♦ Conversor A/D de 5 canales de entrada.
♦ 2 canales PWM.
♦ 1 canal de comunicación serie USART.
♦ 1 canal de comunicación serie para I2C.
♦ Frecuencia de trabajo máxima: 20MHz.
♦ 3 puertos de I/O.
♦ Perro guardián.
♦ Encapsulado DIP de 28 patillas.
Este es un microcontrolador de 8 bits, dispone de un repertorio de 35 instrucciones,
1 vector de interrupción, 8 niveles de pila y su arquitectura es del tipo harvard, que se
explica en el siguiente párrafo.
1 Ver anexo 2.
BRAZO DE ROBOT MEMORIA TECNICA
- 24 -
La arquitectura harvard dispone de dos memorias independientes, una contiene
sólo instrucciones y otra sólo datos. Ambas disponen de sus respectivos sistemas de
buses de acceso y es posible realizar operaciones de acceso (lectura o escritura)
simultáneamente en ambas memorias.
Figura 2.17. Arquitectura harvard.
2.4.1.5. Cristal de cuarzo
Este es un punto crítico de la aplicación, porque del cristal de cuarzo depende la
velocidad de ejecución de las instrucciones, también llamado tiempo de instrucción.
En el diseño del software que controla el brazo de robot, la parte a la que hay que
prestar más atención, es la correspondiente a la comunicación por RS-232, que se
realiza a 9.600 bits por segundo.
Cuando el pic recibe un dato completo, es decir, un bit de START, 8 bits que
corresponde al dato y un bit de STOP, pasa el dato (8 bits) a un buffer y puede seguir
recibiendo a través de RS-232. Entonces el programa tiene que asegurar que cuando
se reciba el siguiente dato completo y sé reescriba el buffer, el dato anterior ya ha sido
leído para no perder bits de la transmisión.
Para lo que se ha explicado en las líneas anteriores, se debe asegurar un cristal de
cuarzo, que actúa como reloj, suficientemente rápido para que las instrucciones que se
tienen que ejecutar entre dato y dato recibido tengan un tiempo de ejecución menor
que el tiempo de la recepción entre datos.
BRAZO DE ROBOT MEMORIA TECNICA
- 25 -
Se realizan los siguientes cálculos:
Velocidad de transmisión: 9.600 baudios1.
La recepción consta de 10 bits, START + 8 bits de datos + STOP, tenemos que el
tiempo que tarda el pic en cargar el buffer es:
Se pensó que entre cada escritura del buffer se necesitaría ejecutar 1.500
instrucciones aproximadamente, por lo tanto:
La relación entre la frecuencia del cristal de cuarzo y el tiempo de instrucción del pic
viene determinada por:
1 Se refiere a la velocidad de transmisión. Esta se realiza a 9.600 bits por segundo.
SsegundosxbitdeTiempo µ1667´104100416671́9600
1 4 === −
�= bitsdeNúmeroxbitdeTiempodisponibleTiempo
SbitsxSdisponibleTiempo µµ 667´1041101667´104 ==
�=nesinstrucciodeNúmero
disponibleTiemponinstrucciócadadeejecucióndeTiempo
SS
ninstrucciócadadeejecucióndeTiempo µµ6950́
1500667´1041 ==
MHzS
xT
cristaldeFrecuenciac
7595́46950́
14
1 =×==µ
BRAZO DE ROBOT MEMORIA TECNICA
- 26 -
Entonces se deduce que el cristal que se elija debe ser de una frecuencia de 5´759
MHz o superior, mientras más rápido sea menos tardará en ejecutar las instrucciones,
es decir, menor será el tiempo de ejecución.
El cristal elegido es de una frecuencia de 9´8340 MHz. Por lo que realizamos
nuevos cálculos:
Como:
El número de instrucciones obtenido se considera que es más que suficiente para la
recepción RS-232 sin perdida de bits.
2.4.1.6. MAX232
El MAX232 es un circuito integrado sin el cuál, no podría establecerse la
comunicación RS-232 entre el PC y el Pic 16F873. Este componente se utiliza para
poder adaptar los niveles lógicos de la línea de comunicación (anexo 1), con los que
utilizan otros circuitos integrados, TTL y CMOS, en este caso el Pic 16F873. Su
encapsulado es un DIP de 16 patillas y para utilizarlo, simplemente hay que
implementarlo tal como se muestra en la figura siguiente:
SMHz
TccristaldeFrecuencia
TcTc
cristaldeFrecuencia µ40670́83409́
444 ==�=�=
nesinstruccioS
STcdisponibleTiempo
nesinstrucciodeNúmero 256140670́
6667´1041===
µµ
BRAZO DE ROBOT MEMORIA TECNICA
- 27 -
Figura 2.18. Circuito típico de conexión del MAX232.
2.4.1.7. EEPROM
La memoria elegida para guardar la secuencia de funcionamiento del brazo de
robot, es una memoria EEPROM1 del tipo I2C (ver anexo), concretamente es la
EEPROM 24LC02. Las características de esta memoria son:
♦ Es una memoria de 2 Kbits (2.048 bits) organizada en un banco de 256
bytes. Esta conversión sale de dividir:
2.048 bits / 8 bits que tiene un byte = 256 bytes. Es decir, como en ancho
de palabra del microcontrolador es de 8 bits, puede controlar toda la
memoria en un solo banco. El cálculo es: 28 = 256 bytes.
♦ El bus se controla mediante el master2, se encarga de generar la señal de
reloj, mientras que la memoria actúa como slave.
♦ En un bus del tipo I2C se pueden controlar hasta un máximo de 8 memorias
de este tipo, según palabra de direccionamiento (ver anexo). El
direccionamiento se realiza a través de: A2, A1, A0, es decir: 23 = 8.
BRAZO DE ROBOT MEMORIA TECNICA
- 28 -
A continuación se muestra el formato de grabación de los datos utilizados dentro
de la memoria:
Figura 2.19. Formato de grabación utilizado en la EEPROM.
Con el formato de grabación descrito, se consigue grabar hasta 42 movimientos
diferentes. Cada movimiento consta de 6 bytes como puede observarse en la figura
anterior, si hacemos el cálculo siguiente vemos:
Nº Pasos 100h01h02h03h04h05h06h07h08h09h0Ah0Bh0Ch0Dh
Destino 1Nº Pasos 2Destino 2
Nº Pasos 3Destino 3
Nº Pasos 1
Nº Pasos 1
Destino 2
Destino 1Nº Pasos 2
Nº Pasos 3Destino 3
Movimiento 1
Movimiento 2
Movimiento 3
F6hF7hF8hF9hFAhFBhFChFDhFEhFFh
Movimiento 42Nº Pasos 1Destino 1
Nº Pasos 2Destino 2
Nº Pasos 3Destino 3
Total movimientosPosición actual
LibreLibre
�=movimientocadaenusadosBytesmemorialadetotalesBytes
smovimientodeNúmero
smovimientobytes
bytessmovimientodeNúmero 66´42
6256
==
BRAZO DE ROBOT MEMORIA TECNICA
- 29 -
Es decir, tenemos 42 movimientos completos y quedan 4 bytes libres en el banco:
De estos 4 bytes que libres, se utilizan 2 para los apuntadores que se necesitan
para realizar correctamente las operaciones de lectura y escritura.
Un byte, dirección “FCh” guarda el número total de movimientos que tiene la
secuencia y puede variar desde 0 hasta 42. Si el número grabado es 0, el robot no
ejecutará movimiento alguno.
El segundo byte es decir, el de la dirección “FDh”, apunta donde debe seguir con la
lectura o escritura.
Cuando se realiza una operación de borrado, lo que se hace, es poner el número
total de movimientos y la posición actual a 0. Entonces todas las posiciones para
grabar movimientos sé reescribiran desde la posición “00h” cuando se realice la
operación de grabación.
Para grabar, lo que se hace es ir escribiendo los movimientos en el punto de
memoria que va indicando posición actual, que con cada movimiento que se graba
aumenta de valor 6 unidades (6 bytes consta el movimiento) como se explicó
anteriormente.
Cuando se tiene que leer, lo que se hace es ir leyendo donde indica la posición
actual, se leen 6 bytes cada vez (1 movimiento), se va leyendo así hasta que se llega
a igualar el número total de movimientos, instante en el que el puntero, “posición
actual” se reinicia a “0” y vuelve a leer desde la posición de memoria “00h”.
�×= movimientoporBytessmovimientodeNúmerosmovimientoguardarparausadosBytes
�−= smovimientodeBytestotalesBytesmemoriadebancoelenlibresBytes
bancoelenlibresBytesBytesBytesmemoriadebancoelenlibresBytes 4252256 =−=
BytessmovimientoguardarparausadosBytes 252642 =×=
BRAZO DE ROBOT MEMORIA TECNICA
- 30 -
2.4.2. Software de control
Aquí se muestra la programación de las tareas más críticas de los programas:
2.4.2.1. PWM para los servos
En este punto se va a tratar, como se generan las señales de control para los
servos. Para controlar los servos se necesita además de las tensiones de alimentación
y GND, la señal PWM tal como se explicó en el punto 2.3.3.
La señal PWM para controlar los servos, tiene un periodo de 20 mS y un tiempo en
estado lógico “1” que varía desde 0´9 mS hasta 2´1 mS, posición de 0º y 180º
respectivamente.
El microcontrolador Pic 16F873, dispone de varias fuentes de interrupción, pero las
que se utilizan para generar la señal PWM son dos, provocadas por dos
temporizadores configurados para esta finalidad.
La señal PWM se genera a través de pines de entrada/salida generales
configurados como salida, correspondiendo cada pin de salida a un servo, por eso se
utilizan temporizadores que provocan interrupción, para tener un control exacto del
tiempo.
Al provocarse la interrupción, el microcontrolador finaliza la instrucción que se está
ejecutando y atiende la rutina de interrupción, que en este caso solo se ha programado
para actuar sobre las señales PWM de los servos.
Una característica primordial que se debe tener en cuenta al generar la señal PWM
es, que la señal de cada servo no puede interferir con la de otros, ya que si se está
atendiendo una interrupción y se provoca otra, esta última no se atenderá, estando los
tiempos de la señal PWM desajustados y actuando el servo de manera incontrolada.
Para evitar interferencias entre señales utilizamos una variable que tendrá 4
posibles valores, es decir, se decrementará desde 3 hasta 0, al llegar a 0 se vuelve a
inicializar con el valor 3.
Se configura un temporizador para provocar una interrupción cada 5 mS. En el
servicio de atención de interrupción, se mira el valor que tiene la variable en ese
momento, actuando sobre el pin de salida correspondiente y por lo tanto sobre el
servo. Como la variable puede tener 4 valores diferentes, se obtiene el periodo de la
señal PWM de control, es decir, 20 mS.
Cuando se atiende esta primera interrupción denominada INT1, el programa decide
sobre que servo tiene que actuar, a continuación lee la posición a la que debe ir ese
BRAZO DE ROBOT MEMORIA TECNICA
- 31 -
servo, esta posición leída estará comprendida entre 0º y 180º que es el recorrido que
tiene el servo, se lee una tabla con esa posición, que carga un valor en un registro
especial de la segunda interrupción, con este valor se conseguirá que según la
posición, el tiempo de la segunda interrupción denominada INT2, provocada por el otro
temporizador, varíe desde 0´9 mS hasta 2´1 mS según la posición a la que tiene que ir
el servo, y que recordemos que es 0º hasta 180º respectivamente.
Se muestra a continuación una tabla en la que se observa lo explicado en los
párrafos anteriores:
Valor variable INT1 INT2 Servo Nivel lógico pin
3 Si No Base “1”
3 No Si Base “0”
2 Si No Hombro “1”
2 No Si Hombro “0”
1 Si No Codo “1”
1 No Si Codo “0”
0 Si No XXX XXX
0 No XXX XXX XXX
Tabla 2.20. Temporización de interrupciones y articulaciones.
Ahora se podrá observar un ejemplo de la constitución de estas señales en modo
gráfico:
Figura 2.21. Señal PWM para cada servo.
0 5 10 15 20 ms
PW MServos
Servo 1
Servo 2
Servo 3
INT 1
INT 2
INT 1
INT 2
INT 1
INT 2
BRAZO DE ROBOT MEMORIA TECNICA
- 32 -
En la figura se pueden ver las señales de cada servo. En el servo 1 se aprecia una
señal con nivel lógico “1” de 0´9 mS, es decir, el servo está en la posición 0º. En el
servo 2 tenemos un nivel lógico “1” de duración 1´5 mS, el servo 2 está en posición
90º y en el servo número 3 tenemos 2´1 mS que corresponde a la posición de 180º,
según la figura 2.11.
2.4.2.2. Movimiento lineal
El movimiento lineal se produce cuando el servo que actúa de motor en cada
articulación es capaz de variar su velocidad en función del desplazamiento que deben
realizar los otros. Para conseguirlo hay que esperar un número de veces antes de
incrementar o decrementar un grado, a este número de veces, se ha llamado pasos.
A continuación se muestra lo descrito con un ejemplo:
Articulación Desplazamiento Número de pasos
Base 180º 1
Hombro 90º 2
Codo 45º 4
Tabla 2.22. Ejemplo de movimiento lineal.
Según el ejemplo se puede ver que el más rápido es el de mayor recorrido, por lo
tanto, tendrá el tiempo de espera entre grados más pequeño, en este caso
corresponde a la articulación de la base.
El número de pasos lo calcula el interfície de programación.
Para realizar este cálculo, se ordena el recorrido de cada articulación de menor a
mayor, con el método de la burbuja, que consiste en comparar pares de elementos
adyacentes e intercambiarlos en caso que no estén en el orden correcto. Después se
divide el desplazamiento del servo de mayor recorrido entre el desplazamiento de
todos los servos.
Siguiendo con el ejemplo:
Articulación División Nº de pasos obtenidos
Base Desplazam. Base / Desplazam. Base 1
Hombro Desplazam. Base / Desplazam. Hombro 2
Codo Desplazam. Base / Desplazam. Codo 4
Tabla 2.23. Cálculo del número de pasos en el movimiento lineal.
BRAZO DE ROBOT MEMORIA TECNICA
- 33 -
2.4.2.3. Trama de comunicación RS-232
El modo de comunicación entre el emisor y el receptor es mediante el protocolo RS-
232 y cada dato que se envía se componen de:
♦ 1 bit de START.
♦ 8 bits de datos.
♦ 1 bit de STOP.
♦ Ninguno de paridad.
El PC por el puerto serie, si el brazo de robot esta en modo programación, envía
tramas que son recogidas por el Pic.
El formato de trama enviado es:
Figura 2.24. Trama de comunicación RS-232.
El significado es el siguiente:
♦ Sincronismo: Son tres bytes que se han de enviar al inicio de cada trama
para sincronizar el emisor y el receptor. Se envía el valor decimal “255”.
♦ Tarea: Consta de un byte, con el cuál el cerebro del brazo de robot, sabe
que función debe realizar y a continuación se detalla:
� Tarea = 0: Aplicar el destino a los servos.
� Tarea = 1: Grabar coordenada en la EEPROM.
� Tarea = 2: Borrar memoria.
� Tarea = 3: Reset. Inicializa servos a posición 0º y borra la memoria.
♦ Nº de pasos 1: Son tres bytes, centena, decena y unidad y corresponde al
tiempo que debe esperar el servo 1 en incrementar o decrementar cada
grado para conseguir el movimiento lineal.
♦ Destino 1: Es el destino al que debe ir el servo 1. Consta de 3 bytes,
centena, decena y unidad.
♦ Los otros números de pasos y destino, son iguales que los dos anteriores
pero correspondientes al servo 2 y 3 respectivamente.
La trama total consta de 22 bytes de datos, además de los correspondientes bits de
control.
Sincronismo T area Nº pasos 1 Destino 1 Nº pasos 2 Destino 2 Nº pasos 3 Destino 3
BRAZO DE ROBOT MEMORIA TECNICA
- 34 -
2.5. Elección de la batería
Una parte muy importante del proyecto es la alimentación, sin ella no es posible que
el brazo de robot funcione de manera alguna, por esto hay que tener cuidado a la hora
de elegir el modo de alimentación. Lo que está claro es que la mejor forma de
alimentación, es con una batería recargable. Con este tipo de batería podemos tener
el brazo de robot disponible para colocarlo en una plataforma móvil y además
respetamos el medio ambiente al no desechar tantas baterías no recargables.
2.5.1. Efecto memoria
El efecto memoria se produce en algunos tipos de baterías, especialmente en las
de níquel-cadmio y ocurre al recargar una batería que no se ha agotado
suficientemente. Si una batería se ha descargado hasta el 20% de su capacidad de
recarga, su capacidad se reducirá hasta el 80% del valor inicial. Esto se debe a que si
se recarga antes de que se haya descargado en su totalidad, los cristales de níquel y
cadmio se acumulan y crecen, lo que termina por romper el separador aislante y
producir altos niveles de autodescarga o un cortocircuito.
2.5.2. Tipos de baterías recargables
Existen muchos tipos de baterías recargables, las más interesantes son:
♦ Baterías de plomo (Pb): Normalmente utilizadas en automóviles, sus
elementos constitutivos son pilas individualmente formadas por un ánodo
de plomo, un cátodo de óxido de plomo y ácido sulfúrico como medio
electrolítico.
♦ Baterías de níquel-cadmio (Ni-Cd): Constan de dos polos que se
encuentran en el mismo recipiente, un polo positivo con hidróxido de níquel
y uno negativo con hidróxido de cadmio. A lo largo de la vida de la batería
su capacidad máxima va disminuyendo debido al efecto memoria. Este tipo
de batería es muy contaminante.
BRAZO DE ROBOT MEMORIA TECNICA
- 35 -
♦ Baterías de níquel metal hidruro (NiMH): Son más caras que las anteriores
porque usan metales como titanio, zirconio o vanadio, pero proporcionan
aproximadamente un 50% más de energía a igualdad del peso. Además
estas no tienen efecto memoria.
♦ Baterías de litio-ion (LiIon): Con mayor capacidad que las de NiMH, no
tienen efecto memoria y apenas se observa efecto autodescarga.
Se muestra una tabla con las ventajas y desventajas de diversos tipos de baterías:
Tipo de batería: Ventajas: Desventajas:
Pb -Precio -Peso
-Muy contaminantes
-Efecto memoria
Ni-Cd -Precio -Efecto memoria
-Muy contaminantes
NiMH -No tienen efecto memoria
-Capacidad de almacenamiento
-Sensibles a la temperatura
Tabla 2.25. Ventajas y desventajas de los tipos de baterías.
Después de analizar las ventajas y desventajas de los diversos tipos de baterías, se
decidió por una batería de NiMH, ya que para menor peso es capaz de proporcionar
más autonomía al brazo de robot. La elegida es una batería cuyas características son:
4´8 V y 650 mAh.
2.5.3. Autonomía
A continuación se realiza el cálculo de autonomía en dos situaciones:
1) Cuando el brazo de robot trabaja moviendo todas las articulaciones pero
sin transportar ningún peso. Para este cálculo se ha medido la intensidad que
consume el sistema con un amperímetro.
BRAZO DE ROBOT MEMORIA TECNICA
- 36 -
Consumo medido: 205 mA.
Gráfica 2.26. Gráfico de autonomía de la batería con un consumo de 205 mA.
minyhmA
horamAreceptorcircuitodelConsumo
bateríaladeCapacidadautonomíadeTiempo 103
205650
=•
==
Autonomía de la batería (205 mA)
0
24
6
0 30 60 90 120
150
180
Tiempo (minutos)
Tens
ión
(V)
Gráficateórica
Gráfica real
%12100832́
832́173́100 =×
−=×
−=
realValorrealValorteóricoValor
Perdidas
%88%12%100dimRe =−=−= pérdidasTotalienton
BRAZO DE ROBOT MEMORIA TECNICA
- 37 -
2) Cuando el brazo de robot trabaja, transportando el peso máximo:
Consumo medido: 260 mA.
Gráfica 2.27. Gráfico de autonomía de la batería con un consumo de 260 mA.
minyhmA
horamAreceptorcircuitodelConsumo
bateríaladeCapacidadautonomíadeTiempo 302
260650
=•
==
%251002
252́100 =×
−=×
−=
realValorrealValorteóricoValor
Perdidas
%75%25%100dimRe =−=−= pérdidasTotalienton
Autonomía de la batería (260mA)
0
2
4
6
1 4 7 10 13 16
Tiempo minutos (x10)
Tens
ión
(V) Gráfica
Teórica
Gráfica Real
BRAZO DE ROBOT MEMORIA TECNICA
- 38 -
2.5.4. ¿Qué hacer con las baterías usadas?
Las pilas y baterías constituyen un residuo peligroso por varios aspectos:
♦ Hay un gran tipo de pilas, desde el punto de vista químico, por lo que se
multiplica enormemente la cantidad de contaminantes que se generan.
♦ Algunos de los constituyentes peligrosos de las pilas son: mercurio, cadmio y
plomo. Estos elementos son los más peligrosos.
Idealmente las pilas y baterías, deberían volver al fabricante para que éste se
encargue de reciclar y reutilizar lo que le sea útil mediante la implementación de
tecnologías adecuadas a tal fin. En términos prácticos, la gestión de las pilas usadas
comienza por la recolección en forma separada y continua, enviándolas a continuación
a plantas donde se realice su reciclado.
BRAZO DE ROBOT INSTALACION
3. Instalación del software
3.1. Requerimientos
Para poder ejecutar la interfície de programación, se necesita únicamente un
ordenador en el que se pueda ejecutar el Windows, este puede ser:
♦ Procesador 486 DX II a 66 Mhz.
♦ 8 Mbytes de memoria.
♦ Disco duro de 540 Mb.
3.2. Instalación
Para instalar la interfície de programación solo se tiene que ejecutar el software
de instalación del brazo de robot, denominado “carby” y seguir todos los pasos que
se indiquen. A continuación se conecta el cable de comunicación RS-232 y el brazo
de robot, ya está listo para ser programado.
BRAZO DE ROBOT CONCLUSIONES
4. Conclusiones
En este punto del proyecto, debo decir, que estoy muy satisfecho con el trabajo
realizado, ya que he conseguido llevar a la realidad gran parte de los objetivos que
inicialmente me había planteado.
Para poder realizar mecánicamente este proyecto, se ha conseguido reciclar un
viejo disco duro de 40 Mb sin utilidad alguna en los tiempos actuales, así como
poder reutilizar también la batería de un teléfono móvil ya en desuso. Al reutilizar
estos elementos se ha conseguido respetar el medio ambiente, si no estos
elementos hubiesen ido a la basura.
También he podido aprender el funcionamiento de algunos protocolos de
comunicación serie como son, el RS-232 y el I2C. Respecto al RS-232 su
utilización es conocida por todas las personas que utilizamos el ordenador
personal, ya que está implementado para la comunicación con el ratón como cosa
más significativa, aunque tiene muchas más aplicaciones. Dado que no siempre se
requiere alta velocidad de transferencia de datos, el bus I2C es ideal para sistemas
donde es necesario manejar información entre muchos dispositivos, al mismo
tiempo se requiere poco espacio y líneas de circuito impreso.
Tengo que destacar la sencillez del interfície de programación para que
cualquier persona inexperta pueda programar y manejar el brazo robot en un corto
espacio de tiempo, acercando este proyecto de esta manera a un gran número de
personas de todas las edades.
Otro punto que no quiero dejar de comentar, es la posibilidad de poder
comercializar el producto, realizando algunas mejoras, como añadirle una pinza
que pueda coger objetos como si de una mano se tratase.
Finalmente puedo concluir que el proyecto ha cubierto todas las expectativas
que inicialmente me había planteado, alcanzando así los objetivos educativos
requeridos al plantearse el reto de realizar un proyecto fin de carrera.
BRAZO DE ROBOT PRESUPUESTO
5. Presupuesto
Para realizar el presupuesto del proyecto, se han separado los diferentes conceptos
de la siguiente forma: El material electrónico, el mecánico y las horas empleadas en la
elaboración, si sumamos estos tres conceptos obtendremos el coste total del un brazo
robot, como puede verse a continuación. Si fabricamos en serie los costes se
disminuyen mucho. En las siguientes páginas se desglosa cada concepto. La moneda
utilizada para calcular los importes es el euro.
Coste total del proyecto (una unidad):
Descripción Cant Precio/Ud Importe + 16%IVA
Material electrónico 1 87´40 101´39
Material mecánico 1 6´00 6´96
Trabajo profesionales 1 3030´00 3514´80
Coste total del proyecto (sí solo se fabrica un producto): 3623´15
Si se pide más de una unidad, los gastos relativos a los profesionales se reducirían
mucho, como ejemplo, se estudiará un pedido de 5 unidades, para otra cantidad
habría que estudiar el coste de forma similar.
Descripción Horas Precio/Ud Importe
Estudio de viabilidad 1 14´00 14,00
Montar Brazo y ajustar 10 10´00 100´00
Diseñar y montar placa circuito impreso 5 10´00 50´00
Diseñar y programar software aplicación 25 14´00 350´00
Diseñar y programar interfície de programación 7 14´00 98´00
Verificar funcionamiento 4 14´00 56´00
Confeccionar memoria y recopilar información 2 14´00 28’00
Base imponible: 696´00
IVA (16%): 111´36
Total profesionales: 807´36
Total proyecto (5 unidades), materiales + profesionales: 915.71
BRAZO DE ROBOT PRESUPUESTO
- 42 -
Material electrónico:
Descripción Cant Precio/Ud Importe
Microprocesador PIC 16F873 1 10´50 10´50
Circuito Integrado MAX 232 1 1´30 1´30
EEPROM 24LC02B 1 1´10 1´10
Servomotor HITEC 300BB 3 15´50 46´5
Resistencia 10K / 0´25W 2 0´01 0´02
Cristal de cuarzo 9´8340 MHz 1 0´67 0´67
Condensador cerámico 22pF 2 0´03 0´06
Condensador electrolítico 1µF / 63V 4 0´05 0´20
Zócalo 28 pins 1 0, 12 0´12
Zócalo 16 pins 1 0´08 0´08
Zócalo 8 pins 1 0´05 0´05
Tira 40 pins hembra 2 1´30 2´60
Tira 40 pins macho 1 1´30 1´30
Conector bus 20pins 1 1´90 1´90
Conector alimentación placa 2 pins 1 0´60 0´60
Conector DB9 1 0´65 0´65
Conector aéreo DB9 macho 1 1´10 1´10
Conector aéreo DB9 hembra 1 1´10 1´10
Tornillos M3 8 0´01 0´08
Separador placa M3 4 0´04 0´16
Arandela aislante 0´5mm 4 0´03 0´12
Placa de circuito impreso 1 9,00 9´00
Interruptor aéreo 2 pins 1 0´47 0´47
Conmutador aéreo 3 pins 1 0´69 0´69
Cableado vario 1 3´05 3´05
Batería NiMH 4´8V 650mAh (Reciclada) 1 4´00 4´00
Base imponible: 87´40
IVA (16%): 13´99
Total electrónica: 101´39
BRAZO DE ROBOT PRESUPUESTO
- 43 -
Material mecánico:
Descripción Cant Precio/Ud Importe
Caja módem externo 33K (Reciclada) 1 2´00 2´00
Disco Duro 44Mb (Reciclado) 1 1´00 1´00
Pieza de aluminio 200x400 1 3´00 3´00
Base imponible: 6´00
IVA (16%): 0´96
Total mecánica: 6´96
Trabajo profesionales:
Descripción Horas Precio/Ud Importe
Estudio de viabilidad 5 14´00 70,00
Montar Brazo y ajustar 15 10´00 150´00
Diseñar y montar placa circuito impreso 15 10´00 150´00
Diseñar y programar software aplicación 125 14´00 1750´00
Diseñar y programar interfície de programación 35 14´00 490´00
Verificar funcionamiento 20 14´00 280´00
Confeccionar memoria y recopilar información 10 14´00 140’00
Base imponible: 3030´00
IVA (16%): 484´8
Total profesionales: 3514´8
BRAZO DE ROBOT BIBLIOGRAFIA
6. Bibliografía
Citación bibliográfica de los libros y recursos en línea utilizados para la
implementación del proyecto:
♦ Libros:
� Fundamentos de robótica: Mc Graw Hill, 1997.
Antonio Barrientos, Luís Felipe Peñín, Carlos Balaguer,Rafael Aracil.
� Robótica industrial: Marcombo Boixareu Editores, 1986.
J. Amat, J. Ayza, L. Basañez, F. Ferrer, R. Huber, C. Torres.
� Electricidad del Automóvil-I: CEAC, 1997.
Miguel de Castro Vicente.
� PIC16F87x Data Sheet: Microchip, 2001.
� 24AA02/24LC02B Data Sheet: Microchip, 2002.
� MAX232 Data Sheet: Texas Instruments, 1997.
♦ Recursos en línea:
� http://www.maxim-ic.com
� http://www.microchip.com
� http://www.google.com
� http://www.lynxmotion.com
� http://www.microcontroladores.es
BRAZO DE ROBOT ANEXO 1. RS-232
7. Anexos
7.1. Anexo 1. Comunicación RS-232
La comunicación serie, es el tipo de comunicación más utilizada. Es muy empleado
en la industria, aunque la velocidad no es tan rápida como la comunicación en
paralelo los costes por cableado se reducen mucho.
Los estándares de comunicación establecen una serie de normas en el nivel físico
(mecánico y eléctrico) en los enlaces. Estas normas afectan sobre todo a los aspectos
siguientes:
♦ Frecuencia de transmisión.
♦ Características eléctricas.
♦ Definición y características de la línea.
7.1.1. Funcionamiento de la interface RS-232
La transmisión serie se realiza enviando bit a bit por lo que se necesita un interfaz
que pase la información de paralelo, que es el formato en el que trabaja la CPU, al
formato serie requerido por el dispositivo.
Las señales disponibles en un conector RS-232 están pensadas únicamente para
asegurar la correcta transmisión y recepción de datos, desde un equipo DTE1 a un
equipo DCE2. El tipo DCE más conocido es el módem y el DTE es generalmente un
ordenador.
El estándar RS-232 cuenta con una serie de señales de datos y control. Entre las
más importantes están:
♦ GND: Tierra de protección.
♦ TxD: Línea de transmisión de datos.
♦ RxD: Línea de recepción de datos.
♦ DTR (Data Terminal Ready): Indica al módem que se conecte a la línea.
1 Data Terminal Equipment. Normalmente un ordenador. 2 Data Comunication Equipment. El más conocido es el modem.
BRAZO DE ROBOT ANEXO 1. RS-232
- 46 -
♦ DSR (Data Set Ready): Respuesta a la señal de DTR. El módem indica al
driver que está conectado y preparado para transmitir.
♦ RTS (Request To Send): Indica al módem que pase a modo transmisión.
♦ CTS (Clear To Send): Respuesta a RTS. El módem indica al driver que está
preparado para recibir datos y enviarlos a la línea.
♦ RI (Ring Indicator): El módem indica al driver que se ha producido una
llamada desde un módem externo.
♦ CD (Carrier Detect): El módem indica al driver que la línea ha sido activada
en el extremo remoto, por lo que pueden llegar datos en cualquier
momento.
A continuación tenemos un esquema básico de un programa para comunicaciones
serie:
Organigrama 7.1. Comunicación serie RS-232.
Abrir puerta serie
Configurar puerta serie
Enviar datos por la puerta serie
Recibir datos por la puerta serie
¿Terminar?
Cerrar puerta serie
Salir
N
S
BRAZO DE ROBOT ANEXO 1. RS-232
- 47 -
La gestión de los puertos de comunicaciones es una tarea compleja. Los datos
llegan a los puertos de forma síncrona, es decir, su llegada es imprevisible. Por lo que
el dato que llega tiene que procesarse inmediatamente, ya que pueden llegar otros
datos en cuyo caso se producirían pérdidas de bits. De esta tarea se encarga el
hardware, de forma que cuando detecta la llegada de un dato, interrumpe el flujo
normal de proceso para ceder el control a la rutina de comunicaciones.
Cuando un emisor manda un mensaje transmitiendo los sucesivos bits que lo
componen, el emisor debe ser capaz de reconocer el principio y el final del mensaje
transmitido, además debe conocer la duración de cada bit para muestrear la línea en
el instante adecuado, esta duración se obtiene de la velocidad de transmisión (número
de bits por segundo).
En la transmisión asíncrona se mandan caracteres independientemente unos de
otros, comenzando cada carácter con la sincronización del emisor y el receptor.
Mientras no se transmite ningún carácter la línea se encuentra a nivel alto, por tanto,
antes de enviar un carácter se manda un bit a “0” lógico (bit de START) cuyo pulso de
bajada sincronizará el reloj del receptor con el del emisor. Asimismo tras la transmisión
de un carácter es necesario un período de seguridad que permita distinguir el siguiente
bit de START. Este período que puede durar desde 1 hasta 2 bits, se le denomina bit
de STOP.
Los bits de START y STOP proporcionan el sincronismo de bit, al sincronizar los
relojes y el sincronismo de carácter al delimitar al mismo. Como consecuencia es
necesario para conseguir una correcta comunicación, que tanto el emisor como el
receptor estén de acuerdo con los parámetros de la comunicación.
Figura 7.1. Niveles lógicos del interface RS-232.
BRAZO DE ROBOT ANEXO 1. RS-232
- 48 -
7.1.2. Comunicación RS-232 con Visual Basic
En Visual Basic existe un control denominado MSCOMM que se utiliza para poder
realizar la comunicación serie. En este control hay que configurar varios parámentros
como son:
♦ La velocidad de comunicación.
♦ La paridad.
♦ El número de bits.
♦ El número de bits de STOP.
7.1.3. Comunicación RS-232 con Pic 16F873
Este microcontrolador contiene un módulo llamado MSSP con dos puertas para la
comunicación serie asíncrona. Además dispone de un módulo USART capaz de
soportar la comunicación serie síncrona y asíncrona.
La USART, llamado SCI1 puede funcionar como un sistema de comunicación full
dúplex o bidireccional asíncrono, adaptándose a multitud de periféricos. También
puede trabajar en modo síncrono unidireccional o half dúplex para soportar periféricos
como memorias, conversores, etc. En resumen, la USART puede trabajar de tres
maneras:
♦ Asíncrona (full dúplex, bidireccional).
♦ Síncrona - maestro (half dúplex, unidireccional).
♦ Síncrona – esclavo (half dúplex, unidireccional).
A continuación se muestra un esquema del comportamiento de la USART en modo
asíncrono, donde las transferencias de información se realizan sobre dos líneas Tx
(transmisión) y Rx (recepción), saliendo y entrando los bits por dichas líneas al ritmo
de una frecuencia controlada internamente por la USART.
BRAZO DE ROBOT ANEXO 1. RS-232
- 49 -
Figura 7.3. Líneas de comunicación RS-232 del Pic 16F873.
En la forma de comunicación asíncrona que es la que se emplea en este proyecto,
se usa la norma RS-232 donde cada palabra de información o dato se envía
independientemente de los demás. Suele constar de 8 o 9 bits y van precedidos por un
bit de START y detrás de ellos se coloca un bit de STOP.
Figura 7.4. Envío de 1 byte a través de RS-232.
BRAZO DE ROBOT ANEXO 1. RS-232
- 50 -
7.1.4. Conexionado del cable
La unidad de control se utiliza un conector delta de 9 pines como el que se aprecia
en la siguiente figura:
Fotografía 7.5. Conector DB9
A continuación se aprecia la configuración de los pines:
Figura 7.6. Configuración de los pines en el conector DB9.
BRAZO DE ROBOT ANEXO 1. RS-232
- 51 -
Los pines más significativos para la comunicación son:
♦ Pin 2: También conocido como Rx y es por donde se reciben los diferentes
caracteres.
♦ Pin 3: Conocido como Tx y es por donde se transmiten caracteres.
♦ Pin 5: Que es la masa de referencia para que la comunicación pueda
establecerse.
BRAZO DE ROBOT ANEXO 2. BUS I2C
7.2. Anexo 2. Bus I2C
La comunicación serie es una forma muy apreciada de transferir datos digitales
entre sistemas y circuitos integrados, dada la reducida cantidad de líneas que precisa.
En algunas aplicaciones, se deben establecer ciertos criterios:
♦ Cierto tipo de microcontroladores no son ampliables desde el exterior.
♦ Normalmente, un sistema completo, además de un microcontrolador,
necesita de otros circuitos periféricos como memorias, ampliación de las
líneas de E/S, conversores A/D y D/A, entre otros.
♦ El coste de conexión de todos estos periféricos con el microcontrolador
deben reducirse al mínimo.
♦ Normalmente, la aplicación no requiere de una gran velocidad de
transferencia entre el microcontrolador y los diferentes periféricos.
♦ La eficacia general del sistema depende de la versatilidad de los
dispositivos conectados al mismo.
Los distintos dispositivos conectados al bus deben comunicarse entre sí mediante
un protocolo que evite el bloqueo de la información y garantice la comunicación entre
todos ellos.
El sistema debe ser independientemente de los distintos dispositivos conectados al
bus, con objeto de poder realizar futuras ampliaciones y modificaciones. Mediante el
protocolo adecuado se decide qué dispositivo se hace cargo del bus y cuándo.
7.2.1. Descripción y funcionamiento
Diseñado por Philips, este intercambio de información a través de tan solo dos
cables permite a circuitos integrados y módulos OEM interactuar entre sí a velocidades
relativamente lentas. Emplea comunicación serie, utilizando un conductor para
manejar los pulsos de reloj que actúan de sincronismo y otro para intercambiar datos.
El bus se basa en tres señales:
♦ SDA (System Data) por la cual viajan los datos entre los dispositivos.
♦ SCL (System Clock) por la cual transitan los pulsos de reloj que sincronizan
el sistema.
♦ GND (masa) interconecta entre todos los dispositivos conectados al bus.
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 53 -
Las líneas SDA y SCL son del tipo drenador abierto, similares a las de colector
abierto pero asociadas a un transistor de efecto de campo1. Se deben poner en estado
alto2 para construir una estructura de bus tal que se permita conectar en paralelo
múltiples entradas y salidas.
Figura 7.7. Conexión de dispositivos usando el bus I2C.
En la figura se puede observar la configuración eléctrica básica del bus. Las dos
líneas de comunicación disponen de niveles lógicos altos cuando están inactivas, de
eso se encargan las resistencias de pull-up Rp, Rs son las impedáncias de las líneas
de conexión. Inicialmente el número de dispositivos que se puede conectar al bus es
limitado, pero obsérvese que las líneas tienen una especificación máxima de 400 pF
en lo que respecta a capacidad de carga. La máxima velocidad de transmisión de
datos que se puede obtener es de aproximadamente 100 Kbits por segundo.
Las definiciones o términos utilizados en relación con las funciones del bus I2C son
las siguientes:
♦ Master: Dispositivo que determina la temporización y la dirección del tráfico
de datos en el bus. Es el único que aplica los pulsos de reloj en la línea
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 54 -
SCL. Cuando se conectan varios dispositivos maestros a un mismo bus la
configuración obtenida se denomina “multi-maestro”.
♦ Slave: Cualquier dispositivo conectado al bus incapaz de generar pulsos de
reloj. Reciben señales de comando y de reloj proveniente del dispositivo
maestro.
♦ Bus desocupado: Estado en el cual ambas líneas (SDA y SCL) están
inactivas, presentando un estado lógico alto. Unicamente en este momento
es cuando un dispositivo maestro puede comenzar a hacer uso del bus.
♦ START: Sucede cuando un dispositivo maestro hace ocupación del bus,
generando esta condición. La línea de datos (SDA) toma un estado bajo
mientras que la línea de reloj (SCL) permanece alta.
♦ STOP: Un dispositivo maestro puede generar esta condición dejando libre
el bus. La línea de datos toma un estado lógico alto mientras que la de reloj
permanece en ese estado.
A continuación se muestra un diagrama que muestran las condiciones de START y
STOP en modo gráfico:
Figura 7.8. Condiciones de START y STOP.
♦ Valid Data: Sucede cuando un dato presente en la línea SDA es estable
mientras la línea SCL está a nivel lógico alto
♦ Data Format: La transmisión de datos a través de este bus consta de 8 bits
de datos. A cada byte le sigue el noveno pulso de reloj durante el cuál, el
dispositivo receptor del byte debe generar un pulso de reconocimiento,
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 55 -
conocido como ACK1. Esto se logra situando la línea de datos a un nivel
lógico bajo, mientras transcurre el noveno pulso de reloj.
♦ Address: Cada dispositivo diseñado para funcionar con este bus dispone de
su propia y única dirección de acceso, que viene preestablecida por el
fabricante. Hay dispositivos que permiten establecer externamente parte de
la dirección de acceso. Esto permite que una serie del mismo tipo de
dispositivos se puedan conectar en un mismo bus sin problemas de
identificación. La dirección 00 es la denominada “de acceso general”, por la
cual responden todos los dispositivos conectados al bus.
♦ Lectura/Escritura (Bit R/W): Cada dispositivo dispone de una dirección de 7
bits. El octavo bit, el LSB2 enviado durante la operación de
direccionamiento corresponde al bit que indica el tipo de operación a
realizar. Si este bit es alto, el dispositivo maestro lee información
proveniente de un dispositivo esclavo. En cambio, si este bit fuese bajo el
dispositivo maestro escribe información en un dispositivo esclavo.
Debido a la variedad de tecnologías empleadas en los dispositivos diseñados para
conectarse al bus I2C (CMOS, NMOS, TTL) los niveles lógicos “0” y “1” de los bits
transferidos no tienen una tensión fija, sino que dependen de la tensión Vdd de
alimentación. Cada bit que se transfiere por la línea SDA debe ir acompañado de un
pulso de reloj por la línea SCL.
7.2.2. Protocolo
Como es lógico, para iniciar una comunicación entre dispositivos conectados al bus
I2C se debe respetar un protocolo. Tan pronto como el bus esté libre, un dispositivo
maestro puede ocuparlo generando una condición de inicio. El primer byte transmitido
después de la condición de inicio contiene los siete bits que componen la dirección del
dispositivo destino seleccionado y un octavo bit correspondiente a la operación
deseada (lectura y escritura). Si el dispositivo cuya dirección se apuntó en los siete bits
está presente en el bus, éste responde enviando el pulso de reconocimiento ACK.
Seguidamente puede comenzar el intercambio de información entre los dispositivos.
1 Acknowledge. Reconocimiento. 2 Low Significative Bit. Bit de menos peso.
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 56 -
Cuando la señal R/W está previamente a nivel lógico bajo, el dispositivo maestro
envía datos al dispositivo esclavo hasta que deja de recibir los pulsos de
reconocimiento, o hasta que se hayan transmitido todos los datos.
En el caso contrario, es decir, cuando la señal R/W estaba a nivel lógico alto, el
dispositivo maestro genera pulsos de reloj durante los cuales el dispositivo esclavo
puede enviar datos. Luego de cada byte recibido, el dispositivo maestro (que en este
momento está recibiendo datos) genera un pulso de reconocimiento.
El dispositivo maestro puede dejar libre el bus, generando una condición de STOP.
Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condición
de START, en lugar del STOP. Esta nueva condición de START se denomina “inicio
repetitivo” y se puede emplear para direccionar un dispositivo esclavo diferente o para
alterar el estado del bit de lectura/escritura (R/W).
7.2.3. Aplicaciones
Tanto Philips como otros fabricantes de dispositivos compatibles con I2C disponen
de una amplia gama de circuitos integrados, incluyendo memorias RAM y EEPROM,
microcontroladores, puertos de E/S, codificadores DTMF, transceptores IR,
conversores A/D y D/A, relojes de tiempo real y calendarios.
Dado que no siempre se requiere alta velocidad de transferencia de datos, este bus
es ideal para sistemas donde es necesario interconectar muchos dispositivos.
7.2.4. PIC 16F873
En este pic, el fabricante ha implementado el módulo MSSP1 que proporciona una
excelente interfaz de comunicación de los microcontroladores y diversos periféricos.
En este pic el usuario puede utilizar 2 patillas que correctamente programadas se
utilizan para manejar directamente el bus I2C.
El módulo MSSP consta básicamente de dos registros: El SSPSR, que es un
registro de desplazamiento que transforma la información serie en paralelo y
viceversa, también consta del registro SSPBUF, que actúa como buffer de la
información que recibe o transmite.
El funcionamiento del módulo MSSP es muy sencillo. En transmisión, el byte que se
quiere transmitir se carga en el registro SSPBUF a través del bus de datos interno y
automáticamente se traspasa al registro SSPSR, que va desplazando bit a bit el dato,
sacándolo ordenadamente al exterior al ritmo de los impulsos de reloj. En recepción,
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 57 -
los bits van entrando al ritmo del reloj por una patita y se van desplazando en el
SSPSR hasta que lo llenan, en cuyo momento la información se traspasa al SSPBUF,
donde queda lista para su lectura. Este doble almacenamiento del dato recibido
permite iniciar la recepción de un nuevo dato antes de que se haya leído el último.
Cuando se han recibido 8 bits durante la recepción en SSPSR, se traspasa dicha
información a SSPBUF y entonces el bit señalizador BF (Buffer Full) se pone a “1”, al
igual que el flag de interrupción SSPIF. Cualquier escritura en el SSPBUF se ignora
durante una transferencia de información y se señaliza poniendo a “1” el bit WCOL,
que advierte de este tipo de colisiones. Recae en la responsabilidad del programador
pasar el bit WCOL a “0” una vez completada la escritura en SSPBUF.
En la siguiente figura se muestra un esquema básico sobre la estructura interna del
módulo MSSP.
7.2.5. EEPROM
Una memoria del tipo EEPROM1 es un tipo de memoria que una vez se le quita la
corriente eléctrica mantiene la información de forma indefinida y además puede
reprogramarse borrando su contenido de forma eléctrica.
Figura 7.7. Configuración típica del bus I2C.
7.2.5.1. Direccionamiento de la memoria
Después del START se envía un byte de control, este consiste en 8 bits, de los
cuáles los 4 primeros (mayor peso) indican la operación que se quiere realizar, en el
caso de la memoria es 1010, los tres siguientes (A2,A1,A0), indican el número de
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 58 -
dispositivo dentro de la misma operación u banco de memoria dentro del mismo
dispositivo y el último bit indica la operación de lectura o escritura, si ese bit es “1”
realizaremos una lectura y si es “0” realizaremos escritura. Una vez enviado, el
dispositivo responde con un ACK.
Figura 7.10. Direccionamiento de la memoria.
7.2.5.2. Byte write
Este tipo de escritura se produce cuando solo es necesario grabar un dato. La
escritura comienza con un START, direccionamiento del dispositivo, dirección del byte
y el byte a escribir, después de cada elemento se añade un ACK por parte de la
memoria. La dirección del byte o word address, indica la dirección de la celda de
memoria a la que se quiere acceder dentro de cada bloque.
Figura 7.11. Escritura como byte write.
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 59 -
7.2.5.3. Page write
Este tipo de escritura es del tipo secuencial, es decir, se pueden escribir más de un
byte sin tener que mandar un START y STOP para cada byte.
Figura 7.12. Escritura como page write.
7.2.5.4. Current address read
Este tipo de lectura, lee la posición actual de la memoria, esta posición está
apuntada por un puntero interno que la incrementa cada vez.
Figura 7.13. Current address read.
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 60 -
7.2.5.5. Random read
En este tipo de lectura se indica la posición de donde debe leer la información, hay
que destacar que primero se ha de enviar la dirección y después se recibe el dato.
Figura 7.14. Random read.
7.2.5.6. Sequential read
En este tipo de lectura, se leen varias posiciones, hay que darle la dirección a partir
de la cual queremos leer y a continuación se leen los bytes que se necesiten leer en
la aplicación. Para conseguirlo debemos implementar la trama que se muestra en la
figura siguiente:
Figura 7.15. Sequential read.
BRAZO DE ROBOT ANEXO 3. METODO DE LA BURBUJA
7.3. Anexo 3. Método de la burbuja.
Este es un método para ordenar un vector. Consiste en ir comparando parejas
contiguas de datos, desplazando hacia la última posición el dato mayor o menor,
según si la clasificación es ascendente o descendente. En este caso se ordena de
forma ascendente un vector de 3 posiciones.
Organigrama 7.16. Método de la burbuja.
BURBUJA
I = 0
I = I + 1
V(I) > V(I+1)
I = 3
FIN
Aux = V(I)V(I) = V(I+1)V(I+1) = Aux
S
N
S
N
BRAZO DE ROBOT ANEXO 7. CD-ROM
7.4. Anexo 4. Placa de circuito impreso.
7.4.1. Esquema
7.4.2. PCB
7.4.2.1. Vista de Componentes 7.4.2.2. Vista Top 7.4.2.3. Vista Bottom
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 63 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 64 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 65 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 66 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 67 -
7.5. Anexo 5. Listados de programa y organigramas.
A continuación se entregan los listados del software desarrollado para la aplicación,
es decir, del interfície de programación y del cerebro del brazo de robot. También se
entregan los organigramas seguidos para desarrollar el software y poder entender
mejor los programas.
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 68 -
INTERFICIE DE PROGRAMACION:
Interfície de programación
¿Cambio de posición para servo 1?
¿Cambio de posición
para servo 2?
¿Cambio de posición para servo 3?
¿Grabar Memoria?
Tarea a Realizar = 0
Tarea a Realizar = 1
¿Reset?
¿Borrar Memoria?
Tarea a Realizar = 2
Tarea a Realizar = 3
Enviar trama de comunicación por el puerto serie
N
Fin Interfície
S
S
N
N
S
S
N
N
S
S N
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 69 -
Organigrama 7.17. Interficie de programación. CALCULO DEL NUMERO DE PASOS A ENVIAR:
Organigrama 7.18. Cálculo del número de pasos que debe esperar cada servo.
CALCULO PASOS
I = 0
I = I + 1
V(I) > V(I+1)
I = 3
FIN PASOS
Aux = V(I)V(I) = V(I+1)V(I+1) = Aux
S
N
S
N
I = 0
V(I) = Grados_BaseV(I+1) = Grados_Hombro
V(I+2) = Grados_Codo
Nº Pasos_Base = V(I+2) / Incremento_ Grados_BaseNº Pasos_Hombro = V(I+2) / Incremento_Grados_Hombro
Nº Pasos_Codo = V(I+2) / Incremento_Grados_Codo
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 70 -
LISTADO DEL PROGRAMA DE LA INTERFICIE: Formulario Principal: Private Sub Pantallaprincipal_Load() ‘Inicializa todas las variables del programa Memorizarrutina.RutinaSumarRestar(0).Value = 0 ‘Variables de los text box de los Memorizarrutina.RutinaSumarRestar(1).Value = 0 ‘grados donde debe ir cada servo. Memorizarrutina.RutinaSumarRestar(2).Value = 0 Memorizarrutina.RutinaGrados(0).Text = 0 Memorizarrutina.RutinaGrados(1).Text = 0 Memorizarrutina.RutinaGrados(2).Text = 0 Grados_Base = 0 ‘Variables de los grados que tiene cada servo. Grados_Hombro = 0 Grados_Codo = 0 Grados_Base_Anterior = 255 Grados_Hombro_Anterior = 255 Grados_Codo_Anterior = 255 Numero_Puerto = 1 ‘Inicializa el puerto serie de transmisión, como COM1. Call Memorizarrutina.enviar End Sub Private Sub Menumemorizacionderutina_Click() ‘Muestra el formulario de rutinas, si ha sido Memorizarrutina.Show vbModal, Me ‘seleccionado con el menu del formulario End Sub ‘principal. Private Sub Menuopcionesdecomunicacion_Click() ‘Muestra el formulario para cambiar el OpcionesComunicacion.Show vbModal, Me ‘el puerto de comunicación. End Sub Private Sub Menusalir_Click() ‘Para finalizar el programa, se selecciona desde el menu End ‘del formulario principal. End Sub Formulario opciones de comunicación: Private Sub OpcionesAceptar_Click(Index As Integer) ´Acepta el COM seleccionado como Unload Me ‘valido. End Sub Private Sub OpcionPuerto1_Click() ‘Selecciona el COM1 como activo. Numero_Puerto = 1 End Sub Private Sub OpcionPuerto2_Click() ‘Selecciona el COM2 como activo. Numero_Puerto = 2 End Sub
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 71 -
Formulario para grabar, borrar y resetear el brazo de robot: Private Sub Borrar_Click() ‘Rutina para borrar la memoria I2C. Para ello se manda como Tarea_Realizar = "3" ‘Tarea a realizar el número 3. Mov_Text1.Text = 0 Mov_Text2.Text = 42 Grados_Base_Anterior = 255 Grados_Hombro_Anterior = 255 Grados_Codo_Anterior = 255 Call enviar End Sub Private Sub RutinaGrabar_Click() ‘Esta rutina sirve para grabar una secuencia de movimientos ‘en la memoria I2C. If (Grados_Base <> Grados_Base_Anterior Or Grados_Hombro <> Grados_Hombro_Anterior Or Grados_Codo <> Grados_Codo_Anterior) And (Mov_Text1.Text < 42) Then Mov_Text1 = Mov_Text1 + 1 Mov_Text2 = Mov_Text2 - 1 Grados_Base_Anterior = Grados_Base Grados_Hombro_Anterior = Grados_Hombro Grados_Codo_Anterior = Grados_Codo Tarea_Realizar = "1" ‘Para dar la orden de grabación de la posición actual del brazo. Call enviar End If End Sub If (RutinaGrados(0).Text >= 0 And RutinaGrados(0).Text <= 180) Or (RutinaGrados(1).Text >= 0 And RutinaGrados(1) <= 180) Or (RutinaGrados(2).Text >= 0 And RutinaGrados(2).Text <= 180) Then Grados_Base = RutinaGrados(0).Text RutinaSumarRestar(0).Value = RutinaGrados(0).Text ‘En esta rutina se actualiza la Grados_Hombro = RutinaGrados(1).Text ‘variable que contiene el valor RutinaSumarRestar(1).Value = RutinaGrados(1).Text ‘de los grados de cada servo a Grados_Codo = RutinaGrados(2).Text ‘partir del valor del campo de RutinaSumarRestar(2).Value = RutinaGrados(2).Text ‘texto de cada servo. End If End Sub Private Sub RutinaReset_Click() ‘Rutina para resetear el brazo de robot, es decir, RutinaGrados(0).Text = 0 ‘lleva todos los servos a la posición 0º, borra memoria RutinaGrados(1).Text = 0 ‘e inicializa todas las variables del interfície. RutinaGrados(2).Text = 0 RutinaSumarRestar(0).Value = 0 ‘Texto que indica la posición de cada servo. RutinaSumarRestar(1).Value = 0 RutinaSumarRestar(2).Value = 0 Grados_Base = 0 ‘Variable que guarda la posición de cada servo. Grados_Hombro = 0 Grados_Codo = 0 Grados_Base_Anterior = 255 ‘Posición anterior, cuando se inicializa se pone a Grados_Hombro_Anterior = 255 ‘valor 255. Grados_Codo_Anterior = 255 Mov_Text1.Text = 0 ‘Movimientos actuales grabados en memoria I2C. Mov_Text2.Text = 42 ‘Movimientos que faltan para llenar banco de memoria I2C. Tarea_Realizar = "2" ‘Indica al Brazo de robot que resetee la memoria y los servos. Call enviar
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 72 -
End Sub Private Sub RutinaSalir_Click() ‘Vuelta al formulario principal. Unload Me End Sub Private Sub RutinaSumarRestar_Change(Index As Integer) If RutinaSumarRestar(0).Value <> Grados_Base Then ‘Texto de la posición del servo1, Grados_Base = RutinaSumarRestar(0).Value ‘Base. RutinaGrados(0).Text = RutinaSumarRestar(0).Value End If If RutinaSumarRestar(1).Value <> Grados_Hombro Then ‘Texto de la posición del servo Grados_Hombro = RutinaSumarRestar(1).Value ‘del Hombro. RutinaGrados(1).Text = RutinaSumarRestar(1).Value End If If RutinaSumarRestar(2).Value <> Grados_Codo Then ‘Texto de la posición del servo del Grados_Codo = RutinaSumarRestar(2).Value ‘Codo. RutinaGrados(2).Text = RutinaSumarRestar(2).Value End If Tarea_Realizar = "0" 'Aplicar a los servos sin grabar en EEPROM Call enviar End Sub Sub enviar() Inicio_Transmision_Centena = "2" ‘Bytes de sincronización. Inicio_Transmision_Decena = "5" Inicio_Transmision_Unidad = "5" If Grados_Base >= 0 And Grados_Base <= 180 Then ‘Se prepara la centena, decena y unidad If Grados_Base >= 0 And Grados_Base < 10 Then ‘Base < 10 Centena(0) = "0" Decena(0) = "0" Unidad(0) = Grados_Base End If If Grados_Base >= 10 And Grados_Base < 100 Then ‘Base <100 Centena(0) = "0" '_Base = "0" Decena(0) = Left(Grados_Base, 1) Unidad(0) = Right(Grados_Base, 1) End If If Grados_Base >= 100 Then ‘Base > 100 Centena(0) = Left(Grados_Base, 1) Decena(0) = Mid(Grados_Base, 2, 1) Unidad(0) = Right(Grados_Base, 1) End If End If If Grados_Hombro >= 0 And Grados_Hombro <= 180 Then If Grados_Hombro >= 0 And Grados_Hombro < 10 Then ‘Hombro <10 Centena(1) = "0" Decena(1) = "0" Unidad(1) = Grados_Hombro End If If Grados_Hombro >= 10 And Grados_Hombro < 100 Then ‘Hombro <100 Centena(1) = "0" Decena(1) = Left(Grados_Hombro, 1)
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 73 -
Unidad(1) = Right(Grados_Hombro, 1) End If If Grados_Hombro >= 100 Then ‘Hombro > 99 Centena(1) = Left(Grados_Hombro, 1) Decena(1) = Mid(Grados_Hombro, 2, 1) Unidad(1) = Right(Grados_Hombro, 1) End If End If If Grados_Codo >= 0 And Grados_Codo <= 180 Then ‘Codo < 10 If Grados_Codo >= 0 And Grados_Codo < 10 Then Centena(2) = "0" Decena(2) = "0" Unidad(2) = Grados_Codo End If If Grados_Codo >= 10 And Grados_Codo < 100 Then ‘Codo < 100 Centena(2) = "0" Decena(2) = Left(Grados_Codo, 1) Unidad(2) = Right(Grados_Codo, 1) End If If Grados_Codo >= 100 Then ‘Codo > 99 Centena(2) = Left(Grados_Codo, 1) Decena(2) = Mid(Grados_Codo, 2, 1) Unidad(2) = Right(Grados_Codo, 1) End If End If 'Rutina de ordenacion del valor de grado de cada servo, según la diferencia entre el valor ‘siguiente y el anterior, para así saber el mayor desplazamiento y calcular el número de ‘pasos. If Grados_Base_Anter > Grados_Base Then Grados_Base_Resta = Grados_Base_Anter - Grados_Base End If If Grados_Base_Anter < Grados_Base Then Grados_Base_Resta = Grados_Base - Grados_Base_Anter End If Grados_Base_Anter = Grados_Base If Grados_Hombro_Anter > Grados_Hombro Then Grados_Hombro_Resta = Grados_Hombro_Anter - Grados_Hombro End If If Grados_Hombro_Anter < Grados_Hombro Then Grados_Hombro_Resta = Grados_Hombro - Grados_Hombro_Anter End If Grados_Hombro_Anter = Grados_Hombro If Grados_Codo_Anter > Grados_Codo Then Grados_Codo_Resta = Grados_Codo_Anter - Grados_Codo End If If Grados_Codo_Anter < Grados_Codo Then Grados_Codo_Resta = Grados_Codo - Grados_Codo_Anter End If Grados_Codo_Anter = Grados_Codo
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 74 -
Ordenados(0) = Grados_Base_Resta Ordenados(1) = Grados_Hombro_Resta Ordenados(2) = Grados_Codo_Resta For J = 0 To 2 ‘Ordenación por el método de la burbuja, el mayor queda For I = 0 To 1 ‘al final del vector. If Ordenados(I) > Ordenados(I + 1) Then aux = Ordenados(I) Ordenados(I) = Ordenados(I + 1) Ordenados(I + 1) = aux End If Next I Next J 'calculo del número de paso de cada servo dividiendo el mayor desplazamiento entre los ‘los otros. 'Evita la division por cero Grados_Base_Paso = Grados_Base_Resta Grados_Hombro_Paso = Grados_Hombro_Resta Grados_Codo_Paso = Grados_Codo_Resta If Grados_Base_Paso = 0 Then Grados_Base_Paso = Grados_Base_Paso + 1 End If If Grados_Hombro_Paso = 0 Then Grados_Hombro_Paso = Grados_Hombro_Paso + 1 End If If Grados_Codo_Paso = 0 Then Grados_Codo_Paso = Grados_Codo_Paso + 1 End If 'Cuidado que Str mete un signo a la izda, caracter blanco si es positivo '- si es negativo. Pasos_Servo(0) = Str(Int(Ordenados(2) / Grados_Base_Paso)) ‘Cálculo de pasos. Pasos_Servo(1) = Str(Int(Ordenados(2) / Grados_Hombro_Paso)) Pasos_Servo(2) = Str(Int(Ordenados(2) / Grados_Codo_Paso)) 'Aqui elimino el signo de la izquierda que se coloca con Str() If Pasos_Servo(0) >= 0 And Pasos_Servo(0) <= 180 Then If Pasos_Servo(0) >= 0 And Pasos_Servo(0) < 10 Then Pasos_Servo_Centena(0) = "0" Pasos_Servo_Decena(0) = "0" Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0), 2, 1) End If If Pasos_Servo(0) >= 10 And Pasos_Servo(0) < 100 Then Pasos_Servo_Centena(0) = "0" Pasos_Servo_Decena(0) = Mid(Pasos_Servo(0), 2, 1) Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0), 3, 1) End If If Pasos_Servo(0) >= 100 Then Pasos_Servo_Centena(0) = Mid(Pasos_Servo(0), 2, 1) Pasos_Servo_Decena(0) = Mid(Pasos_Servo(0), 3, 1) Pasos_Servo_Unidad(0) = Mid(Pasos_Servo(0), 4, 1) End If End If
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 75 -
If Pasos_Servo(1) >= 0 And Pasos_Servo(1) <= 180 Then If Pasos_Servo(1) >= 0 And Pasos_Servo(1) < 10 Then Pasos_Servo_Centena(1) = "0" Pasos_Servo_Decena(1) = "0" Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1), 2, 1) End If If Pasos_Servo(1) >= 10 And Pasos_Servo(1) < 100 Then Pasos_Servo_Centena(1) = "0" Pasos_Servo_Decena(1) = Mid(Pasos_Servo(1), 2, 1) Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1), 3, 1) End If If Pasos_Servo(1) >= 100 Then Pasos_Servo_Centena(1) = Mid(Pasos_Servo(1), 2, 1) Pasos_Servo_Decena(1) = Mid(Pasos_Servo(1), 3, 1) Pasos_Servo_Unidad(1) = Mid(Pasos_Servo(1), 4, 1) End If End If If Pasos_Servo(2) >= 0 And Pasos_Servo(2) <= 180 Then If Pasos_Servo(2) >= 0 And Pasos_Servo(2) < 10 Then Pasos_Servo_Centena(2) = "0" Pasos_Servo_Decena(2) = "0" Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2), 2, 1) End If If Pasos_Servo(2) >= 10 And Pasos_Servo(2) < 100 Then Pasos_Servo_Centena(2) = "0" Pasos_Servo_Decena(2) = Mid(Pasos_Servo(2), 2, 1) Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2), 3, 1) End If If Pasos_Servo(2) >= 100 Then Pasos_Servo_Centena(2) = Mid(Pasos_Servo(2), 2, 1) Pasos_Servo_Decena(2) = Mid(Pasos_Servo(2), 3, 1) Pasos_Servo_Unidad(2) = Mid(Pasos_Servo(2), 4, 1) End If End If ‘Se manda la trama de comunicación por el puerto serie RS-232. CommSerie.CommPort = Numero_Puerto CommSerie.Settings = "9600,N,8,1" CommSerie.PortOpen = True CommSerie.Output = Inicio_Transmision_Centena CommSerie.Output = Inicio_Transmision_Decena CommSerie.Output = Inicio_Transmision_Unidad CommSerie.Output = Tarea_Realizar For x = 0 To 2 '3 CommSerie.Output = Pasos_Servo_Centena(x) CommSerie.Output = Pasos_Servo_Decena(x) CommSerie.Output = Pasos_Servo_Unidad(x) CommSerie.Output = Centena(x) CommSerie.Output = Decena(x) CommSerie.Output = Unidad(x) Next x
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 76 -
CommSerie.PortOpen = False Tarea_Realizar = "0" End Sub
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 77 -
CEREBRO DEL BRAZO DE ROBOT: PROGRAMA PRINCIPAL DE LA APLICACIÓN:
Organigrama 7.19. Rutina principal del brazo de robot.
Programa principal
¿Modo Autonómo?
¿Recibido por el puerto serie el valor
"255"?
Recibir trama por el puerto serie: Tarea a
Realizar yPosición de los servos
¿Tarea a Realizar = 0?
Actuar sobre servos
¿Tarea a Realizar = 1?Grabar memoria
¿Tarea a Realizar = 2?
Posicionar servos en posicion 0º y borrar memoria
Borrar memoria¿Tarea a
Realizar = 3?
Leer memoriaActuar sobre servos
¿Todos los servos en posición?
N S
Modo AutonómoModo Programación
N S
N SS
N
S
S
S
N
N
N
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 78 -
RUTINA PARA GRABAR EN LA MEMORIA I2C
Organigramas 7.20. Rutina grabar memoria.
Rutina Grabar Memoria
¿Memoria llena?
Fin Rutina Grabar
Grabar: Posición servo1 y nº de pasos 1Posición servo2 y nº de pasos 2Posición servo3 y nº de pasos 3
Numero Total Movimientos+1y grabar en memoria
S
N
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 79 -
RUTINA LEER MEMORIA:
Organigrama 7.21. Rutina leer de EEPROM.
Rutina Leer Memoria
¿Número de movimiento actual > número total de
movimientos?
Fin Rutina Leer
Leer en EEPROM: Posición servo1 y nº de pasos1 Posición servo2 y nº de pasos2 Posición servo3 y nº de pasos3
Incrementar número de movimiento actual
¿Número de movimiento actual = número total de
movimientos?
Inicializar: Número de movimiento actual
S
N
S
N
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 80 -
RUTINA SERVICIO DE INTERRUPCION (PWM):
Organigrama 7.22. Atención de interrupción, genera PWM para los servos.
RSI
¿Interrupcion por TMR1?
¿Variable = 2? Subir pin servo 1Cargar TMR1
¿Interrupcion por TMR0?
¿Variable = 2?Bajar pin servo 1
¿Variable = 1?Subir pin servo 2
Cargar TMR1
Subir pin servo 3Cargar TMR1
¿Variable = 1?Bajar pin servo 2
Bajar pin servo 3Variable = 3
Desactivar TMR1Variable = Variable - 1
Fin RSI
S N
N
S
S
S
N
NN
N
S
S
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 81 -
LISTADO DEL PROGRAMA GRABADO EN EL PIC 16F873 ;Programa para realizar las siguientes operaciones pertenecientes al brazo de robot con 3 ;servos, estas acciones son: Controlar servos, borrar, grabar y leer la EEPROM I2C. ;Los 3 servos incrementan y decrementan grados según una tabla, de aproximadamente 1 ;grado. El duty-cycle sera una interrupcion provocada por TMR1. El resto del periodo será una ;interrupcion provocada por el TMR0. El TMR0 provoca interrupcion cada 5 milisegundos, por lo ; que se necesitara una variable contador que cada 4 veces que se produzca una TMR0 ;interrupción actuará sobre cada servo, con intervalo de 5 mS. Dejando así tiempo de sobra ;para para que no se afecte el PWM de los demás servos. ;Además se le pasaran las posiciones a la que debe ir cada servo desde el PC, por el puerto ;serie, desde el programa hecho en VB para tal tarea. LIST P=16F873 ;Tipo de procesador. INCLUDE "P16F873.INC" ;Variables N_SERVO EQU 20h ;Nº de servo para actuar el PWM, en cada INT. Leido EQU 21h ;Leido de RCREG, después de restar 30h ASCI I. GRADOS_SERVO1 EQU 22h ;Grado al que debe ir el servo 1. GRADOS_SERVO2 EQU 23h ;Grado al que debe ir el servo 2. GRADOS_SERVO3 EQU 24h ;Grado al que debe ir el servo 3. GRADO_LECTURA EQU 26h ;Grado para leer tabla. Tarea_Realizar EQU 27h ;Tarea a realizar. W_TEMP EQU 30h ;Para guardar el Counter program y registro W. STATUS_TEMP EQU 31h ;al ejecutar el servicio de interrupción. PCLATH_TEMP EQU 32h Unidad EQU 33h ;Unidad leída de RS-232. Decena EQU 34h ;Decena leída de RS-232. Centena EQU 35h ;Centena leída de RS-232. Cifra_Leida EQU 36h ;Obtiene la cifra real. Pasos_Servo1 EQU 38h ;Nº de pasos de espera para servo 1. Pasos_Servo2 EQU 39h ;Idem para servo 2 y 3. Pasos_Servo3 EQU 3Ah GR_DEST_SERVO1 EQU 42h ;Variables para saber el grado destino al que GR_DEST_SERVO2 EQU 43h ;debe ir cada servo. GR_DEST_SERVO3 EQU 44h Pas_act_Servo1 EQU 46h ;Paso actual en el que se encuentra cada Pas_act_Servo2 EQU 47h ;servo para repetir cada grado. Pas_act_Servo3 EQU 48h Pas_act_Servo4 EQU 49h GRADOS_SERVO EQU 4Bh Pasos_Servo EQU 4Ch GR_DEST_SERVO EQU 4Dh Pas_act_Servo EQU 4Eh Mira_si_Paso EQU 4Fh ;Mira si se puede sumar pasos o grados, para ;sincronizar con los servos. Retardo_1 EQU 50h ;Necesario en el Delay de 4,7mS
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 82 -
Retardo_2 EQU 51h ;el I2C y la EEPROM 24LC02B WORD_ADDRESS EQU 52h ;Palabra de direccion para el I2C. Total_Mov EQU 53h ;Total movimientos de la secuencia. N_Mov_Act EQU 54h ;El numero por el que va en la secuencia de lectura. ;********** Programa. ORG 00h ;Vector de reset GOTO Inicio ORG 04h ;Vector de interrupcion GOTO RSI ;Configuración de registros página 1 de memoria. Inicio BCF STATUS,RP1 ;PAGINA 1 BSF STATUS,RP0 MOVLW b'00000111' ;TMR0 con preescaler 1:256 MOVWF OPTION_REG MOVLW 0x06 ;PORTA como salidas/entradas digitales MOVWF ADCON1 MOVLW b'00110000' ;RA0,1,2,3 salida, el resto son entradas MOVWF TRISA MOVLW b'00000000' ;PORTB como salidas digitales MOVWF TRISB MOVLW b'10111111' ;RC7/Rx entrada, RC6/Tx salida MOVWF TRISC ;RC3/SCL entrada, RC4/SDA entrada MOVLW .15 ;9600 baudios con FREC=9,830400 MOVWF SPBRG ;segun la formula MOVLW b'10000000' ;Velocidad estandard con niveles I2C MOVWF SSPSTAT MOVLW .24 ;Velocidad del bus aprox 100 khz MOVWF SSPADD ;Cristal de 9,8340 Mhz MOVLW b'11100000' ;Interrupciones generales, perifericas y MOVWF INTCON ;de TMR0 por overflow MOVLW b'00000001' ;Habilita INT por TMR1 overflow MOVWF PIE1 ;Configuración de registros página 0 de memoria. BCF STATUS,RP0 ;Pagina 0 MOVLW b'00101000' ;Modulo MSSP en ON MOVWF SSPCON MOVLW .207 ;TMR0 provocara INT cada 5 mS MOVWF TMR0
CLRF PORTA ;Borrar la puerta A,B y C CLRF PORTB CLRF PORTC MOVLW b'10010000' ;Configura recepcion asincrona MOVWF RCSTA ;de 8 bits sin paridad MOVLW b'00000000' ;Resetea FLAG de int por tmr1 overflow y el MOVWF PIR1 ;que indica que el buffer de recepcion esta lleno MOVLW b'00110000' ;Desactiva TMR1 y preescaler 1:8 MOVWF T1CON MOVLW 02h ;Inicializa la variable N_SERVO MOVWF N_SERVO ;para actuar sobre los 3 servos MOVLW .1 ;Si se puede incrementar/decrementar grado MOVWF Mira_si_Paso movlw 0x00 ;Inicializa la Tarea a Realizar movwf Tarea_Realizar
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 83 -
;Condiciones iniciales del brazo de robot Condi_Inicial MOVLW .0 ;Servos a posición de 0º MOVWF GRADOS_SERVO1 MOVWF GR_DEST_SERVO1 MOVLW .0 MOVWF GRADOS_SERVO2 MOVWF GR_DEST_SERVO2 MOVLW .0 MOVWF GRADOS_SERVO3 MOVWF GR_DEST_SERVO3 MOVLW .0 ;Empezará la secuencia desde el
MOVWF N_Mov_Act ;principio de la memoria. MOVWF WORD_ADDRESS
;****Rutina Principal Principal BTFSC PORTC,0 ;Si es 0 entra en el modo programacion GOTO Modo_Autonomo ;Aqui en realidad tiene que ir Modo Autonomo GOTO Modo_Programacion ;Interruptor externo. Fin_Principal GOTO Principal Modo_Autonomo BCF STATUS,Z MOVLW .1 ;Comprueba si puede seguir mirando pasos o ;incrementando/decrementando grados SUBWF Mira_si_Paso,w ;segun la condicion de sincronizacion BTFSC STATUS,Z GOTO Modo_Aut_1 BSF PCLATH,0 ;Cambio de banco de memoria BSF PCLATH,1 CALL Modo_Autonomo_1 Modo_Aut_1 BSF PCLATH,0 BSF PCLATH,2 CALL Fin_Modo_Auton Fin_Modo_Auton_1 GOTO Modo_Autonomo Modo_Programacion ;En este bucle leeremos continuamente si llega algo por el puerto ;serie, en este orden: ;1º,2º y 3º byte, de start, si es 255 se sigue la lectura sino a esperar que ;llegue. ;4º , tarea a realizar, 0 es mover servo ;5º, 6º y 7º byte, numero de pasos que debe esperar el Servo1 ;8º, 9º y 10º numero de grado al que debe ir el servo1 (0...180º) ;11º, 12º y 13º byte, numero de pasos que debe esperar el Servo2 ;14º, 15º y 16º numero de grado al que debe ir el servo2 (0...180º) ;17º, 18º y 19º byte, numero de pasos que debe esperar el Servo3 ;20º, 21º y 22º numero de grado al que debe ir el servo3 (0...180º) ;Se leen 3 bytes y a continuacion cuando se comprueba si es el byte de start 255, ;si es ese byte se sigue con la lectura, si no se vuelve a esperar que llegue. BCF STATUS,Z CALL Obtiene_Cifra_3bytes MOVLW .255
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 84 -
SUBWF Cifra_Leida,w BTFSC STATUS,Z GOTO Leer_Tarea GOTO Principal Leer_Tarea CALL Obtiene_Cifra_1byte MOVF Cifra_Leida,w MOVWF Tarea_Realizar Leer_Pasos_Servo1 CALL Obtiene_Cifra_3bytes ;3 bytes, centena, decena y unidad MOVF Cifra_Leida,w MOVWF Pasos_Servo1 ;Se guarda en la variable Leer_Grados_Servo1 CALL Obtiene_Cifra_3bytes ;Centena, decena y unidad MOVF Cifra_Leida,w MOVWF GRADOS_SERVO1 Leer_Pasos_Servo2 CALL Obtiene_Cifra_3bytes ;3bytes MOVF Cifra_Leida,w MOVWF Pasos_Servo2 Leer_Grados_Servo2 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO2 Leer_Pasos_Servo3 CALL Obtiene_Cifra_3bytes ;3byte MOVF Cifra_Leida,w MOVWF Pasos_Servo3 Leer_Grados_Servo3 CALL Obtiene_Cifra_3bytes MOVF Cifra_Leida,w MOVWF GRADOS_SERVO3 Comprobar_Tarea MOVF Tarea_Realizar,w ADDWF PCL,f ;Se comprueba si la tarea a realizar es: GOTO Principal ;0 -> Al Servo GOTO Grabar_Posicion ;1 -> Grabar Coordenada en la EEPROM GOTO Reset ;2 -> Inicializa puntero memoria, borrandola, ;y posicionando el servo a 0º GOTO Borrar_Memoria ;3 -> Borra Memoria Obtiene_Cifra_1byte CALL Leer_Rx ;Obtiene la cifra leída de Tarea a Realizar MOVWF Unidad BSF PCLATH,1 MOVF Unidad,w CALL TABLA_UNIDADES MOVWF Cifra_Leida BCF PCLATH,1 RETURN Obtiene_Cifra_3bytes CALL Leer_Rx ;Obtiene la cifra leída MOVWF Centena CALL Leer_Rx MOVWF Decena CALL Leer_Rx MOVWF Unidad BSF PCLATH,1 MOVF Centena,w CALL TABLA_CENTENAS MOVWF Cifra_Leida MOVF Decena,w CALL TABLA_DECENAS ADDWF Cifra_Leida,f MOVF Unidad,w CALL TABLA_UNIDADES
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 85 -
ADDWF Cifra_Leida,f BCF PCLATH,1 RETURN Leer_Rx BTFSS PIR1,5 ;Lee el buffer de entrada, RS-232 GOTO Leer_Rx BCF PIR1,5 MOVF RCREG,w MOVWF Leido MOVLW 30h SUBWF Leido,f MOVF Leido,w RETURN Grabar_Posicion BSF PCLATH,2 ;Grabar los pasos y grados en CALL Grabar_Memoria ;la memoria GOTO Principal Reset ;Lleva todo el sistema a condiciones iniciales, los servos y el puntero de ;memoria tambien, borrandola de esta manera MOVLW .0 MOVWF GR_DEST_SERVO1 MOVWF GR_DEST_SERVO2 MOVWF GR_DEST_SERVO3 MOVWF GRADOS_SERVO1 MOVWF GRADOS_SERVO2 MOVWF GRADOS_SERVO3 BSF PCLATH,2 CALL Reset_Total_Mov GOTO Principal Borrar_Memoria BSF PCLATH,2 CALL Reset_Total_Mov GOTO Principal RSI ;Rutina de servicio de interrupcion, genera PWM movwf W_TEMP ;Guarda Contador de programa swapf STATUS,w ;acumulador y registro de banderas CLRF STATUS movwf STATUS_TEMP movf PCLATH,w movwf PCLATH_TEMP clrf PCLATH MIRAR_INT BTFSS INTCON,2 GOTO TMR1_INT ;Se ha producido INT por overflow de TMR1 GOTO TMR0_INT ;Se ha producido INT por overflow de TMR0 TMR1_INT BTFSS PIR1,0 ;INT por TMR1 ? GOTO FIN_RSI ;Falsa INT ;TMR1_int, bajar PWM MOVLW .207 ;TMR0 cada 5 mS MOVWF TMR0
MOVF N_SERVO,W ADDWF PCL,F
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 86 -
GOTO BAJAR_SER3 GOTO BAJAR_SER2 GOTO BAJAR_SER1
GOTO FIN_RSI ;Si hay alguna cosa incontrolada BAJAR_SER1 BCF PORTA,0 ;Nivel bajo del PWM de cada servo GOTO TMR1_INT_1 ;segun corresponda BAJAR_SER2 BCF PORTA,1 GOTO TMR1_INT_1 BAJAR_SER3 BCF PORTA,2 MOVLW 03h ;Inicializa N_SERVO MOVWF N_SERVO TMR1_INT_1 DECF N_SERVO,F
BCF T1CON,0 ;Desactiva TMR1 BCF PIR1,0 ;Habilita INT por TMR1 overflow GOTO FIN_RSI TMR0_INT movlw .0 ;Para sincronizar para que todos los servos movwf Mira_si_Paso ;lleguen juntos a la posicion destino MOVF N_SERVO,W ADDWF PCL,F GOTO SUBIR_SER3 ;pwm a nivel alto GOTO SUBIR_SER2 GOTO SUBIR_SER1 SUBIR_SER1 BSF PORTA,0 MOVF GRADOS_SERVO1,W GOTO CARGAR_TMR1 SUBIR_SER2 BSF PORTA,1 MOVF GRADOS_SERVO2,W GOTO CARGAR_TMR1 SUBIR_SER3 BSF PORTA,2 MOVF GRADOS_SERVO3,W CARGAR_TMR1 MOVWF GRADO_LECTURA BSF PCLATH,0 CALL DUTY_LOW MOVWF TMR1L
MOVF GRADO_LECTURA,W BCF PCLATH,0 BSF PCLATH,1 CALL DUTY_HIGH MOVWF TMR1H BCF PCLATH,1 FIN_TMR1 BSF T1CON,0 ;Activar TMR1 BCF INTCON,2 ;Restablece FLAG de TMR0 FIN_RSI movf PCLATH_TEMP,w movwf PCLATH swapf STATUS_TEMP,w movwf STATUS swapf W_TEMP,F swapf W_TEMP,w RETFIE ;Retorno de interrupcion
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 87 -
ORG 100h DUTY_LOW ADDWF PCL,F ;Carga en TMR1 la parte baja, "LOW" del duty ;del pwm correspondiente. TMR1 es de 16 bits. RETLW low .65259 ;0º RETLW low .65257 ;1º RETLW low .65255 ;2º RETLW low .65253 ;3º RETLW low .65251 ;4º RETLW low .65249 ;5º RETLW low .65247 ;6º RETLW low .65245 ;7º RETLW low .65243 ;8º RETLW low .65241 ;9º RETLW low .65239 ;10º RETLW low .65237 ;11º RETLW low .65235 ;12º RETLW low .65233 ;13º RETLW low .65231 ;14º RETLW low .65229 ;15º RETLW low .65227 ;16º RETLW low .65225 ;17º RETLW low .65223 ;18º RETLW low .65221 ;19º RETLW low .65219 ;20º RETLW low .65217 ;21º RETLW low .65215 ;22º RETLW low .65213 ;23º RETLW low .65211 ;24º RETLW low .65209 ;25º RETLW low .65207 ;26º RETLW low .65205 ;27º RETLW low .65203 ;28º RETLW low .65201 ;29º RETLW low .65199 ;30º RETLW low .65197 ;31º RETLW low .65195 ;32º RETLW low .65193 ;33º RETLW low .65191 ;34º RETLW low .65189 ;35º RETLW low .65187 ;36º RETLW low .65185 ;37º RETLW low .65183 ;38º RETLW low .65181 ;39º RETLW low .65179 ;40º RETLW low .65177 ;41º RETLW low .65175 ;42º RETLW low .65173 ;43º RETLW low .65171 ;44º RETLW low .65169 ;45º RETLW low .65167 ;46º RETLW low .65165 ;47º RETLW low .65163 ;48º RETLW low .65161 ;49º RETLW low .65159 ;50º RETLW low .65157 ;51º RETLW low .65155 ;52º RETLW low .65153 ;53º RETLW low .65151 ;54º
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 88 -
RETLW low .65149 ;55º RETLW low .65147 ;56º RETLW low .65145 ;57º RETLW low .65143 ;58º RETLW low .65141 ;59º RETLW low .65139 ;60º RETLW low .65137 ;61º RETLW low .65135 ;62º RETLW low .65133 ;63º RETLW low .65131 ;64º RETLW low .65129 ;65º RETLW low .65127 ;66º RETLW low .65125 ;67º RETLW low .65121 ;68º RETLW low .65119 ;69º RETLW low .65117 ;70º RETLW low .65115 ;71º RETLW low .65113 ;72º RETLW low .65111 ;73º RETLW low .65109 ;74º RETLW low .65107 ;75º RETLW low .65105 ;76º RETLW low .65103 ;77º RETLW low .65101 ;78º RETLW low .65099 ;79º RETLW low .65097 ;80º RETLW low .65095 ;81º RETLW low .65093 ;82º RETLW low .65091 ;83º RETLW low .65089 ;84º RETLW low .65087 ;85º RETLW low .65085 ;86º RETLW low .65083 ;87º RETLW low .65081 ;88º RETLW low .65079 ;89º RETLW low .65077 ;90º RETLW low .65075 ;91º RETLW low .65073 ;92º RETLW low .65071 ;93º RETLW low .65069 ;94º RETLW low .65067 ;95º RETLW low .65065 ;96º RETLW low .65063 ;97º RETLW low .65061 ;98º RETLW low .65059 ;99º RETLW low .65057 ;100º RETLW low .65055 ;101º RETLW low .65053 ;102º RETLW low .65051 ;103º RETLW low .65049 ;104º RETLW low .65047 ;105º RETLW low .65045 ;106º RETLW low .65043 ;107º RETLW low .65041 ;108º RETLW low .65039 ;109º RETLW low .65037 ;110º RETLW low .65035 ;111º RETLW low .65033 ;112º RETLW low .65031 ;113º RETLW low .65029 ;114º
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 89 -
RETLW low .65027 ;115º RETLW low .65025 ;116º RETLW low .65023 ;117º RETLW low .65021 ;118º RETLW low .65019 ;119º RETLW low .65017 ;120º RETLW low .65015 ;121º RETLW low .65013 ;122º RETLW low .65011 ;123º RETLW low .65009 ;124º RETLW low .65007 ;125º RETLW low .65005 ;126º RETLW low .65003 ;127º RETLW low .65001 ;128º RETLW low .64999 ;129º RETLW low .64997 ;130º RETLW low .64995 ;131º RETLW low .64993 ;132º RETLW low .64991 ;133º RETLW low .64989 ;134º RETLW low .64987 ;135º RETLW low .64985 ;136º RETLW low .64983 ;137º RETLW low .64981 ;138º RETLW low .64979 ;139º RETLW low .64977 ;140º RETLW low .64975 ;141º RETLW low .64973 ;142º RETLW low .64971 ;143º RETLW low .64969 ;144º RETLW low .64967 ;145º RETLW low .64965 ;146º RETLW low .64963 ;147º RETLW low .64961 ;148 RETLW low .64959 ;149º RETLW low .64957 ;150º RETLW low .64955 ;151º RETLW low .64953 ;152º RETLW low .64951 ;153º RETLW low .64949 ;154º RETLW low .64947 ;155º RETLW low .64945 ;156º RETLW low .64943 ;157º RETLW low .64941 ;158º RETLW low .64939 ;159º RETLW low .64937 ;160º RETLW low .64935 ;161º RETLW low .64933 ;162º RETLW low .64931 ;163º RETLW low .64929 ;164º RETLW low .64927 ;165º RETLW low .64925 ;166º RETLW low .64923 ;167º RETLW low .64921 ;168º RETLW low .64919 ;169º RETLW low .64917 ;170º RETLW low .64915 ;171º RETLW low .64913 ;172º RETLW low .64911 ;173º RETLW low .64909 ;174º
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 90 -
RETLW low .64907 ;175º RETLW low .64905 ;176º RETLW low .64903 ;177º RETLW low .64901 ;178º RETLW low .64899 ;179º RETLW low .64897 ;180º ORG 200h DUTY_HIGH ADDWF PCL,F ;Carga en TMR1 la parte alta, "HIGH" del duty ;del PWM correspondiente. RETLW high .65259 ;0º RETLW high .65257 ;1º RETLW high .65255 ;2º RETLW high .65253 ;3º RETLW high .65251 ;4º RETLW high .65249 ;5º RETLW high .65247 ;6º RETLW high .65245 ;7º RETLW high .65243 ;8º RETLW high .65241 ;9º RETLW high .65239 ;10º RETLW high .65237 ;11º RETLW high .65235 ;12º RETLW high .65233 ;13º RETLW high .65231 ;14º RETLW high .65229 ;15º RETLW high .65227 ;16º RETLW high .65225 ;17º RETLW high .65223 ;18º RETLW high .65221 ;19º RETLW high .65219 ;20º RETLW high .65217 ;21º RETLW high .65215 ;22º RETLW high .65213 ;23º RETLW high .65211 ;24º RETLW high .65209 ;25º RETLW high .65207 ;26º RETLW high .65205 ;27º RETLW high .65203 ;28º RETLW high .65201 ;29º RETLW high .65199 ;30º RETLW high .65197 ;31º RETLW high .65195 ;32º RETLW high .65193 ;33º RETLW high .65191 ;34º RETLW high .65189 ;35º RETLW high .65187 ;36º RETLW high .65185 ;37º RETLW high .65183 ;38º RETLW high .65181 ;39º RETLW high .65179 ;40º RETLW high .65177 ;41º RETLW high .65175 ;42º RETLW high .65173 ;43º RETLW high .65171 ;44º RETLW high .65169 ;45º RETLW high .65167 ;46º RETLW high .65165 ;47º
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 91 -
RETLW high .65163 ;48º RETLW high .65161 ;49º RETLW high .65159 ;50º RETLW high .65157 ;51º RETLW high .65155 ;52º RETLW high .65153 ;53º RETLW high .65151 ;54º RETLW high .65149 ;55º RETLW high .65147 ;56º RETLW high .65145 ;57º RETLW high .65143 ;58º RETLW high .65141 ;59º RETLW high .65139 ;60º RETLW high .65137 ;61º RETLW high .65135 ;62º RETLW high .65133 ;63º RETLW high .65131 ;64º RETLW high .65129 ;65º RETLW high .65127 ;66º RETLW high .65125 ;67º RETLW high .65121 ;68º RETLW high .65119 ;69º RETLW high .65117 ;70º RETLW high .65115 ;71º RETLW high .65113 ;72º RETLW high .65111 ;73º RETLW high .65109 ;74º RETLW high .65107 ;75º RETLW high .65105 ;76º RETLW high .65103 ;77º RETLW high .65101 ;78º RETLW high .65099 ;79º RETLW high .65097 ;80º RETLW high .65095 ;81º RETLW high .65093 ;82º RETLW high .65091 ;83º RETLW high .65089 ;84º RETLW high .65087 ;85º RETLW high .65085 ;86º RETLW high .65083 ;87º RETLW high .65081 ;88º RETLW high .65079 ;89º RETLW high .65077 ;90º RETLW high .65075 ;91º RETLW high .65073 ;92º RETLW high .65071 ;93º RETLW high .65069 ;94º RETLW high .65067 ;95º RETLW high .65065 ;96º RETLW high .65063 ;97º RETLW high .65061 ;98º RETLW high .65059 ;99º RETLW high .65057 ;100º RETLW high .65055 ;101º RETLW high .65053 ;102º RETLW high .65051 ;103º RETLW high .65049 ;104º RETLW high .65047 ;105º RETLW high .65045 ;106º RETLW high .65043 ;107º
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 92 -
RETLW high .65041 ;108º RETLW high .65039 ;109º RETLW high .65037 ;110º RETLW high .65035 ;111º RETLW high .65033 ;112º RETLW high .65031 ;113º RETLW high .65029 ;114º RETLW high .65027 ;115º RETLW high .65025 ;116º RETLW high .65023 ;117º RETLW high .65021 ;118º RETLW high .65019 ;119º RETLW high .65017 ;120º RETLW high .65015 ;121º RETLW high .65013 ;122º RETLW high .65011 ;123º RETLW high .65009 ;124º RETLW high .65007 ;125º RETLW high .65005 ;126º RETLW high .65003 ;127º RETLW high .65001 ;128º RETLW high .64999 ;129º RETLW high .64997 ;130º RETLW high .64995 ;131º RETLW high .64993 ;132º RETLW high .64991 ;133º RETLW high .64989 ;134º RETLW high .64987 ;135º RETLW high .64985 ;136º RETLW high .64983 ;137º RETLW high .64981 ;138º RETLW high .64979 ;139º RETLW high .64977 ;140º RETLW high .64975 ;141º RETLW high .64973 ;142º RETLW high .64971 ;143º RETLW high .64969 ;144º RETLW high .64967 ;145º RETLW high .64965 ;146º RETLW high .64963 ;147º RETLW high .64961 ;148 RETLW high .64959 ;149º RETLW high .64957 ;150º RETLW high .64955 ;151º RETLW high .64953 ;152º RETLW high .64951 ;153º RETLW high .64949 ;154º RETLW high .64947 ;155º RETLW high .64945 ;156º RETLW high .64943 ;157º RETLW high .64941 ;158º RETLW high .64939 ;159º RETLW high .64937 ;160º RETLW high .64935 ;161º RETLW high .64933 ;162º RETLW high .64931 ;163º RETLW high .64929 ;164º RETLW high .64927 ;165º RETLW high .64925 ;166º RETLW high .64923 ;167º
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 93 -
RETLW high .64921 ;168º RETLW high .64919 ;169º RETLW high .64917 ;170º RETLW high .64915 ;171º RETLW high .64913 ;172º RETLW high .64911 ;173º RETLW high .64909 ;174º RETLW high .64907 ;175º RETLW high .64905 ;176º RETLW high .64903 ;177º RETLW high .64901 ;178º RETLW high .64899 ;179º RETLW high .64897 ;180º TABLA_CENTENAS ADDWF PCL,F RETLW 0x00 ;Devuelve 0 RETLW .100 ;Devuelve el 100 decimal RETLW .200 ;Devuelve el 200 decimal TABLA_DECENAS ADDWF PCL,F RETLW .0 ;Devuelve el 0 RETLW .10 ;Devuelve el 10 RETLW .20 ;Devuelve el 20 RETLW .30 ;Devuelve el 30 RETLW .40 ;Devuelve el 40 RETLW .50 ;Devuelve el 50 RETLW .60 ;Devuelve el 60 RETLW .70 ;Devuelve el 70 RETLW .80 ;Devuelve el 80 RETLW .90 ;Devuelve el 90 TABLA_UNIDADES ADDWF PCL,F RETLW .0 ;Devuelve el 0
RETLW .1 ;Devuelve el 1 RETLW .2 ;Devuelve el 2 RETLW .3 ;Devuelve el 3 RETLW .4 ;Devuelve el 4 RETLW .5 ;Devuelve el 5 RETLW .6 ;Devuelve el 6 RETLW .7 ;Devuelve el 7 RETLW .8 ;Devuelve el 8 RETLW .9 ;Devuelve el 9 ORG 300h Modo_Autonomo_1 BCF STATUS,C ;Aquí se va incrementando o decrementando MOVF N_SERVO,w ;los grados, teniendo en cuenta el nº de pasos ADDWF PCL,f ;que el servo tiene que esperar cada vez. GOTO Calculo_Servo3 GOTO Calculo_Servo2 GOTO Calculo_Servo1
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 94 -
Calculo_Servo1 MOVF GRADOS_SERVO1,w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO1,w MOVWF GR_DEST_SERVO MOVF Pasos_Servo1,w MOVWF Pasos_Servo MOVF Pas_act_Servo1,w MOVWF Pas_act_Servo GOTO Calculo_Servo Calculo_Servo2 MOVF GRADOS_SERVO2,w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO2,w MOVWF GR_DEST_SERVO MOVF Pasos_Servo2,w MOVWF Pasos_Servo MOVF Pas_act_Servo2,w MOVWF Pas_act_Servo GOTO Calculo_Servo Calculo_Servo3 MOVF GRADOS_SERVO3,w MOVWF GRADOS_SERVO MOVF GR_DEST_SERVO3,w MOVWF GR_DEST_SERVO MOVF Pasos_Servo3,w MOVWF Pasos_Servo MOVF Pas_act_Servo3,w MOVWF Pas_act_Servo Calculo_Servo MOVF GRADOS_SERVO,w ;GRADOS_SERVO>GRADOS_DESTINO SUBWF GR_DEST_SERVO,w BTFSS STATUS,C GOTO DECREMENTAR BCF STATUS,C
MOVF GR_DEST_SERVO,w ;GRADOS_SERVO<GRADOS_DESTINO SUBWF GRADOS_SERVO,w BTFSS STATUS,C GOTO I NCREMENTAR GOTO Fin_Modo_Autonomo ;Caso que sean iguales INCREMENTAR BCF STATUS,Z MOVF Pasos_Servo,w ;Comprueba si el numero de pasos SUBWF Pas_act_Servo,w ;que ha dado es el que hay que dar BTFSC STATUS,Z ;antes de incrementar un grado GOTO INCREMENTAR_GRADO INCF Pas_act_Servo,f GOTO Guardar_Servo INCREMENTAR_GRADO
INCF GRADOS_SERVO,f MOVLW .1 MOVWF Pas_act_Servo GOTO Guardar_Servo
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 95 -
DECREMENTAR BCF STATUS,Z MOVF Pasos_Servo,w ;Comprueba si el numero de pasos SUBWF Pas_act_Servo,w ;que ha dado es el que hay que dar BTFSC STATUS,Z ;antes de decrementar un grado GOTO DECREMENTAR_GRADO INCF Pas_act_Servo,f GOTO Guardar_Servo DECREMENTAR_GRADO
DECF GRADOS_SERVO,f MOVLW .1 MOVWF Pas_act_Servo GOTO Guardar_Servo Guardar_Servo MOVF N_SERVO,w ADDWF PCL,f GOTO Guardar_Servo3 GOTO Guardar_Servo2 GOTO Guardar_Servo1 Guardar_Servo1 MOVF GRADOS_SERVO,w MOVWF GRADOS_SERVO1 MOVF Pas_act_Servo,w MOVWF Pas_act_Servo1 GOTO Fin_Modo_Autonomo Guardar_Servo2 MOVF GRADOS_SERVO,w MOVWF GRADOS_SERVO2 MOVF Pas_act_Servo,w MOVWF Pas_act_Servo2 GOTO Fin_Modo_Autonomo Guardar_Servo3 MOVF GRADOS_SERVO,w MOVWF GRADOS_SERVO3 MOVF Pas_act_Servo,w MOVWF Pas_act_Servo3 Fin_Modo_Autonomo movlw .1 ;No realiza ningun incremento/decremento hasta movwf Mira_si_Paso ;nueva interrupción BCF PCLATH,0 BCF PCLATH,1 RETURN ORG 0x400 ;Tratamiento de memoria EEPROM Grabar_Memoria ;Random Read para leer el numero de movimientos totales, antes de ;grabar y la palabra de dirección actual CALL Delay_I2C ;Lee los movimientos totales, si son menores CALL START ;de 42 graba MOVLW b'10100000' CALL I2C_ENVIAR ;Envia el Control Byte como escritura ;(datagrama) MOVLW .252
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 96 -
CALL I2C_ENVIAR ;Envia la Word Address del total de ;movimientos CALL RESTART MOVLW b'10100001' CALL I2C_ENVIAR ;Manda el nuevo Control Byte como lectura ;(datagrama) CALL I2C_LEER ;Lee el total de movimientos MOVWF Total_Mov CALL I2C_MAN_NO_ACK CALL STOP ;Lee como CURRENT ADDRESS READ la Word Address ;Empieza la grabacion de los diferentes valores de Servo1,2,3 BCF STATUS,Z ;Comprueba si hay 42 movimientos grabados MOVLW .42 SUBWF Total_Mov,w BTFSC STATUS,Z GOTO Fin_Grabar Grabar_Mem ;Graba como 'PAGE WRITE' los 6 valores correspondientes a los 3 Servos
;Graba el numero de movimientos como 'BYTE WRITE' INCF Total_Mov,f CALL Delay_I2C
BSF PCLATH,0 CALL START_GRABACION MOVLW .252 CALL I2C_ENVIAR ;Manda la WORD ADDRESS de la posicion de ;grabación MOVF Total_Mov,w CALL I2C_ENVIAR ;Manda la el Total de movimientos de la ;secuencia actual del movimiento CALL STOP ;'PAGE WRITE' CALL Delay_I2C
BSF PCLATH,0 CALL START_GRABACION MOVF WORD_ADDRESS,w CALL I2C_ENVIAR MOVF Pasos_Servo1,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f MOVF GRADOS_SERVO1,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f call STOP
bsf PCLATH,0 call START_GRABACION movf WORD_ADDRESS,w call I2C_ENVIAR MOVF Pasos_Servo2,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f MOVF GRADOS_SERVO2,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f
call STOP
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 97 -
bsf PCLATH,0 call START_GRABACION movf WORD_ADDRESS,w call I2C_ENVIAR MOVF Pasos_Servo3,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f MOVF GRADOS_SERVO3,w CALL I2C_ENVIAR INCF WORD_ADDRESS,f CALL STOP bsf PCLATH,1 Fin_Grabar BCF PCLATH,2 movlw 0x00 movwf Tarea_Realizar RETURN Leer_Memoria CALL Delay_I2C ;'Random Read' para Total_Mov CALL START MOVLW b'10100000' CALL I2C_ENVIAR MOVLW .252 CALL I2C_ENVIAR CALL RESTART MOVLW b'10100001' CALL I2C_ENVIAR CALL I2C_LEER MOVWF Total_Mov CALL I2C_MAN_NO_ACK CALL STOP ;Compara si Total_Mov = 0, si es así ir al final de la lectura porque no hay ningun movimiento BCF STATUS,Z MOVLW .0 SUBWF Total_Mov,w BTFSC STATUS,Z GOTO Fin_Leer_Mem ;Leer 6 posiciones de la memoria ;La primera como 'Random Read' para posicionar el puntero en WORD_ADDRESS CALL Delay_I2C ;'Random Read' CALL START MOVLW b'10100000' CALL I2C_ENVIAR MOVF WORD_ADDRESS,w CALL I2C_ENVIAR CALL RESTART MOVLW b'10100001' CALL I2C_ENVIAR CALL I2C_LEER MOVWF Pasos_Servo1 CALL I2C_MAN_NO_ACK CALL STOP INCF WORD_ADDRESS,f
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 98 -
;Leer siguientes como 'Sequential Read' CALL Delay_I2C CALL START MOVLW b'10100001' CALL I2C_ENVIAR CALL I2C_LEER MOVWF GR_DEST_SERVO1 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK
CALL I2C_LEER MOVWF Pasos_Servo2 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF GR_DEST_SERVO2 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF Pasos_Servo3 INCF WORD_ADDRESS,f CALL I2C_MAN_ACK CALL I2C_LEER MOVWF GR_DEST_SERVO3 INCF WORD_ADDRESS,f CALL I2C_MAN_NO_ACK CALL STOP INCF N_Mov_Act,f ;Compara si N_Mov_Act = Total_Mov, si son iguales iniciar WORD_ADDRESS = 0 ;y N_Mov_Act = 0 BCF STATUS,Z MOVF Total_Mov,w SUBWF N_Mov_Act,w BTFSC STATUS,Z GOTO Iniciar_WORD_ADDRESS GOTO Fin_Leer_Mem Iniciar_WORD_ADDRESS MOVLW .0 MOVWF WORD_ADDRESS MOVWF N_Mov_Act ;Graba WORD_ADDRESS como 'BYTE WRITE' Fin_Leer_Mem BSF PCLATH,0 RETURN ;Resetea la variable Total_Mov y el WORD ADDRESS, y los graba en la posicion ;correspondiente de la EEPROM, borrando asi la memoria Reset_Total_Mov ;Graba posiciones 252d y 253d como 'PAGE WRITE' CALL Delay_I2C CALL START MOVLW b'10100000' CALL I2C_ENVIAR MOVLW .252
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 99 -
CALL I2C_ENVIAR MOVLW .0 CALL I2C_ENVIAR ;Graba Total_Mov = 0 CALL STOP MOVLW .0 MOVWF Tarea_Realizar MOVWF N_Mov_Act movwf Total_Mov call Delay_I2C call START movlw b'10100000' call I2C_ENVIAR movlw .252 call I2C_ENVIAR call RESTART movlw b'10100001' call I2C_ENVIAR call I2C_LEER movwf kk call I2C_MAN_NO_ACK call STOP BCF PCLATH,2 RETURN ;*********** RUTINAS I2C **************** Delay_I2C movlw .10 ;Retardo que necesita estar como minimo a nivel 0, las ;lineas I2C Movwf Retardo_1 Delay_1 movlw 0xFF movwf Retardo_2 Bcf STATUS,Z Delay_2 nop nop DECFSZ Retardo_2,f goto Delay_2 bcf STATUS,Z DECFSZ Retardo_1,f goto Delay_1 Return START BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,SEN BTFSC SSPCON2,SEN GOTO $-1 BCF STATUS,RP0 RETURN RESTART BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,RSEN BTFSC SSPCON2,RSEN GOTO $-1 BCF STATUS,RP0 RETURN
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 100 -
STOP BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,PEN BTFSC SSPCON2,PEN GOTO $-1 BCF STATUS,RP0 RETURN I2C_ENVIAR MOVWF SSPBUF BSF STATUS,RP0 BTFSC SSPSTAT,R_W GOTO $-1 BCF STATUS,RP0 RETURN I2C_LEER BCF PIR1,SSPIF BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,RCEN BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BSF STATUS,RP0 BCF SSPCON2,RCEN BCF STATUS,RP0 MOVF SSPBUF,w RETURN I2C_MAN_ACK BSF STATUS,RP0 BCF STATUS,RP1 BCF SSPCON2,ACKDT BSF SSPCON2,ACKEN BTFSC SSPCON2,ACKEN GOTO $-1 BCF STATUS,RP0 RETURN I2C_MAN_NO_ACK
BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,ACKDT BSF SSPCON2,ACKEN BTFSC SSPCON2,ACKEN GOTO $-1 BCF STATUS,RP0 RETURN
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 101 -
ORG 0x500 Fin_Modo_Auton ;Comparar si todos los servos estan en su destino, si es asi leer ;siguiente posicion
BCF STATUS,Z MOVF GR_DEST_SERVO1,w SUBWF GRADOS_SERVO1,w BTFSC STATUS,Z GOTO SEGUIR_LEER_1 GOTO Fin_Modo_Aut_1 SEGUIR_LEER_1 BCF STATUS,Z MOVF GR_DEST_SERVO2,w SUBWF GRADOS_SERVO2,w BTFSC STATUS,Z GOTO SEGUIR_LEER_2 GOTO Fin_Modo_Aut_1 SEGUIR_LEER_2 BCF STATUS,Z MOVF GR_DEST_SERVO3,w SUBWF GRADOS_SERVO3,w BTFSC STATUS,Z GOTO SEGUIR_LEER_3 GOTO Fin_Modo_Aut_1 SEGUIR_LEER_3 BCF PCLATH,0 CALL Leer_Memoria Fin_Modo_Aut_1 BCF PCLATH,0 BCF PCLATH,2 RETURN START_GRABACION BSF STATUS,RP0 BCF STATUS,RP1 BSF SSPCON2,ACKSTAT BCF STATUS,RP0 CALL START GOTO $+2 CALL RESTART MOVLW b'10100000' CALL I2C_ENVIAR BSF STATUS,RP0 BTFSC SSPCON2,ACKSTAT GOTO $-5 BCF STATUS,RP0 BCF PCLATH,0 RETURN org 0x600 decf WORD_ADDRESS,f decf WORD_ADDRESS,f decf WORD_ADDRESS,f call Delay_I2C call START movlw b'10100000' call I2C_ENVIAR movf WORD_ADDRESS,w
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 102 -
call I2C_ENVIAR call RESTART movlw b'10100001' call I2C_ENVIAR call I2C_LEER call I2C_MAN_NO_ACK call STOP incf WORD_ADDRESS,f incf WORD_ADDRESS,f incf WORD_ADDRESS,f
bcf PCLATH,1 return END