ENIB 2024 : Bass Hero : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Code Arduino)
(Code Arduino)
Ligne 38 : Ligne 38 :
 
===Code Arduino===
 
===Code Arduino===
 
<syntaxhighlight lang="Arduino" line>  
 
<syntaxhighlight lang="Arduino" line>  
#include <Adafruit_GFX.h>
 
#include <Adafruit_NeoMatrix.h>
 
#include <Adafruit_NeoPixel.h>
 
  
#define NOTE_B0  31
+
//Code à mettre
#define NOTE_C1  33
 
#define NOTE_CS1 35
 
#define NOTE_D1  37
 
#define NOTE_DS1 39
 
#define NOTE_E1  41
 
#define NOTE_F1  44
 
#define NOTE_FS1 46
 
#define NOTE_G1  49
 
#define NOTE_GS1 52
 
#define NOTE_A1  55
 
#define NOTE_AS1 58
 
#define NOTE_B1  62
 
#define NOTE_C2  65
 
#define NOTE_CS2 69
 
#define NOTE_D2  73
 
#define NOTE_DS2 78
 
#define NOTE_E2  82
 
#define NOTE_F2  87
 
#define NOTE_FS2 93
 
#define NOTE_G2  98
 
#define NOTE_GS2 104
 
#define NOTE_A2  110
 
#define NOTE_AS2 117
 
#define NOTE_B2  123
 
#define NOTE_C3  131
 
#define NOTE_CS3 139
 
#define NOTE_D3  147
 
#define NOTE_DS3 156
 
#define NOTE_E3  165
 
#define NOTE_F3  175
 
#define NOTE_FS3 185
 
#define NOTE_G3  196
 
#define NOTE_GS3 208
 
#define NOTE_A3  220
 
#define NOTE_AS3 233
 
#define NOTE_B3  247
 
#define NOTE_C4  262
 
#define NOTE_CS4 277
 
#define NOTE_D4  294
 
#define NOTE_DS4 311
 
#define NOTE_E4  330
 
#define NOTE_F4  349
 
#define NOTE_FS4 370
 
#define NOTE_G4  392
 
#define NOTE_GS4 415
 
#define NOTE_A4  440
 
#define NOTE_AS4 466
 
#define NOTE_B4  494
 
#define NOTE_C5  523
 
#define NOTE_CS5 554
 
#define NOTE_D5  587
 
#define NOTE_DS5 622
 
#define NOTE_E5  659
 
#define NOTE_F5  698
 
#define NOTE_FS5 740
 
#define NOTE_G5  784
 
#define NOTE_GS5 831
 
#define NOTE_A5  880
 
#define NOTE_AS5 932
 
#define NOTE_B5  988
 
#define NOTE_C6  1047
 
#define NOTE_CS6 1109
 
#define NOTE_D6  1175
 
#define NOTE_DS6 1245
 
#define NOTE_E6  1319
 
#define NOTE_F6  1397
 
#define NOTE_FS6 1480
 
#define NOTE_G6  1568
 
#define NOTE_GS6 1661
 
#define NOTE_A6  1760
 
#define NOTE_AS6 1865
 
#define NOTE_B6  1976
 
#define NOTE_C7  2093
 
#define NOTE_CS7 2217
 
#define NOTE_D7  2349
 
#define NOTE_DS7 2489
 
#define NOTE_E7  2637
 
#define NOTE_F7  2794
 
#define NOTE_FS7 2960
 
#define NOTE_G7  3136
 
#define NOTE_GS7 3322
 
#define NOTE_A7  3520
 
#define NOTE_AS7 3729
 
#define NOTE_B7  3951
 
#define NOTE_C8  4186
 
#define NOTE_CS8 4435
 
#define NOTE_D8  4699
 
#define NOTE_DS8 4978
 
#define REST      0
 
 
 
#define PIN 8
 
#define BTN_X 2
 
#define BTN_Y 3
 
#define BTN_Z 4
 
#define BTN_W 5
 
#ifndef PSTR
 
#define PSTR // Make Arduino Due happy
 
#endif
 
 
 
// change this to whichever pin you want to use
 
int buzzer = 11;
 
 
 
int music[] = {1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,
 
              0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,
 
              0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,
 
              0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,2,3,1,1,0,2,1,3,1,0,3,0,0,2,3,1,1,};
 
int tempo = 100;
 
//int wholenote = (60000 * 4) / tempo;
 
 
 
// notes of the moledy followed by the duration.
 
// a 4 means a quarter note, 8 an eighteenth , 16 sixteenth, so on
 
// !!negative numbers are used to represent dotted notes,
 
// so -4 means a dotted quarter note, that is, a quarter plus an eighteenth!!
 
/*int melody[] = {
 
 
 
  // Nokia Ringtone
 
  // Score available at https://musescore.com/user/29944637/scores/5266155
 
 
 
  NOTE_E5, 8, NOTE_D5, 8, NOTE_FS4, 4, NOTE_GS4, 4,
 
  NOTE_CS5, 8, NOTE_B4, 8, NOTE_D4, 4, NOTE_E4, 4,
 
  NOTE_B4, 8, NOTE_A4, 8, NOTE_CS4, 4, NOTE_E4, 4,
 
  NOTE_A4, 2,
 
};*/
 
