Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Créer un jeu de mémoire Arduino (Clone de Simon) – Tutoriel étape par étape

Composants et fournitures

Composant Quantité Notes
Arduino UNO 1
Résistances 330 Ω (SparkFun) 4 Pour les LEDs
Résistances 10 kΩ (SparkFun) 4 Pour les boutons (pull-down)
LEDs assorties (SparkFun) 4 4 couleurs différentes
Mini haut-parleur (SparkFun) 1 Optionnel pour le son
Plaque d'essai (Breadboard) taille standard 1
Fils de connexion (jumper wires) 1 jeu

Applications et services en ligne

À propos de ce projet

Vous souvenez-vous du jeu « Simon » ? Beaucoup de gens de ma génération (nés dans les années 70) y ont passé des heures. Le principe était simple : 4 boutons de couleurs différentes s'allumaient en séquence et il fallait la reproduire. À chaque succès, la séquence s'allongeait d'une couleur.

J'en ai eu un pour Noël il y a longtemps, mais déménagement après déménagement, il a fini perdu dans une boîte jamais déballée.

En tant qu'« adulte », j'ai découvert les joies de l'Arduino et l'opportunité de ressusciter mon vieil ami perduteur de temps.

Ce tutoriel montre comment réaliser un jeu similaire avec un Arduino Uno, quelques LEDs, résistances et un circuit relativement simple.

Le programme peut sembler un peu complexe pour un débutant, j'ai donc essayé d'expliquer dans le code ce qu'il fait et comment.

La méthode la plus simple pour lancer le jeu

  1. Connectez le circuit exactement comme sur le schéma. La couleur des fils n'a pas d'importance.
  2. Copiez le code source dans votre éditeur Arduino préféré et téléversez-le sur la carte.
  3. Jouez !

Le jeu démarre après environ 3 secondes avec 5 flashs lents de toutes les LEDs.

Créer un jeu de mémoire Arduino (Clone de Simon) – Tutoriel étape par étape

Si une ou plusieurs LEDs ne clignotent pas, vérifiez le câblage. Sur ma carte, les tout petits boutons ne tiennent pas toujours bien et ont tendance à sortir.

Si le câblage semble correct, essayez d'inverser une LED qui fonctionne avec une qui ne fonctionne pas pour voir si c'est le câblage ou la LED.

Après les 5 flashs, une LED s'allume. Devinez laquelle ? C'est une surprise :) Appuyez sur le bouton correspondant. Cette LED s'allumera à nouveau suivie d'une nouvelle. Appuyez sur les bons boutons dans l'ordre... Vous voyez où je veux en venir...

Créer un jeu de mémoire Arduino (Clone de Simon) – Tutoriel étape par étape

Bientôt, toutes les LEDs clignoteront rapidement. Cela signifie que vous avez perdu :D

La dernière séquence s'affichera pour que vous puissiez compter vos points, suivie des 5 flashs lents indiquant le redémarrage.

Vous avez 2 secondes pour appuyer sur chaque bouton.

Amusez-vous bien !

Voulez-vous corser le jeu ?

Changez la valeur en haut du code :

#define PLAYER_WAIT_TIME 2000

Ou ajoutez une autre LED si vous en avez une. Pour cela, reproduisez cette portion de circuit :

Créer un jeu de mémoire Arduino (Clone de Simon) – Tutoriel étape par étape

Le fil orange ira sur une broche inutilisée de l'Arduino (évitez 0 et 1).

Puis modifiez ces lignes dans le code :

byte noPins = 4;
byte pins[] = {2, 13, 10, 8};

Si vous ajoutez une LED sur la broche 6 :

byte noPins = 5;
byte pins[] = {2, 13, 10, 8, 6};

Petit conseil pour l'écriture de code Arduino

void setup() {
  delay(3000); // Délai au début de setup()
  Serial.begin(9600);
  Reset();
}

Mettez un court délai comme première instruction de setup(). Il est facile de faire entrer l'Arduino dans une boucle infinie ou de le bloquer. Ce délai permet de réinitialiser l'Arduino et uploader un sketch vide avant qu'il ne se rebloque.

J'ai finalement rendu ce petit projet portable...

Pour une idée vraiment cool d'un jeu similaire (mais bien plus avancé), regardez ceci : Lego Mini Memory Game de Peter Kent. Il a fait le jeu sur mobile avec une interface vers une voiture Lego. C'est vraiment génial !

Code du jeu de mémoire


#define PLAYER_WAIT_TIME 2000 // Temps autorisé entre appuis sur boutons - 2s
byte sequence[100];           // Stockage de la séquence lumineuse
byte curLen = 0;              // Longueur actuelle de la séquence
byte inputCount = 0;          // Nombre d'appuis corrects du joueur dans un tour
byte lastInput = 0;           // Dernière entrée du joueur
byte expRd = 0;               // LED qui doit être allumée par le joueur
bool btnDwn = false;          // Vérifie si un bouton est pressé
bool wait = false;            // Programme en attente de l'appui du joueur
bool resetFlag = false;       // Indique que le joueur a perdu
byte soundPin = 5;            // Sortie haut-parleur
byte noPins = 4;              // Nombre de boutons/LEDs
byte pins[] = {2, 13, 10, 8}; // Broches entrées boutons / sorties LEDs
long inputTime = 0;           // Variable timer pour délai entre entrées utilisateur

