Projet Fun : Simon

Qu’est ce que Simon ? Simon est un jeu auquel vous avez surement joué étant plus jeune. Le principe est...

Qu’est ce que Simon ?
Simon est un jeu auquel vous avez surement joué étant plus jeune. Le principe est le suivant:
Une séquence de led s’allume et le joueur doit reproduire cette séquence. A chaque fois que la séqeunce est validé, une led aléatoire se rajoute à la séquence.

De quoi a-t-on besoin ?
- Arduino. Il faut obligatoirement être sur des ports digitaux!!! Les ports PWM ne marchent pas comme on veut !
- 4 Boutons poussoirs
- 4 leds
- Fils
- Resistances (entre 20 et 100 Ohms)
- Une Pince

Temps nécessaire
J’ai personnellement mis quelques heures pour réaliser ce montage et le code.
Le programme était simple à faire, mais j’ai eu quelques prises de têtes sur le montage des fois (un fil mal cablé c’est chiant ^^).

Prérequis
- Configurer votre Arduino

Voir ici
J’ai personnellement utilisé un Arduino Mega 2560 mais n’importe lequel marche.

- Configurer les ports
Un port peut être configuré en entrée ou en sortie.

pinMode(22, OUTPUT);

On configure par exemple une led en sortie (« OUTPUT ») sur le port 22.

pinMode(23, INPUT);

On configure par exemple un boutton en entrée (« INPUT ») sur le port 23.

