Arduino : Création d’un Jeu de mémoire électronique

Avertissement : cette page présente une fiche projet réalisée par un·e Conseiller Numérique France Service en formation avec le pôle ressource en médiation numérique Zoomacom. Elle constitue une hypothèse de travail, une idée d'animation, qui n'a pas forcément été testée en conditions réelles.

image jeumemoire3d.png (0.4MB)

Auteur de cet atelier : Cédric Chazelet

Contexte

Création d’un jeu de mémoire électronique
Nous allons créer un jeu de mémoire électronique sur la base du jeu Simon que certain ont peut-être connu.
Nous allons voir ensemble comment il est conçu de l’intérieur.
Nous allons créer le programme qui le commande en Arduino et nous allons l’assembler avec la coque pré-imprimer avec notre imprimante 3D.
Vous repartirez avec votre jeu de mémoire électronique !
On relève le défi, alors c’est parti !


Présentation du jeu Simon avec publicité MB de l'époque
image jeumemoire3ddessous.png (0.6MB)
image jeudememoire3Dentier.png (0.3MB)

Fiche programme à télécharger ci-dessous :
Fiche_programme_JDME.odt (0.1MB)
Fiche déroulé global de l'atelier à télécharger ci-dessous:
Deroule_globale_JDME.odt (22.9kB)
Fiche scénario pédagogique complet de l'atelier à télécharger ci-dessous:
Trame_scenario_pedagogique_JDME.odt (29.5kB)


Matériel requis pour mettre en place l'animation :
Pour chaque participants :
  • Une carte Arduino nano
  • 4 leds bouton lumineux
  • 1 pile
  • Des fils de branchements
  • 1 petit bouton reset
  • 1 moule de la boite en 3D imprimé à l'avance de préférence

Code source Arduino du jeu de mémoire électronique

//Programme réalisé par Cédric Chazelet - Conseiller Numérique
 
  int const LR = 2;
  int const LV = 3;
  int const LJ = 4;
  int const LB = 5;
  
  
  void setup() {
  pinMode(LB, OUTPUT);
  pinMode(LJ, OUTPUT);
  pinMode(LV, OUTPUT);
  pinMode(LR, OUTPUT);
}



void loop(){
  
  digitalWrite(LB, HIGH);
  digitalWrite(LJ, HIGH);
  digitalWrite(LV, HIGH);
  digitalWrite(LR, HIGH);

}



//Programme réalisé par Cédric Chazelet - Conseiller Numérique
  
  int const LR = 2;
  int const LV = 3;
  int const LJ = 4;
  int const LB = 5;
  
  int const BB = 9;
  int const BJ = 8;
  int const BV = 7;
  int const BR = 6;

  
  void setup() {
  pinMode(BB, INPUT_PULLUP);
  pinMode(BJ, INPUT_PULLUP);
  pinMode(BV, INPUT_PULLUP);
  pinMode(BR, INPUT_PULLUP);
  
  
  pinMode(LB, OUTPUT);
  pinMode(LJ, OUTPUT);
  pinMode(LV, OUTPUT);
  pinMode(LR, OUTPUT);

}



void loop(){
  
  
  
  if (digitalRead(BB) == LOW)
  {
    digitalWrite(LB, HIGH);
  }else{
    digitalWrite(LB, LOW);
  }


  if (digitalRead(BR) == LOW)
  {
    digitalWrite(LR, HIGH);
  }else{
    digitalWrite(LR, LOW);
  }

  if (digitalRead(BV) == LOW)
  {
    digitalWrite(LV, HIGH);
  }else{
    digitalWrite(LV, LOW);
  }

  if (digitalRead(BJ) == LOW)
  {
    digitalWrite(LJ, HIGH);
  }else{
    digitalWrite(LJ, LOW);
  }

}



