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
- Arduino IDE
À 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
- Connectez le circuit exactement comme sur le schéma. La couleur des fils n'a pas d'importance.
- Copiez le code source dans votre éditeur Arduino préféré et téléversez-le sur la carte.
- Jouez !
Le jeu démarre après environ 3 secondes avec 5 flashs lents de toutes les LEDs.

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

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 :

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

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