Gamoover

[move]Vous aimez la série Ricky la belle vie, Julio Iglésias ou l'émission Kohlanta ? Alors soyez les bienvenus sur Gamoover ! [/move]

[idée] pour fabriquer un penny puncher

Démarré par deltaone, Dimanche 26 Février 2006, 10:24:26 AM

jeremiggy

GENIAL! ça fonctionne  ^-
Dans mon cas j'ai 3 switch et 3 fichiers différents mp3 différents.
Le but que le switch 1 déclenche le mp3 track001, le switch 2 déclenche le mp3 track002 et le switch 3 le mp3 track003. Est-ce possible?

usagi

Cool :)
Oui c'est jouable par contre, comment ça se passe si :

  • Le morceau 1 est déjà entrain de jouer et le bouton est appuyé à nouveau ? Ça relance le morceau au début ou il continue ou il sera joué une fois que celui en cours sera terminé ?
  • Il y a une priorité sur les switch ? Genre si le 1 et 3 sont déclenchés en même temps, quel son sera joué ?
Arcade: Astro City
Flipper : Space Jam

jeremiggy

Pour la première question, je préfère que le son entrain de jouer continu (et que le son ne soit pas joué une fois que celui en cours se termine).
Pour la deuxième question aucune priorité je dirais que le premier switch activé doit être celui qui joue le morceau même si entre temps un appui est fait sur un autre switch.

usagi

Okay, tu me diras si ça marche.
Joli réalisation au fait  ^-^


#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;


const int btnPin=12;

#define NUMBERSWITCH 3 // Nombre de switch
//            Switch   1   2   3
const int[] btnPins= [11, 12, 13]; // pin correspondant a chaque switch
const int[] tracks = [ 1,  2,  3]; // morceau à lire pour chaque switch

int buttonState = 0;

void setup() {
  Serial.begin(9600);
  //start the shield
  sd.begin(SD_SEL, SPI_HALF_SPEED);
  MP3player.begin();

  for(int i=0; i<NUMBERSWITCH; i++){
    pinMode(btnPins[i], INPUT);
  }
}

//do something else now
void loop() {
  int tracktoplay = 0;

  //detecte le bouton actif
  for(int i = 0; i< NUMBERSWITCH; i++){
    int state = digitalRead(btnPins[i]);
    if(state == HIGH){ // le bouton numéro i est appuyé ?
      tracktoplay = tracks[i]; // on va jouer le morceau correspondant
      break; // on a trouvé le morceau à jouer
    }
  } 

  if(tracktoplay != 0){ //Est-ce qu'il y a un morceau à jouer ?
    if (! MP3player.isPlaying()) //Est ce que l'on joue déjà le morceau ?
      MP3player. playTrack(tracktoplay); // si non, on lance la musique
  }
}
Arcade: Astro City
Flipper : Space Jam

jeremiggy

Salut et merci pour ton aide.
Je n'arrive pas a envoyer le code vers l'arduino, il relève des erreurs:


usagi

Pas bien réveillé ce matin :) C'est normal, je n'ai pas écrit du C  ::)


#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;


const int btnPin=12;

#define NUMBERSWITCH 3 // Nombre de switch
//            Switch   1   2   3
const int btnPins[]= {11, 12, 13}; // pin correspondant a chaque switch
const int tracks[] = { 1,  2,  3}; // morceau à lire pour chaque switch

int buttonState = 0;

void setup() {
  Serial.begin(9600);
  //start the shield
  sd.begin(SD_SEL, SPI_HALF_SPEED);
  MP3player.begin();

  for(int i=0; i<NUMBERSWITCH; i++){
    pinMode(btnPins[i], INPUT);
  }
}

//do something else now
void loop() {
  int tracktoplay = 0;

  //detecte le bouton actif
  for(int i = 0; i< NUMBERSWITCH; i++){
    int state = digitalRead(btnPins[i]);
    if(state == HIGH){ // le bouton numéro i est appuyé ?
      tracktoplay = tracks[i]; // on va jouer le morceau correspondant
      break; // on a trouvé le morceau à jouer
    }
  } 

  if(tracktoplay != 0){ //Est-ce qu'il y a un morceau à jouer ?
    if (! MP3player.isPlaying()) //Est ce que l'on joue déjà le morceau ?
      MP3player. playTrack(tracktoplay); // si non, on lance la musique
  }
}
Arcade: Astro City
Flipper : Space Jam

jeremiggy

Je viens d'eesayer cela ne semble pas fonctionner. Faut-il nommer les fichiers d'une façon particulière?

jeremiggy

#487
Correction ça fonctionne parfaitement bien!
Merci.

Moi parallèlement à ton code j'avais fais ça
void loop() {
 
 int b = 1;
 int d = 1;
 int f = 1;
 int a = digitalRead(18); // lit la valeur de la broche 18
 int c = digitalRead(19); // lit la valeur de la broche 19
 int e = digitalRead(20);

 if(a==b) // test si la valeur de a est égale à 1 (soit est ce que le bouton 1 est enfoncé ?)
 {digitalWrite(gyro1,LOW); // si oui alors on alimente la broche 18 => gyro1 allumée
 }else
 digitalWrite(gyro1, HIGH); // si non alors on n'alimente pas la broche 18 => gyro1 éteint
 
 if(c==d) // test si la valeur de c est égale à 1 (soit est ce que le bouton 2 est enfoncé ?)
 {digitalWrite(gyro2,LOW); // si oui alors on alimente la broche 19 => gyro2 allumée
 }else
 digitalWrite(gyro2, HIGH); // si oui alors on n'alimente pas la broche 19 => gyro2 éteint
 
 if(e==f)
 {digitalWrite(gyro3,LOW);
 }else
 digitalWrite(gyro3,HIGH);
 

}


