Snake – die verfressene Schlange

Para otro proyecto de juego de nuestro cliente H.U. Küster, primero tuve que pedir otro MAX7219 8x32 4 en 1 Módulo de pantalla LED Matriz de puntos (se necesitan un total de cuatro) para conseguir un área de juego de 32x32 puntos iluminados. Los recuerdos se avivaron de inmediato al mencionar el juego: Snake, la serpiente que se hacía más grande con cada punto que se tragaba y que no podía tocar los bordes ni su propio cuerpo. Tuve este juego en mi antiguo teléfono Nokia, y fue el mejor pasatiempo después de una larga semana laboral mientras esperaba en el ferry del Elba.

He pegado los cuatro Módulos de pantalla LED Matriz de puntos con cinta adhesiva, como hice con la pantalla de tiempo grande. Para el primer intento, he conectado cuatro botones de la placa enchufable a tierra y los he conectado a los pines utilizados en el sketch. Esto controla la cabeza codiciosa de la serpiente y también el juego sólo se inicia cuando se presiona cualquier botón por primera vez.

La fuente de alimentación para las pantallas es de 5V y GND, al principio la toma de 5V del Microcontrolador con ATMEGA 328P es suficiente, pero cuantos más LEDs se iluminan, mayor será el consumo de energía, y se debe considerar una fuente de alimentación externa, que también pueda alimentar a la MCU.

hardware

Hardware utilizado:

1

Microcontrolador con ATMEGA 328P

4

MAX7219 8x32 4 en 1 Módulo de pantalla LED Matriz de puntos

1

Opcional: PS2 Joystick Shield Game Pad Teclado V2.0

1

Opcional: Módulo de Joystick KY-023

1

Opcional: Módulo de alarma de Buzzer Piezo Pasivo KY-006

Breadboard , Botón y Cable de puente


En cuanto a las líneas de datos para las pantallas, es importante tener en cuenta que la librería de programas "LedControl.h" de EberHard Fahle, que se emplea en el sketch, sólo puede controlar 8 pantallas conectadas en serie. Dado que cada módulo de la matriz ya está formado por cuatro pantallas individuales, sólo se pueden conectar dos módulos a la vez a través de una "cadena" y ambos bloques se instancian por separado.

 #include "ledcontrol.h" // por Eberhard Fahle se puede encontrar en el administrador de la biblioteca; Pero solo puede conducir 8 pantallas.
 byte Number_displays = 8;
 Ledcontrol Bloque_1 = Ledcontrol(12, 11, 10, Number_displays); // DIN; CLK; CS; 12-11-10
 Ledcontrol bloque_2 = Ledcontrol(9, 8, 7, Number_displays); // DIN; CLK; CS; 9-8-7

La asignación de pines para las dos líneas de datos (DIN, CLK y CS respectivamente) resulta del sketch o del siguiente diagrama de circuito:

diagrama de circuito

El altavoz opcional es un Módulo de alarma de Buzzer Piezo Pasivo KY-006. Como tiene una impedancia muy alta , se puede conectar directamente. Otros altavoces pueden tener que ser conectados con una resistencia en serie.

Una vez más, las simples reglas del juego: el propósito del juego es conducir a serpiente por el campo de juego y tiene que "tragarse" puntos como objetivo. Cada vez que lo hace, crece una extremidad más. Sin embargo, no puede desbordarse ni toparse con ella mismo. Lo que es bastante sencillo al principio, pero se vuelve más difícil a medida que la serpiente se alarga.

Al principio, solo se puede visualizar el punto de partida. Si presiona una de las teclas de dirección, aparece el primer objetivo y la serpiente comienza a moverse.

Si la serpiente golpea el borde o a sí misma, el juego se detiene. La serpiente se desintegra extremidad a extremidad. A continuación, se presenta la longitud de la serpiente durante unos segundos y se reinicia el juego.

Si el juego es demasiado rápido o demasiado lento, puede cambiar la velocidad en la línea 137.

 // velocidad del programa
     demora(200);
En esta configuración, el juego es un poco lento al principio, pero cuando llega a áreas por encima de 50, tiene una gran lucha en sus manos.

