INSTITUTO POLITÉCNICO NACIONAL
ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y
ELÉCTRICA
Sistema de control de desplazamiento de un robot móvil de propósito general,
empleando el protocolo Zigbee
Para obtener el título de:
Ingeniero en Comunicaciones y Electrónica
Por:
García Bonilla Miguel
Guridi Torres Erik
Pacheco Rivera Luis Daniel
Asesor Técnico: Ing. Alejandro V. Lugo Silva
Asesor Metodológico: M. en C. Genaro Zavala Mejía
ÍNDICE
Objetivo General ………... iii
Objetivos Particulares ……..………..……... iii
Justificación………... iv
Introducción………... 1
Capítulo I Antecedentes
1.1 Estado del arte……… 3
1.2 Marco teórico………. 4
Capítulo II Descripción de los bloques del sistema
2.1. IGU……….…... 8
2.1.1. Función IGU……….………..……….8
2.2. Transmisión y Recepción de datos ……….………..10
2.2.1 Función de la transmisión y recepción de datos…………..…. …..10
2.3 Descripción del robot ……….………12
Capítulo III Resultados de Hardware
3.1 Módulo receptor zigbee.………..……….…….13
3.2 Microcontrolador.………...……….14
3.3 Interfaz de potencia..………..………..………….15
3.4 Motores a pasos..………..……….17
3.5 Circuito final………18
Capitulo IV Resultado de Software
4.1 Desarrollo de la interfaz gráfica (IGU)……… ….21
4.1.1.1 Conexión al puerto………...………21
4.1.1.2 Calidad de la señal………...…22
4.1.1.3 Archivo………22
4.1.1.4 Bloque prohibido……… ….. ………..….23
4.1.1.5 Bloques de trayecto………..………..…..23
4.1.1.6 Botón de inicio………...………24
4.2 Configuración de los módulos………..……25
4.3 Configuración del microcontrolador……….…………28
Conclusiones……….…29
Apéndice 1. Costos………..30
Apéndice 2. Código del Microcontrolador………..31
Apéndice 3. Código de la Interfaz Gráfica ……….33
Apéndice 4. Hojas de datos de los módulos xbee ………...…………..……….58
Objetivo General
Diseñar un programa que controle la trayectoria de un robot por medio de
una interfaz gráfica, empleando una red inalámbrica punto a punto con protocolo
Zigbee y la base de un robot de propósito general.
Objetivos Particulares
Diseñar y programar la interfaz gráfica para desarrollar la aplicación del
proyecto.
Diseñar y construir el hardware de un robot móvil elemental.
Establecer la comunicación entre la computadora y el robot mediante
protocolo zigbee.
Justificación
En los últimos años han surgido nuevas tecnologías encaminadas al
monitoreo remoto de sensores, motivado por el bajo costo de los sistemas
para la transmisión inalámbrica, ZigBee es una de ellas.
Zigbee presenta las siguientes ventajas: tiene un menor consumo energético, un
tiempo de respuesta instantáneo, permite la comunicación inalámbrica
omnidireccional fiable y de dos vías, agilidad de canales para una mejor
coexistencia con otras tecnologías inalámbricas de 2.4 GHz, permite una
instalación y configuración sencilla.
Por las ventajas que presenta Zigbee despertó el interés de la realización del
proyecto, en el cual la parte medular es la comunicación inalámbrica por medio de
estos módulos. Con los cuales se busca hacer la conexión remota de la
computadora con un móvil de propósito general. (esta investigación aplicativa se
realizará con el fin de dar a conocer cómo se puede aplicar el protocolo
inalámbrico Zigbee ).
INTRODUCCIÓN
La automatización es un proceso que ha crecido en los últimos años y por
lo tanto se ha vuelto de gran importancia, la implementación de nuevas técnicas y
tecnologías dentro de este campo están encaminadas a satisfacer de manera más
veloz y eficientemente las necesidades de las empresas.
La automatización es un sistema donde se trasfieren tareas de producción,
realizadas habitualmente por operadores humanos a un conjunto de elementos
tecnológico.
El proyecto será una base para resolver diferentes tipos y niveles de
complejidad de problemas relacionados. No estará enfocado a la solución de un
problema en específico. El objetivo es hacer más eficiente el traslado y almacén
de material pesado, peligroso o de difícil manejo, eliminando el contacto directo de
la mano del hombre sobre estos con la ayuda de comunicación inalámbrica para
transmitir las instrucciones desde un ordenador personal a un robot que realizará
el trabajo físico.
El desarrollo del proyecto se presentara a través de cinco capítulos
distribuidos de la siguiente manera:
El capítulo I consta de la presentación del proyecto donde se abordara el
fundamento teórico que se aplicara posteriormente.
El capítulo II describe el diagrama a bloques, detallando claramente cuál es
el esquema funcional al que se debe llegar al concluir el mismo.
En el capítulo III se muestran los resultados correspondientes al hardware,
mientras que el capítulo IV hace referencia a los resultados obtenidos en software.
CAPITULO I Antecedentes
ZigBee se ha desarrollado para satisfacer la creciente demanda de
capacidad de red inalámbrica entre varios dispositivos de baja potencia. En la
industria ZigBee se está utilizando para la próxima generación de fabricación
automatizada, con pequeños transmisores en cada dispositivo, lo que permite
la comunicación entre dispositivos a un ordenador central.
Para llevar a cabo este sistema, un grupo de trabajo llamado Alianza
ZigBee (ZigBee Alliance) formado por varias industrias, sin ánimo de lucro, la
mayoría de ellas fabricantes de semiconductores, está desarrollando el estándar.
La alianza de empresas está trabajando codo con codo con IEEE para asegurar
una integración, completa y operativa. Esta alianza en las cuales destacan
empresas como Invensys, Mitsubishi, Philips y Motorola trabajan para crear un
sistema estándar de comunicaciones, vía radio y bidireccional, para usarlo dentro
de
dispositivos
de
automatización
hogareña
(domótica),
de
edificios
(inmótica), control industrial, periféricos de PC y sensores médicos. Los miembros
de esta alianza justifican el desarrollo de este estándar para cubrir el vacío que se
produce por debajo del Bluetooth como se muestra en la tabla comparativa.
1.1.
ESTADO DEL ARTE
Las comunicaciones inalámbricas son aquellas que propagan la información
en condiciones de espacio libre, por medio de ondas electromagnéticas, por lo
tanto este tipo de red carece de cables, existen varios tipos de redes inalámbricas.
Las redes inalámbricas facilitan cualquier tipo de instalación. Permiten que
los dispositivos remotos se conecten sin dificultad, sin necesidad de realizar
cambios en la infraestructura del lugar donde se va a instalar. Esto ha hecho que
el uso de esta tecnología se extienda con rapidez.
El mayor interés global de mejorar la eficiencia energética puede
desempeñar un papel fundamental en introducir a los consumidores el valor de las
soluciones de automatización del hogar, para esto fue creado Zigbee.
ZigBee, también conocido como "
HomeRF Lite
", es una tecnología
inalámbrica, basada en el estándar IEEE 802.15.4. Su objetivo son las
aplicaciones que requieren comunicaciones seguras con baja tasa de transmisión
de datos y maximización de la vida útil de sus baterías.
ZigBee comunica una serie de dispositivos haciendo que trabajen más
eficiente entre sí. Es especialmente útil para redes de sensores en entornos
industriales, médicos y domóticos.
1.1.1. ZIGBEE EN APLICACIONES DOMÓTICAS
Es el estándar mundial para el control de electrodomésticos, iluminación, el
medio ambiente, gestión energética, y seguridad.
Los protocolos ZigBee están definidos para su uso en aplicaciones
embebidas con requerimientos muy bajos de transmisión de datos y consumo
energético. Se pretende su uso en aplicaciones de propósito general como se
muestra en la figura 1, con características auto organizativas y bajo coste.
Puede utilizarse para realizar control industrial, albergar sensores
empotrados, recolectar datos médicos, ejercer labores de detección de humo y en
el área de la domótica.
Figura 1.2 Diferentes aplicaciones de ZigBee[3]
La seguridad de las transmisiones y de los datos son puntos clave en la
tecnología ZigBee.
ZigBee utiliza el modelo de seguridad de la subcapa MAC IEEE 802.15.4, la
cual especifica 4 servicios de seguridad.
Control de accesos. El dispositivo mantiene una lista de los dispositivos
“comprobados” en la red.
Datos Encriptados. Los cuales usan una encriptación con un código de 128
bits.
Integración de tramas para proteger los datos de ser modificados por otros.
Secuencias de refresco, para comprobar que las tramas no han sido
reemplazadas por otras.
El controlador de red. Comprueba estas tramas de refresco y su valor, para
ver si son las esperadas.
Depende del dispositivo final que creemos será nuestra decisión el dotarlo
de más o menos seguridad.
1.2.
MARCO TEÓRICO
También es la base sobre la que se define la especificación de ZigBee,
cuyo propósito es ofrecer una solución completa para este tipo de redes
construyendo los niveles superiores de la pila de protocolos que el estándar no
cubre
1.2.1. Características de Zigbee
ZigBee opera en las bandas libres ISM (Industrial, Scientific& Medical) de
2.4 GHz, 868 MHz (Europa) y 915 MHz (Estados Unidos).
Tiene una velocidad de transmisión de 250 Kbps y un rango de cobertura
de 10 a 75 metros.
[image:12.595.83.520.357.572.2]A pesar de coexistir en la misma frecuencia con otro tipo de redes como
WiFi o Bluetooth su desempeño no se ve afectado, esto debido a su baja tasa de
transmisión y, a características propias del estándar IEEE 802.15.4 [3] que
muestra espectro de Zigbee frente a otras tecnologías.
Figura 1.3Espectro de distintas tecnologías[3]
La fabricación de un transmisor ZigBee consta de menos circuitos
analógicos de los que se necesitan habitualmente.
Diferentes tipos de topologías como estrella, punto a punto, malla, árbol.
Escalabilidad de red: Un mejor soporte para las redes más grandes,
ofreciendo más opciones de gestión, flexibilidad y desempeño.
Cada red ZigBee tiene un identificador de red único, lo que permita que
coexistan varias redes en un mismo canal de comunicación sin ningún
problema.
Puesta de servicio inalámbrico: El conjunto fue mejorado con capacidades
seguras: para poner en marcha el servicio inalámbrico.
Ventajas
Ideal para conexiones punto a punto y punto a multipunto
Diseñado para el direccionamiento de información y el refrescamiento de la
red.
Opera en la banda libre de ISM 2.4 Ghz para conexiones inalámbricas.
Óptimo para redes de baja tasa de transferencia de datos.
Reduce tiempos de espera en el envío y recepción de paquetes.
Detección de Energía (ED).
Baja ciclo de trabajo: Proporciona larga duración de la batería.
Soporte para múltiples topologías de red: Estática, dinámica, estrella y
malla.
Hasta 65.000 nodos en una red.
Provee conexiones seguras entre dispositivos.
Son más baratos y de construcción más sencilla.
Desventajas
La tasa de transferencia es muy baja.
Solo manipula textos pequeños comparados con otras tecnologías.
Zigbee trabaja de manera que no puede ser compatible con bluetooth en
todos sus aspectos porque no llegan a tener las mismas tasas de
transferencia, ni la misma capacidad de soporte para nodos.
Tiene menor cobertura porque pertenece a redes inalámbricas de tipo
WPAN.
Dispositivos Zigbee según su papel en la red
Coordinador (ZigBee Coordinator, ZC). Que es el encargado del control la red y
los caminos que deben seguir los dispositivos para conectarse entre ellos.
Router (ZigBee Router, ZR).
Que tiene la funcionalidad del enrutamiento de
paquetes y ser origen o destino de información.
Dispositivo final (ZigBee EndDevice, ZED).Que serán los sensores y actuadores
de la red.
Dispositivos Zigbee según su funcionalidad.
Dispositivo de funcionalidad completa (FFD). Es capaz de recibir mensajes en
formato del estándar 802.15.4. Gracias a la memoria adicional y a la capacidad de
computar, puede funcionar como coordinador o router o puede ser usado en
dispositivos de red que actúen de interface con los usuarios.
Dispositivo de funcionalidad reducida (RFD).
Tiene capacidad y funcionalidad
limitadas (especificada en el estándar) con el objetivo de conseguir un bajo coste y
una gran simplicidad. Básicamente, son los sensores/actuadores de la red.
Para el desarrollo del proyecto se basara en los diferentes de dispositivos
ZigBee según su papel en la red para implementar la red inalámbrica que se
mencionara más adelante.
Tipos de Trafico de Datos
ZigBee/IEEE 802.15.4 dirige tres tipos de tráfico típicos:
Cuando el dato es periódico. La aplicación dicta la proporción, el sensor se
activa, chequea los datos y luego desactiva.
Cuando el dato es intermitente. La aplicación, u otro estímulo, determinan la
proporción como en el caso de los detectores de humo. El dispositivo necesita
sólo conectarse a la red cuando la comunicación se hace necesaria. Este tipo
habilita el ahorro óptimo en la energía.
CAPITULO II Solución Propuesta
El objetivo principal de la tesis es el diseño de un programa para que un
usuario controle la trayectoria de un robot por medio de una interfaz gráfica,
empleando el protocolo zigbee para la transmisión de información y la base de un
robot de propósito general, esto se llevara a cabo en 3 etapas:
-
Interfaz Gráfica de Usuario(IGU)
[image:15.595.119.472.284.552.2]-
Transmisión y Recepción de datos a través del módulo zigbee
-
Control del robot (Microcontrolador y sistema de potencia).
La figura 2.1 muestra el diagrama a bloques general del proyecto.
Figura 2.1 Diagrama a bloques del sistema
2.1. IGU
Esta etapa del proyecto consiste en desarrollar e implementar, una interfaz
amigable para el usuario con la cual podrá controlar los movimientos del robot en
base al trazado de una trayectoria previamente diseñada.
2.1.1. Función IGU
la de simular la situación en la que se encuentre actualmente el almacén
correspondiente. (figura 2.2)
Figura 2.2 Bloques sin función
Una vez que quede bien hecho todo el diseño se indicarán todos los
caminos posibles por los que podrá transitar nuestro robot. Al hacer esto se busca
facilitar la forma de enviar los datos o instrucciones a los motores, además de que
de esta forma evitaremos que el usuario dibuje trayectorias erróneas que al ser
realizadas puedan causar algún daño al móvil o al mismo almacén.
Todas las trayectorias posibles serán dibujadas en la interfaz por medio de
bloques muy pequeños. Cada uno de estos bloques tendrá un menú donde el
usuario podrá elegir en donde quiere que el móvil se detenga cierto tiempo, gire o
que realice alguna otra actividad, esto con el fin de facilitar aún más su manejo y
que sea mucho más versátil. (figura 2.3)
Figura 2.3 Bloques para definir trayectorias
Para que el usuario pueda indicar el inicio de la trayectoria bastará con que
de un click sobre el bloque correspondiente, posteriormente pasara el mouse
sobre los bloques que dibujen correctamente el camino requerido y finalizara el
trayecto con un click nuevamente sobre el bloque final.
[image:16.595.186.410.416.525.2]Figura 2.4 Diseño de interfaz gráfica de usuario
2.2. Transmisión y Recepción de datos a través del módulo zigbee
La transmisión y recepción de datos es una etapa esencial para la
realización del proyecto, ya que esta será la encargada de comunicar y de
llevar la transmisión de comandos, desde la interfaz hasta el robot.
2.2.1 Función de la transmisión y recepción de datos
Para que esta etapa se lleve a cabo, como se había mencionado
anteriormente utilizaremos módulos zigbee para la comunicación entre el
computador y el robot, esto debido a que es ideal para el proyecto, puesto que el
protocolo zigbee es ideal para domótica y para la inmótica, ya que el ancho de
banda es pequeño en consideración al bluetooth, puesto que para este tipo de
tareas no se necesita gran cantidad de información y su consumo de potencia es
mínimo.
requieren de una alimentación desde 2.8 a 3.4 V, y cuenta con 8 entradas/salidas
digitales las cuales van a ser útiles para manipular los motores del robot que se
utiliza.
Figura 2.5 Módulo Xbee S1 [1]
[image:18.595.129.471.447.567.2]Para poder tener toda la conectividad completa, necesitaremos dos de
estos módulos, una base para conectar a la computadora a través de un cable
USB llamado Xbee Explorer USB, y otra base llamada XBee Explorer Regulated,
que se posicionara en el robot la cual está destinada a regular el voltaje correcto
para que el módulo trabaje
Figura 2.6 Accesorios xbee necesarios para la conectividad [1]
Teniendo conocimiento de este tipo de tramas, la cual se muestra su
estructura en la figura 2.7, no se dependerá de programas que se mencionaran
posteriormente para poder transmitir información, sin entrar al modo de comandos,
ya que con el solo tener acceso al puerto serial (para esto usaremos una clase
incorporada al programa visual studio) podemos enviar la trama directamente y el
módulo la identificara como comando realizando la instrucción que se le asigne.
Figura 2.7 Estructura del frame del modo API [2]
2.3 Descripción del robot
En dicha etapa se controlara la activación y desactivación de los motores
del robot a utilizar, esto con el propósito de dar la instrucción a la etapa de
potencia para que el robot siga la trayectoria previamente diseñada por el usuario
en la interfaz gráfica de usuario.
El robot debe de contar con dos motores a pasos los cuales deberán tener
la suficiente potencia para llevar a cabo los movimientos trazados en la IGU y que
a su vez se transmitirán por medio de los módulos zigbee.
CAPITULO III Resultados de Hardware
[image:20.595.121.479.189.376.2]La etapa correspondiente al hardware está compuesta de distintas fases las
cuales se muestran en la figura 3.1. Dichas fases se describen en los subtemas
posteriores.
Figura 3.1. Diagrama a bloques de la etapa de hardware
3.1 Módulo receptor zigbee.
Para la recepción de los comandos enviados a partir de la interfaz gráfica
de usuario, se está haciendo uso del módulo xbee s1.
Dicho módulo se configuro para hacer uso de dos salidas digitales, las
cuales serán parte fundamenta en el control de la activación de los motores. Las
terminales correspondientes son las siguientes:
Pin 20 DIO0: Entrada o salida digital 0.
Pin 19 DIO1: Entrada o salida digital 1.
Figura 3.2. Diagrama de pines del módulo Xbee
Otro parámetro configurado de este módulo es el muestreo de las salidas
digitales a través del comando ATIR con un intervalo de 1 segundo, el cual nos
sirve para mostrar en IGU la intensidad de la señal.
3.2 Microcontrolador.
En esta fase se hace uso del microcontrolador MSP430 de Texas
Instruments, construido con una CPU de 16 bits, está diseñado para aplicaciones
empotradas de bajo costo y bajo consumo de energía. Este dispositivo tiene una
variedad de configuraciones con los siguientes periféricos: oscilador interno, timer
incluyendo unPWM, watchdog, USART, SPI, I2C, 10/12/14/16-bit ADCs.
Con este microcontrolador controlamos los motores a pasos, esto a través de la
programación de las secuencias lógicas necesarias para lograr el giro de los
motores.
Figura 3.3. Diagrama de pines del microcontrolador MSP430
En lo que se refiere a la configuración de entradas y salidas digitales del
microcontrolador la llevamos a cabo de la siguiente forma:
Puerto 1: correspondientes del pin 2 al 9 (P1.0-P1.7). Se configuraron como
salidas digitales, para hacer la conexión con los motores a pasos, distribuidos de
la siguiente manera:
P1.0-P1.3.- Destinados a las 4 terminales del motor a pasos 1.
P1.4-P1.7.- Destinados a las 4 terminales del motor a pasos 2.
Puerto 2: correspondientes a los pines 12 y 13 (P2.6, P2.7). Se configuraron
como entradas digitales, ya que estas terminales son las que interconectan al
módulo receptor xbee, y las cuales nos indican que motor se activa y por cuánto
tiempo.
Para verificar la configuración y programación de secuencias de este
microcontrolador consultar el apéndice 2.
De esta forma llevamos a cabo la fase de control de nuestro hardware, es
decir del movimiento y dirección de nuestro robot.
3.3 Interfaz de potencia.
Debido a que el microcontrolador no puede suministrar la corriente
necesaria para los devanados de los motores a pasos, para cumplir con dicha
necesidad hacemos uso del circuito integrado L293D.
Las salidas tienen un diseño que permite el manejo directo de cargas
inductivas tal es el caso de los motores a pasos, ya que incorpora internamente
los diodos de protección de contracorriente para cargas inductivas.
[image:23.595.206.380.271.481.2]La estructura interna consiste en transistores en configuración Darlington
que conducen la terminal de salida a tierra y otro par de transistores en conexión
seudo Darlington aporta la corriente de alimentación desde
VCC2. Las salidas
tienen diodos incorporados en el interior del chip para proteger al circuito de
manejo de potencia de las contracorrientes de una carga inductiva, todo esto se
muestra en la figura 3.4.
Figura 3.4. Estructura interna del integrado L293D.
Figura 3.5. Diagrama de pines del integrado L293D.
3.4 Motores a pasos
Para realizar el movimiento preciso y sincronizado de las dos llantas
traseras del robot, se hace uso de dos motores pasos unipolares.
Estos motores suelen tener 5 ó 6 cables de salida dependiendo de su
conexionado interno (en nuestro caso tiene 5 cables). Estos motores utilizan un
cable común a la fuente de alimentación y posteriormente se van colocando las
otras líneas a tierra en un orden especifico para generar cada paso, si tienen 6
cables es porque cada par de bobinas tiene un común separado, si tiene 5 cables
es porque las cuatro bobinas tiene un solo común.
Los motores a pasos que se están utilizando tienen la matrícula M35SP-9
C5870-60004 mitsumi mostrado en la figura 3.6, dentro de sus características da
7.5° por paso, es decir es necesario dar 48 pasos para una vuelta completa del
motor.
[image:24.595.216.377.553.673.2]Existen tres secuencias posibles para este tipo de motores: secuencia
normal, wave drive, medio paso. En nuestro caso llevamos a cabo la secuencia
normal.
[image:25.595.169.462.245.481.2]Con esta secuencia el motor avanza un paso por vez y debido a que
siempre hay al menos dos bobinas activadas, se obtiene un alto torque de paso y
de retención. La secuencia se puede consultar en la figura 3.7.
Figura 3.7. Secuencia normal para motor a pasos unipolar.
3.5 CIRCUITO FINAL
Este es el capítulo final de los resultados de hardware. En esta etapa se
juntan todos los resultados anteriores en un solo circuito, para que en conjunto
realicen las instrucciones enviadas por el programa.
.
Figura 3.8 Circuito final de Hardware
Una vez realizado el circuito y probado en una tabla de prácticas
(protoboard), se realizó el PCB del circuito. Y quedó como se muestra en la figura
3.9.
[image:26.595.160.453.387.681.2]En la figura 3.10 se muestra la etapa de hardware completa
CAPITULO IV Resultados de Software
4.1 Desarrollo de la interfaz gráfica (IGU)
[image:28.595.84.505.289.501.2]El diseño de la IGU se llevó a cabo en la paquetería de Visual Studio 2010
ultimate (C#), el modelo consiste en una serie de bloques, los cuales representan
el espacio por el cual el robot podrá desplazarse, la trayectoria el usuario la
indicara mediante el paso del cursor (mouse) sobre los pequeños bloques, los
cuales irán cambiando de color mostrando el recorrido que seguirá el robot; así
como también se mostrara un menú de opciones el cual permitirá realizar una
serie de eventos (este se mostrara dando clic derecho sobre el bloque en el cual
se encuentra localizado). La figura 4.1 muestra el diseño.
Figura 4.1 Diseño de la IGU
4.1.1 Controles
4.1.1.1 Conexión al puerto
Esta área denominada conectividad está conformada por un comboBox donde se muestra
la lista de los posibles puertos donde se puede conectar el módulo X-Bee transmisor,
además de un par de botones, uno para iniciar la conexión y otro para frenar la conexión
con el puerto seleccionado.
Figura 4. 2 Area de conectividad
4.1.1.2 Calidad de la señal
Esta área denominada señal cuenta con un pictureBox y el un textBox en
los cuales se mostrará la calidad de la señal mientras se está transmitiendo la
señal.
El pictureBox irá cambiando de color verde cuando la señal es muy fuerte y
cambiando progresivamente el tono hasta llegar a rojo cuando la señal se vuelve
muy débil. De igual manera en el textBox se mostrará el texto “muy fuerte” cuando
la señal es perfecta cambiando a “fuerte”, “débil” y “muy débil” mientras el móvil se
va alejando. El límite permitido para el correcto funcionamiento es hasta cuando la
señal es débil, en el momento que este pase a ser muy débil se corre el riesgo de
que la conexión se pierda.
Figura 4.3 Área de calidad de la señal
4.1.1.3 Archivo
Este control está hecho con menuItem donde se despliega un menú muy
simple que cuenta con 2 posibles acciones, resetear y salir.
[image:29.595.234.397.414.492.2]Figura 4.4 Menu principal de la IGU
4.1.1.4 Bloque prohibido
Estos son bloques formados por controles pictureBox que simplemente
representan el estado geográfico de la zona por donde se moverá el robot. Estos
bloques son zonas prohibidas para el móvil, el mismo programa no te permite
elegirlas, esto con la finalidad de evitar posibles errores por parte del usuario al
trazar la trayectoria.
Figura 4.5 Bloques Prohibidos
4.1.1.5 Bloques de trayecto
Estos bloques representan todos los posibles caminos por donde puede
moverse el robot hechos con el control pictureBox, basta con dar un click izquierdo
en el primer bloque y a partir de ahí simplemente pasar el cursor por todo el
camino que quieres que realice el móvil.
[image:30.595.238.389.371.458.2]Figura 4.6 Bloques de trayecto
Otra característica que tienen es que dentro de cada pictureBox que
representa el camino hay un pequeño menú que se despliega al darle un click
derecho. Este menú despliega 3 opciones las cuales son el tiempo que quieres
que se detenga el móvil. Una vez que haya cumplido el móvil el tiempo de espera,
este continuara con el camino indicado.
Figura 4.7 Opciones del click derecho
4.1.1.6 Botón de inicio
[image:31.595.218.413.374.493.2]Figura 4.8 Botón de Inicio
4.2 Configuración de los módulos
Para la programación de los módulos necesaria para que estos se
identifiquen, uno como transmisor y el otro como receptor existe software llamado
el X-CTU (figura 4.1), que es capaz de probar el correcto funcionamiento de los
módulos, indicarnos su versión, y leer el contenido de los mismos.
La programación de los módulos se puede hacer con este programa
mediante la pestaña Terminal, o también con el programa Hyperterminal, todo esto
atreves de una serie de comandos llamados AT commands (Comandos AT), los
cuales pueden ser capaces de asignar un id a cada módulo así como configurarlos
para que interactúen entre ellos, en la figura 4.2 se muestra un ejemplo para la
lectura de parámetros.
Figura 4.10 Ejemplo de lectura de parámetros[1]
Nuestro propósito es configurar las entradas y salidas digitales de dichos
módulos para la transmisión información, el módulo cuenta con 8 IO, de las cuales
solo vamos a hacer uso de 2.
Los comandos AT necesarios para la programación de los módulos se
usaran los siguientes comandos AT
•
ATMY
•
ATDL
•
ATAP
•
ATD0,ATD1
•
ATIR
que ATDL será la dirección del módulo remoto con la que se identificara. El
comando ATAP se activara en ambos módulos como 1, esto para que sean
capaces de identificar tramas API.
Las configuraciones que se realizaran para el control de
entradas/salidas digitales se llevaran a cabo con los comandos ATDX
donde X es la entrada o salida digital que se quiere modificar, tendiendo 8
disponibles, modificaremos solo 2 de estas.
Para el módulo local las modificaciones que se harán será
ATMY1234 y ATDL5678 lo que indica que el módulo remoto tiene la
dirección de 5678.
Parametro
Valor
ATDL
5678
ATMY
1234
[image:34.595.74.519.290.350.2]ATAP
1
Figura 4.11 Configuraciones del módulo local
La configuración del módulo remoto para la identificación del otro módulo,
se hará inverso a como se había hecho con el módulo local, esto quiere decir que
ahora será ATMY5678 y ATDL1234, teniendo ahora una conexión exitosa entre
los módulos. Para la configuración de las entrada/digitales se configuraran ahora
con ATD04 y ATD14 que representaran salidas digitales que serán las
encargadas de controlar las llantas del robot. ATIR es un comando que estará
sensando constantemente el estado de las entrada/salidas digitales del módulo,
indicándonos constantemente la potencia de la señal que se recibe, aquí se
propone de un segundo teniendo ATIR3E8.
Parametro
Valor
ATDL
1234
ATMY
5678
ATAP
1
ATD1
4
ATD0
4
ATIR
3E8
[image:34.595.77.515.543.645.2]4.3 Configuración del microcontrolador
[image:35.595.128.535.225.609.2]Para la programación del microcontrolador, se declararon tres vectores,
DATOS1, DATOS2, DATOS3, los cuales contienen las secuencia para controlar
motor a pasos 1, motor a pasos 2, y los dos motores respectivamente; dichas
secuencias van a estar activándose dependiendo de las entradas del puerto 2, tal
y como se muestra en el diagrama de flujo en la figura 4.13G.
Conclusiones.
Con la realización del proyecto Sistema de control de desplazamiento
de un robot móvil de propósito general, empleando el protocolo zigbee se llegaron
a las siguientes conclusiones.
•
Del estudio realizado se determinó que zigbee es una buena alternativa
debido a que no maneja gran cantidad de ancho de banda (250kbps), lo cual es
idóneo para la aplicación de nuestro proyecto.
•
Logrando entender el funcionamiento del módulo xbee en modo de
operación API, se pudo establecer una interconexión exitosa entre la interfaz
gráfica de usuario y el robot, permitiendo enviar comandos sin la necesidad de
usar el modo de comandos, debido a que API lo realiza automáticamente.
•
Con el diseño de la etapa del movimiento del robot y la comprensión
del funcionamiento e implementación de los motores a pasos se logro que el robot
cumpliera con la función de llevar a cabo el desplazamiento, que previamente se
diseña en la interfaz gráfica.
•
Otra etapa fundamental la cumple el Microcontrolador MSP430, en el
cual se programo las secuencias necesarias para el buen funcionamiento de los
motores a pasos, además de ayudar con el ahorro de energía
Apendice 1. Costos
Nombre
Costo
Cantidad
Total
Placa 10X10
10.50
1
10.50
Base 14 pines
2.50
1
2.50
Base 16 pines
2.50
2
5.00
Bornes 3 terminales
5.50
3
16.50
Bornes 2 terminales
5.00
2
10.00
Módulos xbee
490.00
2
980.00
Xbee explorer USB
500.00
1
500.00
Xbee explorer regulador
200.00
1
200.00
L293D
40.00
2
80.00
Microcontrolador
MSP430
40.00
1
40.00
Programador
MSP-EXP430G2
150.00
1
150.00
Motores a pasos unipolar
40.00
2
80.00
Resistencia 10K
Ω
1.00
1
1.00
Alambre
2.00
2m
4.00
Soldadura
5.00
2m
10.00
Pila 9volts
40.00
1
40.00
Pila 1.5volts
10.00
4
40.00
Cloruro Férrico
20.00
1
20.00
Apendice 2. Codigo del Microcontrolador
NAME main ; module name
PUBLIC main ; make the main label vissible
; outside this module
#include "msp430x20x2.h" ; #define controlled include file
;
ORG 0xF800 ;Inicio del programa ;
---main
RESET MOV.W #0x280, SP ; Inicialización del Stackpointer
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Watchdog timer detenido
MOV.B &CALBC1_1MHZ,&BCSCTL1 ;DCO funcionando a la frecuencia
MOV.B &CALDCO_1MHZ,&DCOCTL ;calibrada de 1MHz
INICIO MOV.B #0x00,&P1SEL MOV.B #0xFF,&P1DIR MOV.B #0x00,&P2SEL MOV.B #0x00,&P2DIR MOV.B &P2IN,R4 ST AND.B #0xC0,R4 CMP.B #0x80,&P2IN JZ INICIO1 CMP.B #0x40,&P2IN JZ INICIO2
CMP.B #0xC0,&P2IN JZ INICIO3
CMP.B #0x00,&P2IN JZ INICIO4
;---
----; SUBRUTINAS
;---
----TIEMPO: DEC.W R4 NOP
CMP.W #0x0000, R4 JNZ TIEMPO RET
INICIO1: MOV.W #DATOS1,R5 BUCLE1: MOV.B @R5+,&P1OUT MOV.W #666d,R4
CALL #TIEMPO CMP.B #0x00,0(R5) JZ ST
JMP BUCLE1 INICIO2: MOV.W #DATOS2,R5 BUCLE2: MOV.B @R5+,&P1OUT MOV.W #666d,R4
CALL #TIEMPO CMP.B #0x00,0(R5) JZ ST
JMP BUCLE2 INICIO3: MOV.W #DATOS3,R5 BUCLE3: MOV.B @R5+,&P1OUT MOV.W #666d,R4
CALL #TIEMPO CMP.B #0x00,0(R5) JZ ST
JMP BUCLE3 INICIO4:
MOV.B #0x00,&P1OUT JMP ST
;---
----; SECUENCIAS
;---
----DATOS1 DC8 0x03,0x06,0x0C,0x09,0x00 DATOS2 DC8 0x30,0x60,0xC0,0x90,0x00 DATOS3 DC8 0x33,0x66,0xCC,0x99,0x00
;---
----; Vectores de Interrupcióh
;---
ORG 0xFFFE ; Vector de RESET del MSP430
DW RESET
Apéndice 3. Codigo de Interfaz Gráfica
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace IGUprueba1 {public partial class Form1 : Form {
int bandera; int primero=0; int contador=0;
int [] variable = new int [112]; public Form1()
{
InitializeComponent(); foreach (string portname in SerialPort.GetPortNames()) { comboBox1.Items.Add(portname); } } private void adiosToolStripMenuItem_Click(object sender, EventArgs e) { }
private void Form1_Load(object sender, EventArgs e)
{
}
private void pictureBox1_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; } private void pictureBox1_MouseLeave_1(object sender, EventArgs e) {
if (pictureBox1.BackColor != Color.Aqua)
if ((pictureBox2.BackColor == Color.Aqua) || (ovalShape16.BackColor == Color.Blue)||primero==0)
if (bandera == 1) {
pictureBox1.BackColor = Color.Aqua;
if (ovalShape16.BackColor == Color.Blue)
{
if (pictureBox90.BackColor == Color.Aqua)
{
variable[contador] = 3; }
contador++;
variable [contador]= 1; contador++;
primero = 1; }
}
private void pictureBox2_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox4_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox3_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox5_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox10_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox9_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox8_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox7_Click(object sender, EventArgs e)
{
}
private void pictureBox6_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox22_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox21_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox16_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox15_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox11_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox90_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox89_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox88_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1;
}
private void pictureBox70_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox71_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox72_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox81_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox80_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox79_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox99_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox98_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox97_Click_1(object sender, EventArgs e)
{
}
private void pictureBox39_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox38_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox37_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox36_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox35_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox34_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox33_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox32_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox31_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0;
}
private void pictureBox30_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox29_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox28_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox27_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox26_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox25_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox93_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox92_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox91_Click(object sender, EventArgs e)
{
}
private void pictureBox75_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox74_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox73_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox84_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox83_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox82_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void
pictureBox102_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void
pictureBox101_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void
pictureBox100_Click_1(object sender, EventArgs e)
bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox54_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox53_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox52_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox51_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox50_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox49_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox48_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox47_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox45_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox44_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox43_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox42_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox41_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox40_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox96_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox95_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox94_Click_1(object sender, EventArgs e)
{
if (bandera != 1)
bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox78_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox77_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox76_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox87_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox86_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox85_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void
pictureBox105_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void
pictureBox104_Click_1(object sender, EventArgs e)
{
private void
pictureBox103_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox69_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox68_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox67_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox66_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox65_Click_1(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox64_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox63_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox62_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1)
private void pictureBox61_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox60_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox59_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox58_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox57_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox56_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void pictureBox55_Click(object sender, EventArgs e)
{
if (bandera != 1) bandera = 1; else if (bandera == 1) bandera = 0; }
private void
pictureBox2_MouseLeave(object sender, EventArgs e)
{
if (pictureBox2.BackColor != Color.Aqua)
if ((pictureBox1.BackColor == Color.Aqua) || (pictureBox4.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox2.BackColor = Color.Aqua;
} }
private void
pictureBox4_MouseLeave(object sender, EventArgs e)
{
if (pictureBox4.BackColor != Color.Aqua)
if ((pictureBox2.BackColor == Color.Aqua) || (pictureBox3.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox4.BackColor = Color.Aqua;
variable[contador] = 1; contador++; primero = 1;
} }
private void
pictureBox3_MouseLeave(object sender, EventArgs e)
{
if (pictureBox3.BackColor != Color.Aqua)
if ((pictureBox4.BackColor == Color.Aqua) || (pictureBox5.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox3.BackColor = Color.Aqua;
variable[contador] = 1; contador++;
primero = 1; }
}
private void
pictureBox5_MouseLeave(object sender, EventArgs e)
{
if (pictureBox5.BackColor != Color.Aqua)
if ((pictureBox3.BackColor == Color.Aqua) || (ovalShape15.BackColor == Color.Blue)||primero==0)
if (bandera == 1) {
pictureBox5.BackColor = Color.Aqua;
if (ovalShape15.BackColor == Color.Blue) { if(pictureBox10.BackColor==Color.Aqua) { variable[contador]=1; } if (pictureBox70.BackColor == Color.Aqua) {
variable[contador] = 2; }
contador++; }
variable[contador] = 1; contador++;
primero = 1; }
}
private void
pictureBox10_MouseLeave(object sender, EventArgs e)
{
if (pictureBox10.BackColor != Color.Aqua)
if ((pictureBox9.BackColor == Color.Aqua) || (ovalShape15.BackColor == Color.Blue)||primero==0)
if (bandera == 1) {
pictureBox10.BackColor = Color.Aqua;
if (ovalShape15.BackColor == Color.Blue)
{
if (pictureBox5.BackColor == Color.Aqua)
{
variable[contador] = 1; }
if (pictureBox70.BackColor == Color.Aqua)
{
variable[contador] = 3; }
contador++; }
variable[contador] = 1; contador++;
primero = 1;
} }
private void
pictureBox9_MouseLeave(object sender, EventArgs e)
{
if (pictureBox9.BackColor != Color.Aqua)
if ((pictureBox10.BackColor == Color.Aqua) || (pictureBox8.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox9.BackColor = Color.Aqua;
variable[contador] = 1; contador++;
primero = 1; }
}
private void
pictureBox8_MouseLeave(object sender, EventArgs e)
{
if (pictureBox8.BackColor != Color.Aqua)
if ((pictureBox9.BackColor == Color.Aqua) || (pictureBox7.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox8.BackColor = Color.Aqua;
variable[contador] = 1; contador++;
primero = 1; }
}
private void
{
if (pictureBox7.BackColor != Color.Aqua)
if ((pictureBox8.BackColor == Color.Aqua) || (pictureBox6.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox7.BackColor = Color.Aqua;
variable[contador] = 1; contador++; primero = 1; }
}
private void
pictureBox6_MouseLeave(object sender, EventArgs e)
{
if (pictureBox6.BackColor != Color.Aqua)
if ((pictureBox7.BackColor == Color.Aqua) || (ovalShape14.BackColor == Color.Blue)||primero==0)
if (bandera == 1) {
pictureBox6.BackColor = Color.Aqua;
if (ovalShape15.BackColor == Color.Blue)
{
if (pictureBox22.BackColor == Color.Aqua)
{
variable[contador] = 1; }
if (pictureBox81.BackColor == Color.Aqua)
{
variable[contador] = 2; }
contador++; }
variable[contador] = 1; contador++;
primero = 1; }
}
private void
pictureBox22_MouseLeave(object sender, EventArgs e)
{
if (pictureBox22.BackColor != Color.Aqua)
if ((pictureBox21.BackColor == Color.Aqua) || (ovalShape14.BackColor == Color.Blue)||primero==0)
if (bandera == 1) {
pictureBox22.BackColor = Color.Aqua;
if (ovalShape4.BackColor == Color.Blue)
{
if (pictureBox81.BackColor == Color.Aqua)
{
variable[contador] = 3; }
if (pictureBox6.BackColor == Color.Aqua)
{
variable[contador] = 1; }
}
variable[contador] = 1; contador++;
primero = 1; }
}
private void
pictureBox21_MouseLeave(object sender, EventArgs e)
{
if (pictureBox21.BackColor != Color.Aqua)
if ((pictureBox22.BackColor == Color.Aqua) || (pictureBox16.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox21.BackColor = Color.Aqua;
variable[contador] = 1; contador++;
primero = 1; }
}
private void
pictureBox16_MouseLeave(object sender, EventArgs e)
{
if (pictureBox16.BackColor != Color.Aqua)
if ((pictureBox21.BackColor == Color.Aqua) || (pictureBox15.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox16.BackColor = Color.Aqua;
variable[contador] = 1; contador++; primero = 1; }
}
private void
pictureBox15_MouseLeave(object sender, EventArgs e)
{
if (pictureBox15.BackColor != Color.Aqua)
if ((pictureBox16.BackColor == Color.Aqua) || (pictureBox11.BackColor == Color.Aqua)||primero==0)
if (bandera == 1) {
pictureBox15.BackColor = Color.Aqua;
variable[contador] = 1; contador++; primero = 1; }
}
private void
pictureBox11_MouseLeave(object sender, EventArgs e)
{
if (pictureBox11.BackColor != Color.Aqua)
if ((pictureBox15.BackColor == Color.Aqua) || (ovalShape13.BackColor == Color.Blue)||primero==0)
if (bandera == 1) {
pictureBox11.BackColor = Color.Aqua;
if (ovalShape13.BackColor == Color.Blue)
{