ENIB 2022 - groupe A : Simon : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
 
(10 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
 
 
==photos==
 
==photos==
 
[[Fichier:Nicolacodesimon.jpg|vignette|néant]]
 
[[Fichier:Nicolacodesimon.jpg|vignette|néant]]
 +
[[Fichier:Img simon large.jpg|cadre]]
 +
Nicolas Demailly effectuent son travail de Stakhanoviste afin de fournir un code d'une qualité exceptionnelle
  
 +
==Principe du jeu==
 +
"Apparu à la fin des années 70, de forme circulaire et qui comprenait 4 gros boutons lumineux de couleurs différentes => le jeu proposait une séquence lumineuse accompagnée de sons, que le joueur devait reproduire sans se tromper dans un délai donné."
 +
Le jeu du Simon trouve son origine dans le jeu pour enfant Jacques a dit, d'où il tire également son nom, puisque dans les pays anglophones ce n'est pas Jacques mais Simon (Simon Says…) qui donne les ordres.
 +
Le jeu, électronique, éclaire une des quatre couleurs et produit un son toujours associé à cette couleur. Le joueur doit alors appuyer sur la touche de la couleur qui vient de s'allumer dans un délai assez court.
 +
Le jeu répète la même couleur et le même son, puis ajoute au hasard une nouvelle couleur. Le joueur doit reproduire cette nouvelle séquence. Chaque fois que le joueur reproduit correctement la séquence, le jeu ajoute une nouvelle couleur.
 
==Que fait ce projet ? ==
 
==Que fait ce projet ? ==
"apparu à la fin des années 70, de forme circulaire et qui comprenait 4 gros boutons lumineux de couleurs différentes => le jeu proposait une séquence lumineuse accompagnée de sons, que le joueur devait reproduire sans se tromper dans un délai donné."
+
 
Notre projets propose de recréer un '''Simon''' avec les matériaux du bord
+
Notre projets propose de recréer un '''Simon''' avec les matériaux du bord et ceux disponible au fablab des fabriques du ponant.
  
 
==Liste des composants==
 
==Liste des composants==
Ligne 27 : Ligne 32 :
  
 
[[Fichier:Ledallumésionm.jpg|vignette|gauche]]
 
[[Fichier:Ledallumésionm.jpg|vignette|gauche]]
 +
 +
[[Fichier:Schema elec simon.png|vignette|gauche]]
 
==Code==
 
==Code==
 
<pre>
 
<pre>
 +
#include <ArduinoSTL.h>
 +
#include "Module.h"
 +
#include "Key.h"
 +
#include "Led.h"
 +
 +
static std::vector<Module*> modules;
 +
 +
std::vector<Module*> module::getModules() {
 +
  return modules;
 +
}
 +
 +
void module::addModule(Module* module) {
 +
  modules.push_back(module);
 +
}
 +
 +
Module::Module() {
 +
  addModule(this);
 +
}
 +
 +
const int buzzer = 10;
 +
int intro = -1;
 +
bool sound = false;
 +
int level = -1;
 +
int memory[128];
 +
int score = 0;
 +
int decay = 0;
 +
int decayLed = 0;
 +
int play = -1;
 +
bool wait = true;
 +
int share = 0;
 +
bool first = true;
 +
 +
int frenquencies[] = {
 +
  523,
 +
  587,
 +
  622,
 +
  554
 +
};
 +
 +
void* listener = ([](Key* key, KeyEvent event, int id) {  // ENTER
 +
  if (!sound && (intro == -1)) {
 +
    level = id;
 +
    score = 0;
 +
    play = 0;
 +
    first = true;
 +
    share = 0;
 +
    key->getLed()->strobeFor(2000);
 +
    intro = 5000;
 +
    return;
 +
  }
 +
  if (intro > -1) {
 +
    return;
 +
  }
 +
  if (event.getType() == 0) {
 +
    if (sound) {
 +
      tone(buzzer, frenquencies[id]);
 +
    }
 +
    key->getLed()->turnOn();
 +
    if (wait) {
 +
      Serial.println(share);
 +
      if (id == memory[share]) {
 +
        Serial.println("ok");
 +
      } else {
 +
        Serial.println("pas ok");
 +
        key->getLed()->strobeFor(3000);
 +
        noTone(buzzer);
 +
        sound = false;
 +
      }
 +
    }
 +
  } else  if (event.getType() == 2) {
 +
    key->getLed()->turnOff();
 +
    noTone(buzzer);
 +
    if (wait) {
 +
      if (id == memory[share]) {
 +
        if (share == score) {
 +
          score++;
 +
          share = 0;
 +
          play = 0;
 +
          first = true;
 +
          wait = false;
 +
        } else {
 +
          share++;
 +
        }
 +
      }
 +
    }
 +
  }
 +
});
 +
 +
 +
Led leds[] = {
 +
  Led(5, Color::YELLOW),
 +
  Led(14, Color::RED),
 +
  Led(15, Color::BLUE),
 +
  Led(16, Color::GREEN)
 +
};
 +
 +
Key keys[] = {
 +
  Key(6, &leds[0], listener, 0), // YELLOW
 +
  Key(7, &leds[1], listener, 1), // RED
 +
  Key(8, &leds[2], listener, 2), // BLUE
 +
  Key(9, &leds[3], listener, 3)  // GREEN
 +
};
 +
 +
void setup() {
 +
  pinMode(buzzer, OUTPUT);
 +
Serial.begin(9600);
 +
}
 +
 +
void loop() {
 +
for (module::Module* &module : module::getModules()) module->work();
 +
  if (intro > 0) {
 +
    if (intro == 2950) {
 +
      decay = 2800;
 +
    }
 +
    if (intro == decay && intro > 1000) {
 +
      leds[decayLed].toogle();
 +
      decayLed++;
 +
      if (decayLed == 4) {
 +
        decayLed = 0;
 +
      }
 +
      decay = decay - 50;
 +
    } else if (intro <= 1000) {
 +
      leds[0].turnOff();
 +
      leds[1].turnOff();
 +
      leds[2].turnOff();
 +
      leds[3].turnOff();
 +
    }
 +
    intro--;
 +
    if (intro == 0) {
 +
      for (int i = 0; i < 128; i++) {
 +
        memory[i] = random(0, 4);
 +
      }
 +
      play = 0;
 +
      sound = true;
 +
      wait = false;
 +
      intro = -1;
 +
    }
 +
  }
 +
  if (play >= 0) {
 +
    if (!wait) {
 +
      if (first) {
 +
        if (play == (200 / (level + 1))) {
 +
          first = false;
 +
          play = 0;
 +
        }
 +
      } else {
 +
        int toShare = memory[share];
 +
        if (play == 1) {
 +
          //Serial.print("COUCOU : ");
 +
          //Serial.println(toShare);
 +
          keys[toShare].callEvent(KeyEvent(KeyEvent::PRESS, 0));
 +
        }
 +
        if (play == (200 / (level + 1))) {
 +
          keys[toShare].callEvent(KeyEvent(KeyEvent::RELEASE, 10));
 +
        }
 +
        if (play == (400 / (level + 1))) {
 +
          play = 0;
 +
          if (share == score) {
 +
            share = 0;
 +
            wait = true;
 +
          } else {
 +
            share++;
 +
          }
 +
        }
 +
      }
 +
    }
 +
    play++;
 +
  }
 +
  delay(1);
 +
}
 +
 +
int AddressableModule::readAnalogValue() {
 +
this->value = analogRead(this->getAddress());
 +
return this->value;
 +
}
 +
 +
int AddressableModule::readDigitalValue() {
 +
this->value = digitalRead(this->getAddress());
 +
return this->value;
 +
}
 +
 +
void Led::setup() {
 +
pinMode(this->getAddress(), OUTPUT);
 +
}
 +
 +
void Key::setup() {
 +
  pinMode(this->getAddress(), INPUT_PULLUP);
 +
}
 +
 +
void Led::work() {
 +
  int strobe = this->getStrobe();
 +
  if (strobe > 0) {
 +
    int a = (strobe / 100) % 2;
 +
    if (a == 0) {
 +
      this->turnOff();
 +
    } else if (a == 1) {
 +
      this->turnOn();
 +
    }
 +
    this->decreaseStrobe();
 +
  }
 +
digitalWrite(this->getAddress(), this->getStatus() ? HIGH : LOW);
 +
}
  
 
</pre>
 
</pre>
 +
==photos du projet==
 +
[[Fichier:Img simon large.jpg|cadre|centré]]
  
 +
[[Fichier:Img simon proche.jpg|cadre|centré]]
 
==Catégories==
 
==Catégories==
  
 
[[Catégorie:Enib2022]]
 
[[Catégorie:Enib2022]]

Version actuelle datée du 14 janvier 2022 à 15:31

photos

Nicolacodesimon.jpg
Img simon large.jpg

Nicolas Demailly effectuent son travail de Stakhanoviste afin de fournir un code d'une qualité exceptionnelle

Principe du jeu

"Apparu à la fin des années 70, de forme circulaire et qui comprenait 4 gros boutons lumineux de couleurs différentes => le jeu proposait une séquence lumineuse accompagnée de sons, que le joueur devait reproduire sans se tromper dans un délai donné." Le jeu du Simon trouve son origine dans le jeu pour enfant Jacques a dit, d'où il tire également son nom, puisque dans les pays anglophones ce n'est pas Jacques mais Simon (Simon Says…) qui donne les ordres. Le jeu, électronique, éclaire une des quatre couleurs et produit un son toujours associé à cette couleur. Le joueur doit alors appuyer sur la touche de la couleur qui vient de s'allumer dans un délai assez court. Le jeu répète la même couleur et le même son, puis ajoute au hasard une nouvelle couleur. Le joueur doit reproduire cette nouvelle séquence. Chaque fois que le joueur reproduit correctement la séquence, le jeu ajoute une nouvelle couleur.

Que fait ce projet ?

Notre projets propose de recréer un Simon avec les matériaux du bord et ceux disponible au fablab des fabriques du ponant.

Liste des composants

■ Arduino micro pro (x1) : shorturl.at/detAX

■ RGB Screen (x1) : shorturl.at/gtCU9

■ LED red, blue, green, yellow (x4) : shorturl.at/cABQ0

■ Resistors (220 Ohms) (x4) : https://geni.us/Ufa2s

■ Wire: https://geni.us/22AWGWire

■ Arcade Buttons (x4) : shorturl.at/howNQ

■ 5v buzzer (x1) : https://geni.us/5vBuzzer

Le Projet

Imagemachinesimon.jpg
Ledallumésionm.jpg
Schema elec simon.png

Code

#include <ArduinoSTL.h>
#include "Module.h"
#include "Key.h"
#include "Led.h"

static std::vector<Module*> modules;

std::vector<Module*> module::getModules() {
  return modules;
}

void module::addModule(Module* module) {
  modules.push_back(module);
}

Module::Module() {
  addModule(this);
}

const int buzzer = 10;
int intro = -1;
bool sound = false;
int level = -1;
int memory[128];
int score = 0;
int decay = 0;
int decayLed = 0;
int play = -1;
bool wait = true;
int share = 0;
bool first = true;

int frenquencies[] = {
  523,
  587,
  622,
  554
};

void* listener = ([](Key* key, KeyEvent event, int id) {   // ENTER
  if (!sound && (intro == -1)) {
    level = id;
    score = 0;
    play = 0;
    first = true;
    share = 0;
    key->getLed()->strobeFor(2000);
    intro = 5000;
    return;
  }
  if (intro > -1) {
    return;
  }
  if (event.getType() == 0) {
    if (sound) {
      tone(buzzer, frenquencies[id]);
    }
    key->getLed()->turnOn();
    if (wait) {
      Serial.println(share);
      if (id == memory[share]) {
        Serial.println("ok");
      } else {
        Serial.println("pas ok");
        key->getLed()->strobeFor(3000);
        noTone(buzzer);
        sound = false;
      }
    }
  } else  if (event.getType() == 2) {
    key->getLed()->turnOff();
    noTone(buzzer);
    if (wait) {
      if (id == memory[share]) {
        if (share == score) {
          score++;
          share = 0;
          play = 0;
          first = true;
          wait = false;
        } else {
          share++;
        }
      }
    }
  }
});


Led leds[] = {
  Led(5, Color::YELLOW),
  Led(14, Color::RED),
  Led(15, Color::BLUE),
  Led(16, Color::GREEN)
};

Key keys[] = {
  Key(6, &leds[0], listener, 0), // YELLOW
  Key(7, &leds[1], listener, 1), // RED
  Key(8, &leds[2], listener, 2), // BLUE
  Key(9, &leds[3], listener, 3)  // GREEN
};

void setup() {
  pinMode(buzzer, OUTPUT);
	Serial.begin(9600);
}

void loop() {
	for (module::Module* &module : module::getModules()) module->work();
  if (intro > 0) {
    if (intro == 2950) {
      decay = 2800;
    }
    if (intro == decay && intro > 1000) {
      leds[decayLed].toogle(); 
      decayLed++;
      if (decayLed == 4) {
        decayLed = 0;
      }
      decay = decay - 50;
    } else if (intro <= 1000) {
      leds[0].turnOff();
      leds[1].turnOff();
      leds[2].turnOff();
      leds[3].turnOff();
    }
    intro--;
    if (intro == 0) {
      for (int i = 0; i < 128; i++) {
        memory[i] = random(0, 4);
      }
      play = 0;
      sound = true;
      wait = false;
      intro = -1;
    }
  }
  if (play >= 0) {
    if (!wait) {
      if (first) {
        if (play == (200 / (level + 1))) {
          first = false;
          play = 0;
        }
      } else {
        int toShare = memory[share];
        if (play == 1) {
          //Serial.print("COUCOU : ");
          //Serial.println(toShare);
          keys[toShare].callEvent(KeyEvent(KeyEvent::PRESS, 0));
        }
        if (play == (200 / (level + 1))) {
          keys[toShare].callEvent(KeyEvent(KeyEvent::RELEASE, 10));
        }
        if (play == (400 / (level + 1))) {
          play = 0;
          if (share == score) {
            share = 0;
            wait = true;
          } else {
            share++; 
          }
        }
      }
    }
    play++;
  }
  delay(1);
}

int AddressableModule::readAnalogValue() {
	this->value = analogRead(this->getAddress());
	return this->value;
}

int AddressableModule::readDigitalValue() {
	this->value = digitalRead(this->getAddress());
	return this->value;
}

void Led::setup() {
	pinMode(this->getAddress(), OUTPUT);
}

void Key::setup() {
  pinMode(this->getAddress(), INPUT_PULLUP);
}

void Led::work() {
  int strobe = this->getStrobe();
  if (strobe > 0) {
    int a = (strobe / 100) % 2;
    if (a == 0) {
      this->turnOff();
    } else if (a == 1) {
      this->turnOn();
    }
    this->decreaseStrobe();
  }
	digitalWrite(this->getAddress(), this->getStatus() ? HIGH : LOW);
}

photos du projet

Img simon large.jpg
Img simon proche.jpg

Catégories