Bouillon Cube


Bouillon cube, serious game pour sensibiliser sur la déforestation.

Bouillons-cubes.png

Statut du projet

Prototype

Statut de la publication

Publié

License

CC-by-sa-3.0 - Creative Commons Attribution CC-by-sa-3.0 France

Inspiration

Fichiers source

Machines

Matériaux

Lien




Sommaire

Concept

Bouillon Cube est un serious game présenté au premier abord comme un jeu de rapidité. Ce cube intéractif a pour but de sensibiliser le joueur sur la déforestation. Le jeu dénonce différents produits du quotidien qui font parti des principales causes de la déforestation. En plus de susciter le sens critique, le jeu apporte des conseils et solutions pour lutter contre cette catastrophe écologique.

Déroulement du jeu

Le jeu se suit avec deux outils: le cube et une page web qui présente les différentes instructions. Le but est de réaliser toutes les activités de la journée, resprésentées sur le cube, le plus vite possible.

Bouillons-cubes cube.jpg

Etape du jeu

Le joueur se place devant le cube pour pouvoir le prendre en main. Pour débuter le jeu il faut activer le bouton qui lancera le chronomètre.

Le jour va ensuite suivre les instructions et effectuer les différentes actions tout autour du cube.
1. Etalez la pâte à tartiner chocolat-noisette.
2. Revissez le pot de pâte à tartiner chocolat-noisette.
3. Prenez vos vêtements dans le tiroir
4. Appeler son boss pour connaitre le lieu de la conférence.
5. Demarrer la voiture.
6. Prenez note de la conférence.
7. Enlever votre blouson de cuir.
8. Faire réchauffer votre poulet au four.
9. Rechargez votre téléphone.

Ces intéractions se font à l'aide de différents capteurs éléctroniques, habillés par le cube.
Une fois terminé, le joueur ré-appuie sur le bouton pour stopper le chronomètre.

Fin du jeu

La page web indique au joueur qu'une trappe va s'ouvrir pour lui afficher son score.
Hors lorsque la trappe va s'ouvrir, le joueur va découvrir une animation d'arbres qui tombent pour illustrer la déforestation. Un chiffre qui va s'afficher sur le cadrant, ne sera pas en seconde mais convertie en nombre d'arbres coupés dans le monde, pendant le temps que le joueur aura mis à finir le jeu.

Bouillons-cubes Fin.jpg

La page web découle aussi sur une landing page qui parle des différentes causes de la déforestation et permet au joueur de réaliser et comprendre le lien entre la déforestation et les activités qu'il aura réalisé pendant le jeu.

A la fin de la page, le joueur est appelé à faire un don pour une des différentes associations qui luttent contre la déforestation.




Concevoir le cube

Nous avons commencez par faire les graphismes et la découpe extérieure du cube pour les passer à la découpeuse laser avec les logiciels Illustrator, Inkscape. Le cube entier devait être démontable facilement sans viser ou coller. La plaque à découper était une planche de contre-plaqué de 4mm d'épaisseur. Certain trou pour insérer les potentiomètre on été fait avec une visseuse électrique muni d'un forêt. Pour les interactions du cube, nous avons utiliser trois potentiomètres (étapes 2, 5, 8), il y a quatre capteur de fin de courses (étapes 3, 4, 7, 9), un capteur de pression (étape 6) et de la peinture conductrice (étape 1). Pour montrer que les interactions sont validé il y a un ruban de trois leds sur les trois face. Il y a aussi des interactions dans le cube. Quand le jeu est fini, la trappe s'ouvre grâce à un solenoïde. Les arbres pour tomber on chacun un servo moteur alternatif ainsi que l'écran à leds au fond qui à démarré des le début pour montrer le nombre d'arbre abattu le temps de la partie. Nous n'avons pas pu faire toute les interactions par manque de place sur la carte photon et de temps.

Bouillons-cubes planches.jpg
Bouillons-cubes interieure.jpg

Site Web



Le site web est directement relié aux interactions du cube et permet d’enchaîner les instructions de façon fluide.

Programmation du cube

Ce code a été réalisé avec particle pour être transféré sur la carte photon

//Importation des librairy pour l'écran 4x7 segments

  1. include <TM1637Display.h>

//Importation des librairy pour le ruban a led

  1. include <neopixel.h>

//Initialisation de l'écran 4x7 segments

  1. define CLK D1
  2. define DIO D2

TM1637Display display(CLK, DIO);

//Initialisation du ruban de led

  1. define PIN D6
  2. define N_LEDS 9

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN);

//Initialisation des Capteurs de fin de courses

  1. define FinCourse1 D4
  2. define FinCourse2 D5
  3. define FinCourse3 D7

//Initialisation du capteur de pression int fsrAnalogPin = A2; int fsrReading;

//Initialisation du solenoid int solenoidPin = D4;

//Initialisation du bouton int interrupteur = LOW; int toggle = 0; int buttonPin = D0; int buttonState = 0;

//Initialisation des potentiomètres int analogPin0 = A0; int analogPin1 = A1; int analogPin2 = A3; int val0 = 0; int val1 = 0; int val2 = 0;

