Nota
Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Immergiti più a fondo nel mondo di Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.
Perché unirsi a noi?
Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.
Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e omaggi: Partecipa a omaggi e promozioni festive.
👉 Sei pronto per esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!
3.1.13 GIOCO– NotNot
Introduzione
In questo progetto, creeremo un dispositivo di gioco divertente che chiamiamo «Not Not».
Durante il gioco, la matrice di punti visualizzerà una freccia a caso. Quello che devi fare è premere il pulsante nella direzione opposta alla freccia entro un tempo limitato. Se il tempo scade o se premi il pulsante nella stessa direzione della freccia, sei fuori.
Questo gioco mette davvero alla prova il tuo pensiero inverso, sei pronto a provarlo?
Componenti necessari
In questo progetto, avremo bisogno dei seguenti componenti.
È sicuramente conveniente acquistare un intero kit, ecco il link:
Nome |
OGGETTI IN QUESTO KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link qui sotto.
INTRODUZIONE COMPONENTI |
LINK ACQUISTO |
|---|---|
Schema Elettrico
T-Board Name |
physical |
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 |
Procedure Sperimentali
Passo 1: Costruisci il circuito.
Passo 2: Abilita l’SPI prima di iniziare l’esperimento, fai riferimento a Configurazione SPI per i dettagli.
Passo 3: Vai alla cartella del codice.
cd ~/raphael-kit/c/3.1.13/
Passo 4: Compila il codice.
make
Passo 5: Esegui il file eseguibile.
sudo ./3.1.13_GAME_NotNot
Dopo l’avvio del programma, una freccia a sinistra o a destra verrà mostrata casualmente sulla matrice di punti. Dovrai premere il pulsante nella direzione opposta alla freccia, e allora apparirà “√” sulla matrice. Se premi il pulsante nella stessa direzione della freccia, sei fuori e sulla matrice comparirà “x”. Puoi anche aggiungere 2 nuovi pulsanti o sostituirli con i tasti del Joystick per le direzioni su, giù, sinistra e destra per aumentare la difficoltà del gioco.
Nota
Se dopo l’esecuzione non funziona o compare un messaggio di errore: "wiringPi.h: No such file or directory", fai riferimento a Installa e Controlla wiringPi.
Spiegazione del Codice
Questo programma in C è progettato per essere eseguito su un Raspberry Pi utilizzando la libreria WiringPi. Interagisce con un display a matrice LED 8x8 controllato dal chip driver MAX7219 e utilizza due pulsanti per l’interazione con l’utente. Il programma visualizza casualmente una freccia a sinistra o a destra sulla matrice LED, e l’utente deve premere il pulsante corrispondente. Successivamente, visualizza un segno di spunta per una risposta corretta o una croce per una risposta errata.
File di intestazione:
wiringPi.h: Fornisce funzioni per il controllo GPIO usando la libreria WiringPi.wiringPiSPI.h: Fornisce funzioni per la comunicazione SPI.stdio.h: Funzioni di input/output standard (printf, ecc.).stdlib.h: Funzioni di libreria standard (rand,srand,exit).time.h: Funzioni per la manipolazione di data e ora (time,NULL).
Definizioni di tipo:
#define uchar unsigned char: Definisceucharcome alias perunsigned char.#define uint unsigned int: Definisceuintcome alias perunsigned int.
Costanti e Macro:
SPI_CHANNEL: Canale SPI usato per la comunicazione (0 o 1).SPI_SPEED: Velocità di comunicazione SPI impostata a 1 MHz.AButtonPin: Numero di pin WiringPi per il pulsante A (GPIO 22).BButtonPin: Numero di pin WiringPi per il pulsante B (GPIO 23).
Variabili globali:
int stage = 0;: Tiene traccia della fase attuale del gioco (visualizzazione della freccia o del risultato).
Array di dati:
uchar arrow[2][8]: Contiene due pattern di 8 byte che rappresentano le frecce destra e sinistra per la matrice LED.arrow[0]: Pattern della freccia destra.arrow[1]: Pattern della freccia sinistra.
uchar check[2][8]: Contiene due pattern di 8 byte che rappresentano i simboli di corretto (segno di spunta) e errato (croce).check[0]: Pattern del simbolo corretto.check[1]: Pattern del simbolo errato.
Funzione
void Delay_xms(uint x):Funzione wrapper per
delay(x)fornita da WiringPi.Ritarda l’esecuzione del programma per
xmillisecondi.
Funzione
void Write_Max7219_byte(uchar DATA):Invia un singolo byte (
DATA) al MAX7219 via SPI.Usa
wiringPiSPIDataRWper eseguire il trasferimento dei dati SPI.DATA: Il byte di dati da inviare.
Funzione
void Write_Max7219(uchar address1, uchar dat1):Invia un comando e dati al MAX7219.
Combina
address1(indirizzo del registro) edat1(dati) in un buffer e li invia tramite SPI.address1: Indirizzo del registro del MAX7219.dat1: Dati da scrivere nel registro.
Funzione
void Init_MAX7219():Inizializza il driver display MAX7219 con le configurazioni necessarie.
Configura il modo di decodifica, intensità, limite di scansione, modalità di spegnimento e test display.
Pulisce eventuali dati precedenti sul display.
Funzione
void Init_WiringPi():Inizializza la libreria WiringPi e l’interfaccia SPI.
Configura i pin dei pulsanti come input con resistori di pull-up.
Verifica l’inizializzazione e termina se fallisce.
Funzione
int get_index():Genera un indice casuale (0 o 1) per scegliere tra la freccia sinistra e destra.
Restituisce:
0o1.
Funzione
int get_key(uint num):Attende che l’utente prema un pulsante e determina se l’input corrisponde alla freccia visualizzata.
Parametri:
num: L’indice della freccia visualizzata (0 per destra, 1 per sinistra).
Restituisce:
1se l’input dell’utente è corretto.0se l’input dell’utente è errato.
Funzionalità:
Entra in un ciclo infinito controllando lo stato dei pulsanti.
Usa
digitalReadper rilevare le pressioni dei pulsanti (LOW attivo).Confronta il pulsante premuto con l’input previsto in base a
num.
Funzione
void display(uint index):Visualizza una freccia o un simbolo di risultato sulla matrice LED in base alla
stage.Parametri:
index: Indice per selezionare il pattern dagli arrayarrowocheck.
Funzionalità:
Se
stage == 0, visualizza un pattern a freccia.Se
stage == 1, visualizza un segno di spunta o un simbolo di croce.
Funzione Principale:
Inizializzazione:
Imposta il generatore di numeri casuali con
srand((unsigned)time(NULL)).Chiama
Init_WiringPi()per configurare GPIO e SPI.Chiama
Init_MAX7219()per inizializzare il display a matrice LED.Introduce un breve ritardo con
Delay_xms(50).
Loop di gioco (``while (1)``):
Fase 0 (Visualizza freccia):
Chiama
get_index()per selezionare casualmente una direzione della freccia.Chiama
display(direction)per mostrare la freccia sulla matrice LED.Imposta
stage = 1per passare alla fase successiva.
Fase 1 (Ottieni input utente e visualizza risultato):
Chiama
get_key(direction)per attendere l’input dell’utente e determinare la correttezza.Chiama
display(key)per mostrare il simbolo di risultato (segno di spunta o croce).Attende 1 secondo usando
Delay_xms(1000)per consentire all’utente di vedere il risultato.Imposta
stage = 0per riavviare il ciclo.
Riepilogo del flusso del programma:
Configurazione:
Inizializza WiringPi e SPI.
Configura i pin dei pulsanti e le impostazioni MAX7219.
Imposta il generatore di numeri casuali.
Visualizza Freccia:
Seleziona casualmente una direzione della freccia (sinistra o destra).
Visualizza la freccia corrispondente sulla matrice LED.
Interazione con l’utente:
Attende che l’utente prema il pulsante A o B.
Determina se il pulsante premuto corrisponde alla direzione della freccia.
Visualizza Risultato:
Mostra un segno di spunta se l’input dell’utente è corretto.
Mostra una croce se l’input dell’utente è errato.
Attende 1 secondo prima del turno successivo.
Ripeti:
Torna a visualizzare una nuova freccia e continua il gioco.