Note

Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l’univers des Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.

  • Réductions spéciales : Profitez de réductions exclusives sur nos produits les plus récents.

  • Promotions festives et cadeaux : Participez à des cadeaux et des promotions de vacances.

👉 Prêt à explorer et à créer avec nous ? Cliquez [Ici] et rejoignez-nous aujourd’hui !

3.1.13 JEU – NotNot

Introduction

Dans ce projet, nous allons créer un dispositif de jeu intéressant, que nous appelons « Not Not ».

Pendant le jeu, la matrice de points affichera une flèche de manière aléatoire. Ce que vous devez faire, c’est appuyer sur le bouton dans la direction opposée à la flèche dans un temps limité. Si le temps est écoulé ou si vous appuyez sur le bouton dans la même direction que la flèche, vous perdez.

Ce jeu est excellent pour exercer votre pensée inversée, alors, pourquoi ne pas essayer ?

Composants nécessaires

Pour ce projet, nous avons besoin des composants suivants.

../_images/list_GAME_14_NotNot.png

Il est très pratique d’acheter un kit complet, voici le lien :

Nom

ÉLÉMENTS DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément aux liens ci-dessous.

INTRODUCTION DES COMPOSANTS

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Module Matrice LED

ACHETER

Bouton

ACHETER

Schéma de câblage

Nom de la carte

Physique

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

Procédures expérimentales

Étape 1 : Construisez le circuit.

../_images/3.1.14game_notnot.png

Étape 2 : Activez le SPI avant de commencer l’expérience, consultez Configuration SPI pour plus de détails.

Étape 3 : Accédez au dossier du code.

cd ~/raphael-kit/c/3.1.13/

Étape 4 : Compilez le code.

make

Étape 5 : Exécutez le fichier exécutable.

sudo ./3.1.13_GAME_NotNot

Après le démarrage du programme, une flèche gauche ou droite sera affichée aléatoirement sur la matrice de points. Vous devez appuyer sur le bouton dans la direction opposée à la flèche, puis “√” apparaît sur la matrice de points. Si vous appuyez sur le bouton dans la même direction que la flèche, vous perdez et la matrice de points affiche “x”. Vous pouvez également ajouter 2 nouveaux boutons ou les remplacer par des touches de joystick pour les directions haut, bas, gauche et droite afin d’augmenter la difficulté du jeu.

Note

Si cela ne fonctionne pas après l’exécution ou s’il y a un message d’erreur : « wiringPi.h: No such file or directory », veuillez consulter Installer et vérifier WiringPi.

Explication du code

