Bouillon Cube : Différence entre versions
(→Site Web) |
|||
(11 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{Projet | {{Projet | ||
− | |status= | + | |status=Prototype |
− | |status_pub= | + | |status_pub=Publié |
+ | |image=Bouillons-cubes.png | ||
+ | |description=Bouillon cube, serious game pour sensibiliser sur la déforestation. | ||
|license=CC-by-sa-3.0 - Creative Commons Attribution CC-by-sa-3.0 France | |license=CC-by-sa-3.0 - Creative Commons Attribution CC-by-sa-3.0 France | ||
+ | |contributeurs=Emma Boileau, Audrey Brousse, Alexandre Guyochet, Margot Ryckewaert, | ||
}} | }} | ||
== Concept == | == Concept == | ||
Ligne 12 : | Ligne 15 : | ||
Le jeu se suit avec deux outils: le cube et une page web qui présente les différentes instructions. | 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.<br /> | Le but est de réaliser toutes les activités de la journée, resprésentées sur le cube, le plus vite possible.<br /> | ||
+ | |||
+ | [[Fichier:Bouillons-cubes cube.jpg|vignette]] | ||
=== Etape du jeu === | === Etape du jeu === | ||
Ligne 24 : | Ligne 29 : | ||
6. Prenez note de la conférence.<br /> | 6. Prenez note de la conférence.<br /> | ||
7. Enlever votre blouson de cuir.<br /> | 7. Enlever votre blouson de cuir.<br /> | ||
− | 8. Faire réchauffer votre poulet au | + | 8. Faire réchauffer votre poulet au four.<br /> |
9. Rechargez votre téléphone.<br /> | 9. Rechargez votre téléphone.<br /> | ||
<br /> | <br /> | ||
Ligne 35 : | Ligne 40 : | ||
La page web indique au joueur qu'une trappe va s'ouvrir pour lui afficher son score.<br /> | La page web indique au joueur qu'une trappe va s'ouvrir pour lui afficher son score.<br /> | ||
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.<br /><br /> | 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.<br /><br /> | ||
+ | |||
+ | [[Fichier:Bouillons-cubes Fin.jpg|vignette]] | ||
+ | |||
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.<br /> | 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.<br /> | ||
Ligne 42 : | Ligne 50 : | ||
<br /> | <br /> | ||
+ | |||
+ | |||
+ | ==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. | ||
+ | |||
+ | [[Fichier:Bouillons-cubes planches.jpg|vignette]] | ||
+ | |||
+ | [[Fichier:Bouillons-cubes interieure.jpg|vignette]] | ||
+ | |||
== Site Web == | == Site Web == | ||
<br /> | <br /> | ||
Ligne 48 : | Ligne 69 : | ||
</gallery> | </gallery> | ||
<br /> | <br /> | ||
+ | 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 | ||
+ | #include <TM1637Display.h> | ||
+ | |||
+ | //Importation des librairy pour le ruban a led | ||
+ | #include <neopixel.h> | ||
+ | |||
+ | //Initialisation de l'écran 4x7 segments | ||
+ | #define CLK D1 | ||
+ | #define DIO D2 | ||
+ | |||
+ | TM1637Display display(CLK, DIO); | ||
+ | |||
+ | //Initialisation du ruban de led | ||
+ | #define PIN D6 | ||
+ | #define N_LEDS 9 | ||
+ | |||
+ | Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN); | ||
+ | |||
+ | //Initialisation des Capteurs de fin de courses | ||
+ | #define FinCourse1 D4 | ||
+ | #define FinCourse2 D5 | ||
+ | #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); | ||
+ | } | ||
+ | } |
Version actuelle en date du 13 avril 2018 à 10:48
Bouillon cube, serious game pour sensibiliser sur la déforestation.
Contributeur·ice·s
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
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.
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.
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.
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
- include <TM1637Display.h>
//Importation des librairy pour le ruban a led
- include <neopixel.h>
//Initialisation de l'écran 4x7 segments
- define CLK D1
- define DIO D2
TM1637Display display(CLK, DIO);
//Initialisation du ruban de led
- define PIN D6
- define N_LEDS 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN);
//Initialisation des Capteurs de fin de courses
- define FinCourse1 D4
- define FinCourse2 D5
- 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); }
}