Aquí está el sketch original del Sr. Küster para descargar.

Mi problema a la hora de jugar era que, en ocasiones, los botones económicos de la placa de conexión no siempre respondían al comando de dirección y entonces perdía. Por supuesto, esto también se puede deber al retraso en la línea (200); aquí el programa se detiene durante 200 ms y no acepta más entradas. Así que primero tuve que conseguir mejores botones, por ejemplo, los del Joystick Shield, que ya había utilizado para otros proyectos (actualmente sólo disponibles en la tienda de AZ-Delivery en Amazon). Y segundo, un cambio de programa para que el tiempo de espera no provoque un bloqueo (non-blocking). El sketch BlinkwithoutDelay es un ejemplo de ello.

Joystick-shield

Las tomas de la parte superior de la pantalla (DIN = D12, CLK = D11, CS = D10) se pueden leer en el Shield, al igual que DIN = D9 de la parte inferior de la pantalla. Entonces queda una toma libre (3V3). A continuación, CLK se conecta a KEY (detrás está D8) y CS se conecta a la siguiente toma sin etiquetar (=D7). Los botones A a D están bien cableados, pero están colocados de forma ligeramente diferente a la configuración del Sr. Küster. Así que sin más preámbulos, realice algunos cambios en el sketch de la línea 60:

 byte Izquierda = 5; byte debajo = 4; byte encima = 2;  byte derecho = 3; // puerto para la consulta clave

Afortunadamente, casi los mismos pines, sólo que en diferente orden; así que no hay conflictos con la pantalla. Sin embargo, el altavoz piezoeléctrico, que es opcional, se debe conectar al pin 6.

Como los puntos luminosos eran ligeramente brillantes, en lo personal, configuré la intensidad a 1 en las líneas 73 y 76:

 Bloque_1.Sedentensidad(zw1, 1);   
 bloque_2.Sedentensidad(zw1, 1);

Se necesitaron otros cambios para la sustitución del retraso (200); por un if-query, si han pasado 200 ms desde la última entrada. Para esto, necesitamos al principio:

 largo En t AnteriorMILLIS = 0;
 largo En t intervalo = 200;

Antes del crucial bucle do while:

 AnteriorMILLIS = milis();

y luego

  SI (milis() - AnteriorMILLIS >= intervalo) {
       paso();
       AnteriorMILLIS = milis();
  }
Utilizando la variable intervalo, se puede variar la velocidad del juego como se ha descrito anteriormente.

Aquí está el sketch para descargar.

No se acabaron mis consideraciones, porque el juego también debería poder jugarse con el módulo del joystick.

Módulo de joystick

Sin embargo, para esto, se deben hacer cambios adicionales en el sketch, ya que los potenciómetros incorporados suministran valores entre 0 y 1023 en las entradas analógicas A0 y A1, en la posición central aproximada 511 cada una.

Al principio de la función void loop () hay dos bucles do while para la petición de los botones, uno para iniciar el juego y otro para la duración del mismo. Ambos se deben cambiar de la siguiente manera:

 // HACER MIENTRAS
   hacer {
     // Consulta de los botones del joystick y establezca la dirección
     SI (análoga(A0) > 850) {
       dirección = 1;
    }
    Demás  SI (análoga(A1) > 850) {
       dirección = 2;
    }
     Demás SI (análoga(A0) < 150) {
       dirección = 3;
    }
     Demás SI (análoga(A1) < 150) {
       dirección = 4;
    }

De hecho, yo personalmente fui capaz de conseguir la mayor cantidad de puntos con el módulo del joystick. El joystick en el mencionado Joystick-Shield también utiliza las entradas analógicas A0 y A1. Sin embargo, las asignaciones de la dirección se deben ajustar.

Aquí está la descarga de los sketchs para el Joystick analógico y para el Joystick-Shield con joystick y botones.

Diviértase construyendo y jugando.

¿Tiene algún proyecto interesante del que podamos informar aquí? Escríbeme: Albrecht [at] az-delivery.com
MuestraPara arduinoProyectos para principiantes

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas