Saltar al contenido

Sensor LED – Juego TicTacToe

julio 10, 2021
F34LQNSHLZRD8FK

Cuando escuché por primera vez sobre el uso de LED como sensores, no sabía en qué medida esto podría usarse para hacer algo útil. Después de muchas pruebas e investigaciones, terminé diseñando un TicTacToe-Game usando solo LED como entrada. La desventaja de usar solo LED como entrada es que siempre se necesita un poco de luz ambiental para que los LED detecten un dedo. Cuando tenía 14 años construí una primera versión del juego que se puede ver aquí en youtube. En términos de este concurso, decidí mantener el hardware pero rediseñar el software, para hacer que la computadora sea enemiga más rápido y limpiar el código.

Quería hacer un instructivo que sea fácil de reconstruir, se divierta y también use algo de investigación.

Paso 1: ¡Cosas que necesitará!

¡Cosas que necesitarás!

Cosas que necesita para este instructable:

– 9 LEDs dúo
– Resistencia de la serie 18x para los LED (390 ohmios debería hacerlo)
– 1 resistencia de 10K como pullup para el pin de reinicio
– 1x ATMega32 / 16
– 1x interruptor de encendido / apagado
– Fuente de alimentación 1x 5V
– encierro
– tabla de striptease
– alambres
– programador para flashear µC

Paso 2: ¿Cómo funciona?

¿Como funciona?¿Como funciona?¿Como funciona?

Paso 1: El LED funciona en modo normal, se emite luz (este paso se puede omitir)
Paso 2: El LED funciona en modo de polarización inversa, el LED se carga como un condensador. Cuanta más luz brille sobre el LED, más rápido se descargará el LED.
Paso 3: Se puede medir el voltaje en el cátodo.

Tanto el cátodo como el ánodo del LED están conectados a un pin controlador. De esa manera, se puede invertir la polarización del LED, configurar el pin del cátodo como entrada o usar el LED para emitir luz;) En lugar de medir el voltaje en el pin del cátodo, el µC mide el tiempo que el pin no está a nivel del suelo, lo cual es mucho más fácil de implementar. En el oscilograma izquierdo se sostiene un dedo sobre el LED, ya que se puede ver que la curva desciende muy suavemente y ni siquiera llega al nivel del suelo. El otro oscilograma muestra la curva del LED sin un dedo sobre el LED. La curva alcanza el nivel del suelo con bastante rapidez, esto significa que se puede distinguir claramente entre dedo y sin dedo. Entonces, el fenómeno de que un LED se puede usar como un condensador dependiente de la luz, hace posible reconocer si se sostiene un dedo sobre el LED.

Paso 3: ¡Conéctelo!

¡Conectándolo!¡Conectándolo!

El cableado es bastante fácil, el ATmega32 / 16 tiene 4 puertos de E / S con 8 pines cada uno. El interruptor se usa para cortar la fuente de alimentación, la resistencia de 10K y el capacitor de 100nF son partes estándar para darle vida al ATmega32 / 16. Los LED cátodos de los primeros ocho LED están conectados a PORTA (cat1 -> PA0, cat2 -> PA1, …, cat8 -> PA7). Los primeros ocho ánodos rojos están conectados a PORTB (anr1 -> PB0, …, anr8 -> PB8). Los primeros ocho ánodos verdes están conectados a PORTC (ang1 -> PC0, …, ang8 -> PC8). El último LED, LED9 se conecta a PORTD de la siguiente manera: cat9 -> PD7, anr9 -> PD6, ang9 -> PD6.

Al principio intenté multiplexar los LED en una matriz que habría ahorrado muchos pines del controlador, pero resultó que los LED necesitan unos 200 milisegundos para descargarse. Esto puede parecer poco, pero hace que sea imposible multiplexar los LED sin parpadear, por eso necesitamos tantos pines.

