.. note::
¡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 [|link_sf_facebook|] y únete hoy mismo!
.. _3.1.13_c_pi5:
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.
.. image:: ../img/list_GAME_14_NotNot.png
:align: center
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nombre
- ELEMENTOS EN ESTE KIT
- ENLACE
* - Kit Raphael
- 337
- |link_Raphael_kit|
También puedes comprarlos por separado en los enlaces a continuación.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCCIÓN DEL COMPONENTE
- ENLACE DE COMPRA
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_dot_matrix`
- |link_led_matrix_buy|
* - :ref:`cpn_button`
- |link_button_buy|
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
================= ========== ======== ====
.. image:: ../img/Schematic_notnot.png
:align: center
Procedimientos Experimentales
---------------------------------
**Paso 1**: Construir el circuito.
.. image:: ../img/3.1.14game_notnot.png
**Paso 2**: Activa el SPI antes de comenzar el experimento, consulta :ref:`spi_configuration` para más detalles.
**Paso 3**: Ve a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.13/
**Paso 4**: Compila el código.
.. raw:: html
.. code-block::
make
**Paso 5**: Ejecuta el archivo compilado.
.. raw:: html
.. code-block::
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.
.. note::
Si no funciona después de ejecutarlo, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", consulta :ref:`install_wiringpi_pi5`.
**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.
#. 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``).
#. 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``.
#. 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).
#. Variables Globales:
* ``int stage = 0;``: Rastrea la etapa actual del juego (mostrando flecha o resultado).
#. 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.
#. 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.
#. 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.
#. 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.
#. 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.
#. 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.
#. Función ``int get_index()``:
* Genera un índice aleatorio (0 o 1) para elegir entre la flecha izquierda o derecha.
* Retorno: ``0`` o ``1``.
#. 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``.
#. 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.
#. 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.