Nota

¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Vistas previas exclusivas: Obtén acceso anticipado a anuncios de nuevos productos y avances.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más nuevos.

  • Promociones festivas y sorteos: Participa en sorteos y promociones navideñas.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo!

3.1.13 JUEGO– NotNot

Introducción

En este proyecto, crearemos un dispositivo de juego interesante, y lo llamamos “Not Not”.

Durante el juego, la matriz de puntos mostrará una flecha al azar. Lo que debes hacer es presionar el botón en la dirección opuesta a la flecha dentro de un tiempo limitado. Si se acaba el tiempo o presionas el botón en la misma dirección que la flecha, estás fuera.

Este juego realmente puede practicar tu pensamiento inverso, ¿te animas a intentarlo?

Componentes Requeridos

En este proyecto, necesitamos los siguientes componentes.

../_images/list_GAME_14_NotNot.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Módulo de Matriz LED

COMPRAR

Botón

COMPRAR

Diagrama Esquemático

Nombre de T-Board

Pin físico

wiringPi

BCM

GPIO22

Pin 15

3

22

GPIO23

Pin 16

4

23

SPIMOSI

Pin 19

12

MOSI

SPICE0

Pin 24

10

CE0

SPISCLK

Pin 23

14

SCLK

../_images/Schematic_notnot.png

Procedimientos Experimentales

Paso 1: Construir el circuito.

../_images/3.1.14game_notnot.png

Paso 2: Activa el SPI antes de comenzar el experimento, consulta Configuración de SPI para más detalles.

Paso 3: Ve a la carpeta del código.

cd ~/raphael-kit/c/3.1.13/

Paso 4: Compila el código.

make

Paso 5: Ejecuta el archivo compilado.

sudo ./3.1.13_GAME_NotNot

Después de iniciar el programa, una flecha hacia la izquierda o hacia la derecha se refrescará al azar en la matriz de puntos. Lo que necesitas hacer es presionar el botón en la dirección opuesta a la flecha, entonces aparecerá “√” en la matriz de puntos. Si se presiona el botón en la misma dirección que la flecha, estás fuera y la matriz de puntos mostrará “x”. También puedes agregar 2 nuevos botones o reemplazarlos con teclas de joystick para arriba, abajo, izquierda y derecha— 4 direcciones para aumentar la dificultad del juego.

Nota

Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory", consulta Instalar y verificar WiringPi.

Explicación del Código