void setup() {
  delay(3000); // Temps pour respirer après connexion
  Serial.begin(9600);
  Reset();
}

/// Définit toutes les broches en INPUT ou OUTPUT selon 'dir'
void setPinDirection(byte dir) {
  for(byte i = 0; i < noPins; i++) pinMode(pins[i], dir);
}

/// Envoie la même valeur à toutes les broches LED
void writeAllPins(byte val) {
  for(byte i = 0; i < noPins; i++) digitalWrite(pins[i], val);
}

/// Émet un bip (très agaçant :)
void beep(byte freq) {
  analogWrite(soundPin, 2); delay(freq);
  analogWrite(soundPin, 0); delay(freq);
}

/// Fait clignoter toutes les LEDs ensemble
/// freq = vitesse clignotement - petit = rapide | grand = lent
void flash(short freq) {
  setPinDirection(OUTPUT); // Activation LEDs
  for(int i = 0; i < 5; i++) {
    writeAllPins(HIGH); beep(50); delay(freq);
    writeAllPins(LOW); delay(freq);
  }
}

/// Réinitialise toutes les variables de jeu aux valeurs par défaut
void Reset() {
  flash(500);
  curLen = 0; inputCount = 0; lastInput = 0;
  expRd = 0; btnDwn = false; wait = false; resetFlag = false;
}

/// Le joueur a perdu
void Lose() { flash(50); }

/// L'Arduino montre la séquence à mémoriser
/// Aussi appelé après une perte pour montrer la dernière séquence
void playSequence() {
  for(int i = 0; i < curLen; i++) {
    Serial.print("Seq: "); Serial.print(i); Serial.print(" Pin: "); Serial.println(sequence[i]);
    digitalWrite(sequence[i], HIGH); delay(500);
    digitalWrite(sequence[i], LOW); delay(250);
  }
}

/// Événements lors d'une perte
void DoLoseProcess() {
  Lose(); delay(1000);
  playSequence(); // Montre la dernière séquence - pour compter votre score (mon record : 22 !)
  delay(1000);
  Reset(); // Réinitialisation pour nouvelle partie
}

/// Là où la magie opère
void loop() {
  if(!wait) {
    //****************//
    // Tour de l'Arduino //
    //****************//
    setPinDirection(OUTPUT);
    randomSeed(analogRead(A0));
    sequence[curLen] = pins[random(0, noPins)]; // Nouvelle valeur aléatoire
    curLen++;
    playSequence();
    beep(50);
    wait = true; // Tour du joueur
    inputTime = millis();
  } else {
    //***************//
    // Tour du joueur //
    //***************//
    setPinDirection(INPUT);
    
    if(millis() - inputTime > PLAYER_WAIT_TIME) {
      DoLoseProcess(); // Temps écoulé = perdu
      return;
    }
    
    if(!btnDwn) {
      expRd = sequence[inputCount];
      Serial.print("Attendu: "); Serial.println(expRd);
      
      for(int i = 0; i < noPins; i++) {
        if(pins[i] == expRd) continue; // Ignore la bonne broche
        if(digitalRead(pins[i]) == HIGH) { // Mauvais bouton pressé
          lastInput = pins[i];
          resetFlag = true;
          btnDwn = true;
          Serial.print("Lu: "); Serial.println(lastInput);
        }
      }
    }
    
    if(digitalRead(expRd) == 1 && !btnDwn) { // Bon bouton pressé
      inputTime = millis();
      inputCount++;
      btnDwn = true;
      Serial.print("Lu: "); Serial.println(expRd);
    } else {
      if(btnDwn && digitalRead(lastInput) == LOW) { // Bouton relâché
        btnDwn = false; delay(20);
        if(resetFlag) { DoLoseProcess(); }
        else {
          if(inputCount == curLen) { // Séquence complète reproduite
            wait = false; // Prochain tour = Arduino
            inputCount = 0;
            delay(1500);
          }
        }
      }
    }
  }
}

Schémas

Créer un jeu de mémoire Arduino (Clone de Simon) – Tutoriel étape par étape

Fichier Fritzing : simonsays_siKds3Jmk2.fzz

Processus de fabrication

  1. Créer un système Ambilight spectaculaire pour moniteur avec Arduino
  2. Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
  3. Affichage LED Interactif Gyroscopique avec Anneau NeoPixel et Arduino
  4. Créer un jeu Pong classique sur Arduino UNO avec écran OLED – Tutoriel étape par étape
  5. Manette de jeu USB Arduino DIY – Construisez votre propre gamepad haute performance
  6. Jeu Breakout tactile Arduino : recréez l'arcade classique sur écran TFT 2,4″
  7. Pixie : Montre-bracelet NeoPixel à base d'Arduino – Élégante, DIY, montre LED
  8. Pixel Chaser : Jeu LED interactif à une touche avec Arduino Nano
  9. Automatiser le Jeu Chrome Dino avec Arduino et LDR