Pacman FreeRTOS G1

=MICROPACMAN= =MicroPacMan  =



= Integrantes =


 * JUAN DIEGO BERNAL BURGOS ([mailto:jd.bernal2802@uniandes.edu.co jd.bernal2802@uniandes.edu.co ])
 * SANTIAGO JIMENÉZ LEUDO ([mailto:s.jimenez774@uniandes.edu.co  s.jimenez774@uniandes.edu.co ])
 * ANDRÉS FELIPE RENGIFO SANCHÉZ ([mailto:af.rengifo239@uniandes.edu.co af.rengifo239@uniandes.edu.co ])

http://ftpest.uniandes.edu.co/~jd.bernal2802/pac.gif

= Descripción del Proyecto =

Requerimientos y Solución
En este proyecto se desarrolló el clásico juego arcade Pac-Man, creado por Toru Iwatani para la empresa Namco y llegando a ser el juego más exitoso rompiendo records con más de 293.822 maquinas, a partir de las herramientas de sistema operativo en tiempo real. La programación se realizó con base en el lenguaje C, teniendo en cuenta los conceptos vistos en clase. El microcontrolador en el cual se implementó el código es el AT91SAM7S256 (Ver Datasheet), con el cual ya se había tenido un acercamiento y trabajo previo. Parte del objetivo fundamental del proyecto era utilizar las herramientas y conceptos de RTOS, diseñando un sistema autocontrolado que permita cumplir al máximo con las especificaciones requeridas. La interfaz esta ocmpuesta por una pantalla LCD de 128 x 64 pixeles con controador ks108 y un control tactil implementado a través de dos matrices de leds.

La tarjeta de desarrollo ''UNIANDES AT91SAM7S256 BOARD'

Cronograma de Actividades Animation.gif
Cronograma de actividades y la distribución de tareas entre los integrantes del grupo.

Algoritmo de la solución Animation.gif
 DIAGRAMA DE BLOQUES



El anterior esquema es un diagrama muy sencillo de los requerimientos básicos del problema a continuación se encuentra unn diagrama más detallado con la información correspondiente de las señales.

Entradas

- Mando de control (3 donwto 0) Señal digital de 4 bits que indica la dirección seleccionada por el usuario a través de la matriz de leds. - Start Button Señal de 1 bit que indica la selección del ususario.

Salidas

Pantalla LCD - D (7 downto 0) Señal digital de 8 bits que permite dibujar en la pantalla LCD- - CS (1 downto 0) Señal digital que permite seleccionar entre los dos controladores de la pantalla. - R/W - EN - RS Buzzer - Señal Analógica del Pin 0 del PIOA y correspondiente al PWM del microcontrolador utilizado.

Sensado a partir de Matriz de Leds Animation.gif
Para sensar los movimientos del usuario, se utilizaron dos matrices de leds de 8x8, de forma tal que una detectara los movimientos horizontales y la otra los movimientos verticales. El principio en el que se basa el funcionamiento de este bloque es el efecto fotoeléctrico. Cuando los leds de la matriz recibe una gran cantidad de luz, generar una diferencia de potencial determinada entre sus terminales, la cual varía al variar la cantidad de luz que recibe. De esta forma en el momento en el que el usuario interponga su mano entre la luz y alguna fila o columna determinada de la pantalla de leds, se generará ña detección de su comando, lo cual indicará el movimiento del pacman a lo largo del tablero, y el manejo de las opciones de inicio del juego. Se presenta el datasheet de las matrices de leds utilizadas.

Lo que se realizó con base en esto fue tomar dos columnas, cerca de los extremos, las cuales debían ser cubiertas en su totalidad para registrar el movimiento deseado. Una de las filas de la matriz es referenciada con una resistencia a tierra y a partir de esto es posible comparar el ánodo y cátodo de un led determinado con un amplificador operacional, de forma tal que envíe valores lógicos si este ha sido polarizado con +5V y 0V. Después de la comparación la salida entra a un negador 7404, ya que nosotros estamos trabajando con activas bajas, es decir que cuando la señal se encuentra en 0, es porque se esta marcando un movimiento especifico.

Con el fin de oprganizar mejor el circuito necesario para obtener el funcionamiento requerido, se diseña una PCB para cada una de las matrices de leds (la cual se especifica posteriormente) y cuyo esquemático se presenta acontinuación, teninendo en cuenta las conexiones de los elementos mencionados previamente y las distancias necesarias para ajustarse a las dimensiones de los mismos.