int melody[] = {
 
 
 
  // Song of storms - The Legend of Zelda Ocarina of Time.
 
  // Score available at https://musescore.com/user/4957541/scores/1545401
 
 
 
  NOTE_D4,4, NOTE_A4,4, NOTE_A4,4,
 
  REST,8, NOTE_E4,8, NOTE_B4,2,
 
  NOTE_F4,4, NOTE_C5,4, NOTE_C5,4,
 
  REST,8, NOTE_E4,8, NOTE_B4,2,
 
  NOTE_D4,4, NOTE_A4,4, NOTE_A4,4,
 
  REST,8, NOTE_E4,8, NOTE_B4,2,
 
  NOTE_F4,4, NOTE_C5,4, NOTE_C5,4,
 
  REST,8, NOTE_E4,8, NOTE_B4,2,
 
  NOTE_D4,8, NOTE_F4,8, NOTE_D5,2,
 
 
 
  NOTE_D4,8, NOTE_F4,8, NOTE_D5,2,
 
  NOTE_E5,-4, NOTE_F5,8, NOTE_E5,8, NOTE_E5,8,
 
  NOTE_E5,8, NOTE_C5,8, NOTE_A4,2,
 
  NOTE_A4,4, NOTE_D4,4, NOTE_F4,8, NOTE_G4,8,
 
  NOTE_A4,-2,
 
  NOTE_A4,4, NOTE_D4,4, NOTE_F4,8, NOTE_G4,8,
 
  NOTE_E4,-2,
 
  NOTE_D4,8, NOTE_F4,8, NOTE_D5,2,
 
  NOTE_D4,8, NOTE_F4,8, NOTE_D5,2,
 
 
 
  NOTE_E5,-4, NOTE_F5,8, NOTE_E5,8, NOTE_E5,8,
 
  NOTE_E5,8, NOTE_C5,8, NOTE_A4,2,
 
  NOTE_A4,4, NOTE_D4,4, NOTE_F4,8, NOTE_G4,8,
 
  NOTE_A4,2, NOTE_A4,4,
 
  NOTE_D4,1,
 
};
 
 
 
// sizeof gives the number of bytes, each int value is composed of two bytes (16 bits)
 
// there are two values per note (pitch and duration), so for each note there are four bytes
 
int notes = sizeof(melody) / sizeof(melody[0]) / 2;
 
 
 
// this calculates the duration of a whole note in ms
 
int wholenote = (60000 * 4) / tempo;
 
 
 
int divider = 0, noteDuration = 0;
 
 
 
 
 
 
 
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
 
                            NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
 
                            NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
 
                            NEO_GRB  + NEO_KHZ800);
 
                           
 
const uint16_t colors[] = { matrix.Color(255, 184, 28), matrix.Color(0, 219, 73), matrix.Color(255, 41, 60), matrix.Color(24, 12, 255), matrix.Color(50, 50, 50) };
 
 
 
int score = 0;
 
int pass = 0;
 
int iterator = 0;
 
int currentState = LOW;
 
 
 
void setup() {
 
  // put your setup code here, to run once:
 
  matrix.begin();
 
  matrix.setTextWrap(false);
 
  matrix.setBrightness(40);
 
  matrix.setTextColor(colors[0]);
 
 
 
  pinMode(BTN_X, INPUT_PULLUP);
 
  pinMode(BTN_Y, INPUT_PULLUP);
 
  pinMode(BTN_Z, INPUT_PULLUP);
 
  pinMode(BTN_W, INPUT_PULLUP);
 
}
 
 
 
bool play_note(int offset, int color, int thisNote) {
 
  bool note_played = false;
 
  int x=matrix.width();
 
  int t_start=millis();
 
  int t_loop=millis();
 
 
 
  divider = melody[thisNote + 1];
 
  if (divider > 0) {
 
    // regular note, just proceed
 
    noteDuration = (wholenote) / divider;
 
  } else if (divider < 0) {
 
    // dotted notes are represented with negative durations!!
 
    noteDuration = (wholenote) / abs(divider);
 
    noteDuration *= 1.5; // increases the duration in half for dotted notes
 
  }
 
 
 
  while (x>1) {
 
    x=x-1;
 
    matrix.begin();
 
    matrix.drawLine(x, 1+offset, x-1, 1+offset, colors[color]);
 
    matrix.drawLine(x, 2+offset, x-1, 2+offset, colors[color]);
 
    matrix.drawLine(x+1, 1+offset, x+1, 2+offset, matrix.Color(0, 0, 0));
 
    matrix.show();
 
    while (1) {
 
      t_loop=millis();
 
 
 
      if (x<10) {
 
        /* IMPLEMENT BUTTON CHECK */
 
        /* PLAY NOTE SOUND HERE ? */
 
 
 
        currentState=HIGH;
 
        if (color==0) {currentState = digitalRead(BTN_X);}
 
        else if (color==1) {currentState = digitalRead(BTN_Y);}
 
        else if (color==2) {currentState = digitalRead(BTN_Z);}
 
        else if (color==3) {currentState = digitalRead(BTN_W);}
 
       
 
        if (currentState!=HIGH) {
 
          note_played=true;
 
        }
 
        if (note_played==true) {
 
          tone(buzzer, melody[thisNote], noteDuration * 0.9);
 
        }
 
       
 
      }
 
     
 
      if (t_loop>t_start+15) {
 
        t_start=millis();
 
        noTone(buzzer);
 
        break;
 
      }
 
    }
 
  }
 
  return note_played;
 
}
 
 
 
