Cub-i
Cub-i, le cubi qui anime vos soirées / cube interactif
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
Sommaire
Cubi
Le cube interactif qui anime vos soirées Cube interactif réalisé dans le cadre d'un workshop d'étudiants de 3 ème année d'interactivité à l'École de Design Nantes Atlantique
Concept
Cub-i est un cube interactif qui propose des mini-jeux via une page web, à chaque partie, un nombre aléatoire de gorgées est en jeux, le gagnant de chaque jeux doit distribuer les gorgées à ses adversaires.
Mode d'emploi
1) Retournez les shooters afin de démarrer les jeux. Au démarrage, au moins une led doit s'allumer.
2) Le nombre de gorgées en jeux est indiquer par les leds ( entre 1 et 9 )
3) Le jeux s'affiche sur l'application
4) -Si c'est le jeu de la bombe :
Le jeux de la bombe consiste à faire passer rapidement la bombe aux adversaires afin qu'elle ne ne soit pas en votre possession à la fin du compte a rebours. Le joueur qui à la bombe (les 9 leds s'allument rose) et doit la passer au joueur de gauche en appuyant sur le bouton bleu ou au joueur de droit en appuyant sur le bouton rouge. A la fin du compte à rebours, le joueur qui possède la bombe doit boire le nombre de gorgées en jeux.
-Si c'est le jeu du quizz :
Le jeux du Quizz consiste à répondre aux questions que propose l'application, les joueurs répondent à la question ( A ou B) via les boutons rouge et bleu. Lorsque tous les joueurs ont répondus à la question, les leds s'affichent vert si la réponse est vrai et rouge si la réponse est fausse. Les personnes qui ont répondus correctement continus le jeu du Quizz jusqu'a ce qu'il reste qu'une seule personne qui pourra distribuer le nombre de gorgées au joueur de son choix.
-Si c'est le jeux joke de papa :
Le joueur désigné par l'application doit raconter une blague, la première personne qui rigole doit boire le nombre de gorgées correspondant à la partie. Si le joueur n'a pas d'inspiration , il peut générer des blagues automatiquement via l'application.
5)Pour éteindre le jeux, il suffit de retourner les shooters ( attention à bien essuyer pour pas qu'il y ait de liquide )
L'application mobile
- MOCK2.png
Description 2
Concevoir le cube
1) Commencez par concevoir la structure du cube ( 20 x 20 cm) , pour cela nous avons utilisé une planche de bois d'épaisseur de 4mm que nous avons découpé à l'aide d'une découpe laser et du logiciel inskape.
Nous avons découpé des trous pour les leds, les boutons ainsi que pour les shooters sur la face du haut. Toujours avec la découpé laser et le logiciel inskape, nous avons gravé les numéros des leds, le nom du jeux, et les joueurs.
2) Après l'obtention de vos 6 faces, assemblez les à l'aide de petite charnière . Ne vissez pas la face du haut pour laissez la possibilité d'ouvrir le cube.
3) Assemblez le montage électrique dans le cube ( voir le montage électrique ci dessous) au endroits prévu. Renforcez les boutons à l'aide de scotch.
4)Ajouter le code sur particule et flashez votre photon
5) Pour plus d'autonomie, ajoutez une batterie externe à l'intérieur du cube afin de jouer partout.
Le schéma de montage
le code particule
le code particule :
// This #include statement was automatically added by the Particle IDE.
- include <neopixel.h>
/* Utiliser des leds RGB adressables
* branchement * leds / Photon * GND --> GND * 5V --> VIN * DI --> D2 (DI pour Data In) * Dans ce programme, les elds peuvent être activées par deux boutons, ou par une interface web * Bouton 1 (sur D0) : couleur au hasard * Bouton 2 (sur D1) : allumer / éteindre */
- define PIXEL_PIN D4
- define PIXEL_COUNT 40
- define PIXEL_TYPE WS2812B
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
// Variables pour le QUIZ
int RepJoueur1 = NULL;
int RepJoueur2 = NULL;
int RepJoueur3 = NULL;
int RepJoueur4 = NULL;
int Vrai1 = D5; int Faux1 = D6;
int Vrai2 = D7; int Faux2 = A0;
int Vrai3 = A3; int Faux3 = A4;
int Vrai4 = A1; int Faux4 = A2;
int bonnereponse;
// variables pour la BOMBE
int timernumber; int timer; int JoueurAvecBombe = 0;
///// Variable pour l'initiation du jeu////////
boolean allshooter; boolean jeuselectionner; boolean initgamebool;
int nbshooterglobal;
int QuestionSelect;
int Joueur1; int Joueur2; int Joueur3; int Joueur4;
int JeuActif = 0;
void setup() {
// Défnition des entrées du photon pour les micro rupteurs Joueur1 = D0; Joueur2 = D1; Joueur3 = D3; Joueur4 = D2; pinMode(Joueur1, INPUT); pinMode(Joueur2, INPUT); pinMode(Joueur3, INPUT); pinMode(Joueur4, INPUT); pinMode(Vrai1, INPUT); pinMode(Faux1, INPUT); pinMode(Vrai2, INPUT); pinMode(Faux2, INPUT); pinMode(Vrai3, INPUT); pinMode(Faux3, INPUT); pinMode(Vrai4, INPUT); pinMode(Faux4, INPUT); /*Particle.function("LaunchGame", LaunchGameFunction);*/ Particle.function("GameActive", GameActive);
allshooter = false; jeuselectionner = false; initgamebool = false; strip.begin(); strip.show();
// On set le Random Seed sur l'entrée analogique A5 pour avoir un "vrai" random. C'e
randomSeed(analogRead(A5)); timer = false;
}
void loop() {
// Si tous les microrupteurs sont activés, alors on change le booléen allshooter
if(digitalRead(Joueur1) == LOW && digitalRead(Joueur2) == LOW && digitalRead(Joueur3) == LOW && digitalRead(Joueur4) == LOW){ allshooter = true; // Quiz if(digitalRead(Vrai1) == 1){ RepJoueur1 = 1; //Particle.publish("Vrai1"); delay(300); }else if(digitalRead(Faux1) == 1){ //Particle.publish("Faux1"); RepJoueur1 = 2; delay(300); } if(digitalRead(Vrai2) == 1){ //Particle.publish("Vrai2"); RepJoueur2 = 1; delay(300); }else if(digitalRead(Faux2) == 1){ //Particle.publish("Faux2"); RepJoueur2 = 2; delay(300); } if(digitalRead(Vrai3) == 1){ //Particle.publish("Vrai3"); RepJoueur3 = 1; delay(300); }else if(digitalRead(Faux3) == 1){ //Particle.publish("Faux3"); RepJoueur3 = 2; delay(300); } if(digitalRead(Vrai4) == 1){ //Particle.publish("Vrai4"); RepJoueur4 = 1; delay(300); }else if(digitalRead(Faux4) == 1){ //Particle.publish("Faux4"); RepJoueur4 = 2; delay(300); } // Si tous les joueurs ont répondu alors on lance la fonction ReponseJoueur(); if(JeuActif == 4 && RepJoueur1 != NULL && RepJoueur2 != NULL && RepJoueur3 != NULL && RepJoueur4 != NULL ){ ReponseJoueur(); } ////// Jeu de la Bombe - Passer la bombe entre chque joueur. if(timer == true){ if(JoueurAvecBombe == 1){ if(RepJoueur1 == 1){ JoueurAvecBombe = 4; delay(300); } if(RepJoueur1 == 2){ JoueurAvecBombe = 2; delay(300); } }else if(JoueurAvecBombe == 2){ if(RepJoueur2 == 1){ JoueurAvecBombe = 1; delay(300); } if(RepJoueur2 == 2){ JoueurAvecBombe = 3; delay(300); } }else if(JoueurAvecBombe == 3){ if(RepJoueur3 == 1){ JoueurAvecBombe = 2; delay(300); } if(RepJoueur3 == 2){ JoueurAvecBombe = 4; delay(300); } }else if(JoueurAvecBombe == 4){ if(RepJoueur4 == 1){ JoueurAvecBombe = 3; delay(300); } if(RepJoueur4 == 2){ JoueurAvecBombe = 1; delay(300); } } clignottement(); timernumber--; ResetRepJoueur(); if(timernumber == 0){ ExplosionBombe(); timer = false; JoueurAvecBombe = 0; ResetRepJoueur(); } delay(1000); } }else{ allshooter = false; }
}
/* int LaunchGameFunction(String command){
if(command.equalsIgnoreCase("go")){ if(allshooter == false){ Particle.publish("En attente de tout les shooters"); return -1; }else{ //Qinitgame(); return 1; } }
}*/
// Choix du jeu int GameActive(String command){
if (allshooter == true && jeuselectionner == false && initgamebool == true){ // ici on utilise le command.equalsIgnoreCase et le return pour envoyer une info à notre page Html. if(command.equalsIgnoreCase("Jeu?")){ if(JeuActif == 1){ LaBombe(); jeuselectionner = true; return 11; }else if(JeuActif == 2){ jeuselectionner = true; return 12; }else if(JeuActif == 3){ jeuselectionner = true; return 13; }else if(JeuActif == 4){ ChooseQuestion(); jeuselectionner = true; return 14; }else if(JeuActif == 5){ ChooseQuestion(); jeuselectionner = true; return 15; } } }else if(allshooter == true && jeuselectionner == true && initgamebool == true){ if(JeuActif == 4){ if(QuestionSelect == 1){ return 141; } if(QuestionSelect == 2){ return 142; } if(QuestionSelect == 3){ return 143; } if(QuestionSelect == 4){ return 144; } if(QuestionSelect == 5){ return 145; } if(QuestionSelect == 6){ return 146; } } }else if(allshooter == true && jeuselectionner == false && initgamebool == false){ initgame(); initgamebool = true; // Si un shooter est enlevé, on arrete le jeu }else if(allshooter == false && jeuselectionner == true && initgamebool == true){ Particle.publish("Stop Game"); jeuselectionner = false; initgamebool = false; AllGameStop(); return 20; // Si il manque un ou plusieurs shooters on etein les leds. }else if(allshooter == false && jeuselectionner == false && initgamebool == false){ Particle.publish("En attente des shooter"); for(int i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } strip.show(); }
}
// intitialisation du jeu avec un random des jeux void initgame() {
int JeuChoisi = random(5)+1; while(JeuChoisi == JeuActif){ JeuChoisi = random(5)+1; } startgame(JeuChoisi); NbShooter(); Particle.publish("Jeu", String(JeuActif)); }
void AllGameStop(){
BombeStop();
}
// définition des jeux
void startgame(int JeuChoisi) {
if(JeuChoisi == 1){ JeuActif = 1; }else if(JeuChoisi == 2){ JeuActif = 2; }else if(JeuChoisi == 3){ JeuActif = 3; }else if(JeuChoisi == 4){ JeuActif = 4; }else if(JeuChoisi == 5){ JeuActif = 5; }
}
// Fonctions liées a l'allumage des leds
void NbShooter(){
for(int i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } ChooseJoueur(); delay(1000);
}
// Le ChooseJoueur() se réfere aux faces du cube, nous n'utilisons qu'une entrée digitale pour les 40 leds.
void ChooseJoueur(){
// le nombre de shooters a boire int nbshooter = random(1,10); nbshooterglobal = nbshooter;
for(int i = 0; i <= nbshooter; i++){ SendShooter1(i);
SendShooter2(i); SendShooter3(i); SendShooter4(i); //le strip est la fonction qui allume les leds Strip(); delay(250); }
}
// On allume les leds correspondant au nbshooter compris entre 0 et le nombre de shooter final void SendShooter1(int nbshooter) {
int nbshooterfinal = nbshooter; for(int i=0; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); }
}
// On allume les leds correspondant au nbshooter en commencant a la led 10 + le nombre de shooter final
void SendShooter2(int nbshooter) {
int nbshooterfinal = 10 + nbshooter; for(int i=10; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); }
}
// On allume les leds correspondant au nbshooter en commencant a la led 20 + le nombre de shooter final
void SendShooter3(int nbshooter) {
int nbshooterfinal = 20 + nbshooter; for(int i=20; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); }
}
// On allume les leds correspondant au nbshooter en commencant a la led 30 + le nombre de shooter final
void SendShooter4(int nbshooter) {
int nbshooterfinal = 30 + nbshooter; for(int i=30; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); }
}
void Strip(){
strip.show();
}
// Choix de la question du QUIZ
void ChooseQuestion(){
int question = random(1,6); if(question == 1){ QuestionSelect = 1; bonnereponse = 1; } if(question == 2){ QuestionSelect = 2; bonnereponse = 1; } if(question == 3){ QuestionSelect = 3; bonnereponse = 2; } if(question == 4){ QuestionSelect = 4; bonnereponse = 2; } if(question == 5){ QuestionSelect = 5; bonnereponse = 2; } if(question == 6){ QuestionSelect = 6; bonnereponse = 1; }
}
// Quiz : Si la reponse du joueur est bonne alors les leds s'alluent en Vert, sinon elles s'allument en Rouge
void ReponseJoueur(){
for(int i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } if(RepJoueur1 == bonnereponse){ int nbshooterfinal = nbshooterglobal; for(int i=0; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(0, 255, 0)); strip.setBrightness(25); } }else{ int nbshooterfinal = nbshooterglobal; for(int i=0; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); } } if(RepJoueur2 == bonnereponse){ int nbshooterfinal = 10 + nbshooterglobal; for(int i=10; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(0, 255, 0)); strip.setBrightness(25); } }else{ int nbshooterfinal = 10 + nbshooterglobal; for(int i=10; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); } } if(RepJoueur3 == bonnereponse){ int nbshooterfinal = 20 + nbshooterglobal; for(int i=20; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(0, 255, 0)); strip.setBrightness(25); } }else{ int nbshooterfinal = 20 + nbshooterglobal; for(int i=20; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); } } if(RepJoueur4 == bonnereponse){ int nbshooterfinal = 30 + nbshooterglobal; for(int i=30; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(0, 255, 0)); strip.setBrightness(25); } }else{ int nbshooterfinal = 30 + nbshooterglobal; for(int i=30; i<nbshooterfinal; i++){ strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.setBrightness(25); } } ResetRepJoueur(); Strip();
}
void ResetRepJoueur(){
RepJoueur1 = NULL; RepJoueur2 = NULL; RepJoueur3 = NULL; RepJoueur4 = NULL; }
//Parametres du jeu Bombe, le timer et le joueur qui commence avec la bombe.
void LaBombe (){
timernumber = 20; timer = true; JoueurAvecBombe = /*random(1, 4)*/2;
}
// Cligontement des leds pour le joueur qui a la bombe.
void clignottement(){
if(JoueurAvecBombe == 1){ for(int i=0; i<10; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); delay(100); for(int i=0; i<10; i++){ strip.setPixelColor(i, strip.Color(255, 255, 255)); strip.setBrightness(25); } Strip(); delay(100); for(int i=0; i<10; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); } if(JoueurAvecBombe == 2){ for(int i=10; i<20; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); delay(100); for(int i=10; i<20; i++){ strip.setPixelColor(i, strip.Color(255, 255, 255)); strip.setBrightness(25); } Strip(); delay(100); for(int i=10; i<20; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); } if(JoueurAvecBombe == 3){ for(int i=20; i<30; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); delay(100); for(int i=20; i<30; i++){ strip.setPixelColor(i, strip.Color(255, 255, 255)); strip.setBrightness(25); } Strip(); delay(100); for(int i=20; i<30; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); } if(JoueurAvecBombe == 4){ for(int i=30; i<40; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); delay(100); for(int i=30; i<40; i++){ strip.setPixelColor(i, strip.Color(255, 255, 255)); strip.setBrightness(25); } Strip(); delay(100); for(int i=30; i<40; i++){ strip.setPixelColor(i, strip.Color(0, 0, 0)); strip.setBrightness(25); } Strip(); }
}
void ExplosionBombe(){
if(JoueurAvecBombe == 1){ for(int i=0; i<10; i++){ strip.setPixelColor(i, strip.Color(random(255), random(255), random(255))); strip.setBrightness(25); } Strip(); } if(JoueurAvecBombe == 2){ for(int i=10; i<20; i++){ strip.setPixelColor(i, strip.Color(random(255), random(255), random(255))); strip.setBrightness(25); } Strip(); } if(JoueurAvecBombe == 3){ for(int i=20; i<30; i++){ strip.setPixelColor(i, strip.Color(random(255), random(255), random(255))); strip.setBrightness(25); } Strip(); } if(JoueurAvecBombe == 4){ for(int i=30; i<40; i++){ strip.setPixelColor(i, strip.Color(random(255), random(255), random(255))); strip.setBrightness(25); } Strip(); }
}
void BombeStop(){
timer = false; JoueurAvecBombe = 0; ResetRepJoueur();
}