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.

../_images/list_GAME_14_NotNot.png

È sicuramente conveniente acquistare un intero kit, ecco il link:

Nome

OGGETTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link qui sotto.

INTRODUZIONE COMPONENTI

LINK ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo Matrice LED

ACQUISTA

Pulsante

ACQUISTA

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

../_images/Schematic_notnot.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/3.1.14game_notnot.png

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.

  1. 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).

  2. Definizioni di tipo:

    • #define uchar unsigned char: Definisce uchar come alias per unsigned char.

    • #define uint unsigned int: Definisce uint come alias per unsigned int.

  3. 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).

  4. Variabili globali:

    • int stage = 0;: Tiene traccia della fase attuale del gioco (visualizzazione della freccia o del risultato).

  5. 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.

  6. Funzione void Delay_xms(uint x):

    • Funzione wrapper per delay(x) fornita da WiringPi.

    • Ritarda l’esecuzione del programma per x millisecondi.

  7. Funzione void Write_Max7219_byte(uchar DATA):

    • Invia un singolo byte (DATA) al MAX7219 via SPI.

    • Usa wiringPiSPIDataRW per eseguire il trasferimento dei dati SPI.

    • DATA: Il byte di dati da inviare.

  8. Funzione void Write_Max7219(uchar address1, uchar dat1):

    • Invia un comando e dati al MAX7219.

    • Combina address1 (indirizzo del registro) e dat1 (dati) in un buffer e li invia tramite SPI.

    • address1: Indirizzo del registro del MAX7219.

    • dat1: Dati da scrivere nel registro.

  9. 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.

  10. 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.

  11. Funzione int get_index():

    • Genera un indice casuale (0 o 1) per scegliere tra la freccia sinistra e destra.

    • Restituisce: 0 o 1.

  12. 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:

      • 1 se l’input dell’utente è corretto.

      • 0 se l’input dell’utente è errato.

    • Funzionalità:

      • Entra in un ciclo infinito controllando lo stato dei pulsanti.

      • Usa digitalRead per rilevare le pressioni dei pulsanti (LOW attivo).

      • Confronta il pulsante premuto con l’input previsto in base a num.

  13. 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 array arrow o check.

    • Funzionalità:

      • Se stage == 0, visualizza un pattern a freccia.

      • Se stage == 1, visualizza un segno di spunta o un simbolo di croce.

  14. 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 = 1 per 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 = 0 per riavviare il ciclo.

Riepilogo del flusso del programma:

  1. Configurazione:

    • Inizializza WiringPi e SPI.

    • Configura i pin dei pulsanti e le impostazioni MAX7219.

    • Imposta il generatore di numeri casuali.

  2. Visualizza Freccia:

    • Seleziona casualmente una direzione della freccia (sinistra o destra).

    • Visualizza la freccia corrispondente sulla matrice LED.

  3. Interazione con l’utente:

    • Attende che l’utente prema il pulsante A o B.

    • Determina se il pulsante premuto corrisponde alla direzione della freccia.

  4. 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.

  5. Ripeti:

    • Torna a visualizzare una nuova freccia e continua il gioco.