laboratorio de sistemas ... -...
TRANSCRIPT
RROOBBOOTT CCOONN CCOONNTTRROOLL RREEMMOOTTOO YY CCÁÁMMAARRAA DDEE VVÍÍDDEEOO IINNTTEEGGRRAADDAA
Laboratorio de Sistemas Electrónicos Digitales
AUTORESPABLO RODRÍGUEZ CABELLOS
EUGENIO SILLERO HERRERO
Robot con control remoto y cámara de vídeo integrada
ÍNDICE 1. INTRODUCCIÓN ....................................................................... 7
1.1. OBJETIVOS .........................................................................................7 1.2. DESCRIPCIÓN DEL ROBOT ...............................................................7
2. PROTOCOLOS DE COMUNICACIONES ............................... 14
2.1. EL NIVEL FÍSICO: ENLACE RADIOFRECUENCIA............................14 2.2. NIVEL DE ENLACE: LAPR .................................................................16 2.3. PROTOCOLO DE COMANDOS .........................................................18
2.3.1. ÓRDENES DE MOTORES ...............................................................................19 2.3.2. ÓRDENES DEL SISTEMA ...............................................................................20 2.3.3. ÓRDENES DE IMAGEN ...................................................................................20
2.4. PROTOCOLO DE DATOS..................................................................21 2.4.1. ESTADO DEL ROBOT .....................................................................................21 2.4.2. RECOMPONIENDO LA IMAGEN.....................................................................21
3. TARJETA DE CONTROL DE MOTORES............................... 24
3.1. DESCRIPCIÓN DEL HARDWARE .....................................................24 3.1.1. ALIMENTACIÓN ...............................................................................................24 3.1.2. SENSORES ......................................................................................................25 3.1.3. DRIVER DE MOTORES ...................................................................................27 3.1.4. PROCESADO ...................................................................................................29
3.2. DESCRIPCIÓN DEL SOFTWARE. .....................................................32 3.2.1. EQUIVALENCIAS Y VECTORES DE INTERRUPCIÓN ..................................32 3.2.2. RUTINA DE RESET..........................................................................................35 3.2.3. MODO AUTOMÁTICO......................................................................................37 3.2.4. MODO MANUAL...............................................................................................41 3.2.5. INTERRUPCIONES..........................................................................................44 3.2.6. SUBRUTINAS...................................................................................................47
4. TARJETA DE CONTROL PRINCIPAL.................................... 54
4.1. DESCRIPCIÓN DEL HARDWARE .....................................................54 4.1.1. ALIMENTACIÓN ...............................................................................................55 4.1.2. CONTROL DE ORIENTACIÓN DE LA CÁMARA ............................................55 4.1.3. INTERFAZ DE LA CÁMARA.............................................................................56 4.1.4. PROCESADO ...................................................................................................58
4.2. DESCRIPCIÓN DEL SOFTWARE......................................................60 4.2.1. EQUIVALENCIAS Y VECTORES DE INTERRUPCIÓN ..................................60 4.2.2. RUTINA DE RESET..........................................................................................62 4.2.3. RUTINAS DE CONFIGURACIÓN DE CÁMARA ..............................................64 4.2.4. EL PROGRAMA PRINCIPAL............................................................................68 4.2.5. ADQUISICIÓN DE DATOS...............................................................................69 4.2.6. LAS RUTINAS DE ENLACE .............................................................................70 4.2.7. EL NIVEL FÍSICO .............................................................................................78
5. HOST DE CONTROL REMOTO.............................................. 82
5.1. PLACA DE CONTROL........................................................................82 5.2. EL SOFTWARE ..................................................................................85 5.3. PAQUETE COM.THEEXBTEAM.COMM............................................86 5.4. PAQUETE COM.THEEXBTEAM.ROBOTS ........................................88
6. APÉNDICE A: INSTALACIÓN DEL SOFTWARE................... 92
- 2 -
Robot con control remoto y cámara de vídeo integrada
6.1. INSTALACIÓN DEL ENTORNO JAVA................................................92 6.2. INSTALACIÓN DE LAS LIBRERÍAS JAVAX.COMM...........................93 6.3. INSTALACIÓN DE LA APLICACIÓN DE CONTROL ..........................94 6.4. INSTALACIÓN DE JAKARTA-ANT.....................................................94
7. APÉNDICE B ESQUEMÁTICOS DE LAS PLACAS ............... 96
8. APÉNDICE F: AVISOS LEGALES.......................................... 99
8.1. PAQUETES COM.THEEXBTEAM.* ...................................................99 8.2. LIBRERÍAS JAVAX.COMM ................................................................99 8.3. TERCERAS PARTES.......................................................................100
9. BIBLIOGRAFÍA ..................................................................... 101
9.1. REFERENCIAS BIBLIOGRÁFICAS (POR HACER) .........................101 9.2. HOJAS DE CARACTERÍSTICAS Y RECURSOS EN LA RED ..........101 9.3. DIRECCIONES DE FABRICANTES Y PROVEEDORES..................102
- 3 -
Robot con control remoto y cámara de vídeo integrada
ÍNDICE DE ILUSTRACIONES Figura 1 Vista general del prototipo en madera del robot .............................8
Figura 2 Vista lateral del robot ......................................................................8
Figura 3 Detalle de la batería del robot.........................................................9
Figura 4 Tarjeta de control del robot y radio enlace......................................9
Figura 5 Frontal del robot con los bumpers de colisión ..............................10
Figura 6 Parte inferior del robot. .................................................................11
Figura 7 Detalle del bastidor delantero .......................................................11
Figura 8 Detalle de los sensores CNY70 del robot. ....................................12
Figura 9 Tarjeta de control de motores con todos los sensores conectados ...................................................................................12
Figura 10 Comunicación serie un bit de arranque, 8 de datos y uno de parada. .........................................................................................14
Figura 11 Módulo de radio frecuencia WIZ-434-SML-IA de Auriel ...............15
Figura 12 Esquema de las tramas de comandos. ........................................17
Figura 13 Esquema de las tramas de ACK de comando. .............................17
Figura 14 Esquema de las tramas de estado ...............................................18
Figura 15 Esquema de las tramas de píxeles de imágenes. ........................18
Figura 16 Detalle de la trama de datos de estado ........................................21
Figura 17 Gráfico del proceso de cálculo de la fila y columna de imagen......................................................................................................22
Figura 18 Esquema de la tarjeta de control de motores. ..............................24
Figura 19 Sistema de alimentación de la tarjeta de control de motores. ......25
Figura 20 Polarización de los sensores CNY70. ..........................................26
Figura 21 Conexión de los sensores CNY70................................................26
Figura 22 Polarización de los bumpers.........................................................27
Figura 23 Conexión de los bumpers. ............................................................27
Figura 24 Esquema del driver de motores....................................................28
Figura 25 Conexiones del microcontrolador. ................................................29
Figura 26 Interfaz del programación AVR.....................................................30
Figura 27 Circuito de reset. ..........................................................................30
Figura 28 Lógica de adaptación para la interrupción mecánica....................31
Figura 29 Esquema de la tarjeta de control principal....................................54
Figura 30 Sistema de orientación de la cámara. ..........................................56
Figura 31 Cámara digital M64282FP............................................................57
- 4 -
Robot con control remoto y cámara de vídeo integrada
Figura 32 Interfaz de la tarjeta principal con la cámara. ...............................57
Figura 33 Asignación de terminales de la cámara digital al bus de datos ....58
Figura 34 Conexiones del microcontrolador. ................................................58
Figura 35 Detalle del registro de estado COMM...........................................69
Figura 36 Esquema de funcionamiento de los codificadores de enlace .......72
Figura 37 Placa de control del host ..............................................................82
Figura 38 Detalle del adaptador MAX232.....................................................83
Figura 39 Detalle de la conexión con la tarjeta de radio frecuencia .............83
Figura 40 LEDs de la placa de control..........................................................84
Figura 41 Pines de contacto de la tarjeta de radiofrecuencia WIZ-434-SML-IA..........................................................................................85
Figura 42 Diagrama UML del paquete com.theexbteam.comm....................87
Figura 43 Diagrama UML del paquete com.theexbteam.robots ...................89
Figura 44 Aspecto de la interface gráfica de usuario....................................91
Figura 45 Logotipo del lenguaje de programación Java de Sun Microsystems................................................................................92
Figura 46 Logotipo del proyecto APACHE ANT ...........................................92
- 5 -
Robot con control remoto y cámara de vídeo integrada
ÍNDICE DE TABLAS Tabla 1. Pila de protocolos. ........................................................................14
Tabla 2. Configuración de velocidad de las tarjetas WIZ-SML-IA. .............15
Tabla 3. Comandos de motores .................................................................19
Tabla 4. Comandos del sistema .................................................................20
Tabla 5. Comandos de imagen ..................................................................20
- 6 -
Robot con control remoto y cámara de vídeo integrada
1. INTRODUCCIÓN
1.1. OBJETIVOS La práctica se compone de un robot motorizado con dos
servomotores, manipulados para funcionar como motores de continua con
caja reductora, y un sistema de adquisición de vídeo usando una cámara
CCD de 128x128 píxeles monocroma. El sistema está controlado
remotamente por un PC y una aplicación que recibirá las imágenes
capturadas por la cámara del robot y transmitirá las órdenes de
desplazamiento al robot.
El enlace se realiza mediante una tarjeta de radiofrecuencia half-
duplex de 100 kbps de la casa AURºEL. El enlace se controla desde un
PC por el puerto serie, estableciendo una comunicación directa con el
robot.
El robot está gobernado por una tarjeta con un microcontrolador
ATMEL AT90S8515 que se comunica con el PC del usuario, adquiere
datos desde la cámara y puede controlar otra tarjeta similar que conforma
el sistema de control motriz. Esta segunda tarjeta hace funcionar al robot
como un seguidor de línea al incorporar los sensores necesarios. Sin
embargo, el sistema motriz puede ser controlado por el usuario en un
modo de ejecución especial.
La microcámara que se emplea es el modelo M64282FP Artificial
Retina de Mitsubishi Electric o similares. Se orienta mediante un
servomotor a pesar de que el sistema tiene capacidad para controlar dos.
El objetivo buscado es la creación de un robot multifunción,
fácilmente reprogramable. Para ello se ha querido desarrollar una
plataforma multiuso con varios modos de ejecución, así cómo unas
librerías software para la comunicación vía radio y control del sistema.
1.2. DESCRIPCIÓN DEL ROBOT Como se ha descrito antes el robot consta de distintas placas que se
montan sobre una estructura común. Se ha buscado crear un soporte
robusto y compacto para albergar los distintos sistemas del robot.
- 7 -
Robot con control remoto y cámara de vídeo integrada
La estructura es de madera por su fácil manejo y poco peso. En la
parte superior del robot se colocan la batería, la tarjeta de radio, la tarjeta
principal y el sistema de la cámara. En la parte inferior se colocan los
motores y soportes necesarios así como la tarjeta de control de motores y
un bastidor en el que se hayan los sensores CNY70 encargados de la
detección de la línea.
Figura 1 Vista general del prototipo en madera del robot
Figura 2 Vista lateral del robot
- 8 -
Robot con control remoto y cámara de vídeo integrada
La batería utilizada es una batería típica para aplicaciones de
radiocontrol. Es una batería de Ni-Ca con una tensión nominal de 7,2V.
Se ha elegido esta batería por su tamaño y por su durabilidad.
Proporciona potencia suficiente para alimentar todos los sistemas del
robot.
Figura 3 Detalle de la batería del robot
La tarjeta de radio principal forman
el ce
, la cámara y la tarjeta de control
rebro del robot y se describen intensivamente en otros apartados.
Ocupan la parte superior del robot para facilitar el acceso a ellas. La
tarjeta de control tiene varias interfaces. A parte de los distintos
conectores para comunicarse con la tarjeta de radio, la de control de
motores y la cámara dispone de una interfaz de programación integrada.
Figura 4 Tarjeta de control del robot y radio enlace
- 9 -
Robot con control remoto y cámara de vídeo integrada
También dispone de unos LEDs de indicación y un pulsador de reset.
Los LEDs se utilizan para notificar que la alimentación está encendida,
que la programación del microcontrolador está en curso o que se ha
activado una traza de depuración.
En la parte superior delantera también se colocan los sensores de
detección de colisión frontal.
Figura 5 Frontal del robot con los bumpers de colisión
En la parte inferior se colocan los motores sujetos por abrazaderas.
Son dos servomotores manipulados para funcionar como motores de
corriente continua con caja reductora. Los dos motores junto con una
rótula adherida a un zócalo forman el sistema motriz y de apoyo de robot.
- 10 -
Robot con control remoto y cámara de vídeo integrada
Figura 6 Parte inferior del robot.
En la parte inferior también se colocan los sensores de colisión
trasera y los de detección de línea. Los sensores de detección de línea se
colocan en un bastidor ajustable en altura mediante unas gomas. Esto se
debe a que estos sensores tienen que estar cerca de la superficie a
explorar para proporcionar medidas fiables. Además el bastidor impide
que una luz ambiente excesiva induzca ruido en las lecturas.
Figura 7 Detalle del bastidor delantero
La colocación de los sensores se hace de forma que haya dos
sensores centrales que deben estar al mismo tiempo sobre la línea. Los
dos sensores laterales se colocan ligeramente retrasados con respecto a
los otros. Con esta colocación se consigue que si el robot se sale en una
- 11 -
Robot con control remoto y cámara de vídeo integrada
curva por la inercia los sensores laterales sigan detectando la línea. En
este caso el robot deberá intensificar el giro para volver a la situación
deseada. Al estar estos dos sensores retrasados se maximiza la
probabilidad de que sigan detectando la línea si el robot se sale en una
cuerva.
Figura 8 Detalle de los sensores CNY70 del robot.
La tarjeta de control de motores se coloca en el espacio libre bajo el
robot. Consta de dos puertos de sensores, uno para los CNY70 (sensores
de línea) y otro para los bumpers (sensores de colisión). También dispone
de puertos para los motores y para comunicarse con la tarjeta principal.
Los otros dos puertos son el de programación y el de expansión. Este
último no se usa en esta aplicación y el primero es exactamente igual al
de la tarjeta principal.
Figura 9 Tarjeta de control de motores con todos los sensores conectados
En cuanto a la interfaz con el usuario se refiere, a los LEDs de
indicación de la otra tarjeta se añade uno más. También incorpora un
nuevo pulsador, el de marcha. El nuevo LED indica que el sistema motriz
se ha iniciado y está listo para arrancar. Cuando se enciende este LED el
- 12 -
Robot con control remoto y cámara de vídeo integrada
robot espera a que el usuario pulse el botón de marcha para arrancar. El
sistema aplica un retardo antes de moverse para que el usuario pueda
apartar la mano.
- 13 -
Robot con control remoto y cámara de vídeo integrada
2. PROTOCOLOS DE COMUNICACIONES Se han definido dos protocolos de comunicaciones: uno para cada una de
las funciones principales del sistema, el control remoto del robot y el envío de
los datos al control remoto.
La pila de protocolos empleada es la siguiente:
Niveles Protocolos
RESTO END TO END APPLICATION
ENLACE LAPR
FÍSICO RS-232/TTLoRF
Tabla 1. Pila de protocolos.
Dado que solamente existe comunicación con una única unidad remota y
un único host controlador no hace falta especificar ningún sistema de
direccionamiento.
El nivel de enlace lleva a cabo las tareas de entramado, separación de los
distintos protocolos de comunicaciones y en el caso del protocolo de
comandos, asegurar que todos los datos enviados llegan a su destino, tal
como se detalla seguidamente.
2.1. EL NIVEL FÍSICO: ENLACE RADIOFRECUENCIA
La comunicación se lleva a cabo mediante una interface serie con
ocho bits de datos, uno de inicio y otro de parada a través de un enlace
de radiofrecuencia.
Figura 10 Comunicación serie un bit de arranque, 8 de datos y uno de parada.
Este enlace lo realizan las tarjetas Auriel WIZ-434-SML-IA y exige
una fragmentación de datos de 96 bytes por paquete, brindando un canal
de comunicaciones half-duplex de cadencia 100 kbps. Emplea la banda
- 14 -
Robot con control remoto y cámara de vídeo integrada
libre de los 433 MHz para mandar los datos mediante una modulación 2-
FSK.
Figura 11 Módulo de radio frecuencia WIZ-434-SML-IA de Auriel
La interface entre la tarjeta de radiofrecuencia y el host destinatario
se realiza a una tasa binaria configurable entre los 9600 bps y los 115200
bps, siendo esta última cifra la empleada en nuestro sistema dada la alta
tasa de datos que se envían desde la unidad remota hacia el host de
control. La tasa binaria se configura mediante los switches 1 y 2 según la
tabla siguiente:
DS1 DS2 VELOCIDAD (bps) Abierto Abierto 9600 Abierto Cerrado 19200 Cerrado Abierto 57600 Cerrado Cerrado 115200
Tabla 2. Configuración de velocidad de las tarjetas WIZ-SML-IA.
La tarjeta de radiofrecuencia se pone automáticamente a modular la
información a transmitir transcurrido un tiempo igual a 1,5 veces el
período de byte, T:
bout v
TT 82·23·
23 +
==
Para nuestro caso, dado que transmitimos a una cadencia de
115200 bps, resulta:
sTout µ130≈
- 15 -
Robot con control remoto y cámara de vídeo integrada
Sin embargo, según indican las hojas de características del
fabricante, el mínimo tiempo de guarda es de 500µs, que es el Tout que se
usará.
Finalmente, la tarjeta de radiofrecuencia tarda un tiempo Tmod en
modular un paquete de N bytes igual a:
,156.0)·2(6.3mod msNmsT ++=
durante el cual no se puede mandar ningún dato a la tarjeta, pues
ésta los descarga automáticamente. El fabricante recomienda guardar
como precaución unos pocos milisegundos más antes de mandar el
siguiente paquete de datos, por lo que se ha tomado un valor de tiempo
de seguridad adicional de 2ms.
El módulo WIZ-SML-IA proporciona además capacidad de detección
de errores, activando el switch 3, entrega únicamente los datos si éstos
han pasado satisfactoriamente el checksum al que son sometidos. Para
nuestro caso, hemos usado esta característica para evitar sobrecargar el
microprocesador principal.
2.2. NIVEL DE ENLACE: LAPR
La información que se debe transferir a través del enlace
radiofrecuencia puede ser de dos tipos: órdenes o comandos y datos de
estado o imágenes. Dado que sólo se dispone de un único canal se
precisa de una multiplexación en el tiempo para poder transmitir toda esta
información y no tener problemas de mala interpretación.
Por ello se define el protocolo de enlace LAPR (Link Access Protocol
for Robots.) Este protocolo ofrece dos tipos de servicio, cada uno
orientado a cubrir las necesidades de envío de comandos o de datos. Las
tramas de bits se transmiten con un separador de trama, que es el byte
01111110 (126 en decimal) seguido de la cabecera identificadora de
servicio, la cabecera de control y los datos a enviar.
Cada servicio se identifica a través de un único bit LSAPID (Link
Service Access Point Identifider.) Así:
- 16 -
Robot con control remoto y cámara de vídeo integrada
• LSAPID 0 Servicio de Comandos. Este servicio es un servicio
orientado a conexión fiable y confirmado. Se emplea para transmitir
desde el host de control a la unidad remota las órdenes, y por ello cada
orden es confirmada por el robot enviando una trama de ACK de
Comando:
Envío de Comando:
01111110 LSAPID 0 C FR ID COMANDO 7 0 7 6 5 0 7 0
Byte 0 Byte 1 Byte 2
Figura 12 Esquema de las tramas de comandos.
Para enviar un comando, la cabecera de control deberá incluir
su bit más significativo puesto a cero, seguido de cinco bits que
indican el identificador de trama (C FR ID.) El siguiente byte es el
comando a transmitir. Los dos últimos bytes, al ser ‘datos’, son
codificados para evitar que cadenas de la forma 01111110 se
confundan con separadores de trama, pudiendo llegar a ocupar, a
nivel físico 4 bytes el envío (sin contar con los bits de arranque y
parada.) Así, la ventana de transmisión de comandos queda con un
tamaño de 64 comandos, permitiendo ráfagas de hasta 64 órdenes.
En la implementación del software de control, la ventana no se
desplaza hasta haber recibido los ACKs de todos los comandos
recibidos.
Este servicio reenvía automáticamente los comandos no
confirmados hasta que sean confirmados, o bien se envíe el
comando reservado 0xFF de sincronización (función de
inicio/sincronización de la conexión.)
Envío de ACK de Comando:
01111110 LSAPID 1 C FR ID 7 0 7 6 5 4
Byte 0 Byte 1
Figura 13 Esquema de las tramas de ACK de comando.
Para confirmar un comando, el servicio 0 de enlace manda
automáticamente una trama compuesta por el separador de trama,
el LSAPID 0 y en la cabecera de control, el bit más significativo (ACK)
- 17 -
Robot con control remoto y cámara de vídeo integrada
activo, seguido de los cinco bits del ID de trama. Los ACKs se
envían siempre que, o bien se haya recibido un comando con
FRAME ID igual al esperado o bien se haya recibido un comando ya
recibido anteriormente, y que por tanto, el hueco de la ventana de
recepción correspondiente a su FRAME ID contenga dicho comando.
• LSAPID 1 Servicio de Datos. Este servicio es un servicio no
orientado a conexión fiable y no confirmado. Independientemente de
que el host remoto esté escuchando, el robot transmite continuamente
el estado de la unidad y, salvo orden expresa del host de control, los
datos de la cámara. Como se puede transmitir tanto el estado como
píxeles de la cámara se sigue el siguiente criterio:
Envío de Estado:
01111110 LSAPID 0 IHB GL 7 0 7 6 5 4 3 2 1 0
Byte 0 Byte 1
Figura 14 Esquema de las tramas de estado
Donde se disponen de seis bits para los datos de estado. En el
apartado “Protocolo de datos” se explica detalladamente el uso de
cada uno de ellos.
Envío de Píxeles de Imágenes:
01111110 LSAPID 1 I ROW# PIXELES(…) 7 0 7 6 5 0 7 0
Byte 0 Byte 1 Byte 2,3…
Figura 15 Esquema de las tramas de píxeles de imágenes.
La cabecera de control incluye en sus seis bits menos
significativos los seis menos significativos de la fila a la que
pertenecen los píxeles que se reciben. La recomposición de la
imagen se detalla en el apartado “Protocolo de datos.”
2.3. PROTOCOLO DE COMANDOS
La implementación del protocolo de comandos destina un byte para
el envío de comandos, permitiendo el uso de hasta 256 órdenes distintas.
Las órdenes se dividen en tres tipos: mecánicas o de motores, de sistema
o de imagen.
- 18 -
Robot con control remoto y cámara de vídeo integrada
2.3.1. ÓRDENES DE MOTORES Las órdenes de motores se enmascaran con los dos bit más
significativos puestos a cero (00xxxxxx.) Se han definido catorce
órdenes de movimiento distintas que recogen todas las posibilidades
que se pueden realizar con los dos motores principales del robot.
Estas órdenes, con la máscara 0000xxxx se envían directamente
desde la tarjeta de control principal del robot hacia la tarjeta de
control de motores, que automáticamente pasa al modo manual.
Asimismo, la orden 1410 = 0x0E, de ‘MODO_AUTOMÁTICO’
no se envía a la tarjeta de control de motores. En vez de ello, lo que
se hace es poner el bit “MODE” (PC5) a 0 (automático.)
El conjunto de comandos de motores es el siguiente:
Nombre HEX Descripción Recto 0x00 Desplazamiento hacia delante. Giro Derecha 0x01 Gira a la derecha. Giro Izquierda 0x02 Gira a la izquierda. Marcha Atrás 0x03 Desplazamiento hacia atrás. Desvío Derecha 0x04 Desplazamiento hacia delante y la
derecha. Desvío Izquierda 0x05 Desplazamiento hacia delante y la
izquierda. Gira Derecha Trasero 0x06 Desplazamiento hacia atrás y la
derecha. Gira Izquierda Trasero 0x07 Desplazamiento hacia atrás y la
izquierda. Acelerar 0x08 Aumentar la velocidad global. Reducir 0x09 Decrementar la velocidad global. Busca Línea Y Para 0x0a Busca la línea y para los motores. Rota Derecha 0x0b Rotación (mueve dos motores) a la
derecha Rota Izquierda 0x0c Rotación (mueve dos motores) a la
izquierda No Definido 0x0d No definido Modo Automático 0x0e Pasa a modo automático de
seguimiento de líneas. Paro Total 0x0f Paro completo de los motores
Tabla 3. Comandos de motores
Todas las órdenes con máscara 00XXyyyy, con XX distinto de
00 e ‘y’ 0 ó 1 indistintamente no son procesadas actualmente, pero
se pueden implementar nuevos movimientos del robot.
- 19 -
Robot con control remoto y cámara de vídeo integrada
2.3.2. ÓRDENES DEL SISTEMA Actualmente existen únicamente dos comandos de sistema a
parte del comando reservado 0xff:
Nombre HEX Descripción Ping 0xC1 Petición de respuesta, para comprobar
si la unidad remota responde. System Reset 0xCF Reset completo de la tarjeta de control
del robot. RESERVADO 0xFF Conexión interna, no permitido su
envío. Tabla 4. Comandos del sistema
Las órdenes de sistema se enmascaran con los dos bits más
significativos puestos a uno.
2.3.3. ÓRDENES DE IMAGEN Las órdenes de imagen se emplean para controlar la cámara
digital basada en el chip M64282FP de Mitsubishi. Con estos
comandos se puede iniciar o detener la captura de imágenes,
cambiar los modos de captura o alterar el tiempo de exposición.
También gestiona los movimientos los servos de la cámara para
orientar la vista del robot. Se emplea la máscara 01xxxxxx para
diferenciarlos del resto de comandos.
Nombre HEX Descripción Mira Al Frente 0x40 Centra la vista al frente Mira a la derecha 0x41 Gira el servo horizontal a la derecha Mira a la izquierda 0x42 Gira el servo horizontal a la izquierda Mira arriba 0x43 Gira el servo vertical hacia arriba Mira abajo 0x44 Gira el servo vertical hacia abajo Inicia captura Activa la señal START de inicio de
captura. Reset cámara Reinicia la cámara con los valores por
defecto de la misma. Carga Registros 0x59 Carga los ocho registros de
configuración de la cámara. Fija Registro xxx 0x50-57 Fija como registro activo el contenido en
los tres bits menos significativos. Fija Dato Bajo xxxx 0x70-7f Fija los cuatro bits menos significativos
del registro activo como los cuatro bits menos significativos del comando
Fija Dato Alto xxxx 0x60-6f Fija los cuatro bits más significativos del registro activo como los cuatro bits menos significativos del comando.
Tabla 5. Comandos de imagen
- 20 -
Robot con control remoto y cámara de vídeo integrada
Las primeras cinco órdenes se envían directamente al
microcontrolador de servos basado en un PIC16F84. Se envían a
través de cuatro pines, soportando el PIC16F84 ampliaciones de
funciones con el puerto de expansión de cuatro contactos.
Para cargar un registro de la cámara con un byte dado,
primeramente se deberá fijar el registro activo mediante ‘Fija
Registro xxx.’ Seguidamente, se cargan, en orden indistinto la parte
baja y la parte alta del byte a cargar mediante ‘Fija Dato Bajo xxxx’ y
‘Fija Dato Alto xxxx.’ Finalmente se manda el comando ‘Carga
Registros’ para que se actualicen todos los registros de la cámara.
2.4. PROTOCOLO DE DATOS
2.4.1. ESTADO DEL ROBOT Los seis bits menos significativos del segundo byte de la trama
de datos de estado contienen distintos parámetros que monitorizan
el estado del robot:
01111110 LSAPID 0 IHB GL 7 0 7 6 5 4 3 2 1 0
Byte 0 Byte 1 Figura 16 Detalle de la trama de datos de estado
• IHB: bit 6, se pone a uno cuando el robot está transmitiendo las
filas mayores o iguales a 64 (64-127) de la imagen. Se emplea en
el gestor de imágenes para determinar la fila en la que almacenar
los datos de píxeles recibidos.
• 5-1: No usados en la implementación actual
• GL: bit 0, indica cuando está a uno que los sensores CNY70 de
la tarjeta controladora de motores han detectado la presencia de
la línea guía.
2.4.2. RECOMPONIENDO LA IMAGEN El software de gestión de imagen deberá encargarse de la
tarea de recomposición de la imagen a partir de los píxeles que
reciba del robot.
- 21 -
Robot con control remoto y cámara de vídeo integrada
Las tramas de datos de imagen son de longitud variable de
como mucho 96 bytes, y la cabecera contiene los seis bits menos
significativos de la fila a la que pertenecen los píxeles recibidos. La
cámara digital tiene una resolución de 128x128 píxeles y cada uno
de ellos se lee con una resolución de 256 niveles de gris. Al recibir
los datos, el software de gestión de cámara deberá ir alojando
consecutivamente los píxeles que reciba a partir de la posición de
columna cero y hasta alcanzar la posición de columna 127. La fila en
la que deberá guardar los datos se calcula tomando el bit de estado
IHB como bit más significativo y sumándole los seis bits menos
significativos contenidos en la cabecera de la trama de imagen:
[ ]0..52· 6 CABECERAIHBn fila +=
Para evitar problemas de desincronización entre el píxel
mandado por la unidad remota y el software de control se envía
siempre que se inicia la trama la información necesaria para poder
determinar si se ha pasado a enviar la información de la siguiente fila.
F A
s
lí
IL
LSAPID 1 I ROW# 7 6 5 0
Byte 1
LSAPID 0 IHB 7 6 5 4 3 2
Byte 1
COLUMNA
*26
Figura 17 Gráfico del proceso de cálcul
Finalmente, aunque la aplicació
i alcanza la columna 127, pasará a
nea, descartando todos los datos q
- 22 -
COLUMNA
FILA
GL 1 0
Aplicación de control
o de la fila y columna de imagen.
n de control reciba más datos,
utomáticamente a la siguiente
ue reciba hasta que vuelva a
Robot con control remoto y cámara de vídeo integrada
encontrar un inicio de trama de imagen con un valor de línea de
imagen válido.
Todas estas tareas las realiza de forma automática la clase
ImageCore del paquete com.theexbteam.robots que se describe en
la parte de la aplicación de control remoto.
- 23 -
Robot con control remoto y cámara de vídeo integrada
3. TARJETA DE CONTROL DE MOTORES
3.1. DESCRIPCIÓN DEL HARDWARE Esta tarjeta fue creada con la idea de independizar los sistemas
motrices y de detección de línea del control de la cámara y de la tarjeta
de radio. Esta tarjeta es como la de cualquier microrobot seguidor. Se
pueden diferenciar cuatro bloques en la tarjeta, alimentación, sensores,
driver de motores y procesado. El esquema de la tarjeta es el que
muestra la figura.
Title
Size Document Number Rev
Date: Sheet of
1 4.0
Tarjeta de control de motores para Robot LSED
A4
1 1Monday , June 23, 2003
D14DEP
R1470
U4A
7432
1
23
U1 L7805/TO220
VIN1
GND3
VOUT2
U4B
7432
4
56
J5PWR_IN
12
+ C3220uF
+C4100uF
C1100nF
C2100nF
U4D
7432
12
1311
+5V
+5V
R13220
U4C
7432
9
10
147
R8220
U2 L293
1A2
2A7
3A10
4A15
1/2EN1
3/4EN9
1Y 3
2Y6
3Y 11
4Y14
VCC116
VCC28
R9 47K
J6MOT1
12
J7MOT2
12
D11READY
R18470
+5V
+5V
+5V+7,2V
R231K
R19 10K
R20 10K+5V
+5VJ1
EXPAN
1234
J16
PROGRAMADOR
13579
246810
J4PWR_OUT
12
SW1RESET
SW2MARCHA
R1410K
R151K
R1610K
R171K
+5V +5V
C11100nF
C12100nF
R5 47K
+5V
J14
BUMPER3
1234
+5V
R10 10K
C6100nF
+7,2V
R11 10K
C10100nF
D12PROG
R21 470
+5V
+5V
D31N4001
+5V
D41N4001
D5
1N4001
D6
1N4001
J15
BUMPER4
1234
+C9100uF
D13DIODO_RST
Y1
8MHz C815pF
C715pF
U3 AT90S8515
RST9
XTAL218 XTAL119
GN
D20
OC1B29ALE 30
ICP31
VCC40
PC0/A8 21
PC1/A922
PC2/A10 23
PC3/A1124
PC4/A12 25
PC5/A1326
PC6/A14 27
PC7/A1528
PD0/RXD10
PD1/TXD 11
PD2/INT012
PD3/INT1 13
PD414
PD5/OC1A 15
PD6/WR16
PD7/RD 17
PB0/T01
PB1/T12
PB2/AIN03
PB3/AIN14
PB4/SS5
PB5/MOSI6
PB6/MISO7
PB7/SCK8
PA0/AD039
PA1/AD138
PA2/AD237
PA3/AD336
PA4/AD435
PA5/AD534
PA6/AD633
PA7/AD732
D7
1N4001
+7,2V
+7,2V
D8
1N4001
+7,2V
J12
BUMPER1
1234
J13
BUMPER2
1234
D91N4001
D10
1N4001
R22 10K
+7,2V
D1PWR_ON
R3470
J8
CNY1
1234
J10
CNY3
1234
J9
CNY2
1234
J3
TARJ_PPAL
12345678
J11
CNY4
1234
R12220
R4 47K
R6220
R7 47K
+5V
+5V
+5V
+5V
+5V
+5V
MODE
MOTAC2MOTAC3GOT_LINE
MOTAC0MOTAC1
MARCHA
8
BUMPER3
BUMPER4BUMP_TRAS
BUMP_TRAS
MODE
MOTAC3GOT_LINE
MOTAC0MOTAC1MOTAC2
EXP1
MOT1_DIR0
EXP2EXP3EXP4
BUMPER4
MOT1_DIR1MOT2_DIR0MOT2_DIR1
EXP1
BUMPER3
EXP2
EXP3EXP4
MARCHARESET
EN_MOT1
CNY2
EN_MOT2
MOSI
RST
CNY1
SCKMISO
CNY3
MOSI
CNY4
MISOSCK
MOT1_DIR0MOT1_DIR1
MOT2_DIR1MOT2_DIR0
INT_MEC
BUMPER1
BUMPER2
RESET
RESET
XTAL2
MODEINT_MEC
CNY1
EN_MOT1
CNY2
EN_MOT2
CNY3CNY4
BUMPER1BUMPER2BUMPER3BUMPER4
XTAL1XTAL2
XTAL1
Figura 18 Esquema de la tarjeta de control de motores.
Para un mayor detalle, véase la figura 2 del apéndice B.
3.1.1. ALIMENTACIÓN Este es un bloque fundamental pues la alimentación tiene que
estar muy estabilizada porque los motores son una fuente de ruido
impulsivo en las líneas de alimentación. La estabilización se
consigue separando la alimentación de los motores de la del resto
de la tarjeta.
- 24 -
Robot con control remoto y cámara de vídeo integrada
Los motores se alimentan directamente desde la batería de
7,2V. El resto de la tarjeta necesita una tensión de alimentación de
5V, lo que se consigue mediante el regulador L7805. La
estabilización se realiza filtrando la alimentación con unos
condensadores de capacidad elevada. Los filtrados críticos se han
de realizar antes y después del regulador y en la entrada de potencia
de los drivers de motores. Con este montaje el ruido impulsivo no
afecta al correcto funcionamiento del sistema. Los motores toman la
carga almacenada en los condensadores en los picos de tensión y
no de la batería por lo que se evitan caídas de tensión en la
alimentación de a lógica de control.
U1 L7805/TO220
VIN1
GND3
VOUT2
J5PWR_IN
12
+ C3220uF
+C4100uF
C1100nF
C2100nF
+5V+7,2V
J4PWR_OUT
12
D1PWR_ON
R3470
Figura 19 Sistema de alimentación de la tarjeta de control de motores.
3.1.2. SENSORES El robot ha de ser capaz de orientarse automáticamente. Para
la orientación deberá seguir una línea negra sobre un fondo blanco.
Adicionalmente se han de poder detectar posibles colisiones con
obstáculos.
Para poder seguir la línea se utilizan unos sensores de
infrarrojos tipo CNY70. Estos sensores integran un fotodiodo que
emite radiación infrarroja y un fototransistor que se polariza en
función de la radiación recibida. Si el sensor está sobre una
superficie negra la radiación emitida por el fotodiodo no se refleja y
el fototransistor está en situación de corte. Por el contrario, si el
sensor se posiciona sobre una superficie blanca el fototransistor
capta la radiación emitida por el fotodiodo.
La red para poder usar estos transistores es muy simple. Se
ha de polarizar el fotodiodo para que emita siempre con una
- 25 -
Robot con control remoto y cámara de vídeo integrada
potencia lo suficientemente alta para que la radiación pueda ser
detectada. El fototransistor también se ha de polarizar para que este
en la zona activa o en corte dependiendo de la luz incidente en la
base. Los niveles entregados por el transistor han de ser
compatibles con la lógica empleada. El esquema de polarización es
el que se muestra en la siguiente figura.
CNY70
2 314
R147K
R2220
+5V
+5V
Figura 20 Polarización de los sensores CNY70.
Con esta red se satisfacen los requisitos mencionados. Hay
que tener cuidado al conectar los sensores a la placa. El usuario se
ha de cerciorar de que la conexión al molex verifica el esquema de la
siguiente.
CNY70
2 314
+5V
+5V
J1
CNYx
1234
R2220
R1 47K
OUT
Figura 21 Conexión de los sensores CNY70.
La lectura del valor del CNY por el microcontrolador se realiza
por la línea out. Un valor 0 indica que el sensor está sobre la línea
negra, un valor 1 indica todo lo contrario.
Como medida de seguridad, para evitar dañar el sensor o
lecturas erróneas, las conexiones se han de aislar bien. En nuestro
caso se usó un aislante termoretráctil para aislar cada una de las
patas del sensor de las demás. También hay que destacar que los
- 26 -
Robot con control remoto y cámara de vídeo integrada
sensores se colocan en una pieza de madera que no deja pasar la
luz. Esto es importante porque contribuye a eliminar la luz ambiental
haciendo las lecturas más fiables.
Para poder detectar obstáculos en el camino se usaron unos
sensores tipo bumper. Estos elementos no son en realidad sensores
sino pulsadores en un encapsulado especial. La red de polarización
será por lo tanto muy simple y se corresponde a la mostrada en la
siguiente figura.
BUMPER
R110K
+5V
+5V
NC
NO
OUT
NC
NO
Figura 22 Polarización de los bumpers.
La conexión con los molex ha de ajustarse el esquema que se
muestra a continuación para que las lecturas sean correctas.
BUMPER
J1
BUMPERx
1234
R1 10K+5V
Figura 23 Conexión de los bumpers.
3.1.3. DRIVER DE MOTORES La tarjeta de control incluye el circuito de potencia necesario
para atacar el sistema motriz del robot. Los dos motores que
conforman este sistema se excitan a través de un circuito
denominado puente en H. Este tipo de circuitos permiten que los
niveles lógicos de la tarjeta controlen las grandes corrientes que
circulan por los devanados de los motores.
Se ha optado por un puente en H integrado que permite la
rotación en ambos sentidos de los dos motores, el L293. La
configuración elegida hace que cada motor se controla con tres bits,
dos para seleccionar el sentido de giro y otro para arrancarlo. Los
- 27 -
Robot con control remoto y cámara de vídeo integrada
bits para seleccionar el sentido de giro pueden parar el motor si
toman el mismo valor. Si toman distintos valores estos bits los
motores girarán en distintos sentidos. Para la misma combinación
cada uno de los motores gira en sentidos contrarios debido a su
orientación. El tercer bit se conecta a uno de los canales PWM del
microcontrolador para poder controlar la velocidad de giro. Este
control se realiza variando el ciclo de trabajo del PWM. El esquema
de este bloque es el de la figura siguiente.
U2 L293
1A2
2A7
3A10
4A15
1/2EN1
3/4EN9
1Y3
2Y6
3Y11
4Y14
VCC116
VCC28
J6MOT1
12
J7MOT2
12
+5V
C6100nF
+7,2V
C10100nF
D31N4001
D41N4001
D5
1N4001
D6
1N4001+C9
100uF
D7
1N4001
+7,2V
+7,2V
D8
1N4001
+7,2V
D91N4001
D10
1N4001
+7,2V
MOT1_DIR0MOT1_DIR1MOT2_DIR0MOT2_DIR1
EN_MOT1EN_MOT2
Figura 24 Esquema del driver de motores.
En el esquema se puede observar que la lógica se alimenta a
5 voltios mientras que los devanados de los motores se alimentan
directamente de las baterías. Se ha comentado ya que los motores
producen un ruido impulsivo por lo que hay que tener en cuenta esto.
Para este fin hay que filtrar la alimentación de la línea de potencia
del puente en H (condensador 9 en el esquema) y las conexiones de
los motores (condensadores 6 y 10 en el esquema).
Este ruido impulsivo puede además dañar los motores puesto
que la tensión de trabajo está ligeramente por encima de la nominal
de los motores. Esta situación provoca que los devanados de los
motores se puedan fundir si el ruido es demasiado fuerte. Para evitar
esto es necesario conectar unos diodos de protección que eviten las
oscilaciones de la tensión de alimentación y absorban los excesos
de corriente que dañarían los motores.
- 28 -
Robot con control remoto y cámara de vídeo integrada
3.1.4. PROCESADO Este bloque de la tarjeta tiene como finalidad coordinar el
funcionamiento de los bloques de sensores y driver de motores
además de realizar las órdenes recibidas de la tarjeta principal.
El núcleo de este bloque es el microcontrolador, como era de
esperar. Este se encarga de todo el procesado. En la figura 2.7 se
puede ver la disposición de los puertos.
D14DEP
R1470
D11READY
R18470
U3 AT90S8515
RST9
XTAL218 XTAL119
GN
D20
OC1B29ALE30
ICP31
VCC40
PC0/A821
PC1/A922
PC2/A1023
PC3/A1124
PC4/A1225
PC5/A1326
PC6/A1427
PC7/A1528
PD0/RXD10
PD1/TXD11
PD2/INT012
PD3/INT113
PD414
PD5/OC1A15
PD6/WR16
PD7/RD17
PB0/T01
PB1/T12
PB2/AIN03
PB3/AIN14
PB4/SS5
PB5/MOSI6
PB6/MISO7
PB7/SCK8
PA0/AD039
PA1/AD138
PA2/AD237
PA3/AD336
PA4/AD435
PA5/AD534
PA6/AD633
PA7/AD732
+5V
MODE
MOTAC2MOTAC3GOT_LINE
MOTAC0MOTAC1
MARCHA
BUMP_TRAS
EXP1EXP2
EXP3EXP4
MOSIMISOSCK
MOT1_DIR0MOT1_DIR1
MOT2_DIR1MOT2_DIR0
RESET
MODEINT_MEC
CNY1
EN_MOT1
CNY2
EN_MOT2
CNY3CNY4
BUMPER1BUMPER2BUMPER3BUMPER4
XTAL1XTAL2
Figura 25 Conexiones del microcontrolador.
Los sensores se conectan al puerto C. Este puerto no tiene
ninguna funcionalidad adicional por lo que no se sacrifican recursos
en la lectura de los sensores.
El control de la dirección de los motores se hace con los cuatro
bits menos significativos del puerto B. El bit 5 se usa como traza de
depuración, se le conecta un LED que el usuario puede encender
por software para controlar la ejecución del programa. El resto de los
bits de este puerto se utilizan para el programador serie. La interfaz
de este programador es la que especifica el fabricante para este
modelo. Su esquema se puede ver en la figura.
- 29 -
Robot con control remoto y cámara de vídeo integrada
J16
PROGRAMADOR
13579
246810
+5VD12
PROG
R21 470
+5V
D13DIODO_RST
R22 10K
MOSI
RSTSCKMISO
RESET
RST
RESET
Figura 26 Interfaz del programación AVR.
El LED PROG se ilumina mientras se esté programando el
microcontrolador. El otro diodo sirve para que el programador pueda
forzar un reset si pone RST a cero. Sin embargo en condiciones
normales el reset estará a nivel alto. El circuito completo que se
conecta a la pata de reset del microcontrolador es el que muestra la
siguiente figura.
D13DIODO_RST
R22 10K+5V
SW1RESET
R1410K
R151K
+5V
C12100nF
Figura 27 Circuito de reset.
Como se puede observar, mientras que el pulsador no se
presione o no se fuerce externamente RST a 0V, la señal de reset
estará a nivel alto. Sin embargo, en el momento en el que se pulse el
botón de reset hardware o se fuerce RST a 0V, la línea RESET
tomará un voltaje que el microcontrolador interpretará como nivel
bajo, ejecutándose la rutina de reset.
El puerto A se destina a la interacción con agentes exteriores.
Por agentes exteriores nos referimos al usuario o a la tarjeta
principal. Los dos bits más significativos se destinan a interactuar
con el usuario.
- 30 -
Robot con control remoto y cámara de vídeo integrada
Una vez se ha ejecutado la rutina de reset el robot queda en
espera hasta que la línea MARCHA (bit 6 del puerto A) toma un 0
lógico. Esta situación de espera se indica encendiendo el LED
READY (bit 7 del puerto A). Cuando el usuario presione el pulsador
MARCHA (ver figura 2.1) el robot empezará la ejecución del
programa de modo automático tras aplicar un retardo.
Los otros seis bits se utilizan para la comunicación entre
tarjetas. El bit cinco indica el modo en el que se tiene que ejecutar el
programa de motores. Si está a nivel alto el modo será el automático,
sino, será manual. El bit menos significativo lo activa el
microprocesador cuando se coloca sobre la línea al ejecutar la orden
de buscar y parar. El resto de los bits determinan el código de la
orden que debe ejecutar el robot en modo manual.
Al puerto D se conectan otras señales de control. Los bits 0, 1,
6 y 7 son bits de expansión y no se usan en esta aplicación. Los bits
2 y 3 son las interrupciones externas.
La interrupción 0 es la de modo, cuando MODE conmuta a
cero se dispara la interrupción y se pasa a ejecutar el modo manual.
La interrupción 1 se dispara cuando alguno de los dos bumpers
delanteros detecta un choque o el robot se separa de la línea. Sin
embargo, en esta aplicación en la tarjeta se a cortado la pista que
detecta que se ha separado de la línea. Para que la interrupción 1
funcione como se ha descrito es necesario añadir la siguiente lógica
de adaptación.
U4A
7432
123
U4B
7432
456
U4C
7432
9108
147
+5V
CNY2
CNY1
BUMPER2
BUMPER1
INT_MEC
Figura 28 Lógica de adaptación para la interrupción mecánica.
- 31 -
Robot con control remoto y cámara de vídeo integrada
El bit 4 le indica al microprocesador si ha habido una colisión
por detrás. Los otros dos bits que faltan por comentar son las salidas
de los canales PWM que son OC1A y OC1B.
3.2. DESCRIPCIÓN DEL SOFTWARE. El microcontrolador se ha programado íntegramente en lenguaje
ensamblador. El ensamblador elegido es el suministrado por ATMEL para
su familia de controladores AVR. En los siguientes apartados se
describen los distintos módulos del software de la tarjeta de control.
3.2.1. EQUIVALENCIAS Y VECTORES DE INTERRUPCIÓN Para poder variar los parámetros del programa cómodamente
sin producir errores se definen unas variables globales. Para esto se
definen distintos grupos de equivalencias.
El primer grupo de equivalencias se usa para poder trabajar
con los registros de entrada salida y configuración del
microcontrolador usando sus nombres y no sus direcciones. El
código es el sigue a continuación.
; Registros de entrada y salida
.EQU SREG = 0x3f
.EQU SPH = 0x3e
.EQU SPL = 0x3d
.EQU GIMSK = 0x3b
.EQU GIFR = 0x3a
.EQU TIMSK = 0x39
.EQU TIFR = 0x38
.EQU MCUCR = 0x35
.EQU TCCR0 = 0x33
.EQU TCNT0 = 0x32
.EQU TCCR1A = 0x2f
.EQU TCCR1B = 0x2e
.EQU TCNT1H = 0x2d
.EQU TCNT1L = 0x2c
.EQU OCR1AH = 0x2b
.EQU OCR1AL = 0x2a
.EQU OCR1BH = 0x29
.EQU OCR1BL = 0x28
- 32 -
Robot con control remoto y cámara de vídeo integrada
.EQU ICR1H = 0x25
.EQU ICR1L = 0x24
.EQU WDTCR = 0x21
.EQU PORTA = 0x1b
.EQU DDRA = 0x1a
.EQU PINA = 0x19
.EQU PORTB = 0x18
.EQU DDRB = 0x17
.EQU PINB = 0x16
.EQU PORTC = 0x15
.EQU DDRC = 0x14
.EQU PINC = 0x13
.EQU PORTD = 0x12
.EQU DDRD = 0x11
.EQU PIND = 0x10
Los parámetros principales con los que trabaja la tarjeta son
los ciclos de trabajo de los PWM y los bits de dirección de los
motores. Para poder ajustar fácilmente los valores de estos
parámetros se usa otro grupo de equivalencias.
;Constantes de velocidad y dirección para los motores
;Duty cycle = 80%
.EQU VEL_MAX = 0x0332
;Duty cycle = 40%
.EQU VEL_MED = 0x0199
;Duty cycle = 60%
.EQU VEL_MAX2 = 0x0266
;Duty cycle = 20%
.EQU VEL_MED2 = 0x0133
;Parada rápida
.EQU STOP = 0x00
;Marcha directa
.EQU GO = 0x06
;Giro a la izquierda
.EQU LEFT = 0x02
;Giro a la derecha
.EQU RIGHT = 0x04
;Marcha inversa
.EQU BACK = 0x09
;Rotación a la izquierda
- 33 -
Robot con control remoto y cámara de vídeo integrada
.EQU RLEFT = 0x0a
;Rotación a la derecha
.EQU RRIGHT = 0x05
Los últimos parámetros que conviene poder ajustar son los de
la rutina de retardo. Esto es necesario para controlar la distancia que
recorre el robot durante la interrupción de choque tal y como se verá
más adelante. Las equivalencias mencionadas se listan a
continuación.
;Constantes para la rutina de retardo
;Retardo por vuelta
.EQU RET_V = 0xff
;Número de vueltas
.EQU VUELTAS = 0xff
En el mismo archivo se incluye la tabla de vectores de
interrupción. Esta tarjeta solo debe procesar tres fuentes de
interrupción, que son la de reset y las dos externas. Si se dispara
cualquier otra interrupción se debe a un error por lo que el
microprocesador ha de ejecutar la rutina de reset para que el usuario
se percate de ello y depure el programa. La tabla se describe a
continuación.
.ORG 0x000
;Salto a rutina de reset
rjmp RESET
;Salto a rutina de cambio de modo
rjmp INT_MODE
;Salto a rutina de desvío o colisión
rjmp INT_MEC
;Si saltan estas interrupciones se debe a un error
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
- 34 -
Robot con control remoto y cámara de vídeo integrada
rjmp RESET
3.2.2. RUTINA DE RESET Esta rutina debe configurar el timer 1 para funcionar como un
PWM de dos canales, los sentidos (entrada o salida) de los puertos,
las fuentes de interrupción y el puntero de pila. Para esto el código a
ejecutar se puede consultar en las hojas del fabricante. El código
que se le ha cargado al robot es el aquí listado.
;Código de la rutina de reset
RESET:
clr r16
;Interrup. deshabilitadas
out SREG,r16
;Interrup. de los contadores deshabilitadas
out TIMSK,r16
ldi r16,0xc0
;Interrup. externas permitidas
out GIMSK,r16
ldi r16,0x0f
;Sin RAM externa ni modo SLEEP e interrup. por flanco positivo
out MCUCR,r16
ldi r16,0xa3
;Timer1 como PWM 10-bit no invertido
out TCCR1A,r16
ldi r16,0x02
;Frecuencia del timer1 es CLK/8
out TCCR1B,r16
clr r16
out OCR1AH,r16
out OCR1AL,r16
out OCR1BH,r16
;Ambos canales del PWM siempre a cero (Motores parados)
out OCR1BL,r16
;Timer0 parado
out TCCR0,r16
ldi r16,0x02
out SPH,r16
ldi r16,0x5f
- 35 -
Robot con control remoto y cámara de vídeo integrada
;SP al final de la RAM
out SPL,r16
ldi r16,0x81
ldi r17,0x5f
clr r18
ldi r19,0x20
;Configuración del puerto A
out DDRA,r16
;Configuración del puerto B
out DDRB,r17
;Configuración del puerto C
out DDRC,r18
;Configuración del puerto D
out DDRD,r19
Después de haber configurado el microcontrolador de acuerdo
con nuestras necesidades hay que notificárselo al usuario. Para esto
la tarjeta debe encender el LED de READY y quedarse en espera
hasta que se pulse el botón de MARCHA. Una vez pulsado se aplica
un retardo y comienza la ejecución del modo automático.
;Encendemos el LED de READY
sbi PORTA,7
ESP:
;Si MARCHA no está pulsado esperamos
sbic PINA,6
rjmp ESP
;Apagamos el LED de READY
cbi PORTA,7
;Aplicamos un retardo antes de arrancar
rcall RETARDO
rcall RETARDO
rcall RETARDO
;El robot siempre empieza en modo automático
rjmp AUTOMAT
En el momento en el que el robot se queda en espera activa
ejecuta dos instrucciones. La segunda de ellas, la que cierra el bucle,
se salta cuando la pista de marcha se pone a cero.
- 36 -
Robot con control remoto y cámara de vídeo integrada
3.2.3. MODO AUTOMÁTICO El modo automático es el modo de ejecución por defecto.
Cuando la tarjeta de control se haya en este modo el robot se
comporta como un microrobot seguidor normal. Esto quiere decir
que sigue un camino definido por una línea negra sobre un fondo
blanco.
Como se ha visto en los apartados anteriores el robot dispone
de cuatro sensores capaces de distinguir un fondo negro de otro
blanco. Estos sensores se disponen de tal forma que dos de ellos,
los centrales, deben estar siempre sobre la línea negra. Cuando se
produce alguna desviación se debe modificar la marcha de los
motores para recuperar la situación ideal. Adicionalmente, si se
detecta alguna colisión se ejecuta una interrupción que hace que el
robot rodee el obstáculo que la provocó. Sin embargo el código de
esta instrucción se explica en un apartado posterior.
El software correspondiente a este modo se divide en varios
sectores. El primero de ellos es el que se encarga de cargar lo
registros de velocidades con los valores que se van a utilizar,
habilitar las interrupciones y arrancar los motores. Los registros 20 y
21 tienen el valor de configuración del PWM para velocidad media y
los 22 y 23 para la rápida.
AUTOMAT:
ldi r20,HIGH(VEL_MED)
ldi r21,LOW(VEL_MED)
ldi r22,HIGH(VEL_MAX2)
ldi r23,LOW(VEL_MAX2)
;Habilitamos las interrupciones
sei
;Los registros 20 y 21 tienen el valor VEL_MED
;Los registros 22 y 23 tienen el valor VEL_MAX
;Arrancamos ambos PWM a velocidad media
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
- 37 -
Robot con control remoto y cámara de vídeo integrada
Después de haber hecho estos ajustes iniciales comienza el
bucle central del programa que lo único que hace es comprobar una
y otra vez lo que leen los sensores y actúa en consecuencia.
Primero se miran los dos sensores centrales.
BAUT:
;Leemos el puerto C
in r18,PINC
;Operaremos sobre el registro 24
mov r24,r18
;Ponemos a cero todos los bits menos el bit0 y el bit1
andi r24,0x03
;Si no estamos sobre la línea hay que girar
brne GIR1
ldi r17,GO
;Si estamos sobre la línea seguimos recto
out PORTB,r17
out OCR1AH,r22
out OCR1AL,r23
out OCR1BH,r22
;Fijamos la velocidad al máximo
out OCR1BL,r23
rjmp BAUT
GIR1:
;Ponemos a cero todos los bits menos el bit1
andi r24,0x02
;Si el bit1 no es cero hay que mirar el bit0
brne GIR2
;Si el bit1 es cero es que el bit 0 es 1
ldi r17,GO
;Seguimos hacia delante
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
;El lado de la derecha se ha quedado fuera de la línea
out OCR1BH,r22
;por lo que el motor izquierdo tiene que reducir
out OCR1BL,r23
;Ponemos el flag T a uno (desviados por la derecha)
- 38 -
Robot con control remoto y cámara de vídeo integrada
set
rjmp BAUT
GIR2:
mov r24,r18
;Ponemos a cero todos los bits menos el bit0
andi r24,0x01
;Si los bits 0 y 1 estaban a uno hemos perdido la línea
brne GIR3
;Si estamos aquí es que el bit0 era 0 y el bit1 era 1
ldi r17,GO
;Esto quiere decir que nos hemos desviado por la izquierda
out PORTB,r17
out OCR1AH,r22
out OCR1AL,r23
out OCR1BH,r20
;El motor derecho tiene que reducir
out OCR1BL,r21
;Ponemos el flag T a cero (desviados por la izquierda)
clt
rjmp BAUT
Se puede ver que si alguno de los dos sensores centrales veía
a la línea no se hacen más comprobaciones y se vuelve al bucle. En
el caso de que los sensores centrales hayan perdido la línea se
consultan los laterales.
GIR3:
;Tenemos que comprobar los CNY secundarios
mov r24,r18
;Comprobamos el valor del CNY4
andi r24,0x08
;Si este CNY no está sobre la línea seguimos comprobando
brne GIR4
;Si tenemos la línea bajo el CNY4 hay que girar a la izquierda
ldi r17,RIGHT
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
- 39 -
Robot con control remoto y cámara de vídeo integrada
;Ambos motores reducen la marcha
out OCR1BL,r21
;Ponemos el flag T a uno (desviados por la derecha)
set
rjmp BAUT
GIR4:
mov r24,r18
;Comprobamos el valor del CNY3
andi r24,0x04
;Si no tenemos línea en ningún CNY hay que buscarla
brne ROT
;Si tenemos la línea bajo el CNY3 hay que girar a la derecha
ldi r17,LEFT
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
;Ambos motores reducen la marcha
out OCR1BL,r21
;Ponemos el flag T a cero (desviados por la izquierda)
clt
rjmp BAUT
Puede parecer cuando se quiere girar a la derecha se use la
variable LEFT es una incongruencia. Sin embargo, la variable LEFT
indica que el motor derecho se para y el izquierdo sigue avanzando.
Finalmente si se ha perdido la línea por completo se debe parar el
robot y girar sobre sí mismo hasta encontrarla. Es posible que el
lector se haya percatado que en las comprobaciones anteriores se
almacena en el bit T del registro de estado el flanco bajo el cual fue
vista la línea por última vez. El robot rotará en el sentido que indique
este bit.
ROT:
;Antes de invertir los motores hay que pararlos
ldi r17,STOP
;(1 useg aprox.)
out PORTB,r17
brtc ROT2
- 40 -
Robot con control remoto y cámara de vídeo integrada
;Si estamos desviados por la derecha hay que rotar hacia la izquierda
ldi r17,RRIGHT
rjmp RT
ROT2:
;Si no hay que rotar hacia la derecha
ldi r17,RLEFT
RT:
out PORTB,r17
;Ambos motores reducen la marcha
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
rjmp BAUT
Algo que es muy importante y que el usuario ha de tener en
cuenta es que hay que parar los motores antes de invertirlos.
Aunque en el momento de invertir los motores estos sigan girando
en la dirección anterior no es problemático. En este caso se
produciría un pico de tensión, que es lo que queremos evitar, pero
será mucho menos intenso que si invertimos la marcha con los
motores alimentados. Por este motivo es de gran importancia pasar
por el estado de parada rápida antes de cambiar el sentido de giro
de los motores.
Otro comentario de utilidad e que al leer de los puertos
externos (in rxx,PINX) hay que usar el registro PINX porque si se
usara PORTX la lectura sería incorrecta. Este detalle no viene
especificado en la descripción del microcontrolador y supuso un fallo
en tiempo de ejecución que nos hizo perder mucho tiempo hasta dar
con él .
3.2.4. MODO MANUAL La rutina de motores del robot se puede ejecutar en modo
manual. El usuario envía órdenes que decodifica la tarjeta principal y
se lo notifica a la de control.
- 41 -
Robot con control remoto y cámara de vídeo integrada
La tarjeta de control sabe en qué modo está por el estado de la
pista MODE. Si esta pata está a cero el modo ha de ser el
automático. Un flanco de subida en esta pata provoca una
interrupción de cambio de modo. En la rutina manual el
microcontrolador ha de leer constantemente el puerto A para ver la
instrucción a ejecutar. Al final del bucle ha de comprobar el estado
de MODE para seguir en modo manual o cambiar al modo
automático.
Antes de ejecutar el bucle central de la rutina no hay que hacer
ningún ajuste puesto que todos los cambios los controla el usuario.
Primero se ha de leer la orden y calcular la posición de la tabla de
órdenes a la que se ha de saltar. Como el microcontrolador no tiene
modo indexado hay que sumar el índice, multiplicado por dos, a la
base de la tabla antes del salto.
;Código para el modo manual
MANUAL:
in r16,PINA
lsr r16
;Leemos la orden a los motores
andi r16,0x0f
;Multiplicamos por dos
lsl r16
;Utilizamos el registro z para guardar un offset al que sumamos el número de orden multiplicado por dos para calcular la siguiente instrucción a procesar
ldi r30,LOW(OFFST)
ldi r31,HIGH(OFFST)
add r30,r16
ijmp
Cada celda de la tabla contiene dos instrucciones, por eso hay
que multiplicar el índice por dos. Estas instrucciones son una
llamada a la subrutina asociada a cada orden y un salto a las
comprobaciones finales.
OFFST:
;La orden 0x0 es seguir recto
rcall RECTO
- 42 -
Robot con control remoto y cámara de vídeo integrada
rjmp CMD
;La orden 0x1 es giro derecha
rcall GD1
rjmp CMD
;La orden 0x2 es giro izquierda
rcall GI1
rjmp CMD
;La orden 0x3 es dar marcha atrás
rcall ATRAS
rjmp CMD
;La orden 0x4 es desvio derecha
rcall GD0
rjmp CMD
;La orden 0x5 es desvio izquierda
rcall GI0
rjmp CMD
;La orden 0x6 es giro derecha trasero
rcall GD2
rjmp CMD
;La orden 0x7 es giro izquierda trasero
rcall GI2
rjmp CMD
;La orden 0x8 es acelerar
rcall ACLR
rjmp CMD
;La orden 0x9 es reducir
rcall FRNR
rjmp CMD
;La orden 0xa es buscar línea y parar
rcall BUSCL
rjmp CMD
;La orden 0xb es rotar hacia la izquierda
rcall ROTI
rjmp CMD
;La orden 0xc es rotar hacia la derecha
rcall ROTD
rjmp CMD
;La orden 0xd no está definida
rcall ERR
rjmp CMD
- 43 -
Robot con control remoto y cámara de vídeo integrada
;La orden 0xe no está definida
rcall ERR
rjmp CMD
;La orden 0xf es parar el robot
rcall PARA
Al final del bucle se actualiza el bit T tal y como se explica en
la rutina automática. Esto se hace para mantener una referencia de
la línea. Finalmente, tras comprobar el estado de MODE se vuelve a
saltar al programa correspondiente.
CMD:
in r16,PINA
;Actualizamos el flag T
rcall FLG
;Comprobamos el flag de MODE (PA5)
andi r16,0x20
;Si seguimos en modo manual volvemos al bucle
brne MANUAL
rjmp AUTOMAT
3.2.5. INTERRUPCIONES Las dos interrupciones que se han de comentar son las
debidas a fuentes externas puesto que la de reset se explica en otro
apartado. Estas fuentes pueden indicar un cambio de modo o una
colisión.
El código de la interrupción de cambio de modo es muy
sencillo. Simplemente saca de la pila la dirección de retorno y la
cambia por la de la rutina manual. También para el motor para que
se ejecute la orden que ha provocado la interrupción.
;Código de la interrupción de cambio de modo
INT_MODE:
ldi r17,STOP
;Paramos el robot
out PORTB,r17
pop r27
pop r28
;Modificamos la dirección de retorno para que se ejecute el programa manual
ldi r27,HIGH(MANUAL)
- 44 -
Robot con control remoto y cámara de vídeo integrada
ldi r28,LOW(MANUAL)
push r28
push r27
reti
La otra interrupción es un poco más complicada. Primero se
comprueba que los bumpers siguen presionados, no sea que el
obstáculo se ha desplazado y ha liberado a los bumpers. De todas
formas esta situación es poco probable puesto que entre la
activación de la interrupción y la comprobación pasa un tiempo muy
pequeño. Después de esto, el robot da marcha atrás y aplica un
retardo suficiente para apartarse del obstáculo.
;Código de la interrupción de colisión
INT_MEC:
push r24
push r18
in r18,PINC
mov r24,r18
;Si los bumpers delanteros están sin presionar
andi r24,0x30
;Terminamos con la interrupción
breq FIN
push r17
ldi r17,STOP
;Paramos antes de invertir
out PORTB,r17
push r20
push r21
ldi r20,HIGH(VEL_MED)
ldi r21,LOW(VEL_MED)
;Damos marcha atrás
ldi r17,BACK
out PORTB,r17
;Ponemos los motores a velocidad alta
out OCR1AH,r22
out OCR1AL,r23
out OCR1BH,r22
out OCR1BL,r23
rcall RETARDO
rcall RETARDO
- 45 -
Robot con control remoto y cámara de vídeo integrada
rcall RETARDO
rcall RETARDO
rcall RETARDO
rcall RETARDO
rcall RETARDO
rcall RETARDO
rcall RETARDO
rcall RETARDO
;Paramos antes de invertir
ldi r17,STOP
out PORTB,r17
Después de esto comprueba cual de los dos bumpers golpeó
el obstáculo y gira en consecuencia. Si fueron ambos bumpers los
que golpearon lo que hace es rotar. Después de esto el robot que da
parado. La rutina principal, sea la manual o automática, se
encargará de determinar el siguiente movimiento del robot.
;Comprobamos el valor del bumper1
andi r24,0x10
;Si está a cero el bumper2 está pulsado
brne BP1
;Si hemos chocado por la izquierda giramos a la derecha
ldi r17,RIGHT
out PORTB,r17
rcall RETARDO
ldi r17,STOP
;Paramos después de esquivar
out PORTB,r17
;Hemos terminado
rjmp TER
BP1:
mov r24,r18
;Comprobamos el valor del bumper 2
andi r24,0x20
;si está a cero bumper1 está pulsado
brne BP2
;Si hemos chocado por la derecha giramos a la izquierda
ldi r17,LEFT
out PORTB,r17
- 46 -
Robot con control remoto y cámara de vídeo integrada
rcall RETARDO
ldi r17,STOP
;Paramos después de esquivar
out PORTB,r17
;Hemos terminado
rjmp TER
BP2:
;Colisión frontal
brtc ESQ2
;Si estamos desviados por la derecha hay que rotar hacia la izquierda
ldi r17,RLEFT
rjmp ESQ
ESQ2:
;Si no hay que rotar hacia la derecha
ldi r17,RRIGHT
ESQ:
out PORTB,r17
rcall RETARDO
ldi r17,STOP
;Paramos después de esquivar y terminamos
out PORTB,r17
TER:
pop r21
pop r20
pop r17
FIN:
;Recuperamos registros y terminamos
pop r18
pop r24
reti
3.2.6. SUBRUTINAS Las subrutinas asociadas a las órdenes del modo manual se
agrupan en un archivo. Estas subrutinas son, en su mayoría, para
avanzar, parar o girar y su código es el mismo que se utiliza en el
resto del programa. Por esta razón no hay mucho que comentar
sobre estas subrutinas. Su código se muestra a continuación.
RECTO:
ldi r17,GO
- 47 -
Robot con control remoto y cámara de vídeo integrada
;El robot irá recto a toda velocidad
out PORTB,r17
out OCR1AH,r22
out OCR1AL,r23
out OCR1BH,r22
out OCR1BL,r23
ret
GD1:
ldi r17,RIGHT
;El robot girará a la izquierda a velocidad media
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
ret
GI1:
ldi r17,LEFT
;El robot girará a la derecha a velocidad media
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
ret
ATRAS:
;Hay que parar antes de invertir los motores
rcall PARA
ldi r17,BACK
;El robot irá marcha atrás a velocidad media
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
ret
- 48 -
Robot con control remoto y cámara de vídeo integrada
GD0:
ldi r17,GO
;El robot se desviará a la derecha
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r22
out OCR1BL,r23
ret
GI0:
ldi r17,GO
;El robot se desviará a la izquierda
out PORTB,r17
out OCR1AH,r22
out OCR1AL,r23
out OCR1BH,r20
out OCR1BL,r21
ret
GD2:
;Hay que parar antes de invertir los motores
rcall PARA
ldi r17,BACK
;El robot se desviará a la derecha marcha atrás
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r22
out OCR1BL,r23
ret
GI2:
;Hay que parar antes de invertir los motores
rcall PARA
ldi r17,BACK
;El robot se desviará a la izquierda marcha atrás
out PORTB,r17
out OCR1AH,r22
out OCR1AL,r23
- 49 -
Robot con control remoto y cámara de vídeo integrada
out OCR1BH,r20
out OCR1BL,r21
ret
ROTI:
;Hay que parar antes de invertir motores
rcall PARA
;Rotamos hacia la izquierda
ldi r17,RLEFT
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
ret
ROTD:
;Hay que parar antes de invertir motores
rcall PARA
;Rotamos hacia la derecha
ldi r17,RRIGHT
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
ret
PARA:
ldi r17,STOP
;Paramos los motores
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
out OCR1BL,r21
ret
Sin embargo, hay algunas subrutinas especiales. Unas de
estas son las de cambio de velocidad global. Lo que hacen es
cambiar los valores almacenados en los registros de velocidad de
- 50 -
Robot con control remoto y cámara de vídeo integrada
acuerdo con los deseos del usuario. Como es lógico estas
subrutinas van asociadas a las ordenes de acelerar y parar.
ACLR:
cpi r22,HIGH(VEL_MAX)
;Si la velocidad no es la normal la aumentamos
brne ACB
ret
ACB:
ldi r20,HIGH(VEL_MED)
ldi r21,LOW(VEL_MED)
ldi r22,HIGH(VEL_MAX)
ldi r23,LOW(VEL_MAX)
ret
FRNR:
cpi r22,HIGH(VEL_MAX2)
;Si la velocidad no es la reducida la reducimos
brne FCB
ret
FCB:
ldi r20,HIGH(VEL_MED2)
ldi r21,LOW(VEL_MED2)
ldi r22,HIGH(VEL_MAX2)
ldi r23,LOW(VEL_MAX2)
ret
Otra subrutina especial es la de buscar y parar. Esta subrutina
hace que el robot gire sobre sí mismo hasta encontrar la línea. Una
vez encontrada se queda parado. Para determinar el sentido de giro
hace uso del bit T.
BUSCL:
;Comprobamos los CNY 1 y 2 si no están ambos a cero hay que seguir buscando
in r18,PORTC
andi r18,0x03
brne NOLN
;Si tenemos la línea paramos y lo indicamos en PA0
rcall PARA
sbi PORTA,0
ret
- 51 -
Robot con control remoto y cámara de vídeo integrada
NOLN:
brtc CGIR
;Si estamos desviados por la derecha hay que rotar hacia la izquierda
ldi r17,LEFT
rjmp SGIR
CGIR:
;Si no hay que rotar hacia la derecha
ldi r17,RIGHT
SGIR:
out PORTB,r17
out OCR1AH,r20
out OCR1AL,r21
out OCR1BH,r20
;Ambos motores reducen la marcha
out OCR1BL,r21
ret
La subrutina de error se asocia a instrucciones reservadas y lo
que hace es encender el LED de depuración para notificar el error.
ERR:
;Encendemos el LED de depuración
sbi PORTB,4
ret
La última subrutina que queda por explicar es la de
actualización del bit T. Esta rutina comprueba las lecturas de los
CNY70 y asigna un valor al bit T del registro de estado dependiendo
de en qué flanco se encuentre la línea.
FLG:
;Leemos el puerto C
in r18,PORTC
;Operaremos sobre el registro 24
mov r24,r18
andi r24,0x03
brne FLG1
;Si estamos sobre la línea el flag no cambia
ret
FLG1:
andi r24,0x01
brne FLG2
- 52 -
Robot con control remoto y cámara de vídeo integrada
;Si el bit0 es cero el bit1 es uno y T se pone a cero (desviados por la izquierda)
clt
ret
FLG2:
mov r24,r18
andi r24,0x02
brne FLG3
;Si el bit1 es cero y el bit1 era 1 T se pone a uno (desviados por la derecha)
set
ret
FLG3:
mov r24,r18
andi r24,0x04
brne FLG4
;Si el CNY3 (bit2) está sobre la línea estamos desviados por la izquierda (T=0)
clt
ret
FLG4:
mov r24,r18
andi r24,0x08
;Si el CNY4 (bit3) está sobre la línea estamos desviados por la derecha (T=1)
brne SAL
set
SAL:
;Si hemos perdido la línea no cambiamos T
ret
- 53 -
Robot con control remoto y cámara de vídeo integrada
4. TARJETA DE CONTROL PRINCIPAL La tarjeta principal se tiene que ocupar de coordinar la cámara, la tarjeta
de radiofrecuencia y la tarjeta de control de motores. Su función principal es
convertir, formatear y agrupar la señal leída por la cámara para su envío por el
enlace de radiofrecuencia. Se tiene que ocupar tanto de la señalización del
canal como de la adquisición de datos.
Eventualmente, recibirá alguna orden que tendrá que decodificar. Estas
órdenes pueden ir dirigidas a la tarjeta de control de motores, a la cámara o al
sistema de orientación de la cámara. Esta tarjeta incorpora también la
circuitería necesaria para orientar la cámara mediante servomotores tipo
FUTTABA.
4.1. DESCRIPCIÓN DEL HARDWARE El hardware que se ajusta a las funciones que ha de desempeñar la
tarjeta se puede ver en el siguiente esquema.
Title
Size Document Number Rev
Date: Sheet of
1 1.2
Tarjeta Principal para Robot LSED
A4
1 1Monday , May 19, 2003
Y2
20MHzC815pF
C915pF
D14DEP
R4470
U1 L7805/TO220
VIN1
GND2VOUT 3
J1PWR_IN
12
+ C1220uF
+C3100uF
C2100nF
C4100nF
+5V
J2PWR_OUT
12
D1PWR_ON
R1470
J3
REGULADOR
1 2
J8
AURIEL
13579
246810 +5V
U2 AT90S8515
RST9
XTAL218 XTAL119
GN
D20
OC1B29ALE 30
ICP31
VCC40
PC0/A8 21
PC1/A9 22
PC2/A10 23
PC3/A11 24
PC4/A12 25
PC5/A13 26
PC6/A14 27
PC7/A15 28
PD0/RXD 10
PD1/TXD 11
PD2/INT0 12
PD3/INT1 13
PD4 14
PD5/OC1A 15
PD6/WR 16
PD7/RD 17
PB0/T01
PB1/T12
PB2/AIN03
PB3/AIN14
PB4/SS5
PB5/MOSI6
PB6/MISO7
PB7/SCK8
PA0/AD039
PA1/AD138
PA2/AD237
PA3/AD336
PA4/AD435
PA5/AD534
PA6/AD633
PA7/AD732
+5V
Y1
8MHz C615pF
C515pF
U4
ADC0820
VIN1
REF+12
REF-11
D02
D13
D24
D35
D414
D515
D616
D717
INT9
OFL18
VCC20
GN
D10
CS13
MODE7
RD8
WR/RDY6
R71K
+5V
SW1RESET
R210K
R31K
J7
CAMARA
123456789
101112
+5V
C7100nF
J10
TARJ_CTRL
12345678
+5V
U3 PIC16F84
GND5VDD
14
OSC2/CLKOUT15
MCLR4
OSC1/CLKIN16
RA017
RA118
RA21
RA32
RA4/TOCKI3
RB0/INT 6
RB1 7
RB2 8
RB3 9
RB4 10
RB5 11
RB6 12
RB7 13
+5V
J4
SERVO1
321
+5V
J5
SERVO2
321
U5LM385-2.5/TO
12
+5V
J16
PROGRAMADOR1
13579
246810
+5VD12
PROG
R21 470
+5V
D13DIODO_RST
R22 10K
R5 1.2K+5V
J17
EXPANS
1234
CAM1CAM2CAM3
OSC1
OSC1OSC2
OSC2
CAM1CAM2CAM3CAM4
CAM4
TX
RX
XTAL1 XTAL2
XTAL1XTAL2
MODE
GOT_LINEMOTAC3
MOTAC0MOTAC1MOTAC2
PIX0PIX1PIX2PIX3PIX4PIX5PIX6PIX7
RESET
+5V
XRESET
PIX0
SIN
PIX1
LOAD
PIX2
XCLK
PIX3
START
PIX4
READ
PIX5
XRESET
PIX6
SINLOAD
PIX7
XCLKSTARTREADVOUT
GOT_LINEMOTAC3
MODE
VOUT
MOTAC2
MOTAC0MOTAC1
INCAMADCSTR
INCAMADCSTR
SRV1
SRV2
RST
MOSI
MISOSCK
SRV1
RESET
SRV2
RESET
MOSI
RESET
RX
MISOSCK
TX
EXP0EXP1EXP2EXP3
Figura 29 Esquema de la tarjeta de control principal.
Para un mayor detalle, véase la figura 1 del apéndice B.
- 54 -
Robot con control remoto y cámara de vídeo integrada
Se puede ver que la tarjeta se puede descomponer en varios
sectores. Estos sectores son alimentación, control de orientación de la
cámara, interfaz de la cámara y procesado.
4.1.1. ALIMENTACIÓN La tarjeta principal se puede alimentar de dos formas distintas.
Las distintas formas se seleccionan abriendo o cerrando un jumper.
Una forma que tiene de alimentación de la tarjeta principal es
suministrando directamente una tensión estabilizada de 5V a la
entrada pertinente. De esta forma se puede hacer que ambas
tarjetas compartan fuente de alimentación. La tarjeta de control de
motores tiene una salida después del regulador que se puede utilizar
para alimentar la tarjeta principal de esta forma. Para seleccionar
este modo de alimentación hay que dejar abierto el jumper
REGULADOR.
Sin embargo, la tarjeta también cuenta con un sistema de
alimentación autónomo que se utilizará cuando el jumper
REGULADOR esté cerrado. El sistema de alimentación mencionado
es idéntico al de la tarjeta de control de motores (ver apartado 2.1.1).
Conviene señalar que no es conveniente utilizar la
alimentación de la tarjeta de control de motores si el jumper
REGULADOR está cerrado. Esto se debe a que no conviene
cortocircuitar directamente las salidas de los dos reguladores para
no dañarlos.
4.1.2. CONTROL DE ORIENTACIÓN DE LA CÁMARA Como se ha explicado antes, la tarjeta principal puede
controlar dos servomotores para orientar la cámara.
- 55 -
Robot con control remoto y cámara de vídeo integrada
U3 PIC16F84
GND5VDD
14
OSC2/CLKOUT15
MCLR4
OSC1/CLKIN16
RA017
RA118
RA21
RA32
RA4/TOCKI3
RB0/INT6
RB17
RB28
RB39
RB410
RB511
RB612
RB713
+5V
J4
SERVO1
321
+5V
J5
SERVO2
321
+5V
J17
EXPANS
1234
CAM1CAM2CAM3
OSC1OSC2
CAM4
SRV1SRV2
RESET
EXP0EXP1EXP2EXP3
Figura 30 Sistema de orientación de la cámara.
En la figura se puede ver que el elemento central de este
sistema es un microcontrolador PIC. Este microcontrolador se usa
exclusivamente para generar las dos señales PWM necesarias para
orientar los servomotores. Los servomotores se conectan
directamente a la alimentación porque incorporan una lógica que
reduce el ruido impulsivo, por eso no se filtra su alimentación.
El microcontrolador PIC lee la orientación que le da el
microcontrolador principal por las líneas CAM1:4 y varia los ciclos de
trabajo de los servomotores en consecuencia. También consta de un
puerto de cuatro bit s de expansión por si se quisiera aprovechar la
capacidad de procesamiento sobrante para alguna otra tarea.
4.1.3. INTERFAZ DE LA CÁMARA El chip de la cámara es un MITSUBISHI M64282FP. Este CDC,
pese a estar descatalogado actualmente, se puede encontrar
fácilmente en el periférico GameBoy Camera para la video consola
portátil GameBoy de Nintendo, que se puede adquirir de segunda
mano a través de servicios de subasta on-line como e-Bay por
menos de 10$ USD.
La cámara se conecta directamente al microcontrolador a
excepción de la señal de píxel. Esta señal es analógica por lo que es
necesario intercalar un conversor analógico digital para que el
microcontrolador pueda procesar el píxel.
- 56 -
Robot con control remoto y cámara de vídeo integrada
Figura 31 Cámara digital M64282FP
U4
ADC0820
VIN1
REF+12
REF-11
D02
D13
D24
D35
D414
D515
D616
D717
INT9
OFL18
VCC20
GND10
CS13
MODE7
RD8
WR/RDY6
+5V
J7
CAMARA
123456789
101112
+5V U5LM385-2.5/TO
12
R51.2K+5V
PIX0PIX1PIX2PIX3PIX4PIX5PIX6PIX7
+5VXRESETSINLOADXCLKSTARTREADVOUT
INCAM ADCSTR
Figura 32 Interfaz de la tarjeta principal con la cámara.
Los bits que se conectan desde la cámara directamente al
microcontrolador son los bits de configuración y control de ejecución.
- 57 -
Robot con control remoto y cámara de vídeo integrada
La línea de datos de la cámara tiene que sufrir una conversión
analógico-digital.
Figura 33 Asignación de terminales de la cámara digital al bus de datos
La configuración del conversor ha sido extraída de las hojas
del fabricante, Se ha configurado para ser controlado con solo dos
líneas, la INCAM y la ADCSTR. El conversor es de ocho bits y el
rango de conversión se ajusta de 0V a 2,5V. Este rango es
adecuado porque la cámara entrega una señal de 1V pico a pico con
un offset configurable.
4.1.4. PROCESADO La configuración de este sector es análoga a la del mismo
sector en la otra tarjeta. La disposición de señales en el
microcontrolador es la siguiente.
D14DEP
R4470
U2 AT90S8515
RST9
XTAL218 XTAL119
GND20
OC1B29ALE30
ICP31
VCC40
PC0/A821
PC1/A922
PC2/A1023
PC3/A1124
PC4/A1225
PC5/A1326
PC6/A1427
PC7/A1528
PD0/RXD10
PD1/TXD11
PD2/INT012
PD3/INT113
PD414
PD5/OC1A15
PD6/WR16
PD7/RD17
PB0/T01
PB1/T12
PB2/AIN03
PB3/AIN14
PB4/SS5
PB5/MOSI6
PB6/MISO7
PB7/SCK8
PA0/AD039
PA1/AD138
PA2/AD237
PA3/AD336
PA4/AD435
PA5/AD534
PA6/AD633
PA7/AD732
+5V
CAM1CAM2CAM3CAM4
XTAL1XTAL2
XRESET
PIX0
SIN
PIX1
LOAD
PIX2
XCLK
PIX3
START
PIX4
READ
PIX5PIX6PIX7
GOT_LINEMOTAC3
MODE
MOTAC2
MOTAC0MOTAC1
INCAMADCSTR
RESET
MOSI
RX
MISOSCK
TX
Figura 34 Conexiones del microcontrolador.
El puerto A del microcontrolador se destina íntegramente a la
adquisición de los datos convertidos a digital de la cámara. Este
puerto no tenía ninguna otra funcionalidad por lo que no se sacrifica
ningún recurso en la lectura de los datos de la cámara.
El puerto B se divide en dos partes. Los cuatro bits menos
significativos son los que se usan para comunicarle al
- 58 -
Robot con control remoto y cámara de vídeo integrada
microcontrolador PIC la orientación deseada de la cámara. El bit 5,
como pasaba en la otra tarjeta, se destina a un LED de depuración
que ayude a la detección de errores en el software de la tarjeta.
Puede parecer absurdo malgastar una pata para este fin pero
nosotros lo hemos encontrado de vital importancia. La ayuda del
LED de depuración hace que la detección de errores se pueda
realizar de forma empírica, más cómoda, y nos evita tener que
desentrañar el código ejecutado por el microcontrolador.
Por último, los otros tres bits se destinan al programador AVR.
Las conexiones son idénticas a la de la otra tarjeta, así como el
circuito de reset. Por lo que para su consulta remitimos al lector al
apartado de procesado de la tarjeta de control de motores.
Nótese que el microcontrolador PIC carece de programador
integrado en la tarjeta principal. Por consiguiente, se hace
indispensable el uso de un programador PIC independiente.
El puerto C se destina a la comunicación entre tarjetas y al
control del conversor analógico digital. Los seis bits menos
significativos constituyen el otro extremo del bus que se conecta al
puerto A del microcontrolador de la tarjeta de control de motores.
Los dos bits más significativos son los que se utilizan para controlar
la conversión a digital de los datos de la cámara.
Finalmente el puerto D se usa para configurar y controlar la
cámara y para la comunicación con la tarjeta de radio. Los dos bits
menos significativos son los de transmisión y recepción de la UART.
Estos bits se conectan directamente a la tarjeta de radio y no hace
falta ninguna pista adicional. El control de la comunicación serie por
el enlace radio se hace íntegramente vía software ayudándose de
los registros internos de la UART.
Los otros seis bits se utilizan para encender la cámara
(START), temporizarla (XCLK) y configurarla. Al iniciar la cámara es
necesario cargar unos registros internos que tiene para que funcione
de la forma deseada. Esto se consigue mediante una transmisión
- 59 -
Robot con control remoto y cámara de vídeo integrada
serie por SIN, temporizada por XCLK y validada por LOAD. La pista
READ es la notificación de la cámara de que tiene un píxel nuevo
preparado para la conversión.
4.2. DESCRIPCIÓN DEL SOFTWARE La tarjeta de control principal ha de gobernar todo el robot,
recibiendo las órdenes del host remoto, decodificándolas y ejecutándolas.
Además, debe recopilar la información del estado del robot y los datos de
la cámara y enviarlos a través del enlace de radio frecuencia,
implementando las rutinas necesarias para la separación de tramas y la
temporización que exige la tarjeta de radio frecuencia.
Una vez ejecutada la rutina primera de reset y habilitadas las
interrupciones, el programa principal entra en un bucle continuo de
espera activa aguardando a que se produzcan las interrupciones
programadas:
• Interrupción del Timer0, que da lugar a la recopilación de datos y
su envío a través de la radio frecuencia.
• Interrupción por llegada de nuevos datos desde el enlace radio
frecuencia, que lanza el proceso de descodificación del tipo de dato
recibido y el procesado del comando en caso de que se trate de datos
del servicio de comandos.
4.2.1. EQUIVALENCIAS Y VECTORES DE INTERRUPCIÓN Al igual que con el otro programa se define un primer archivo
en el que se especifican unas equivalencias para facilitar la
programación.
;Registros de entrada y salida
.EQU SREG = 0x3f
.EQU SPH = 0x3e
.EQU SPL = 0x3d
.EQU GIMSK = 0x3b
.EQU GIFR = 0x3a
.EQU TIMSK = 0x39
.EQU TIFR = 0x38
.EQU MCUCR = 0x35
- 60 -
Robot con control remoto y cámara de vídeo integrada
.EQU TCCR0 = 0x33
.EQU TCNT0 = 0x32
.EQU TCCR1A = 0x2f
.EQU TCCR1B = 0x2e
.EQU TCNT1H = 0x2d
.EQU TCNT1L = 0x2c
.EQU OCR1AH = 0x2b
.EQU OCR1AL = 0x2a
.EQU OCR1BH = 0x29
.EQU OCR1BL = 0x28
.EQU ICR1H = 0x25
.EQU ICR1L = 0x24
.EQU WDTCR = 0x21
.EQU PORTA = 0x1b
.EQU DDRA = 0x1a
.EQU PINA = 0x19
.EQU PORTB = 0x18
.EQU DDRB = 0x17
.EQU PINB = 0x16
.EQU PORTC = 0x15
.EQU DDRC = 0x14
.EQU PINC = 0x13
.EQU PORTD = 0x12
.EQU DDRD = 0x11
.EQU PIND = 0x10
.EQU UDR = 0x0C
.EQU USR = 0x0B
.EQU UCR = 0x0A
.EQU UBRR = 0x09
Se han añadido las equivalencias necesarias para manejar la
UART y se ha prescindido del resto de equivalencias pues no tenía
sentido mantenerlas. Sin embargo, más adelante se definirán
nombres simbólicos de registros.
La tabla de vectores de interrupción también sufre
modificaciones porque las fuentes de interrupción son distintas. En
este programa interrumpen los timers y la UART.
CSEG
- 61 -
Robot con control remoto y cámara de vídeo integrada
.ORG 0x000
;Salto a rutina de reset
rjmp RESET
;Si saltan estas interrupciónes se debe a un error
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
;TIMER asociado a la RF
rjmp IRQ_TIMER1
;TIMER asociado a rutina de captura de datos
rjmp IRQ_TIMER0
;Si salta esta interrupción se debe a un error
rjmp RESET
;Tenemos datos del control remoto!
rjmp IRQ_RX
;Se puede enviar el siguiente dato
rjmp IRQ_UOBE
;Si saltan estas interrupciónes se debe a un error
rjmp RESET
rjmp RESET
4.2.2. RUTINA DE RESET Esta rutina se encarga, entre otras cosas, de configurar al
microcontrolador como queremos. Hay que configurar las interrupciones
de los timer y ajustar sus tiempos. También tiene que fijar los parámetros
de la UART y de los puertos de entrada y salida además de las tareas
típicas de configuración.
;Rutina de reset
RESET:
ldi r16,0x02
out SPH,r16
ldi r16,0x5f
;SP al final de la RAM
out SPL,r16
clr r16
;Interrup. deshabilitadas
out SREG,r16
- 62 -
Robot con control remoto y cámara de vídeo integrada
;Interrup. externas deshabilitadas
out GIMSK,r16
;Sin RAM externa
out MCUCR,r16
ldi r16,0x82
;Interrup. por overflow
out TIMSK,r16
ldi r16,0xb8
;Configuración de la UART
out UCR,r16
ldi r16,0x03
;Baud rate = 115200
out UBRR,r16
ldi r16,0xb7
;Interrup cada 10us
out TCNT0,r16
clr r16
;Reloj parado
out TCCR0,r16
out TCCR1A,r16
out TCCR1B,r16
ldi r16,0x00
out TCNT1L,r16
ldi r16,0xb8
;Máximo retardo de 20us
out TCNT1H,r16
clr r16
;Configuración del puerto A
out DDRA,r16
ldi r16,0x5f
;Configuración del puerto B
out DDRB,r16
ldi r16,0xbe
;Configuración del puerto C
out DDRC,r16
ldi r16,0x7e
;Configuración del puerto D
out DDRD,r16
Después de haber realizado las tareas de configuración del
sistema se procede a inicializar la cámara y otras variables.
- 63 -
Robot con control remoto y cámara de vídeo integrada
;Reset de la cámara
rcall RCAM
;Tamaño del buffer
ldi r16,96
ldi r30,0x02
ldi r31,0x01
;Guardamos en la dirección 0x0102
st z,r16
;Capacidad del acumulador inicialmente al maximo
ldi r16,8
mov enACUav, r16
mov deACUav, r16
;Empieza el programa
rjmp PROG
4.2.3. RUTINAS DE CONFIGURACIÓN DE CÁMARA En este apartado se incluye la subrutina que carga los
registros de la cámara y la rutina de reset de cámara. La rutina de
reset de cámara lo que hace es que guarda en las posiciones de
memoria asociadas a la cámara unos valores por defecto y llama a
la subrutina de carga.
RCAM:
;primero reseteamos la camara
;poner a cero reloj
cbi PORTD, XCLK
cbi PORTD, XRESET
sbi PORTD, XCLK
sbi PORTD, XRESET
;Cargamos valores por defecto
ldi mierda1, 0x3f
sts CAMDATA, mierda1
ldi mierda1, 0x04
sts CAMDATA+1, mierda1
ldi mierda1, 0x0a
sts CAMDATA+2, mierda1
ldi mierda1, 0xff
- 64 -
Robot con control remoto y cámara de vídeo integrada
sts CAMDATA+3, mierda1
ldi mierda1, 0x01
sts CAMDATA+4, mierda1
ldi mierda1, 0x00
sts CAMDATA+5, mierda1
ldi mierda1, 0x01
sts CAMDATA+6, mierda1
ldi mierda1, 0x02
sts CAMDATA+7, mierda1
rcall CAM_LOAD_REGISTERS
ret
Estos valores por defecto ajustan el tiempo de exposición, la
ganancia, la luminancia a unos valores típicos. También se aseguran
de que el rango dinámico de la señal esta de acuerdo con lo que
espera el conversor analógico-digital. Es decir, 1V pico a pico más
1V de continua.
La rutina de carga lo que hace es ir cogiendo cada uno de los
valores asociados a los registros y cargarlos en la cámara. La
cámara recibe bit a bit por la pata SIN. El reloj tiene que ir
sincronizado con la transmisión. Primero se transmiten tres bits de
dirección de registro (hay 8 registros) a cargar y luego el byte de
dato. Una vez terminada la transmisión hay que validarla con la
señal LOAD.
La subrutina primero guarda el contexto y calcula la dirección
del dato a cargar. Hecho esto lee el dato de la memoria y lo deja en
un registro.
CAM_LOAD_REGISTERS:
push sucio
push ocho
push mierda1
- 65 -
Robot con control remoto y cámara de vídeo integrada
push r30
push r31
;contador de 0 a 7 para los registros
clr sucio
bucleCarga:
mov r5,sucio
;Calculamos dirección y leemos dato
ldi mierda1, LOW(CAMDATA)
add ocho, mierda1
ldi mierda1, HIGH(CAMDATA)
adc r5,mierda1
mov r30, ocho
mov r31, r5
ld ocho, z
Se han definido nombres simbólicos para algunos registros y
pines para hacer el programa más legible. Hecho esto entra en un
bucle que manda bit a bit la dirección y el dato. Esto se hace
mediante rotaciones.
;mandar primero los tres bits del registro
;bucle contando con mierda1
ldi mierda1, 3
cargaDirReg:
;poner a cero el reloj de la camara
cbi PORTD, XCLK
sbrs sucio, 2
rjmp manda_cero
rcall CAM_SIN_1
decB1:
;poner a uno
sbi PORTD, XCLK
;mover a la izq sucio para mandar el siguiente bit
lsl sucio
dec mierda1
brne cargaDirReg
;xSSSxxxx
lsl sucio
;volvemos a colocar sucio en su posicion original xxxxxSSS
- 66 -
Robot con control remoto y cámara de vídeo integrada
swap sucio
rjmp masDat
manda_cero:
rcall CAM_SIN_0
rjmp decB1
masDat:
;ahora metemos los ocho bits de datos
ldi mierda1, 8
cargaDatReg:
;poner a cero el reloj
cbi PORTD, XCLK
sbrs ocho, 7
rjmp manda_cero_
rcall CAM_SIN_1
decB2:
;poner a uno
sbi PORTD, XCLK
;mover a la izq sucio para mandar el siguiente bit
lsl ocho
dec mierda1
brne cargaDatReg
;terminado el registro se manda el siguiente
inc sucio
cpi sucio, 8
breq finCargaS
;mandar la señal de carga
sbi PORTD, LOAD
;reloj de camara a cero
cbi PORTD, XCLK
cbi PORTD, LOAD;
rjmp bucleCarga
manda_cero_:
rcall CAM_SIN_0
rjmp decB2
Se recupera el contexto y se termina con la subrutina.
finCargaS:
pop r31
- 67 -
Robot con control remoto y cámara de vídeo integrada
pop r30
pop mierda1
pop ocho
pop sucio
ret
Se han utilizado dos subrutinas que lo que hacen es activar o
desactivar la pata SIN del microcontrolador.
CAM_SIN_1:
;poner un 1 a Serial IN de la Camara
sbi PORTD, SIN
ret
CAM_SIN_0:
;poner a 0 la serial in de la camara
cbi PORTD, SIN
ret
4.2.4. EL PROGRAMA PRINCIPAL Simplemente realiza la habilitación de contadores, cámara e
interrupciones, para acabar en el bucle de espera activa:
PROG:
;activar contador TIMER0
clr mierda1
out TCCR0,mierda1
;activar la camara
cbi PORTD, XCLK
sbi PORTD, START;-------------------
sbi PORTD, XCLK
cbi PORTD, START
;habilitar interrupciones
sei
mainloop:
nop
rjmp mainloop
- 68 -
Robot con control remoto y cámara de vídeo integrada
4.2.5. ADQUISICIÓN DE DATOS La adquisición de datos la lleva a cabo como se indicó
anteriormente la rutina de atención a la interrupción periódica del
contador 0, IRQ_TIMER0.
Para evitar problemas de desbordamiento del buffer de salida
de datos hacia el enlace de radio frecuencia, si el bit de Transmisión
Enabled de la UART del Atmel está a cero, la rutina simplemente
devolverá el estado a la espera activa. Si por el contrario sí que se
pueden transmitir datos, la rutina primeramente determina si debe
añadir las cabeceras de datos, tanto de Estado como de Imagen,
con los correspondientes seis bits menos significativos de la fila a la
que pertenecen los píxeles a enviar. Para ello se han habilitado los
bits 4 y 3 del byte del registro COMM que mantiene el estado de las
comunicaciones:
registro COMM FR VD WC NIF NSF TE 7 6 5 4 3 2 1 0
Byte 1
Figura 35 Detalle del registro de estado COMM
Así el bit 4 estará a uno siempre que se deban incluir las
cabeceras de trama de imagen (‘New Image Frame’) y el 3 indica si
se debe mandar el estado o no (‘New Status Frame’) Estos bits se
ponen automáticamente a uno en la rutina de atención a la
interrupción del TIMER 1, que se lanza cuando ha transcurrido el
tiempo de guarda necesario que impone la tarjeta de radio
frecuencia para modular los paquetes de 96 bytes que se le han
mandado.
Tras incluir, si procede, las cabeceras de trama, la rutina
verifica si el bit DATA (PD7) está a uno, en cuyo caso deberá, por un
lado mandar un uno a la señal de reloj XCLK (PD5) para que la
cámara cargue a la su salida de datos analógica el siguiente píxel y
por otro, activar la señal ADCSTR poniendo el bit PC7 a cero para
que el conversor A/D inicie la conversión del dato que viene de la
- 69 -
Robot con control remoto y cámara de vídeo integrada
cámara. En la siguiente ejecución de la rutina periódica, la señal
INCAM (PC6) estará a cero, indicando que el conversor A/D ha
finalizado la conversión y en el puerto A se dispondrá del píxel en
formato digital. Tras poner a cero el reloj de la cámara XCLK, el byte
se envía por el canal de comunicaciones y se actualizan los registros
en los que se almacenan la fila y la columna por la que se va. En
caso de alcanzar la columna 127, se pasa a la línea siguiente y en
caso de alcanzar la línea 127, los contadores se ponen a cero y se
queda en estado de espera hasta, transcurrido el tiempo de
exposición, la señal READ vuelva a estar activa indicando que la
nueva imagen está lista para ser leía píxel a pixel. Para determinar si
se está en la primera fase de conversión A/D o en la segunda se usa
el bit T del registro de estado del Atmel, que a su vez controla el reloj
XCLK.
4.2.6. LAS RUTINAS DE ENLACE Antes de mandar ningún dato por el canal de comunicaciones
es preciso incluir las cabeceras de tramas, los separadores y evitar
los datos 01111110 para que no se confundan con los separadores
de trama.
Las rutinas DEL_ENLACE, AL_ENLACE, METE_FR_SP,
PROCESA_BYTE y SEND_ACK cubren todas las tareas del nivel
de enlace.
Los decodificadores de datos que vienen desde el canal y los
codificadores de datos hacia el canal usan tres registros cada uno
para mantener el estado interno de los bits que todavía no se han
enviado o decodificado al haberse eliminado bits de cero de
redundancia impuestos por los separadores de trama 01111110. Así
se han asignado los siguientes registros, tanto inmediatos como no
inmediatos:
.DEF enACU = r18
.DEF enACUav = r15
.DEF enCount1 = r20
.DEF deACU = r21
- 70 -
Robot con control remoto y cámara de vídeo integrada
.DEF deACUav = r14
.DEF deCount1 = r23
.DEF ocho = r24 ;registro de sucio
.DEF sucio = r25 ;registro de guarreo
.DEF toSend = r16
.DEF toRec = r17
.DEF mierda1 = r19
.DEF COMM = r26
.DEF enDATA = r27
.DEF deDATA = r22
También se han definido los siguientes EQU que contienen las
direcciones de la memoria de datos del Atmel que almacenan los IDs
de tramas esperados, recibidos y la ventana de recepción de
comandos de 64 bytes.
.EQU expFRID = $00
.EQU curFRID = $01
.EQU buffFR = $02 ;esto mas 63 es la ventana
Las rutinas codificadoras y decodificadoras del enlace se
basan en desplazamientos lógicos con arreo y comprobación bit a bit
de si es un cero o un uno. En caso de que sea un uno, los
contadores enCount1 o deCount1 se incrementan, y si se trata de un
cero, los contadores se resetean. Para el caso del codificador, al
recibir cinco unos seguidos, automáticamente introduce un cero para
evitar que otro uno más lo confunda por un separador de trama.
Para el decodificador, si se recibe un cero y el número de unos es
igual a 6, entonces se tiene un separador de trama, activando el bit
más significativo del registro de comunicaciones COMM. Si por el
contrario son 5 el número de unos recibido, entonces se trata de un
cero redundante, que es eliminado automáticamente. Finalmente, si
es inferior a cinco el número de unos, el cero es válido.
◄ C ◄
- 71 -
Robot con control remoto y cámara de vídeo integrada
ACUMULADOR DATO COD/DEC
Figura 36 Esquema de funcionamiento de los codificadores de enlace
Así se tiene el codificador de enlace
AL_ENLACE:
ldi toSend, 0x08
loop1:
lsl enDATA ;BMS del enDATA al C
brcs send1 ;si C==1 enviamos 1
ldi enCount1, $06 ;como es 0, se resetea el contador
alAcu:
rol enACU ;al acu por la derecha el C que es el dato que queremos
rjmp chkAcu;
send1:
dec enCount1
brne alAcu ;no se han mandado mas de 5 unos
ror enDATA ;volvemos a meter a enDATA el BMS
lsl enACU ;metemos al acumulador un 0 por la derecha
inc toSend;
chkAcu:
dec enACUav ;
brne sig1 ;
;ENVIO A LA UART DEL BYTE SI PROCEDE (AL_CANAL) del enACU
rcall AL_CANAL
sig1:
clr enACU;
ldi ocho, 0x08
mov enACUav, ocho;
dec toSend
brne loop1;
ret
Y el decodificador de enlace
- 72 -
Robot con control remoto y cámara de vídeo integrada
;Decodifica un byte recibido de la RF, quitando adecuadamente la sobrecarga
;introducida por el uso de los separadores de trama
DEL_ENLACE:
ldi toRec, 8
in deDATA,UDR
loop2:
lsl deDATA
brcc rx0
inc deCount1
alACU2:
rol deACU ;se meten los datos por la derecha del C
dec deACUav
brne deACUChk
sbr COMM, 6 ;x1xxxxxx, dato valido
;SALTO POR HACER AL PROCESADOR DE BYTES
rcall PROCESA_BYTE
clr deACU
ldi ocho, 0x08
mov deACUav, ocho;
rjmp deACUChk
rx0:
cpi deCount1, $05
breq rx02 ;esto si tenemos un cero que sobra
brmi rx01 ;cero legal, se mete al acu
;eso es una bonita trama
;y se indica en el BMS del byte COMM
cbr COMM, 6 ;x0xxxxxx, dato no valido
sbr COMM, 7 ;1xxxxxxx, frame separator
clr deACU ;
mov deACUav, ocho;
rjmp deACUChk
rx01:
clr deCount1
clc ;poner a cero el C para que el rol meta un cero
rjmp alACU2
- 73 -
Robot con control remoto y cámara de vídeo integrada
rx02:
clr deCount1
deACUChk:
dec toRec
brne loop2
Que también hace uso de la subrutina de envío de
confirmaciones de comando y de la subrutina de procesado de bytes:
;procesa el byte recibido
;usa como entrada el deACU
.DEF backup = r2
PROCESA_BYTE:
mov backup, deACU
sbrs COMM, 6 ;x1xxxxxx ¿byte valido?
rjmp finpro
sbrs COMM, 7 ;1xxxxxxx ¿nueva trama?
rjmp sigue5
;aqui tenemos un inicio de trama
;el dato del acu es el frame ID si es comando
andi deACU, $C0
brne finpro
sbr COMM, 5 ;xx1xxxxx, en espera de comando
cbr COMM, 7 ;0xxxxxxx, ya no es inicio de trama
sts curFRID, backup
rjmp finpro
sigue5:
;comprobar si estamos en espera de comando
sbrs COMM, 5
rjmp finpro
cbr COMM, 5 ;ya lo atendemos y pasamos a modo de espera general
;comprobar si es el RESERVADO antes de nada, que tiene prioridad
cpi deACU, 0xff
breq COM_VALID
lds ocho, curFRID
lds sucio, expFRID
- 74 -
Robot con control remoto y cámara de vídeo integrada
cp ocho, sucio
brne yaenviado
COM_VALID:
;comando valido
push ocho
rcall SEND_ACK
;almacenamos el comando valido en la ventana de recepcion
;para mandar ACKs de paquetes ya recibidos
ldi mierda1, buffFR
add ocho, mierda1;ocho contiene la pos de memoria RAM donde guardar
push r30
push r31
mov r30, ocho
st z, backup
pop r31
pop r30
inc sucio
andi sucio, $3F
sts expFRID, sucio
;SALTO A PROCESAR COMANDO
rcall PROC_COM
rjmp finpro
yaenviado:
mov sucio, ocho
ldi mierda1, buffFR
add sucio, mierda1; tenemos la pos de memoria ande mirar
push r30
push r31
ld sucio, z
pop r31
pop r30
cp sucio, deACU
brne finpro
;MANDAR ACK DEL FR ID que esta en ocho
- 75 -
Robot con control remoto y cámara de vídeo integrada
push ocho;el FR ID esta en la pila
rcall SEND_ACK
finpro:
mov deACU, backup
ret
SEND_ACK:
;primerito de todo, meter el FR SP
rcall METE_FR_SP
;ahorita meter el ACK
push enDATA
push sucio
push r30;
push r31;
in r30, SPL
in r31, SPH
adiw r30, 4
ld sucio, z
;sucio tiene ahora el FR ID a mandar
ori sucio, 0x40 ;enmascarar con 01xxxxxx, que indica ACK de comando
mov enDATA, sucio
rcall AL_ENLACE
pop r31;
pop r30;
pop sucio;
pop enDATA
ret
La rutina encargada de procesar bytes se fija, primeramente si
está activado el bit de trama nueva (FR, 7) de COMM, y en caso
contrario, si está activado el bit de dato válido (VD, 6) del registro
COMM. En este último caso recoge el byte decodificado y determina
si se trata de un inicio de trama de comando, en cuyo caso
almacena el ID de la trama en la posición de memoria de currFRID y
activa el bit 5 del COMM, indicando que esta a la espera de nuevo
comando (WC).
- 76 -
Robot con control remoto y cámara de vídeo integrada
Si PROCESA_BYTE determina que está a la espera de un
byte y el byte disponible en deACU es válido (bit 6 de COMM),
entonces, cargará el valor almacenado en currFRID y en expFRID y
los comparará, si son iguales, el comando es válido. En este caso,
se almacena en la posición de memoria (buffFR + <frame actual>) el
valor del comando recibido, se envía un ACK para el comando y se
llama a la subrutina PROC_COM que se encarga de procesar el
comando.
En caso de que el comando recibido no tenga el identificador
de trama esperado y el valor del comando sea igual al dato
almacenado en la posición de memoria de datos buffRF + <frame
recibido>, se trata de un comando reenviado por error, y se manda
un ACK del comando. En caso de que no coincida con el valor
registrado, no se hace nada y se sigue esperando a recibir una
trama con el Identificador de Trama de Comando válido o bien un
comando reservado para resincronizar con el host remoto.
Finalmente, este módulo de rutinas de enlace dispone de la
rutina METE_FR_SP encargada de introducir sin sobrecarga alguna
de ceros un separador de trama 01111110 al canal:
;envia un separador de trama
METE_FR_SP:
ldi enDATA, 126; la trama
mov toSend, ocho ;
loop123:
lsl enDATA ;BMS del enDATA al C
ror enACU ;al acu por la derecha el C que es el dato que queremos
dec enACUav ;
brne sig123 ;
;ENVIO AL CANAL (AL_CANAL)
rcall AL_CANAL
sig123:
clr enACU;
mov enACUav, ocho;
dec toSend
- 77 -
Robot con control remoto y cámara de vídeo integrada
brne loop123;
ret
4.2.7. EL NIVEL FÍSICO Las rutinas del nivel físico comprenden a AL_CANAL,
ENVIA_SERIE y actTIMER. Dado que las tarjetas de radio
frecuencia exigen un tamaño máximo de ráfagas de 96 bytes y un
tiempo de guarda entre ráfagas fijado por la expresión
estas rutinas deberán respetar estas limitaciones. Para ello lo
que se hace es almacenar los datos a enviar en un búfer auxliar de
192 bytes de capacidad y se activa el TIMER1 que, al lanzarse su
interrupción TIMER1 lo que hace es transmitir de golpe hasta un
máximo de 96 bytes almacenados en el búfer y esperar el tiempo de
guarda máximo antes de volverse a ejecutar hasta vaciar el búfer de
salida.
Las posiciones de memoria de datos empleadas son:
;nivel fisico
.EQU iniBuffer = 0x42
.EQU capBuffer = 0xC0
.DEF puntEnvio = r28 ;registro inmediato
.DEF puntMete = r29 ;registro inmediato
.EQU serieAVA = 0x102 ;pos de memoria donde esta la capacidad de las RF
Asimismo se definen los punteros de Envío y Mete que
apuntan respectivamente a las posiciones de memoria de datos con
el byte a enviar la siguiente vez que se ejecute la rutina de
interrupción IRQ_UBOE y el hueco en el búfer para el siguiente byte
a enviar.
AL_CANAL:
cpi puntMete, capBuffer
breq fincanal
mov ocho, puntMete
clr sucio
- 78 -
Robot con control remoto y cámara de vídeo integrada
ldi mierda1, LOW(iniBuffer)
add ocho, mierda1
ldi mierda1, HIGH(iniBuffer)
adc sucio,mierda1
push r30
push r31
mov r30, ocho
mov r31, sucio
st z, enACU
pop r31
pop r30
inc puntMete
;ACTIVAR LA TAREA DE ENVIO
in sucio, TCCR1B
cpi sucio, 0x00
brne fincanal
;la tarea no esta activada, la activamos
ldi sucio, 0x01;modo NO PREESCALADO!!!
out TCCR1B, sucio
fincanal:
ret
ENVIA_SERIE:
;metemos el byte SOLO si ya esta vacio el UDRE
sbic USR, 5
rjmp etiqueta
rcall actTIMER
rjmp finEnvia
;decrementar la capacidad del buffer
etiqueta:
push r30
push r31
ldi r30, LOW(serieAVA)
ldi r31, HIGH(serieAVA)
ld sucio, z
- 79 -
Robot con control remoto y cámara de vídeo integrada
;ahora sucio tiene la capacidad del buffer
dec sucio
brne otro
rcall actTIMER
otro:
st z, sucio
mov ocho, puntEnvio
clr sucio
ldi mierda1, LOW(iniBuffer)
add ocho, mierda1
ldi mierda1, HIGH(iniBuffer)
adc sucio,mierda1
mov r30, ocho
mov r31, sucio
ld sucio, z
pop r31
pop r30
out UDR, sucio
inc puntEnvio
cpi puntEnvio, capBuffer
brne finEnvia
clr puntEnvio
clr puntMete
finEnvia:
ret
actTIMER:
;activar tempo 1
ldi ocho,0x00
out TCNT1L,ocho
ldi ocho,0xb8
out TCNT1H,ocho ;Máximo retardo de 20us
ldi ocho,0x02
out TCCR1B,ocho
cbi UCR,3 ;deshabilitamos la TX de la UART
ret
- 80 -
Robot con control remoto y cámara de vídeo integrada
La rutina actTIMER es la encargada de activar el contador 1,
cargándole además el retardo máximo de tiempo de guarda como
valor iniciar.
Para enviar datos al canal se usa la rutina AL_CANAL, que
guarda en el búfer auxiliar el byte contenido en el registro enACU
Como el canal es half-duplex, no se envían datos cuando se
están recibiendo datos. De este modo, la rutina de atención a la
interrupción de recepción de datos desde la UART deshabilita la
transmisión poniendo el bit 3 del registro I/O UCR a cero al entrar en
la rutina y restaurando su valor a uno tras la ejecución de la misma,
justo antes del reti. También mientras está el TIMER1 activado no se
permite la transmisión.
- 81 -
Robot con control remoto y cámara de vídeo integrada
5. HOST DE CONTROL REMOTO Este host se encarga de controlar a la unidad móvil, recibiendo por una
parte los datos que recopile ésta, y por otra parte, mandándole las órdenes
pertinentes para su funcionamiento en modo manual.
5.1. PLACA DE CONTROL
La comunicación se realiza a través de las tarjetas de
radiofrecuencia de Auriel WIZ-434-SML-IA que se conectan al equipo vía
puerto Serie. Estas tarjetas trabajan con señales TTL, mientras que los
puertos Serie, típicamente, ‘COM’, de los ordenadores trabajan con
señales en RS232. Para llevar a cabo la adaptación de niveles se hace
uso de la siguiente placa que dispone de un conversor MAX232 de Maxim.
Figura 37 Placa de control del host
Este circuito integrado dispone de dos entradas TTL con sus
correspondientes salidas en RS232 y dos entradas RS232 y sus salidas
convertidas en TTL. En la placa adaptadora se ha hecho uso de
únicamente un par de entradas, quedando el otro libre.
- 82 -
Robot con control remoto y cámara de vídeo integrada
Figura 38 Detalle del adaptador MAX232
La placa puede ser alimentada directamente con una pila de 9
voltios o bien usando una fuente de alimentación y los conectores hembra
de tipo banana. El circuito dispone de un regulador de tensión de 5 voltios
L7805 para poder usar distintas alimentaciones.
La conexión con el PC se realiza mediante el conector DB9 hembra
incorporado, y la tarjeta de radio frecuencia se conecta mediante un bus
de 10 hilos al conector.
PIN 1
Figura 39 Detalle de la conexión con la tarjeta de radio frecuencia
Cuando el circuito está correctamente alimentado, el LED rojo de la
placa y el LED POW de la placa de radiofrecuencia se encenderán. Al
- 83 -
Robot con control remoto y cámara de vídeo integrada
abrirse el puerto por la aplicación de control, el LED Verde la placa se
iluminará. Este LED corresponde a la señal DTR del puerto serie COM, y
se alimenta de la propia señal que recibe desde el equipo PC, por lo que
puede estar perfectamente encendido sin tener el circuito alimentado, en
cuyo caso el enlace RF no funcionará. Cuando se transmiten o reciben
datos por la radiofrecuencia, el led RTX se encenderá.
RTX
POWER
POWER
DTR
Figura 40 LEDs de la placa de control
De los nueve pines de la conexión DB9 serie sólo se emplean los
cinco primeros:
• Pin 1 DCD, Data Carrier Detect, activo a nivel bajo, se pone a
cero cuando se detecta portadora. Está conectado al pin 6 de la tarjeta
de radio frecuencia (XTR Carrier Detect.)
• Pin 2 TXD, Transmitted Data, los datos a transmitir por radio
enlace.
• Pin 3 RXD, Received Data, los datos recibidos desde el radio
enlace.
- 84 -
Robot con control remoto y cámara de vídeo integrada
• Pin 4 DTR, Data Terminal Ready, se activa cuando el equipo
terminal, es decir, el PC está listo, que se produce cuando se abre el
puerto de comunicaciones.
• Pin 5 GND, Signal Ground, la tierra del PC y que se usa en toda
la placa como tierra. Está conectada internamente a los pines 3 y 4 de
la tarjeta de radiofrecuencia.
Los pines usados de la tarjeta de radio frecuencia están marcados
en rojo en la siguiente ilustración:
Figura 41 Pines de contacto de la tarjeta de radiofrecuencia WIZ-434-SML-IA
5.2. EL SOFTWARE
El software del equipo de control está escrito en el lenguaje Java de
Sun Microsystems, concretamente, para su versión de JSDK 1.4.1_02. La
elección de este lenguaje se ha debido a su práctica independencia de la
plataforma en que se ejecute la máquina virtual de Java. Asimismo, para
poder compilar el proyecto entero, se ha usado la herramienta ANT del
grupo Jakarta de la Apache Foundation. Para más información acerca de
la instalación de ANT, vea el apéndice A ‘Instalación del Software.’
El acceso a los puertos de comunicaciones serie se realiza a través
del paquete javax.comm que Sun Microsystems distribuye de forma
separada al JSDK. Nuevamente, para su descarga e instalación, vea el
apéndice A.
El software de control se compone básicamente de tres módulos o
paquetes de Java:
- 85 -
Robot con control remoto y cámara de vídeo integrada
• Paquete com.theexbteam.comm, que proporciona las clases
necesarias para establecer una conexión serie a través de las tarjetas
de radio frecuencia.
• Paquete com.theexbteam.robots, que incluye las clases de
gestión y control del robot.
• Paquete com.theexbteam.robots.ui, que reúne las clases de la
interface de usuario, tanto en línea de comandos como las gráficas.
El último paquete precisa del segundo, y el segundo paquete hace
uso de las clases del primero. No obstante, el paquete de
comunicaciones se puede utilizar para desarrollar cualquier otra
aplicación que precise de acceso a los puertos de comunicaciones serie o
paralelo. Para un mayor detalle de la API de cada paquete, vea la
documentación generada por la herramienta javadoc que incluye precisas
descripciones de los métodos más importantes de cada clase.
5.3. PAQUETE COM.THEEXBTEAM.COMM
Como ya se indicó, este paquete de clases permite transmitir datos a
través de un puerto de comunicaciones del equipo PC. Sus clases hacen
uso de las clases de javax.comm para abrir primeramente los puertos,
activar los eventos pertinentes de aviso de llegada de datos y resolver los
posibles conflictos que puedan surgir entre dos aplicaciones que intenten
acceder al mismo puerto.
La clase AurielWiz434SerialConnection, que deriva de la
SerialConnection, es la encargada de gestionar el uso del canal half-
duplex que proporcionan las tarjetas de radio frecuencia Auriel WIZ-434-
SML-IA. Permite a las aplicaciones que la usen mandar y recibir de forma
transparente datos, sin tener que preocuparse éstas por el acceso al
canal, la fragmentación de paquetes de 96 bytes que imponen las tarjetas,
o de guardar los tiempos especificados en las hojas del fabricante.
Internamente esta clase lo que hace es almacenar en un buffer
secundario los datos a enviar y proceder a su transmisión a la tarjeta de
radio frecuencia transcurrido los tiempos de guarda, fragmentando
- 86 -
Robot con control remoto y cámara de vídeo integrada
además el buffer en segmentos de 96 bytes. Finalmente, y mientras está
recibiendo datos, la salida de datos hacia la radio frecuencia se inhabilita
para evitar colisiones al estar los dos extremos usando el canal de forma
simultánea.
La clase AurielWiz434SerialConnection, por defecto, y a diferencia
de su padre, SerialConnection, no atiende los eventos ‘Output Buffer
Empty’, Buffer de Salida Vacío. En caso de que se desee recibir
notificaciones de este tipo, se debe usar la función
setPortEventOutputEmptyEnabled(true).
Figura 42 Diagrama UML del paquete com.theexbteam.comm
Este paquete incluye además un subpaquete llamado
com.theexbteam.comm.util, que implementa las funciones necesarias
para la creación de los delimitadores de trama 01111110 usados en el
nivel de enlace del protocolo de comunicaciones. Así, intercalará
automáticamente a toda secuencia de datos de cinco unos seguidos un
- 87 -
Robot con control remoto y cámara de vídeo integrada
cero, independientemente de que el siguiente bit sea uno o cero, para así
evitar que los datos se confundan con los separadores de tramas. Cabe
destacar que el método getFrameDecoded(byte) de la clase
FrameEncoder puede devolver tres tipos de datos:
• Un byte con el valor decodificado resultado de concatenar el
acumulador interno de la clase que contiene bytes incompletos con el
último byte introducido, eliminando pertinentemente la sobrecarga de
ceros introducida tras cinco unos consecutivos. En este caso, el
método isDecodedValid() deberá devolver true.
• Un objeto FrameSeparator, arrojado por el método, en cuyo caso
tanto isDecodedValid() devolverá false, que indica el comienzo de una
nueva trama.
• Un byte no válido, al devolver isDecodedValid() false. Esto se
debe a que se ha eliminado una sobrecarga de ceros y no se ha
llegado a completar los ocho bits del acumulador interno y por tanto no
se puede procesar el byte recibido hasta que llegue el siguiente.
5.4. PAQUETE COM.THEEXBTEAM.ROBOTS
La misión de este paquete es controlar la unidad remota, recibir los
datos que ésta le transmita y transmitir las órdenes pertinentes de
movimiento, ajuste de cámara o de sistema.
El siguiente diagrama UML muestra las clases principales del
paquete así como su interrelación:
- 88 -
Robot con control remoto y cámara de vídeo integrada
Figura 43 Diagrama UML del paquete com.theexbteam.robots
La clase Kernel es el núcleo del sistema de control. Ella alberga las
clases CommunicationsCore, ImageCore, StatusMonitor y
CommandCore, encargadas de las tareas de comunicaciones,
procesado de imágenes, monitor de estado del robot y control de órdenes
del robot respectivamente:
• CommunicationsCore: implementa el nivel físico y de aplicación
de la pila de protocolos de comunicaciones y realiza las conexiones
con los puertos de comunicaciones serie según los parámetros que se
le pasen al crear una instancia de ella. Los bytes que recibe desde el
nivel físico a través de las clases del paquete com.theexbteam.comm
son decodificados, separando cada trama de la anterior, determinando
si pertenecen al servicio de datos o al de comandos, y, en este último
caso, enviando los paquetes de confirmaciones pertinentes. Una vez
extraído el servicio al que pertenece la información recibida, propaga
los eventos resultantes a las clases de gestión de datos y comandos:
ImageCore y StatusMonitor por un lado y CommandCore por el otro.
- 89 -
Robot con control remoto y cámara de vídeo integrada
Además recoge estadísticas de uso del radio enlace que pueden ser
consultadas a través de la función getStats() que devuelve un objeto de
la clase java.util.Map con diversos valores, como son los bytes
enviados y recibidos, comandos y confirmaciones enviados y recibidos
y estado de las ventanas de envío y recepción del protocolo confirmado
de comandos. Los comandos de sistema PING no lanzan eventos
CommandEvent de tipo COMMAND_RECEIVED o COMMAND_
ACKNOWLEDGE, sino que se generan de tipo
PING_ECHO_REQUESTED cuando se reciben en la unidad remota y
PING_ECHO_RECEIVED cuando se recibe en la unidad que envió el
comando original el ACK del mismo.
• ImageCore: atiende los eventos de datos de imagen que la
unidad remota transmite al host controlador así como mantiene la
configuración de la cámara del robot. Así, permite variar los diversos
modos de adquisición de la cámara, el tiempo de exposición o la
ganancia de salida de la señal de la cámara. Las modificaciones en los
registros de la cámara sólo se mandan a la unidad remota cuando se
llama al método loadSettings(), no cuando se modifican los valores.
Para más información acerca de los valores que se pueden configurar,
vea la documentación de la clase o bien el apartado dedicado a la
cámara de la memoria.
• StatusMonitor se encarga de controlar el estado general del
robot. Toma los datos de tipo ‘status’ que se reciben desde el enlace de
radio frecuencia. Actualmente sólo se mantiene el estado ‘hay línea’
que indica que la unidad remota en modo automático está siguiendo
con éxito un camino marcado.
• CommandCore. Esta clase facilita a la interface con el usuario el
conjunto necesario de métodos para gobernar el robot en modo manual,
enviando al CommunicationsCore las órdenes de comando necesarias
para realizar los movimientos que se le indiquen.
Para interactuar con el Kernel de la aplicación se dispone de la clase
abstracta UserInterface, que se encarga de ejecutar los métodos
- 90 -
Robot con control remoto y cámara de vídeo integrada
pertinentes de Kernel y sus elementos de acuerdo con las acciones que
realice el usuario o la aplicación final. Se disponen de dos clases que
heredan de UserInterface:
• CommandLineInterface, interface de línea de comandos,
orientada a interpretar cadenas de comandos que se le pasen desde
eventos de teclado.
• GraphicalUserInterface, orientada a interfaces gráficas,
proporciona los métodos de escucha de los eventos principales de
java.awt como son los MouseEvents.
Figura 44 Aspecto de la interface gráfica de usuario
- 91 -
Robot con control remoto y cámara de vídeo integrada
6. APÉNDICE A: INSTALACIÓN DEL SOFTWARE El software ha sido desarrollado y probado con éxito en un entorno
Windows NT5 (2000/Xp Home y Pro), usando para su edición JBuilder 8
Enterprise de Borland y compilando satisfactoriamente tanto con los
compiladores de Borland como los del JSDK 1.4.1_2.
Figura 45 Logotipo del lenguaje de programación Java de Sun Microsystems
El entorno Jakarta-ANT proporciona una forma rápida de compilar y
generar de forma automatizada la documentación de las librerías creadas, que
es, además, y a diferencia de ‘make’ independiente de la plataforma en que se
ejecute. Jakarta-ANT pertenece al grupo de desarrollo Jakarta de la Apache
Software Foundation.
Figura 46 Logotipo del proyecto APACHE ANT
A continuación se describe el procedimiento para instalar y ejecutar las
clases compiladas distribuidas.
6.1. INSTALACIÓN DEL ENTORNO JAVA
Si solamente desea ejecutar las clases previamente compiladas y no
tiene intención de recompilar los fuentes, deberá contar con el entorno de
ejecución de Java (JRE, Java Runtime Environment), en su versión, como
mínimo 1.4.1_2, disponible gratuitamente en:
http://java.sun.com/j2se/downloads.html
Si por el contrario desea compilar los fuentes deberá instalar el
entrono de desarrollo estándar de Java (J2SE-SDK, Java 2 Standar
Edition Software Development Kit), en su versión, como mínimo, 1.4.1_2,
también disponible desde el enlace anterior para su descarga gratuita.
- 92 -
Robot con control remoto y cámara de vídeo integrada
Una vez descargado al equipo local la versión de Java, ejecute el
archivo que iniciará el proceso automático de instalación del entorne
elegido de Java.
6.2. INSTALACIÓN DE LAS LIBRERÍAS JAVAX.COMM
Para instalar correctamente las librerías de comunicaciones de Sun
Microsystem siga los siguientes pasos:
• Descargue de http://java.sun.com/products/javacomm/ la última
versión para la plataforma que use. Actualmente hay versiones
disponibles para plataformas Microsoft Windows y Sun Solares, tanto
para SPARC como para x86.
• Descomprima el contenido del archivo comprimido a una carpeta
temporal si sólo va a ejecutar el programa o bien a una carpeta de
desarrollo de su conveniencia para el caso de que prefiera compilar o
modificar los fuentes.
• Revise antes de seguir los documentos README.HTML y
jdk1.2.html por si difiriera la instalación con el procedimiento aquí
descrito para la versión 2.0 de la API de comunicaciones javax.comm.
• Localice el directorio de instalación del Java Runtime Environment,
JRE en su equipo, por defecto instalado en la subcarpeta <jdk>\jre si
instaló conjuntamente el JSDK y el JRE o en la carpeta \jre si instaló
únicamente el JRE.
• En la subcarpeta <jdk>\jre\lib\ext, copie el archivo comm.jar
que encontrará entre los archivos comprimidos.
• En la subcarpeta <jdk>\jre\lib, copie el archivo
javax.comm.properties. Si no va a compilar el proyecto, puede borrar
ya la carpeta temporal en la que descomprimió los archivos.
• Si va a compilar el proyecto deberá agregar a la variable de
entono CLASSPATH del sistema el archivo comm.jar, indicando tanto
la ruta de acceso como el nombre del mismo. Para entornos Windows
puede usar la directiva:
- 93 -
Robot con control remoto y cámara de vídeo integrada
SET CLASSPATH=%CLASSPATH%;<PATH_COMM.JAR>\comm.jar
6.3. INSTALACIÓN DE LA APLICACIÓN DE CONTROL
Los archivos necesarios para ejecutar la aplicación de control así
como toda la documentación y los archivos fuentes de la aplicación se
encuentran disponibles para su descarga desde la URL
http://www.theexbteam.com/robots
Descomprima el archivo y agregue a la variable de entorno
CLASSPATH la carpeta “classes” que contiene la distribución con todas
las clases compiladas de la forma:
SET CLASSPATH=%CLASSPATH%;<PATH_CARPETA_INSTALACIÓN>\
Para ejecutar las distintas Interfaces de Usuario o programas de
diagnóstico, refiérase al fichero README.TXT de la distribución, en la
que encontrará detallada información acerca de los programas incluidos.
6.4. INSTALACIÓN DE JAKARTA-ANT
La instalación del entorno Jakarta-ANT comprende los siguientes
pasos:
• Descargue la última distribución de Jakarta-ANT desde la página
del proyecto http://ant.apache.org/.
• Descomprima el contenido de la distribución. Asumiremos aquí
<ant> como la ruta a la carpeta en la que descomprimió ANT.
• Agregue a la variable de entorno PATH en los sistemas Windows
o su equivalente para otras plataformas o sistemas operativos la
carpeta <ant>\bin. Para sistemas Windows:
SET PATH=%PATH%;<ant>\bin\
• Cree la variable de entorno ANT_HOME con la ruta a la carpeta
de instalación de ANT:
SET ANT_HOME=<ant>
• Opcionalmente, y si tiene problemas para ejecutar ANT, cree la
variable de entorno JAVA_HOME que debe apuntar a la carpeta de
instalación del JSDK:
- 94 -
Robot con control remoto y cámara de vídeo integrada
SET JAVA_HOME=<PATH_JSDK>\
• Para poder ejecutar correctamente los build.xml de los paquetes
de la aplicación, deberá crear además dos variables de entorno
llamadas JAVA_LIBS y JAVA_DOC. La primera variable deberá
contener la carpeta en la que se colocarán las clases compiladas y en
la que se buscará a la hora de compilar el proyecto las clases
dependientes (CLASSPATH) y la segunda indicará la ruta donde se
copiará la documentación generada automáticamente por la tarea
‘documentar’ de que cuenta cada build.xml.
• Adicionalmente se disponen de las tareas ‘compilar’ para compilar
(tarea por defecto), ‘documentar’ para generar la documentación,
‘empaquetar’ para generar un archivo comprimido .JAR con todas las
clases, ‘limpiar’ para eliminar las clases y la documentación y
‘limpiarDoc’ para eliminar sólo la documentación generada.
- 95 -
Robot con control remoto y cámara de vídeo integrada
7. APÉNDICE B ESQUEMÁTICOS DE LAS PLACAS En las siguientes dos páginas se han recogido a gran tamaño los
esquemáticos detallados de las dos placas de control de la unidad remota.
- 96 -
Robot con control remoto y cámara de vídeo integrada
Title
Size
Doc
umen
t N
umbe
rR
ev
Dat
e:S
heet
- 97 -
Y2
20M
Hz
C8
15pF
C9
15pF
D14
DEP R
447
0
U1
L780
5/TO
220
VIN
1
GN
D2
VOU
T3
J1P
WR
_IN
1 2+
C1
220u
F+
C3
100u
FC
210
0nF
C4
100n
F
+5V
J2 PWR
_OU
T
1 2
D1
PW
R_O
N
R1
470
J3
REG
ULA
DO
R
12
U2
AT9
0S85
15
RS
T9
XTA
L218
XTA
L119
GND20
OC
1B29
ALE
30
ICP
31
VC
C40
PC
0/A8
21
PC
1/A9
22
PC
2/A
1023
PC
3/A
1124
PC
4/A
1225
PC
5/A
1326
PC
6/A
1427
PC
7/A
1528
PD0/
RXD
10
PD1/
TXD
11
PD
2/IN
T012
PD
3/IN
T113
PD4
14
PD
5/O
C1A
15
PD
6/W
R16
PD
7/R
D17
PB0
/T0
1
PB1
/T1
2
PB2
/AIN
03
PB3
/AIN
14
PB4
/SS
5
PB5
/MO
SI
6
PB6
/MIS
O7
PB7
/SC
K8
PA0
/AD
039
PA1
/AD
138
PA2
/AD
237
PA3
/AD
336
PA4
/AD
435
PA5
/AD
534
PA6
/AD
633
PA7
/AD
732
+5V
Y1
8MH
zC
615
pFC
515
pF
U4 VIN
1
REF
+12
REF
-11
D0
2
D1
3
D2
4
D3
5
D4
14
D5
15
D6
16
D7
17
INT
9
OF
L18
VC
C20
GND
CS
13M
OD
E7
RD
8
WR
/RD
Y6
R7 1K
+5V
J10
TAR
J_C
TRL
12345678
+5V
U3
PIC
16F8
4
GN
D5
VD
D14
OSC
2/C
LKO
UT
15
MC
LR4
OSC
1/C
LKIN
16
RA0
17
RA1
18
RA2
1
RA3
2
RA4
/TO
CK
I3
RB0
/INT
6
RB1
7
RB2
8
RB3
9
RB4
10
RB5
11
RB6
12
RB7
13
+5V
U5
LM38
5-2.
5/TO
12
J16
1 3 5 7 9
2 4 6 8 10
+5V
D12
PR
OG
R21
470
+5V
R22
10K
R5
1.2K
+5V
J17
EXP
ANS
1234
of
11.
2
Tarje
ta P
rinci
pal p
ara
Rob
ot L
SED
A4
11
Mon
day
, M
ay 1
9, 2
003
CAM
1C
AM2
CAM
3O
SC
1
OSC
1O
SC2
OSC
2
CA
M1
CA
M2
CA
M3
CA
M4
CAM
4
TX RX
XTAL
1XT
AL2
XTAL
1XT
AL2
MO
DE
GO
T_LI
NE
MO
TAC
3
MO
TAC
0M
OTA
C1
MO
TAC
2
PIX
0P
IX1
PIX
2P
IX3
PIX
4P
IX5
PIX
6P
IX7
RE
SET
+5V
XRES
ET
PIX
0
SIN
PIX
1
LOA
D
PIX
2
XCLK
PIX
3
STAR
T
PIX
4
REA
D
PIX
5
XRE
SET
PIX
6
SIN
LOA
D
PIX
7
XCLK
STA
RT
RE
ADV
OU
T
GO
T_LI
NE
MO
TAC
3
MO
DE
VO
UT
MO
TAC
2
MO
TAC
0M
OTA
C1
INC
AM
AD
CS
TR
INC
AM
AD
CS
TR
SR
V1
SR
V2
RS
T
MO
SI
MIS
OS
CK
SRV
1
RE
SET
SRV
2
RE
SET
MO
SI
RES
ET
RX
MIS
OS
CK
TX
EXP
0E
XP1
EXP
2E
XP3
J4 SER
VO
1
321+5
V
J5 SER
VO
2
321+5
V
SW
1R
ESE
T
R2
10K
R3
1K
J7
CAM
AR
A
1 2 3 4 5 6 7 8 9 10 11 12
+5V
C7
100n
F
AD
C08
20
10
PR
OG
RA
MAD
OR
1
J8
AUR
IEL
1 3 5 7 9
2 4 6 8 10+5
V
D13
DIO
DO
_RS
T
Robot con control remoto y cámara de vídeo integrada
- 98 -
D14
DE
P R1
470
U4A
7432
1
23
U1
L780
5/TO
220
VIN
1
GN
D3
VO
UT
2
U4B
7432
4
56
J5P
WR
_IN
1 2
+C
322
0uF
+C
410
0uF
C1
100n
FC
210
0nF
U4C
7432
9
108
14 7
U2
L293
1A2
2A7
3A10
4A15
1/2E
N1
3/4E
N9
1Y3
2Y6
3Y11
4Y14
VC
C1
16
VC
C2
8
J6 MO
T1
12
J7 MO
T2
12
D11
RE
AD
Y
R18 470
+5V
+5V
+7,2
V
J1
J16
PR
OG
RA
MA
DO
R
1 3 5 7 9
2 4 6 8 10
J4 PW
R_O
UT
1 2
SW
1R
ESE
T
R14
10K
R15
1K
+5V
C12
100n
F
+5V
+5V
10K
+7,2
V
D12
PR
OG
R21
470
+5V
+5V
+C
910
0uF
D13
DIO
DO
_RS
TY1
8MH
zC
815
pFC
715
pF
U3
AT9
0S85
15
RS
T9
XTA
L218
XTA
L119
GND20
OC
1B29
ALE
30
ICP
31
VC
C40
PC
0/A
821
PC
1/A
922
PC
2/A
1023
PC
3/A
1124
PC
4/A
1225
PC
5/A
1326
PC
6/A
1427
PC
7/A
1528
PD
0/R
XD10
PD
1/TX
D11
PD
2/IN
T012
PD
3/IN
T113
PD
414
PD
5/O
C1A
15
PD
6/W
R16
PD
7/R
D17
PB
0/T0
1
PB
1/T1
2
PB
2/A
IN0
3
PB
3/A
IN1
4
PB
4/S
S5
PB
5/M
OS
I6
PB
6/M
ISO
7
PB
7/S
CK
8
PA
0/A
D0
39
PA
1/A
D1
38
PA
2/A
D2
37
PA
3/A
D3
36
PA
4/A
D4
35
PA
5/A
D5
34
PA
6/A
D6
33
PA
7/A
D7
32
D7
1N40
01
D8
1N40
01
+7,2
J12
1234
D9
1N
1N
R22
10K
D1
PW
R_O
N
R3
470
J3 8+5
V
+5V
+5V
Title
Size
Doc
umen
t N
umbe
rR
ev
Dat
e:S
heet
of
14.
0
Tarje
ta d
e co
ntro
l de
mot
ores
par
a R
obot
LS
ED
A4
11
Mon
day
, Ju
ne 2
3, 2
003
MO
DE
MO
TAC
2M
OTA
C3
GO
T_LI
NE
MO
TAC
0M
OTA
C1
MA
RC
HA
BU
MP
ER
3
BU
MP
ER
4B
UM
P_T
RA
S
BU
MP
_TR
AS
MO
DE
9
MO
TAC
3G
OT_
LIN
E
0
MO
TAC
0M
OTA
C1
MO
TAC
2
EXP
1
MO
T1_D
IR0
EXP
2E
XP3
EXP
4
BU
MP
ER
4
MO
T1_D
IR1
MO
T2_D
IR0
MO
T2_D
IR1
EXP
1
BU
MP
ER
3
EXP
2
EXP
3E
XP4
MA
RC
HA
RE
SE
T
EN
_MO
T1
CN
Y2
EN
_MO
T2
MO
SI
RS
T
CN
Y1
SC
KM
ISO
CN
Y3
MO
SI
CN
Y4
MIS
OS
CK
MO
T1_D
IR0
MO
T1_D
IR1
MO
T2_D
IR1
MO
T2_D
IR0
R10
R11
INT_
ME
C
BU
MP
ER
1
BU
MP
ER
2
RE
SE
T
RE
SE
T
XTA
L2
MO
DE
INT_
ME
C
CN
Y1
EN
_MO
T1
CN
Y2
EN
_MO
T2
CN
Y3
CN
Y4
BU
MP
ER
1B
UM
PE
R2
BU
MP
ER
3B
UM
PE
R4
XTA
L1XT
AL2
XTA
L1
U4D
7432
12
1311
+5V
+5V
R13
220
R8
220
R9
47K
+5V
R23
1K
R1
10K
R2
10K
+5V
+5V
EXP
AN
1 2 3 4
SW
2M
AR
CH
A
R16
10K
R17
1K
+5V
C11
100n
F
J14 B
UM
PE
R3
1234
C6
100n
F
R5
47K
10K
C10
100n
F
D3
1N40
01
+5V
D4
1N40
01
D5
1N40
01
J15 B
UM
PE
R4
1234
D6
1N40
01
+7,2
V
+7,2
V
V
BU
MP
ER
1
J13
BU
MP
ER
2
1234
4001
D10
4001
+7,2
V
J8 CN
Y1
1234
J10
CN
Y3
1234
J9 CN
Y2
1234
J11
CN
Y4
1234
R12
220
R4
47K
R6
220
+5V
+5V
+5V
R7
47K
TAR
J_P
PA
L
1234567
Robot con control remoto y cámara de vídeo integrada
8. APÉNDICE F: AVISOS LEGALES
8.1. PAQUETES COM.THEEXBTEAM.*
Las librerías pertenecientes a los paquetes com.theexbteam.* se
distribuyen bajo licencia de fuente abierta u open source. Esta licencia es
la siguiente:
Copyright © 2003 The EXB Team. Todos los derechos reservados.
The EXB Team (‘EXB’) garantiza al usuario una licencia de uso, modificación y
redistribución del software tanto en forma de código fuente o binario, no exclusiva y libre de
royalties, siempre que se mantenga:
i) este aviso de copyright aparezca en todas las copias del software.
ii) El código fuente de este software se incluya en la distribución o al menos se
indique de dónde se pueda obtener dichos fuentes.
iii) El usuario licenciado no utilice el software en manera alguna que perjudique a
EXB
Este software se distribuye “tal cual”, sin garantía alguna de cualquier tipo. Toda condición
explícita o implícita, representaciones y garantías, incluyendo aquellas que impliquen
garantías comerciales están excluidas. EXB y sus usuarios licenciados no serán
responsables por cual daño que sufran los usuarios licenciados como resultado del uso,
modificación o distribución del software o sus derivados. En ningún caso EXB o sus
usuarios licenciados serán responsables por cualquier pérdida de rédito, beneficio o datos
derivados del uso de este software.
El uso de este software implica la aceptación de estos términos de uso.
Esta licencia de uso puede cambiar en versiones futuras del
software. En cualquier caso, revise la licencia que se incluya en las
distribuciones.
8.2. LIBRERÍAS JAVAX.COMM
Las librerías javax.comm de la API de comunicaciones de Java
proporcionadas por Sun Microsystems se licencian según el acuerdo de
uso descrito en el formulario Form ID#011801/LFI#123979 disponible en
el paquete de las librerías y desde la URL
http://java.sun.com/products/javacomm/COMM2.0.3_license.txt.
- 99 -
Robot con control remoto y cámara de vídeo integrada
Sun Microsystems no ofrece ningún tipo de garantía de
lo “tal cual” y su única
are.
8.3.
Microsoft Windows es una marca registrada de Microsoft
Corporation.
Java, JSDK, JRE y J2SE son marcas registradas de Sun
Apache, Jakarta-ANT y ANT son marcas registradas de la Apache
Software Foundation. El paquete ANT se distribuye bajo licencia Apache
Software License, Version 1.1, disponible desde la URL
http://ant.apache.org/manual/LICENSE. El logotipo de Apache-ANT y
Apache pertenecen a la Apache Software Foundation.
funcionamiento del software, proveyéndo
responsabilidad se limita al reemplazo del Softw
TERCERAS PARTES
Microsystems. El logotipo de Java pertenece a Sun Microsystems.
- 100 -
Robot con control remoto y cámara de vídeo integrada
9. Broyectos, versiones
actualizaciones del software y firmware del robot así como la API detallada de
las lib
9.1. REFERENCIAS BIBLIOGRÁFICAS (POR HACER)
grated
Circuits”, McGraw-Hill International Editions, Electrical & Electronic
Engineering Series. International edition 1988.
02.
• [MAL98] N. R. Malik. “Circuitos electrónicos. Análisis, diseño y
simulación”, Prentice Hall, Madrid, 1998
• [SAN01] Jesús Sanz Maudes et al. “Manual de prácticas de
Laboratorios de Electrónica Básica y Componentes, 2ª Parte”
(simulaciones PSPICE), Servicio de publicaciones, E.T.S.I.
Telecomunicación UPM, 2001.
• [WAK01] John F. Wakerly. “Diseño digital”, Prentice Hall, México,01.
• [TAN03] Andrew S. Tanenbaum, “Computer Networks”, fourth
international edition, Prentice Hall, Upper Saddle River (NJ), 2003.
• [HER97] Guillermo Herranz Acebo, “Ingeniería Eléctrico”, 1997,
Madrid, Departamento de Publicaciones de la E.T.S.I
Telecomunicación UPM.
9.2. HOJAS DE CARACTERÍSTICAS Y RECURSOS EN LA RED
Se han empleado las siguientes hojas de características disponibles
en Internet:
IBLIOGRAFÍA Para más información sobre este y otros p
rerías empleadas, consulte
http://www.theexbteam.com/robots
• [FRA88] Sergio Franco, “Operational Amplifiers and Analog Inte
• [FER et al. 2002] J. Ferreiros, J. Macías, et al. “Aspectos prácticos de
diseño y medida en laboratorios de electrónica”, Servicio de
publicaciones, E.T.S.I. Telecomunicación. UPM, 20
- 101 -
Robot con control remoto y cámara de vídeo integrada
• Philips Semiconductors, http://semiconductors.philips.com, para
tes digitales.
• , http://www.maxim-ic.com, para los conversores RS232 a
• Atmel, http://www.atmel.com, para los microcontroladores.
• Nacional Semiconductors, http://www.national.com, para el
los cronogramas.
9
fabr a fabricar el
h
4 - 47015 Modigliana [FC] –
S.L., c/ Balmes 243. – 08006
,
s,
http://www.endrich.net/.
• http://www.ebay.com, para la cámara digital.
los componen
MaximTTL MAX232.
ADC0820.
• Microchip, http://www.microchip.com, para el PIC16F84.
• Timming tool, http://timingtool.com/, para
.3. DIRECCIONES DE FABRICANTES Y PROVEEDORES
A continuación se facilitan las siguientes direcciones de los
icantes y proveedores del material necesario par
ardware del robot y el control remoto:
• AUR°EL S.p.A., Via Foro dei Tigli,
ITALY, Tel.: (+39) 0546941124, Fax: +390546941660. Fabrica los
enlaces radio frecuencia empleados. Para más información,
http://www.aurel.it.
• ENDRICH BauelementeBARCELONA, Tel. (+34) 93 217 31 44, Fax. (+34) 93 217 97 20
e-Mail: [email protected], suministrador oficial de AUR°EL en
España. Para más información y pedido
eBay,
- 102 -