Cela allumait les gyrophares au dessus des entrées de pièces. (ce que l'on voit sur une des images postés page 30.
Est-il possible d'associer les deux?

jeremiggy

J'ai trouvé comment rajouter les gyrophares, je ne sais pas si c'est "propre" mais ça marche.
Voici le code:
#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;


const int btnPin=12;

#define NUMBERSWITCH 3 // Nombre de switch
//            Switch   1   2   3
const int btnPins[]= {18, 19, 20}; // pin correspondant a chaque switch
const int tracks[] = { 1,  2,  3}; // morceau à lire pour chaque switch
const int gyro[] = {26, 24, 22};

int buttonState = 0;

void setup() {
  Serial.begin(9600);
  //start the shield
  sd.begin(SD_SEL, SPI_HALF_SPEED);
  MP3player.begin();

  for(int i=0; i<NUMBERSWITCH; i++){
    pinMode(btnPins[i], INPUT);
  }
}

//do something else now
void loop() {
  int tracktoplay = 0;

  //detecte le bouton actif
  for(int i = 0; i< NUMBERSWITCH; i++){
    int state = digitalRead(btnPins[i]);
    if(state == LOW){ // le bouton numéro i est appuyé ?
    digitalWrite (gyro[i], HIGH);
      tracktoplay = tracks[i]; // on va jouer le morceau correspondant
      break; // on a trouvé le morceau à jouer
    }else
  digitalWrite(gyro[i], LOW); // si non alors on n'alimente pas la broche 18 => gyro1 éteint
  } 

  if(tracktoplay != 0){ //Est-ce qu'il y a un morceau à jouer ?
    if (! MP3player.isPlaying()) //Est ce que l'on joue déjà le morceau ?
      MP3player. playTrack(tracktoplay); // si non, on lance la musique
  }
}


La question que je me pose maintenant, est-il possible de lancer une piste dès le début du programme, une musique de fond, admettons qu'elle se nomme "musiquedefond.mp3" qui jouera sans arrêter (même lorsque d'autres sons sont déclenché comme lorsque l'on appui sur les switchs)?

usagi

Super pour la gestion des gyros. C'est tout à fait ça. ^-
Par contre, tu ne pourras pas mixer deux mp3 (musique et bruitage). Le décodeur du shield MP3 que tu as ne peux gérer qu'un seul flux à la fois. Du coup ça me semble impossible. Il faudrait lire les deux flux MP3 sur l'arduino et faire le mix à la main et ensuite revoyer ce nouveau flux vers le shield. Vu la capacité de calcul de l'arduino ça risque d'être très limite. Et surtout ça risque d'être "touffu" comme programme.  :(
Arcade: Astro City
Flipper : Space Jam

jeremiggy

Merci pour ta réponse.
Pour la musique de fond je vais alors chercher une autre alternative et la faisant jouer indépendamment de l'arduino par un simple lecteur mp3.
Dès que possible je poste un max d'éléments pour la parti la plus hard du projet, le jeu bonus!

Noelfhim

Hello,

Je vois que tu es en de bonnes mains.

Quelques précisions :
- certains lecteurs MP3 gèrent plusieurs flux, ça dépend du lecteur. Après, rien n'interdit d'en avoir plusieurs ou d'avoir un lecteur indépendant
- si tu veux une action à l'allumage, ça se site dans setup()
- je mets en générale un sleep() pas long en fin de loop(), ça évite de faire ramer l'arduino, ça évite aussi d'envoyer 2 fois de suite la commande de lecture si le bouton reste appuyé un petit peu trop longtemps et qu'il est considéré appuyé pendant 2 appels de la fonction loop()
- si tu veux que tes lampes restent allumées un certain temps on peut mettre un compteur dont on diminue la valeur à chaque tour (actionner le switch fixe à une valeur et arrivé à 0 on éteint)

Sinon, comme la fonction loop est exécutée sans arrêt (en boucle), j'ai du mal à voir comment on peut avoir le voyant assez lontemps.

Régis.

jeremiggy

Salut Noelfhim,

Sur le troisième point, quand tu parle des lampes tu parle des gyrophares? En fait il faut que je fasse une video mais le comportement qu'ils ont avec le dernier code va bien, le clignotement est très bref mais ça se voit bien.

Concernant la lecture de la musique de fond, petit point que je n'ai pas précisé jusqu'à maintenant dans la machine j'ai deux arduino! Le mega qui gère 90% de la machine (effet lumineux, sonore, jeu bonus...) et un arduino uno qui gère seulement un petit écran alphanumérique sur lequel défile les règles du jeu bonus.
Je pense donc racheter (même si ça m'embête de claquer encore 30 euros la dedans mais au point ou j'en suis!) un shield MP3 pour le mettre sur l'arduino uno et lui faire gérer à lui de façon indépendante la musique de fond.


jeremiggy

Salut Gg45,

Ca c'est juste le lecteur de carte SD.

Gg45

Non c'est un module complet...

Traduction automatique :

DFPlayer Mini est un module MP3 compact et peu coûteux peut être connecté directement à des haut parleurs. Module de puissance de la batterie , haut-parleur , clavier peut être utilisé seul , ou à travers le contrôle du port série , comme l'ONU ou tout microcontrôleur Arduino avec un module de port série . Le module lui-même parfaitement intégrée de matériel de décodage MP3 , WAV, WMA de . Alors que le logiciel prend en charge pilote de carte TF pour soutenir FAT16 , système de fichiers FAT32 . Peut être fait par les commandes de série simples spécifiée lecteur de musique , ainsi que la façon de jouer de la musique et d'autres fonctions , sans l' exploitation sous-jacent encombrant, facile à utiliser ,