- Configurer un bouton poussoir
Voir [ici](http://arduino.cc/en/Tutorial/Button).

- Configurer une led
Voir ici.

Il se peut que les états s’inversent.

- Faire marcher un buzzer
Le configurer en sortie sur le port X, un son à la fréquence w, et de durée noteDuration.

tone(X, w,noteDuration);

- Configurer un Random
Le random sera utilisé pour que la séquence ne soit pas prédéfinie:

randomSeed(analogRead(0));
long randNumber;
randNumber = random(0,300);

Le « randomSeed(analogRead(0)); » initialise le générateur de nombre pseudo-aléatoire, l’amenant à démarrer à un point arbitraire dans sa séquence aléatoire. Cette séquence, très longue, et arbitraire, est toujours le même.
random(x,y) génère un nombre compris entre x et y (y exclus).

Au travail !
Le code


void setup() {

  //Configuration des leds (sorties) et bouttons (entrées)
  // Bleu
  pinMode(22, OUTPUT);
  pinMode(50, INPUT);

  // Rouge
  pinMode(23, OUTPUT);
  pinMode(51, INPUT);

  // Vert
  pinMode(24, OUTPUT);
  pinMode(52, INPUT);

  // Jaune
  pinMode(25, OUTPUT);
  pinMode(53, INPUT);

  randomSeed(analogRead(0));

  //Buzzer
  pinMode(26,OUTPUT);

}

  //Ports d'entrées : 50==>Bleu
  // 51==>Rouge
  // 52==>Vert
  // 53==>Jaune

  // Leds: 22==>Bleu
  // 23==>Rouge
  // 24==>Vert
  // 25==>Jaune
void allumage_all()
{
  digitalWrite(22, HIGH);
  digitalWrite(23, HIGH);
  digitalWrite(24, HIGH);
  digitalWrite(25, HIGH);
}

void eteindre_all()
{
  digitalWrite(22, LOW);
  digitalWrite(23, LOW);
  digitalWrite(24, LOW);
  digitalWrite(25, LOW);
}

void fail()
{
  allumage_all();
  delay(200);
  eteindre_all();
  delay(200);
  allumage_all();
  delay(200);
  eteindre_all();
  delay(200);
  allumage_all();
  delay(200);
  eteindre_all();
  delay(1000);
}

void loop (){
  int tab[100];
  int rand;
  int bon = 1;
  int i;
  int j =50;
  int check = 0;

  for (i = 1; i < 100; i++)
    tab[i] = 0;
    i = 1;
    tab[0] = random(22,26);

  //Difficulté (tout les combien s'allument les leds)
    int diff = 3;

    while(1){

  //Allumage des leds
      if (bon == 1){
        for (i = 0; tab[i] != 0 ; i++){
          digitalWrite(tab[i], HIGH);
          delay(1000/diff);
          digitalWrite(tab[i], LOW);
          delay(1000/diff);
        }
      }

  //Joueur
      for(i = 0; tab[i] !=0 ; i++){
        while (check == 0){
          j = 50;

          while (digitalRead(j) == false){
            if (j == 54) break;
            j++;
          }
  // On joue un son quand on a appuyé
          tone(26,j*j,300);

          if (j == 54)  j = 50;
          else check = 1;
        }
        check = 0;

        if (tab[i] + 28 == j){
          digitalWrite(tab[i], HIGH);
          delay(200); // tout les combien de temps peut on appuyer sur un boutton
          digitalWrite(tab[i], LOW);
          delay(200);
          bon = 1;
        }
        else {// Trompé: on fait clignoter les leds 3 fois
          bon = 0;
          fail();

          //On fait répéter la séquence de led
          for (i = 0; tab[i] != 0 ; i++){
            digitalWrite(tab[i], HIGH);
            delay(1000/diff);
            digitalWrite(tab[i], LOW);
            delay(1000/diff);
          }
          j = 0;
        }
      }

    if (bon == 1){
      rand = random(22,26);
      tab[i] = rand;
      i++;
    }
  }
}

Je tiens juste à expliquer particulièrement ceci:

if (tab[i] + 28 == j)

C’est la condition qui dit si le bouton est celui qui correspond à la led ou pas.
tab[i] est le pin de la led, et tab[i] + 28 serait le pin d’entrée du bouton.
Cette relation de 28 est arbitraire, elle permet juste d’éviter de faire 4 if différents. Ils auraient été utilisés pour vérifier l’association entre les leds et les bouttons.

Le montage
Le but est maintenant d’assembler le tout : bouttons, leds, buzzer.

C’est simple, il faut y aller au fur et à mesure. Tout d’abord, placer un bouton avec une led (voir comment placer une led et un boutton plus haut). Quand ça marche, répeter l’opération pour les 3 autres leds et bouttons. Voici ici un programme pour tester vos bouttons et Leds:


// Test bouttons
void setup() {
  // Bleu
  pinMode(22, OUTPUT);
  pinMode(50, INPUT);

  // Rouge
  pinMode(23, OUTPUT);
  pinMode(51, INPUT);

  // Vert
  pinMode(24, OUTPUT);
  pinMode(52, INPUT);

  // Jaune
  pinMode(25, OUTPUT);
  pinMode(53, INPUT);

}

//Ports d'entrées : 50==>Bleu
// 51==>Rouge
// 52==>Vert
// 53==>Jaune

// Leds: 22==>Bleu
// 23==>Rouge
// 24==>Vert
// 25==>Jaune

void loop() {
  // Bleu
  if (digitalRead(50) == true){
    digitalWrite(22, HIGH); // set the LED on
    delay(1000); // wait for a second
    digitalWrite(22, LOW); // set the LED off
    delay(1000); // wait for a second
  }

  // Rouge
  if (digitalRead(51) == true){
    digitalWrite(23, HIGH); // set the LED on
    delay(1000); // wait for a second
    digitalWrite(23, LOW); // set the LED off
    delay(1000); // wait for a second
  }

  // Vert
  if (digitalRead(52) == true){
    digitalWrite(24, HIGH); // set the LED on
    delay(1000); // wait for a second
    digitalWrite(24, LOW); // set the LED off
    delay(1000); // wait for a second
  }

  // Jaune
  if (digitalRead(53) == true){
    digitalWrite(25, HIGH); // set the LED on
    delay(1000); // wait for a second
    digitalWrite(25, LOW); // set the LED off
    delay(1000); // wait for a second
  }
}

Une fois ceci testé, il ne vous reste plus qu’à lancer le programme dessus, changer vos ports si vous voulez ou si vous en avez besoin.

Voilà, j’espère que vous vous en êtes sorti.