Este programa en C está diseñado para ejecutarse en una Raspberry Pi usando la biblioteca WiringPi. Se comunica con una pantalla de matriz LED 8x8 controlada por el chip MAX7219 y usa dos botones para la interacción del usuario. El programa muestra aleatoriamente una flecha hacia la izquierda o derecha en la matriz LED, y el usuario debe presionar el botón correspondiente. Luego, muestra una marca de verificación para una respuesta correcta o una cruz para una incorrecta.

  1. Archivos de Cabecera:

    • wiringPi.h: Proporciona funciones para el control de GPIO usando la biblioteca WiringPi.

    • wiringPiSPI.h: Proporciona funciones para la comunicación SPI.

    • stdio.h: Funciones estándar de entrada/salida (printf, etc.).

    • stdlib.h: Funciones de biblioteca estándar (rand, srand, exit).

    • time.h: Funciones para manipular fecha y hora (time, NULL).

  2. Definiciones de Tipos:

    • #define uchar unsigned char: Define uchar como un alias para unsigned char.

    • #define uint unsigned int: Define uint como un alias para unsigned int.

  3. Constantes y Macros:

    • SPI_CHANNEL: Canal SPI usado para la comunicación (0 o 1).

    • SPI_SPEED: Velocidad de comunicación SPI establecida en 1 MHz.

    • AButtonPin: Número de pin de WiringPi para el Botón A (GPIO 22).

    • BButtonPin: Número de pin de WiringPi para el Botón B (GPIO 23).

  4. Variables Globales:

    • int stage = 0;: Rastrea la etapa actual del juego (mostrando flecha o resultado).

  5. Arreglos de Datos:

    • uchar arrow[2][8]: Contiene dos patrones de 8 bytes que representan flechas hacia la derecha e izquierda para la matriz LED.

      • arrow[0]: Patrón de flecha hacia la derecha.

      • arrow[1]: Patrón de flecha hacia la izquierda.

    • uchar check[2][8]: Contiene dos patrones de 8 bytes que representan símbolos de correcto (marca de verificación) e incorrecto (cruz).

      • check[0]: Patrón de símbolo correcto.

      • check[1]: Patrón de símbolo incorrecto.

  6. Función void Delay_xms(uint x):

    • Función de envoltura para delay(x) proporcionada por WiringPi.

    • Retrasa la ejecución del programa por x milisegundos.

  7. Función void Write_Max7219_byte(uchar DATA):

    • Envía un solo byte (DATA) al MAX7219 a través de SPI.

    • Usa wiringPiSPIDataRW para realizar la transferencia de datos SPI.

    • DATA: El byte de datos a enviar.

  8. Función void Write_Max7219(uchar address1, uchar dat1):

    • Envía un comando y datos al MAX7219.

    • Combina address1 (dirección del registro) y dat1 (datos) en un buffer y lo envía por SPI.

    • address1: Dirección del registro del MAX7219.

    • dat1: Datos a escribir en el registro.

  9. Función void Init_MAX7219():

    • Inicializa el controlador de pantalla MAX7219 con las configuraciones necesarias.

    • Configura el modo de decodificación, intensidad, límite de escaneo, modo de apagado y prueba de pantalla.

    • Borra cualquier dato anterior en la pantalla.

  10. Función void Init_WiringPi():

    • Inicializa la biblioteca WiringPi y la interfaz SPI.

    • Configura los pines de los botones como entrada con resistencias pull-up.

    • Verifica una inicialización exitosa y sale si falla.

  11. Función int get_index():

    • Genera un índice aleatorio (0 o 1) para elegir entre la flecha izquierda o derecha.

    • Retorno: 0 o 1.

  12. Función int get_key(uint num):

    • Espera que el usuario presione un botón y determina si la entrada coincide con la flecha mostrada.

    • Parámetros:

      • num: El índice de la flecha mostrada (0 para derecha, 1 para izquierda).

    • Retorno:

      • 1 si la entrada del usuario es correcta.

      • 0 si la entrada del usuario es incorrecta.

    • Funcionalidad:

      • Entra en un bucle infinito verificando el estado de los botones.

      • Usa digitalRead para detectar pulsaciones de botones (activo en bajo).

      • Compara el botón presionado con la entrada esperada según num.

  13. Función void display(uint index):

    • Muestra en la matriz LED una flecha o un símbolo de resultado basado en la stage (etapa).

    • Parámetros:

      • index: Índice para seleccionar el patrón de los arreglos arrow o check.

    • Funcionalidad:

      • Si stage == 0, muestra un patrón de flecha.

      • Si stage == 1, muestra un símbolo de verificación o cruz.

  14. Función Principal (Main):

    • Inicialización:

      • Inicializa el generador de números aleatorios con srand((unsigned)time(NULL)).

      • Llama a Init_WiringPi() para configurar GPIO y SPI.

      • Llama a Init_MAX7219() para inicializar la pantalla de matriz LED.

      • Introduce un breve retraso con Delay_xms(50).

    • Bucle del Juego (``while (1)``):

      • Etapa 0 (Mostrar Flecha):

        • Llama a get_index() para seleccionar aleatoriamente una dirección de flecha.

        • Llama a display(direction) para mostrar la flecha en la matriz LED.

        • Establece stage = 1 para pasar a la siguiente etapa.

      • Etapa 1 (Obtener Entrada del Usuario y Mostrar Resultado):

        • Llama a get_key(direction) para esperar la entrada del usuario y determinar si es correcta.

        • Llama a display(key) para mostrar el símbolo de resultado (verificación o cruz).

        • Espera 1 segundo usando Delay_xms(1000) para permitir que el usuario vea el resultado.

        • Establece stage = 0 para reiniciar el bucle.

Resumen del Flujo del Programa:

  1. Configuración:

    • Inicializa WiringPi y SPI.

    • Configura los pines de los botones y los ajustes de MAX7219.

    • Inicializa el generador de números aleatorios.

  2. Mostrar Flecha:

    • Selecciona aleatoriamente una dirección de flecha (izquierda o derecha).

    • Muestra la flecha correspondiente en la matriz LED.

  3. Interacción del Usuario:

    • Espera que el usuario presione el Botón A o el Botón B.

    • Determina si el botón presionado coincide con la dirección de la flecha.

  4. Mostrar Resultado:

    • Muestra una marca de verificación si la entrada del usuario es correcta.

    • Muestra una cruz si la entrada del usuario es incorrecta.

    • Espera 1 segundo antes de la siguiente ronda.

  5. Repetir:

    • Vuelve a mostrar una nueva flecha y continúa el juego.