Juego de la vida - Game of Life (Conway)



Lo primero, demasiado tiempo sin escribir por aquí, muchas ideas pero poco tiempo para plasmarlas.
Esta vez me traigo un ejercicio de programación típico, el "juego de la vida" de John Horton Conway.

Citando a la wikipedia:
"El juego de la vida es el mejor ejemplo de un autómata celular; es en realidad un juego de cero jugadores, lo que quiere decir que su evolución está determinada por el estado inicial y no necesita ninguna entrada de datos posterior. El "tablero de juego" es una malla formada por cuadrados ("células") que se extiende por el infinito en todas las direcciones. Cada célula tiene 8 células vecinas, que son las que están próximas a ella, incluso en las diagonales. Las células tienen dos estados: están "vivas" o "muertas" (o "encendidas" y "apagadas"). El estado de la malla evoluciona a lo largo de unidades de tiempo discretas (se podría decir que por turnos). El estado de todas las células se tiene en cuenta para calcular el estado de las mismas al turno siguiente. Todas las células se actualizan simultáneamente.

Las transiciones dependen del número de células vecinas vivas:

* Una célula muerta con exactamente 3 células vecinas vivas "nace" (al turno siguiente estará viva).
* Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso muere o permanece muerta (por "soledad" o "superpoblación"). "




Como otros circuitos anteriores, intenté utilizar los mínimos recursos posibles y aprovecharlos al máximo. En este caso han sido:

  • PIC12F683
  • LCD Nokia3310
  • 2x QT100A
Como no disponía de memoria suficiente en el PIC, he dividido la pantalla con una rejilla y así convertir la matriz de 84x48 pixels en una matriz de 25x17 (405 celdas) que sí me caben en la RAM del PIC.
El siguiente problema ha sido al calcular la generación siguiente, ya que necesitaba dos matrices de RAM, una para la generación de entrada y otra para la de salida. Lo he solucionado calculando la generación siguiente línea a línea y usando una pila tipo LIFO de 2 niveles sobre 2 variables de tipo vector.
Los elementos se disponen de forma manual, con uno de los sensores capacitivos y de forma pseudoaleatoria. El programa en el modo de colocación de individuos, ejecuta una interrupción del TIMER1 cada 0.406ms (así solo cuenta de 0 a 405 que son los elementos de la matriz ) y cada vez que se toca el sensor, lee el valor del timer y activa la celda correspondiente.


El otro sensor inicia la simulación.
Durante la simulación es posible pausarla y una vez pausada, podemos continuar o reiniciar.



El circuito


El circuito es muy simple, como he usado componentes de bajo consumo, está alimentado por una pila de botón tipo CR2032.
El PIC se conecta al LCD nokia y sólo es necesario un condensador de 47uF para la Vout del LCD.
Los QT100A únicamente incorporan 1 condensador de desacoplo de 100nf y una red RC que ajusta la sensibilidad del sensor.

La PCB



A una cara y con todos los componentes en SMD. Existen 4 jumpers por la cara posterior.
En el diseño, no he tenido en cuenta que el encapsulado WSON6 de los QT100A posee un pad tipo GND en el centro y he tenido que cubrir con rotulador las pistas que pasan bajo el encapsulado para evitar cortocircuitos.
EL interruptor ON/OFF lo he aprovechado de un MP3 portable.

Simulacion con Proteus



Por si queréis ver como funciona la simulación, os dejo los ficheros de ISIS para Proteus.
Necesitaréis instalar el modelo de simulación del componente "LCD 3310".
Lo podeis descargar de:
http://www.tanu-sha.narod.ru/nokia3310.html

Aquí os dejo un vídeo del funcionamiento:



Salu2

Descargas

4 comentarios:

RaDiKalDeSIG dijo...

Como siempre Impresionante.
Un buen rescate de un problema clasico de la programación.
(como achuchas el PIC ¿queda algún espacio de memoria libre?...jj)

saludos

Indaltronia dijo...

Me alegro de que este blog vuelva a la vida, ya que me parece muy bueno y lo llevo siguiendo desde hace tiempo.

Muy interesante esto del "juego de la vida". La verdad es que lo desconocía. Otra cosa que me fascina es la calidad de la placa de circuito impreso. Me encanta.

Espero ansioso nuevos proyectos.

Anónimo dijo...

Una pregunta, como hago para instalar las descargar en el proteus, puse todo pero al momento de correr la simulacion me bota:

pcd_8544.dll failed to authorize for LCD1
Details: OK

Que hago, es la 1° vez que agrego nuevas librerias

droky dijo...

El componente no funciona en todas las versiones de Proteus, de hecho casi solo funciona en la 7.5 SP3
Es posible que sea por eso, por el mensaje que te ha dado.
Salu2

 
RaDiKalDeSIG | Designed by Techtrends | © 2007-2008 All rights reserved