En la imagen, el cableado se ve un poco desordenado pero funciona 🙂 También se puede ver la fuente de alimentación que utilicé para el juego. Primero usé algunas baterías pequeñas que tenían un voltaje de 12V y un regulador de voltaje. Esas baterías se agotaron rápidamente, así que busqué una alternativa y descubrí que se puede abrir una batería de bloque de 9V. Después de abrir uno tiene 6 baterías de 1,5V. Tres de ellos en serie son adecuados para suministrar energía al juego y no estarían muertos demasiado pronto. Los míos ya duran 3 años;)

Paso 4: Recinto

RecintoRecinto

El siguiente paso es crear un cierre para el juego. En la imagen se puede ver el paquete de un delicioso regaliz, utilicé papel de lija para quitar el recubrimiento. Después de limpiar la caja, hice 9 agujeros en la parte superior para los LED y un agujero para el interruptor en el lateral. Todo encajó a la perfección. ¡Por supuesto que puedes usar cualquier tipo de recinto para tu juego! Los LED deben disponerse en el orden que se muestra en la segunda imagen. También se pueden organizar de otras maneras, pero luego es necesario cambiar las funciones en el código que verifican si un jugador ganó. Utilicé un trozo de madera y un poco de pegamento caliente para mantener los LED en su lugar, después de fijar los LED, usé un poco de cinta para sujetar los LED a la carcasa. (Puede ver esto en la segunda imagen del paso anterior). Dado que el enclusre está hecho de metal, asegúrese de que el PCB no haga contacto con él, utilicé un trozo de cartón para aislar el PCB.

Paso 5: Programa / Código

Código de programa

Usé una placa de desarrollo barata de una empresa alemana para grabar el código en el controlador, pero puede usar cualquier tipo de programador ISP para actualizar el ATmega32 / 16.

El archivo rar contiene los archivos fuente y un archivo hexadecimal (ubicado en la carpeta predeterminada) para un ATmega32, pero recomiendo compilar la fuente usted mismo porque es posible que tenga que ajustar algunos valores de acuerdo con sus LED. Los diferentes LED pueden necesitar diferentes tiempos de carga / descarga, por lo que hay que probar algunos valores. El código fuente se divide en 5 archivos:

TicTacToe_atm32_rev2.c Este archivo contiene la rutina principal y algunas funciones.
led.c/led.h Estos archivos contienen cada código específico de LED, por ejemplo, la función “get_field ()” que devuelve el LED presionado.
computer_enemy.c/computer_enemy.h Como su nombre lo indica, estos archivos contienen la IA.

El código debe estar bastante bien documentado, pero si hay alguna duda, continúe y pregunte en los comentarios.

Paso 6: ¿Cómo funciona el código?

¿Cómo funciona el código?

En la imagen puede ver un diagrama de flujo aproximado de cómo funciona el código. Comienza con la inicialización de los puertos de E / S y determina al enemigo. Tan pronto como se determina el enemigo, se puede ver que hay dos cadenas diferentes, la verde es el modo “humano contra humano” y la roja muestra el ciclo del modo “humano contra computadora”. Ambos ciclos comienzan con la función get field, que lee los leds y devuelve un valor entre 1-9 para un campo específico. La siguiente función establece un campo, hay que pasar el color y el campo. La columna de la izquierda cambia el color y comprueba el ganador, si se encuentra un ganador, la fila ganadora parpadea y el tablero se reinicia. La secuencia comienza de nuevo, pero esta vez el perdedor comienza con su movimiento. La segunda columna primero verifica al ganador, luego mueve la computadora y luego vuelve a verificar al ganador. Hay dos controles en el coulum correcto porque cuando se juega contra la computadora siempre el humano tiene el primer movimiento. Así que hay que buscar un ganador después de cada movimiento.

Para contar las ganancias de un jugador, se debe agregar una función “show_wins ()” y dos variables globales:

int wins_red = 0;
int wins_green = 0;

void show_wins (void) {
para (int i = 0; i set_field (i, 1);
}
_delay_ms (300); // espera 100 ms
// TODO: función clear_board ()

para (int i = 0; i set_field (i, 0);
}
_delay_ms (300); // espera 100 ms
// TODO: función clear_board ()
}

