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.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ELEMENTOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
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 |
Procedimientos Experimentales
Paso 1: Construir el circuito.
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.
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: Defineucharcomo un alias paraunsigned char.#define uint unsigned int: Defineuintcomo un alias paraunsigned 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
xmilisegundos.
Función
void Write_Max7219_byte(uchar DATA):Envía un solo byte (
DATA) al MAX7219 a través de SPI.Usa
wiringPiSPIDataRWpara 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) ydat1(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:
0o1.
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:
1si la entrada del usuario es correcta.0si la entrada del usuario es incorrecta.
Funcionalidad:
Entra en un bucle infinito verificando el estado de los botones.
Usa
digitalReadpara 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 arreglosarrowocheck.
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 = 1para 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 = 0para reiniciar el bucle.
Resumen del Flujo del Programa:
Configuración:
Inicializa WiringPi y SPI.
Configura los pines de los botones y los ajustes de MAX7219.
Inicializa el generador de números aleatorios.
Mostrar Flecha:
Selecciona aleatoriamente una dirección de flecha (izquierda o derecha).
Muestra la flecha correspondiente en la matriz LED.
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.
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.
Repetir:
Vuelve a mostrar una nueva flecha y continúa el juego.