Controles Análogos de PlayStation Animation.gif
Debido a que el sensado por medio de las matrices de leds era muy sensible a los cambios de luz y requería manipulación del ambiente para asegurar el correcto funcionamiento de las mismas, se tomó la decisión de cambiar el control de mando a los análogos de un control común de PlaySation El funcionamiento de estos análogos se basa en la variación de una resistencia y por ende en la caída de potencial sobre las misma. Cada uno de los análogos tiene dos potenciometros, uno para el movimiento horizontal y el otro para el movimiento vertical. El circuito que tiene Sony planteado, en principio no nos funciona, ya que se tiene una sola salida por potenciometro, y cuando está en posición central, es decir quieto, envía una señal no digital. Por esta razón, adaptamos las herramientas que teníamos a nuestras necesidades, planteando un circuito que nos permita tener señales activas bajas, que indican de forma digital la dirección en la que se mueve el análogo. Así, se tendrán 4 salidas por análogo que indican las cuatro direcciones principales, derecha, izquierda, arriba y abajo y estas solo enviarán un 0 lógico cuando el análogo este en la dirección y sentido de cada una, en caso contrario enviará un 1 lógico permanente.

El dispositivo cuenta con un push, que se puede presionar a través del movimiento del análogo. Esto es de gran utilidad, ya que se puede utilizar como el start que se tenía anteriormente, pero sin ocupar espacio adicional.

Comunicación entre tareas Animation.gif
En la Imagen anterior apreciamos el uso de un semaforo binario, el cual se usa para acceder al recurso compartido de modificar, pintar pixeles y figuras sobre la pantalla. En este caso el semáforo se encuentra disponible y es tomado por la tarea pacman. Sin enmbargo este es tomado por cualquier tarea que se encuentre lista ya que todas poseen el mismo nivel de prioridad.



Luego la tarea que tiene el semáforo se ejecuta y usa los recursos necesarios del sistema exclusivamente. En este momento las demás tareas se encuentran bloqueadas y no acceden a la pantalla ni a la cpu.

En las imagenes anteriores encontramos el sistema de comunicación por colas ,entre las tareas de. pacman y los fantasmas. Pacman envia su posición actual x,y por cuatro colas (dos para cada fantasma). Estos las utilizan para calcular su nueva orientación, al llegar a una intersección, con el fin de acercarse a pacman.

Podemos observar el sistema de comunicación por colas usado para coordiar la tarea puntaje, y así poder llevar las estadísticas del juego. Aqui se reciben las coordenas actuales de pacman y los cuatro fantasmas.

Con esta infromación esta tarea es capaz de: Verificar un encuentro entre pacman y un fantasma. Actualizar el puntaje. Llevar el registro de las vidas. Cambiar el comportamiento de los fantasmas ("asustados") cuando pacman llegue a un "punto especial" (esquinas)



Se usa una cola de 5 posiciones a manera de FeedBack, entre la tarea puntaje y las demás tareas. Cada tarea ( pacman, fantasma1, fantasma2, fantasma3, fantasma4) leen una posición respectiva de la cola. Así pueden saber el estado del juego y reinician su posición en caso de un choque entre pacman y fantasma.

Algoritmos de Seguimiento fantasmas
Fantasma1 Este fantasma debe perseguir a pacman. Sigue un algoritmo en el cual, en cada intersección, evalua sus posibles proximas orientaciones, y calcula cual de estas esta más cercana a pacman. De esta manera cambia toma una desición para cambiar orientación para buscar su objetivo. En caso de que se encuentre en modo asustado, realiza el algoritmo pero encontrando su proxima orientación más lejana. Reestablece su comportamiento normal de seguimiento a pacman luego de haber visitado 12 intersecciones. Fantasma2 El algoritmo que sigue el fantasma número dos es el mismo de búqueda de su mejor orientación proxima que le permita llegar a su objetivo, solo que esta vez su objetivo esta dirigido 15 pixeles adelante de pacman. De esta manera se logra que los dos fantasmas busquen encerrar y eliminar a pacman. Fantasma3 y 4 Estos fantasmas se comportan de una manera más aleatoria. Recalculan su nueva orientación dependiendo de la posición de los fantasmas numero 1 y 2. Simplemente se toma la coordenada en x de cada fantasma y se realiza un mod con 4 y se le suma 1 para obtener valores "semialeatorios" entre 1 y 4 de esta se logra un comportamiento inesperado para estos dos fantasmas.

=PCB=



=Código Fuente=


 * Código completo en Eclipse (Descargar)
 * Archivo programable .bin(Descargar)

=Materiales=