Esta función establece primero tantos leds como victorias contadas por el entero. Otra forma es manipular directamente los puertos;) (¡No más de 9, debe realizarse una verificación si hay más premios que campos!) El siguiente paso es llamar a esta función cuando se encuentra un ganador, esto se puede hacer ya sea por una instrucción if separada después de la cual evalúa el valor de la función “check_winner ()” o directamente en la función “check_winner ()”, justo antes de “return 1;” declaración. También hay que incrementar los dos enteros “wins_red ++” (wins_green ++), esto debe hacerse en la función “check_winner ()”. Esto se puede hacer mediante una declaración if:

si (jugador == 1) {
wins_red ++;
}
demás{
wins_green ++;
}

EstoLa declaración debe estar ubicada también antes de “return 1;” declaración y también antes de la función “show_wins ()”, por lo que siempre se cuentan todas las ganancias.

Esta fue solo una idea de cómo agregar más funcionalidad al juego. Otra idea podría ser contar también los sorteos o agregar un pequeño zumbador para tocar alguna melodía si alguien gana.

Paso 7: ¡Usa tu juego!

Aunque no todo se explicó en detalle, espero que hayas podido crear un juego de Tic Tac Toe. De hecho, es muy divertido jugar con él y es un buen proyecto porque se puede construir a partir de pocas partes. Este es solo un ejemplo de lo que se pueden usar los LED, hay mucho más potencial en esos pequeños diodos. Se pueden utilizar, por ejemplo, para medir el brillo o para transmitir datos. Diviértete explorando 🙂

Jugando el juego:
Al encenderlo, hay una breve secuencia de inicialización. Mientras esta secuencia se mide la luz ambiental y se calcula un valor para el tiempo de descarga. Esto hace posible jugar el juego en diferentes entornos. Una vez realizada la inicialización, se puede elegir entre humano contra humano (verde) o humano contra computadora (rojo). En la columna del medio se puede seleccionar la dificultad del enemigo de la computadora (1-3) mientras que 1 es movimientos aleatorios. El enemigo con dificultad 2 intenta ganar y bloquea tus movimientos ganadores y la tercera dificultad usa el algoritmo negamax para calcular siempre el mejor movimiento. El algoritmo intenta cada movimiento, por eso el primer movimiento lleva algo de tiempo. Dado que no puede leer los LED que están habilitados sin parpadear, debe seleccionar los LED encima o debajo del LED verde o rojo. También tienes que reiniciar el juego si quieres seleccionar un enemigo de la computadora más fácil.

Sé el primero en compartir

    7 comentarios

    0
    JohnyAllen
    JohnyAllen

    Hace 7 años en Introducción

    Soy un desarrollador de juegos para dispositivos móviles y, según yo, es una publicación realmente agradable.
    definitivamente ayudará a todos los desarrolladores de juegos. Comprobando el valor de
    el sitio web:http://www.appschopper.com

    0
    nitish28d
    nitish28d

    Hace 7 años en Introducción

    ¡Impresionante trabajo!. ¿Puede agregar instructable para contar quién ganó y mostrarlo? Al menos, indique qué parte de su código se puede utilizar para contar no. de victorias.

    0
    J_TAG
    J_TAG

    Responder hace 7 años el Introducción

    Hola, perdón por la respuesta tardía, pero mi semestre acaba de comenzar y tenía bastante trabajo por hacer: / Agregué un paso más que explica cómo funciona el software, no muy detallado pero lo suficiente para ampliar el proyecto. También escribí cómo uno podría darse cuenta de su idea de contar victorias. Si hay más preguntas, hágalas 🙂

    0
    nitish28d
    nitish28d

    Responder hace 7 años el Introducción

    Gracias por responder. ¿Pero estás seguro de haber agregado todo sobre circuitos y software? ¡Probé todo según las instrucciones y hasta crear un juego en el que los LED siguen brillando! parece COMPUTER vs COMPUTER MODE.
    Por favor corríjame donde pueda estar equivocado 🙁

    0
    J_TAG
    J_TAG

    Responder hace 7 años el Introducción

    Hola, si los LED siguen brillando, lo más probable es que tenga que ajustar el tiempo de carga / descarga de los LED. Encuentra estos valores en el archivo led.c, en …

    close