Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a concorsi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!

3.1.13 GIOCO - NotNot

Introduzione

In questo progetto, realizzeremo un dispositivo di gioco interessante, che chiameremo “Not Not”.

Durante il gioco, la matrice a punti aggiornerà casualmente una freccia. Il tuo compito è premere il pulsante nella direzione opposta alla freccia entro un tempo limitato. Se il tempo scade, o se viene premuto il pulsante nella stessa direzione della freccia, sei fuori.

Questo gioco può davvero esercitare il tuo pensiero inverso, e ora facciamo un tentativo?

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_GAME_14_NotNot.png

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

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK PER L’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: Accendi l’SPI prima di iniziare l’esperimento, consulta Configurazione SPI per i dettagli.

Passo 3: Vai nella 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 verso sinistra o destra verrà aggiornata casualmente sulla matrice a punti. Il tuo compito è premere il pulsante nella direzione opposta alla freccia; allora apparirà un “√” sulla matrice a punti. Se premi il pulsante nella stessa direzione della freccia, sei fuori e la matrice a punti mostrerà una “x”. Puoi anche aggiungere 2 nuovi pulsanti o sostituirli con i tasti del joystick per 4 direzioni—su, giù, sinistra e destra—per aumentare la difficoltà del gioco.

Nota

Se non funziona dopo l’esecuzione, o appare un messaggio di errore: "wiringPi.h: No such file or directory", consulta Installazione e verifica di 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.