Ce programme en C est conçu pour fonctionner sur un Raspberry Pi en utilisant la bibliothèque WiringPi. Il interagit avec un écran de matrice LED 8x8 contrôlé par le pilote MAX7219 et utilise deux boutons pour l’interaction avec l’utilisateur. Le programme affiche aléatoirement une flèche gauche ou droite sur la matrice LED, et l’utilisateur doit appuyer sur le bouton correspondant. Il affiche ensuite une coche pour une réponse correcte ou une croix pour une réponse incorrecte.

  1. Fichiers d’en-tête :

    • wiringPi.h : Fournit des fonctions pour le contrôle GPIO via la bibliothèque WiringPi.

    • wiringPiSPI.h : Fournit des fonctions pour la communication SPI.

    • stdio.h : Fonctions standard d’entrée/sortie (printf, etc.).

    • stdlib.h : Fonctions de la bibliothèque standard (rand, srand, exit).

    • time.h : Fonctions pour manipuler la date et l’heure (time, NULL).

  2. Définitions de types :

    • #define uchar unsigned char : Définit uchar comme un alias pour unsigned char.

    • #define uint unsigned int : Définit uint comme un alias pour unsigned int.

  3. Constantes et macros :

    • SPI_CHANNEL : Canal SPI utilisé pour la communication (0 ou 1).

    • SPI_SPEED : Vitesse de communication SPI fixée à 1 MHz.

    • AButtonPin : Numéro de broche WiringPi pour le Bouton A (GPIO 22).

    • BButtonPin : Numéro de broche WiringPi pour le Bouton B (GPIO 23).

  4. Variables globales :

    • int stage = 0; : Suit l’étape actuelle du jeu (affichage de la flèche ou du résultat).

  5. Tableaux de données :

    • uchar arrow[2][8] : Contient deux modèles de 8 octets représentant les flèches droite et gauche pour la matrice LED.

      • arrow[0] : Modèle de flèche droite.

      • arrow[1] : Modèle de flèche gauche.

    • uchar check[2][8] : Contient deux modèles de 8 octets représentant les symboles correct (coche) et incorrect (croix).

      • check[0] : Modèle de symbole correct.

      • check[1] : Modèle de symbole incorrect.

  6. Fonction void Delay_xms(uint x) :

    • Fonction enveloppe pour delay(x) fournie par WiringPi.

    • Retarde l’exécution du programme de x millisecondes.

  7. Fonction void Write_Max7219_byte(uchar DATA) :

    • Envoie un octet unique (DATA) au MAX7219 via SPI.

    • Utilise wiringPiSPIDataRW pour effectuer le transfert de données SPI.

    • DATA : L’octet de données à envoyer.

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

    • Envoie une commande et des données au MAX7219.

    • Combine address1 (adresse du registre) et dat1 (données) dans un buffer et les envoie via SPI.

    • address1 : Adresse du registre MAX7219.

    • dat1 : Données à écrire dans le registre.

  9. Fonction void Init_MAX7219() :

    • Initialise le pilote d’affichage MAX7219 avec les configurations nécessaires.

    • Configure le mode de décodage, l’intensité, la limite de balayage, le mode veille et le test d’affichage.

    • Efface les données précédentes sur l’affichage.

  10. Fonction void Init_WiringPi() :

    • Initialise la bibliothèque WiringPi et l’interface SPI.

    • Configure les broches des boutons en entrée avec des résistances pull-up.

    • Vérifie la réussite de l’initialisation et quitte en cas d’échec.

  11. Fonction int get_index() :

    • Génère un index aléatoire (0 ou 1) pour choisir entre la flèche gauche et droite.

    • Retourne : 0 ou 1.

  12. Fonction int get_key(uint num) :

    • Attend que l’utilisateur appuie sur un bouton et détermine si l’entrée correspond à la flèche affichée.

    • Paramètres :

      • num : L’index de la flèche affichée (0 pour droite, 1 pour gauche).

    • Renvoie :

      • 1 si l’entrée de l’utilisateur est correcte.

      • 0 si l’entrée de l’utilisateur est incorrecte.

    • Fonctionnalité :

      • Entre dans une boucle infinie vérifiant l’état des boutons.

      • Utilise digitalRead pour détecter les appuis de boutons (actif en BAS).

      • Compare le bouton pressé avec l’entrée attendue en fonction de num.

  13. Fonction void display(uint index) :

    • Affiche soit une flèche soit un symbole de résultat sur la matrice LED en fonction de stage.

    • Paramètres :

      • index : Index pour sélectionner le modèle dans les tableaux arrow ou check.

    • Fonctionnalité :

      • Si stage == 0, affiche un modèle de flèche.

      • Si stage == 1, affiche une coche ou une croix.

  14. Fonction principale :

    • Initialisation :

      • Initialise le générateur de nombres aléatoires avec srand((unsigned)time(NULL)).

      • Appelle Init_WiringPi() pour configurer le GPIO et le SPI.

      • Appelle Init_MAX7219() pour initialiser l’affichage de la matrice LED.

      • Introduit un court délai avec Delay_xms(50).

    • Boucle du jeu (``while (1)``) :

      • Étape 0 (Affichage de la flèche) :

        • Appelle get_index() pour sélectionner aléatoirement une direction de flèche.

        • Appelle display(direction) pour afficher la flèche sur la matrice LED.

        • Définit stage = 1 pour passer à l’étape suivante.

      • Étape 1 (Obtenir l’entrée de l’utilisateur et afficher le résultat) :

        • Appelle get_key(direction) pour attendre l’entrée de l’utilisateur et déterminer si elle est correcte.

        • Appelle display(key) pour afficher le symbole de résultat (coche ou croix).

        • Attend 1 seconde avec Delay_xms(1000) pour permettre à l’utilisateur de voir le résultat.

        • Définit stage = 0 pour redémarrer la boucle.

Résumé du déroulement du programme :

  1. Configuration :

    • Initialise WiringPi et SPI.

    • Configure les broches des boutons et les paramètres du MAX7219.

    • Initialise le générateur de nombres aléatoires.

  2. Affichage de la flèche :

    • Sélectionne aléatoirement une direction de flèche (gauche ou droite).

    • Affiche la flèche correspondante sur la matrice LED.

  3. Interaction utilisateur :

    • Attend que l’utilisateur appuie sur le Bouton A ou le Bouton B.

    • Détermine si le bouton pressé correspond à la direction de la flèche.

  4. Affichage du résultat :

    • Affiche une coche si l’entrée de l’utilisateur est correcte.

    • Affiche une croix si l’entrée de l’utilisateur est incorrecte.

    • Attend 1 seconde avant la prochaine manche.

  5. Répéter :

    • Boucle pour afficher une nouvelle flèche et continuer le jeu.