void loop() {
 
  if (play_note(4*music[iterator], music[iterator], iterator*2)==true) {score+=1;}
 
  else {/* DO SOMETHING IF MISSED NOTE */}
 
 
 
  ++iterator; if (iterator>(int)(sizeof(melody)/2)) {iterator=0;}
 
 
 
  //delay(100);
 
}
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>

Version du 31 janvier 2024 à 16:01

Titre de la fiche expérience :

Description (résumé)

Notre équipe a décidé pour se Hackathon de créer un jeu de rythme inspiré de la série de jeux vidéos "Guitar Hero" qui consiste à appuyer sur des boutons en fonction du rythme de la musique et des indications à l'écran. Nous l'avons nommé "Bass Hero"

BassHero.png

Pour ce faire des carrés lumineux descendront sur un écran LED 16x16 et indiqueront au joueur à quels moments appuyer sur les boutons correspondant

Introduction

Nous sommes 5 à participer à ce projet:

Yassine, Olivier, Antoine, Yann, Rodrigue

Yassine.jpg Olivier Riviere.jpg Antoine Vermander.PNG Yann Tissier.jpg Rodrigue Lemaire.jpg

Le projet que nous avons choisis n'avait pas de thème précis donc nous avons pu laisser libre cours à notre imagination, et nous avons donc eu l'idée de faire un jeu de rythme simple pour pouvoir utiliser complétement la grille de LED 16x16 qui nous a été donné

Outil et matériel

- Carte Arduino Nano

- 4 Boutons

- Buzzer Piézo-électrique

- Câbles

- BreadBoard

- Écran LCD

- Écran LED 16x16

- Boite en carton

Fichiers joint

Code Arduino

1  
2 
3 //Code à mettre

Étapes de fabrication

Voici les différentes étapes que nous avons utilisé pour arriver au projet final:

Circuit Bass Hero.png

Étape 1

Pour commencer on a fabriqué un prototype de la boite en partant d'un carton vide, qui contiendra les circuits internes pour avoir une idée de à quoi ressemblera le projet final:

Carton vide Bass Hero.jpg Prototype 1 Bass Hero.jpg

Étape 2

Début de la création du code (connexions à la carte, affichage des lumières):

Codage du debut Bass Hero.jpg

Étape 3

Préparation des circuits électroniques:

Electronique Bass Hero.jpg Connexions Electronique Bass Hero.jpg

Étape 4

Préparation de la boite du produit final:

Préparation boite final Bass Hero.jpg

Étape 5

Finalisation du code et préparation des interactions avec le joueur:

Finialisation Bass Hero.gif

Étape 6

Installation des composants:

Installation Bass Hero.jpg

Étape 7

Projet Terminé:

Fin de projet Bass Hero.jpg

Difficultés rencontrés

Le plus gros problème qui nous a été posé été la presque impossibilité de se connecter à la carte ESP32 et à la carte Arduino qui avait été utilisé pour replacer la carte ESP32 à cause de ce problème. Cette difficulté est celle qui nous a fait perdre la grande majorité de notre temps et qui a dû être compenser par la programmation du jeu en dehors des heures allouées. Nous n'avons pas vraiment réglé ce souci mais nous avons dû faire avec.

Nous n'avons pas pu utiliser la boite du prototype car nous n'avons pas eu le temps de découper les planches de bois bien que les plans soient prêt à être utilisés et des composants été cassés

Nous avons aussi dû abandonner l'idée d'utiliser des haut parleurs pour la musique et le remplacer par un buzzer piézo-électrique de plus l'installation du lecteur LCD n'a pas pu être faites par manque de temps

Projet Complémentaire Bass Hero +

En vue de la possibilité de non réussite du projet Bass Hero, nous avons pu faire en une dizaine de minutes et en nous basant sur les connaissances acquises pendant ce Hackaton, un autre jeu pour pouvoir présenter quelque chose aux enfants.

Ce jeu ce base sur le très célèbre "Dinosaur game" qui apparait quand un utilisateur du navigateur Google n'a pas de connexion.

Bass Hero + ce joue en appuyant sur le bouton central pour pouvoir esquiver les obstacles barrant la route du joueur.

Bass Hero plus.jpg

ne pas modifier sous cette ligne