//Programme réalisé par Cédric Chazelet - Conseiller Numérique
  const int MAX_LEVEL = 100;
  int sequence[MAX_LEVEL];
  int your_sequence[MAX_LEVEL];
  int level = 1;
  
  int velocity = 1000;
  
  int const LR = 2;
  int const LV = 3;
  int const LJ = 4;
  int const LB = 5;
  
  int const BB = 9;
  int const BJ = 8;
  int const BV = 7;
  int const BR = 6;

  int const TEM = 11;
  
  void setup() {
  pinMode(BB, INPUT_PULLUP);
  pinMode(BJ, INPUT_PULLUP);
  pinMode(BV, INPUT_PULLUP);
  pinMode(BR, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  
  pinMode(LB, OUTPUT);
  pinMode(LJ, OUTPUT);
  pinMode(LV, OUTPUT);
  pinMode(LR, OUTPUT);

  pinMode(TEM, OUTPUT);
  
  digitalWrite(LB, LOW);
  digitalWrite(LJ, LOW);
  digitalWrite(LV, LOW);
  digitalWrite(LR, LOW);
  digitalWrite(TEM, HIGH);
}



void loop(){
  
  if (level == 1)
  generate_sequence();//generate a sequence;
  
  if (digitalRead(10) == LOW || level != 1) //If start button is pressed or you're winning
  {
    digitalWrite(TEM, LOW); // on eteins le temoin
  show_sequence();    //show the sequence
  get_sequence();     //wait for your sequence
  }

}



void show_sequence(){
  digitalWrite(LB, LOW);
  digitalWrite(LJ, LOW);
  digitalWrite(LV, LOW);
  digitalWrite(LR, LOW);

  for (int i = 0; i < level; i++){
    digitalWrite(sequence[i], HIGH);
    delay(velocity);
    digitalWrite(sequence[i], LOW);
    delay(300);
  }
}

void get_sequence(){
  int flag = 0; // indique si la séquence est correct

  for (int i = 0; i < level; i++){
  flag = 0;
  while(flag == 0){
    if (digitalRead(BB) == LOW){
    digitalWrite(LB, HIGH);
    your_sequence[i] = 5;
    flag = 1;
    delay(300);
    if (your_sequence[i] != sequence[i]){
    wrong_sequence();
    return;
    }
    digitalWrite(LB, LOW);
  }

if (digitalRead(BJ) == LOW)
{
digitalWrite(LJ, HIGH);
your_sequence[i] = 4;
flag = 1;
delay(300);
if (your_sequence[i] != sequence[i])
{
wrong_sequence();
return;
}
digitalWrite(LJ, LOW);
}

if (digitalRead(BV) == LOW)
{
digitalWrite(LV, HIGH);
your_sequence[i] = 3;
flag = 1;
delay(300);
if (your_sequence[i] != sequence[i])
{
wrong_sequence();
return;
}
digitalWrite(LV, LOW);
}

if (digitalRead(BR) == LOW)
{
digitalWrite(LR, HIGH);
your_sequence[i] = 2;
flag = 1;
delay(300);
if (your_sequence[i] != sequence[i])
{
wrong_sequence();
return;
}
digitalWrite(LR, LOW);
}

}
}
right_sequence();
}

void generate_sequence(){
randomSeed(millis()); // aleatoire

for (int i = 0; i < MAX_LEVEL; i++){
sequence[i] = random(2,6);
}
}
void wrong_sequence(){
for (int i = 0; i < 3; i++)
{
digitalWrite(LR, HIGH);
digitalWrite(LV, HIGH);
digitalWrite(LJ, HIGH);
digitalWrite(LB, HIGH);
delay(100);
digitalWrite(LR, LOW);
digitalWrite(LV, LOW);
digitalWrite(LJ, LOW);
digitalWrite(LB, LOW);
delay(100);
}
level = 1;
velocity = 1000;
}

void right_sequence(){
  digitalWrite(TEM, HIGH); // On allume le temoin
  delay(2000);

if (level < MAX_LEVEL);
level++;

velocity -= 50; // augmente la diificultée
}


Fichier 3d de la boite du jeu
Sur demande au super Conseiller Numérique Cédric Chazelet pour le moment ;)