.. note:: 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 [|link_sf_facebook|] e unisciti oggi stesso! .. _3.1.13_c: 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. .. image:: ../img/list_GAME_14_NotNot.png :align: center È sicuramente conveniente acquistare un intero kit, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - OGGETTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link qui sotto. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE COMPONENTI - LINK ACQUISTO * - :ref:`cpn_gpio_extension_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| 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 ============ ======== ======== ==== .. image:: ../img/Schematic_notnot.png :align: center Procedure Sperimentali --------------------------------- **Passo 1**: Costruisci il circuito. .. image:: ../img/3.1.14game_notnot.png **Passo 2**: Abilita l'SPI prima di iniziare l'esperimento, fai riferimento a :ref:`spi_configuration` per i dettagli. **Passo 3**: Vai alla cartella del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/c/3.1.13/ **Passo 4**: Compila il codice. .. raw:: html .. code-block:: make **Passo 5**: Esegui il file eseguibile. .. raw:: html .. code-block:: 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. .. note:: Se dopo l'esecuzione non funziona o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", fai riferimento a :ref:`install_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``: Definisce ``uchar`` come alias per ``unsigned char``. * ``#define uint unsigned int``: Definisce ``uint`` come alias per ``unsigned 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 ``x`` millisecondi. #. 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. #. 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. #. 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: ``0`` o ``1``. #. 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``. #. 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. #. 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.