Software

 * Guías de instalación
 * Nota: Para Windows de 64 bits, instalar Yagarto en el directorio C:\
 * Guía de Instalación del Entorno de Desarrollo (IDE) Yagarto [[Media:Guia de Instalacion Eclipse + Yagarto.pdf|Download]]
 * Creación de un Proyecto con Eclippse IDE – Yagarto [[Media:Creacion de un Proyecto en Yagarto.pdf|Download]]


 * Instaladores
 * Eclipse Europa Download
 * Java Java Runtime Runtime Environment Download
 * OpenOCD Download
 * Yagarto Yagarto Tools Download
 * Yagarto GCC Download


 * LDC Assistant Descargar
 * Entorno de desarrollo y GCC Yagarto
 * Sistema Operativo FreeRTOS

Hardware

 * µControlador AT91SAM7S256: Ver Datasheet Download
 * Tarjeta UNIANDES AT91SAM7S256 BOARD: Tarjeta de adaptación para el uC la cual proporciona una interfaz de 36 pines, sistema de alimentación regulada, cristal de 18.432 MHz e interfaz de programación JTAG.


 * Tarjeta de programación por puerto paralelo. [[Media:ProgramacionParalelo.pdf|Download]]
 * Software requerido: H-JTAG Download(Sitio web)

=Publicidad Y Muestras de Funcionamiento=



=Resultados=



A partir de las pruebas realizadas, se encontró que se cumplieron con los requerimientos del proyecto de sistema operativo, a partir del desarrollo del clasico y reconocido juego "PacMan", renovado y adaptado en una nueva versión llamada "MicroPac-Man". Como primera medida se implementó un sistema de detección de objetos que permitía, a partir de un sensor, reconocer cuando se ingresaba una moneda a la caja. Según la cantidad de monedas ingresadas, se tendría una cantidad determinada de vidas, siendo el máximo 3 y el mínimo 1. Hay que resaltar que la interfaz física final incluía como control dos matrices de leds, de forma tal que una de ellas sirviera para el movimiento horizontal y la otra para el movimiento vertical. El funcionamiento de estas matrices se basaba en conexiones que generaban alta sensibilidad en las mismas, por lo cual fue necesario implementar un sistema de iluminación que aseguraba el correcto funcionamiento de ellas. Luego de insertar los créditos dentro de la caja, y especificar la cantidad de vidas deseadas para el juego, se registraba el usuario, ingresando 3 letras que podrían ser las iniciales de su nombre, con el fin de asociar cada usuario con el puntaje logrado al final del juego. Este registro se hace con base al sensado de las matrices de leds y posteriormente se está a la espera de un start, que indica que ya se ha especificado el nombre o identificación que se quiere. Este start, esta representado en la interfaz física a partir de un push, que permite tener un manejo sencillo de los comando del juego. Dado que se ha presionado el botón de start, se inicia el juego, en el cual PacMan debe huir de los dos fantasmas presentas hasta alcnazar todas la galletas presentes en el tablero. Al igual que en el juego clásico, los fantasmas persiguen al pacman, mientras este no ha comido la galleta grande, evitando que recorra todo el tablero y alcnace todas las galletas. El movimiento de los fantasmas es conforme a lo especificado en las seccionew previas. Todo el movimiento del pacman esta dado a partir del sensado con las matrices, con el fin de cumplir con los requerimientos y restricciones establecidas. A medida que el pacman va comiendo las galletas, el contador de puntaje se va actualizando y muestra la cantidad de galletas que se ha comido y los puntos que ha logrado. Cada vez que se llega a un puntaje multiplo de 50, a parece una fruta en el centro de la pantalla la cual le brinda puntos adcicionales al jugador si la alcanza antes de un tiempo límite. De la mismsa forma, cuando se alcanza una galleta grande, los fantasmas cambian de forma, para indicar que pacman se los puede comer, pero en este momento esots dejan de perseguir al pacman para huir de el, evitando quue se los coma. Una vez este los alcanza, son enviados al centro del tablero, y se genera un aumento en el puntaje dle jugador. Al igual que en el juego clásico, los fantasmas se pueden comer, o la galleta grande tiene efecto por un tiempo limitado, después del cual los fantas volverán a perseguir a pacman, para evitar que logre su cometido. Es necesario que se tengan en cuenta las instrucciones del juego para disfrutar al máximo la experiencia interactiva.

=Bibliografía =
 * ARM AT91SAM7S256 (Ver).
 * Distribución de los pines en un conector DB-9 (Ver)
 * Datasheet del MicroControlador (Ver)
 * ARM Instruction Set - ARM (Descargar)
 * ARM Thumb Instruction Set - Quick reference Card (Descargar)
 * AT91SAM7S256 Overview (AT91SAM7S256.pdf Descargar)
 * AT91SAM7S Series Datasheet (Descargar)
 * Esquematico Tarjeta de Desarrollo Uniandes AT91SAM7S256(Descargar)
 * Tutorial Microcontrolador AT91SAM7S256 (Descargar)