//Initiatilsation de variables pour changer la couleur des leds int red0 = 0; int red1 = 0; int red2 = 0; int red3 = 0; int red4 = 0; int red5 = 0; int red6 = 0;

//Initialisation de la variable du nombre d'arbres découpés int arbre=0;

void setup() {

 strip.begin();
   
 pinMode(buttonPin, INPUT);    
 
 display.setBrightness(0x0d);
  
 Serial.begin(9600); // Envoi de message de déboggage sur connexion série
 pinMode(fsrAnalogPin, OUTPUT);  
 pinMode(solenoidPin, OUTPUT); 
 
 //Variables envoyées au web
 Particle.variable("interrupteur", interrupteur);
 Particle.variable("red0", red0);
 Particle.variable("red1", red1);
 Particle.variable("red2", red2);
 Particle.variable("red3", red3);
 Particle.variable("red4", red4);
 Particle.variable("red5", red5);
 Particle.variable("red6", red6);
 
 pinMode(FinCourse1, INPUT);   
 pinMode(FinCourse2, INPUT);   
 pinMode(FinCourse3, INPUT);   
 Serial.begin(115200);

}

void loop() {

   //Lecture de la valeur du capteur de pression
   fsrReading = analogRead(fsrAnalogPin);
   val0 = analogRead(analogPin0);
   val1 = analogRead(analogPin1);
   val2 = analogRead(analogPin2);
   
   //Lecture de la valeur des fin de courses
   int fdc1 = digitalRead(FinCourse1); 
   int fdc2 = digitalRead(FinCourse2); 
   int fdc3 = digitalRead(FinCourse3); 
   
   //Lecture de la valeur du bouton
   buttonState = digitalRead(buttonPin);
 
 //Bouton avec 2 étâts comme un interrupteur (interrupteur ON et interrupteur OFF)
 if (buttonState == HIGH) {    
   if (toggle == 1) {
     interrupteur=!interrupteur;
     toggle=0;
   } 
 }
 else {
   toggle=1;
     
 } 
 
 //Si l'interrupteur est ON 
 if(interrupteur == HIGH){
     if(toggle == 0){ //Remise a 0 des valeurs de l'arbre et des leds au clic
         arbre=0;
         red0=0;
         red1=0;
         red2=0;
         red3=0;
         red4=0;
         red5=0;
         red6=0;
     }
     
   //Solenoid permettant d'ouvrir la porte se bloque
   digitalWrite(solenoidPin, LOW);  
     for(int i=0; i<strip.numPixels(); i++) { 
       // Pour toute les leds ou le capteur est fonctionnel, elles deviennent rouges -> Début de l'expérience
       strip.setPixelColor(i, strip.Color(255,0,0));
       
       //Seules 2 capteurs ne sont pas fonctionnels -> Les leds s'allument vertes dès le début
     strip.setPixelColor(0, strip.Color(0,255,0)); 
     strip.setPixelColor(5, strip.Color(0,255,0));
     
       //Pour chaque interaction avec un capteur -> Valeur de la led prend 1 
       if(val0 > 3800) { 
           red0 = 1;
       }
       if(val1 > 3800) { 
           red1 = 1;
       }
       if(val2 > 3800) { 
           red3 = 1;
       }
       if(fsrReading < 200){
           red2 = 1;
       } 
       if(fdc1 == HIGH){
           red4 = 1;
       }
       if(fdc2 == HIGH){
           red5 = 1;
       }
       if(fdc3 == HIGH){
           red6 = 1;
       }
       
       //Si la valeur de la led est 1 -> Led s'allume en vert
       if(red0 == 1){
           strip.setPixelColor(6, strip.Color(0,255,0));
       } 
       if(red1 == 1){
           strip.setPixelColor(1, strip.Color(0,255,0));
       } 
       if(red2 == 1){
           strip.setPixelColor(3, strip.Color(0,255,0));
         }
       if(red3 == 1){
           strip.setPixelColor(4, strip.Color(0,255,0));
        }
       if(red4 == 1){
           strip.setPixelColor(2, strip.Color(0,255,0));
        }
        if(red5 == 1){
           strip.setPixelColor(8, strip.Color(0,255,0));
        }
        if(red6 == 1){
           strip.setPixelColor(7, strip.Color(0,255,0));
        }
       
       strip.show();
       
       arbre++; //Incrementation du nombre d'arbres
       delay(25);
       display.showNumberDec(arbre);
    }  
 } else //Si l'interrupteur est OFF {
     for(int i=0; i<strip.numPixels(); i++) {//Toute les leds clignotent vert et blanc
       strip.setPixelColor(i, strip.Color(0,255,0));
       delay(50);
       strip.show();
       strip.setPixelColor(i, strip.Color(255,255,255));
       delay(50);
       strip.show();
       digitalWrite(solenoidPin, HIGH); //Solenoid permettant d'ouvrir la porte s'e bloque s'ouvre
     }
     //Le nombre d'arbre se stop
     arbre=arbre;
     display.showNumberDec(arbre);
 }

}