Projet Module mp3ShieldPlayer sparkfun

Bonjour à tous,

Je suis étudiant et je dois réaliser un projet avec une arduino uno et un module mp3Shield de chez Sparkfun. Le but est à chaque appui sur l'un des 5 boutons un son est émis. J'avance à l'aide du programme fourni dans ce lien MP3 Player Shield Hookup Guide V15 - SparkFun Learn mais je comprends pas du tout ce que je dois retirer ou ce que je dois ajouter pour le faire fonctionner, je comprends quel pin doit se trouver en sortie et entrée mais l'utilisation concrète pour faire sortir du son m'échappe un peu. Si une âme charitable accepterai de m'aider ça serait top.

Merci de votre attention

Bonjour,

c'est ton premier contact avec l'arduino ?

c'est sur cet exemple (source) que tu as des questions ? :

/*
  MP3 Shield Trigger
  by: Jim Lindblom
      SparkFun Electronics
  date: September 23, 2013

  This is an example MP3 trigger sketch for the SparkFun MP3 Shield.
  Pins 0, 1, 5, 10, A0, A1, A2, A3, and A4 are setup to trigger tracks
  "track001.mp3", "track002.mp3", etc. on an SD card loaded into
  the shield. Whenever any of those pins are shorted to ground,
  their respective track will start playing.

  When a new pin is triggered, any track currently playing will
  stop, and the new one will start.

  A5 is setup to globally STOP playing a track when triggered.

  If you need more triggers, the shield's jumpers on pins 3 and 4 
  (MIDI-IN and GPIO1) can be cut open and used as additional
  trigger pins. Also, because pins 0 and 1 are used as triggers
  Serial is not available for debugging. Disable those as
  triggers if you want to use serial.

  Much of this code was grabbed from the FilePlayer example
  included with the SFEMP3Shield library. Major thanks to Bill
  Porter and Michael Flaga, again, for this amazing library!
*/

#include <SPI.h>           // SPI library
#include <SdFat.h>         // SDFat Library
//#include <SdFatUtil.h>     // SDFat Util Library
#include <SFEMP3Shield.h>  // Mp3 Shield Library

SdFat sd; // Create object to handle SD functions

SFEMP3Shield MP3player; // Create Mp3 library object
// These variables are used in the MP3 initialization to set up
// some stereo options:
const uint8_t volume = 0; // MP3 Player volume 0=max, 255=lowest (off)
const uint16_t monoMode = 1;  // Mono setting 0=off, 3=max

/* Pin setup */
#define TRIGGER_COUNT 9
int triggerPins[TRIGGER_COUNT] = {0, 1, 5, 10, A0, A1, A2, A3, A4};
int stopPin = A5; // This pin triggers a track stop.
int lastTrigger = 0; // This variable keeps track of which tune is playing

void setup()
{
  /* Set up all trigger pins as inputs, with pull-ups activated: */
  for (int i=0; i<TRIGGER_COUNT; i++)
  {
    pinMode(triggerPins[i], INPUT_PULLUP);
  }
  pinMode(stopPin, INPUT_PULLUP);

  initSD();  // Initialize the SD card
  initMP3Player(); // Initialize the MP3 Shield
}

// All the loop does is continuously step through the trigger
//  pins to see if one is pulled low. If it is, it'll stop any
//  currently playing track, and start playing a new one.
void loop()
{
  for (int i=0; i<TRIGGER_COUNT; i++)
  {
    if ((digitalRead(triggerPins[i]) == LOW) && ((i+1) != lastTrigger))
    {
      lastTrigger = i+1; // Update lastTrigger variable to current trigger
      /* If another track is playing, stop it: */
      if (MP3player.isPlaying())
        MP3player.stopTrack();

      /* Use the playTrack function to play a numbered track: */
      uint8_t result = MP3player.playTrack(lastTrigger);
      // An alternative here would be to use the
      //  playMP3(fileName) function, as long as you mapped
      //  the file names to trigger pins.

      if (result == 0)  // playTrack() returns 0 on success
      {
        // Success
      }
      else // Otherwise there's an error, check the code
      {
        // Print error code somehow, someway
      }
    }
  }
  // After looping through and checking trigger pins, check to
  //  see if the stopPin (A5) is triggered.
  if (digitalRead(stopPin) == LOW)
  {
    lastTrigger = 0; // Reset lastTrigger
    // If another track is playing, stop it.
    if (MP3player.isPlaying())
      MP3player.stopTrack();
  }
}

// initSD() initializes the SD card and checks for an error.
void initSD()
{
  //Initialize the SdCard.
  if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) 
    sd.initErrorHalt();
  if(!sd.chdir("/")) 
    sd.errorHalt("sd.chdir");
}

// initMP3Player() sets up all of the initialization for the
// MP3 Player Shield. It runs the begin() function, checks
// for errors, applies a patch if found, and sets the volume/
// stero mode.
void initMP3Player()
{
  uint8_t result = MP3player.begin(); // init the mp3 player shield
  if(result != 0) // check result, see readme for error codes.
  {
    // Error checking can go here!
  }
  MP3player.setVolume(volume, volume);
  MP3player.setMonoMode(monoMode);
}

Si oui lesquelles ? (le but n'étant pas de faire le projet à ta place, on est bien d'accord, n'est ce pas ?)

Bonjour,

Oui c'est mon premier contact avec une arduino.

Il s'agit effectivement de ce programme.

J'aimerai comprendre le fonctionnement de ce qui mets utile, particulièrement du void loop et de ce que je dois
modifier dedans pour que le programme puisse fonctionner comme je le souhaite.

Cet à dire un appui sur l'un des 5 boutons lance un son de environ 1s et allume la led du bouton.

Bien entendu, je ne souhaites pas que vous fassiez le projet à ma place mais plutôt que vous me donniez des pistes pour que je puisse avancer.

Merci de votre attention.

Tu as des notions de programmation C (cours) je suppose. Voila un point de départ possible:

repérer chaque fonction utilisée, chercher et lire sa documentation.

Si tu as des questions précises j'essayerai d'y répondre.

Alors oui j'ai des notions de programmation mais il s'agit de la première fois que je manipule une arduino.

Pourriez vous m'expliquer à quoi correspond ce qui ce trouve dans le main.

for (int i=0; i<TRIGGER_COUNT; i++)
{
pinMode(triggerPins*, INPUT_PULLUP);*

  • }*
  • pinMode(stopPin, INPUT_PULLUP);*
    ou à quoi correspond le tableau int triggerPins[TRIGGER_COUNT] = {0, 1, 5, 10, A0, A1, A2, A3, A4};
    surtout les 4 premières valeurs, je ne comprends pas leurs utilités.

D'après les commentaires fournis avec le programme :

Pins 0, 1, 5, 10, A0, A1, A2, A3, and A4 are setup to trigger tracks
"track001.mp3", "track002.mp3", etc.

Les pins (broches/pattes) 0, 1, 5, 10, A0, A1, A2, A3, and A4 sont donc des broches de l'arduino utilisées pour indiquer quel MP3 jouer.

Le mode INPUT_PULLUP (regarde ici par exemple) permet de connecter l'entrée à une résistance de tirage au +5V histoire de fixer à l'état haut la broche rien est connecté (bouton ouvert) ou à l'état bas lorsqu'on la relie à GND (bouton appuyé). Le principal intérêt d'utiliser la résistance de tirage interne est que cela évite d'une utiliser une externe :wink:

Un exemple de gestion de bouton avec INPUT_PULLUP : https://www.arduino.cc/en/Tutorial/InputPullupSerial

Tu remarqueras qu'il n'y a aucune résistance externe nécessaire.

Je te remercie de ta réponse détaillée qui m'aide beaucoup.

Mais à quoi correspond les valeurs 0,1,5 et 10 ?
Si je souhaite ajouter un bouton que dois-je mettre comme nouvel valeur à part le A5 ?

D'ailleurs je crois avoir repéré un potentiomètre et je ne comprends pas trop quelle partie du programme lui correspond.

La partie INPUT_PULLUP correspond à l'arduino ou au module ?
Si elle correspond à l'arduino cela m'évitera-t-il de rajouter des résistances pour protéger mes leds ?

Trouve une image de la UNO sur Internet tu verras bien les pins. Pourquoi ont-ils choisi dans l'exemple celles la et pas d'autres ? Je ne sais pas :wink: Perso j'éviterai les 0 et 1 car elles sont je crois utilisées aussi par le port série USB.

Les résistances de tirage du "mode" INPUT_PULLUP sont effectivement dans l'arduino (dans le boitier du micro controleur, on ne les vois pas).

Non, tu ne peux pas utiliser une résistance de tirage pour contrôler le courant qui traverse une led. Elle ne sont pas faite pour cela (trop petite) et pas cablées pour. Il te faut une résistance externe pour les leds.

Dans ton cas, les résistance de tirage interne ne peuvent te servir que pour les boutons/switchs je pense.

EDIT : en fait le module MP3 utilise des pins pour communiquer, du coup il ne reste que quelques pins pour les bouton. Extrait de la doc :

 Which Pins are Free?

Whew! The shield does use up quite a few pins, but here are the pins still available to connect to other components.

    The hardware UART pins -- RX and TX -- on pins 0 and 1
    D5 and D10 (PWM pins!)
    All analog pins (A0 through A5).

Dac dac je comprends beaucoup mieux. Encore merci de ton aide.

Encore quelque questions c'est concernant l'ajout d'un 5ème bouton et le potentiomètre qui se trouve sur la photo ci-joint.
J'aimerai que tu m'expliques quoi correspond à quoi (quelle partie correspond au potentiomètre et celle au boutons poussoir) et savoir si je peux changer toute la partie void loop pour y mettre un case plutôt, si tu penses que ça serait plus judicieux etc...

void loop()
{
  for (int i=0; i<TRIGGER_COUNT; i++)
  {
    if ((digitalRead(triggerPins[i]) == LOW) && ((i+1) != lastTrigger))
    {
      lastTrigger = i+1; // Update lastTrigger variable to current trigger
      /* If another track is playing, stop it: */
      if (MP3player.isPlaying())
        MP3player.stopTrack();

      /* Use the playTrack function to play a numbered track: */
      uint8_t result = MP3player.playTrack(lastTrigger);
      // An alternative here would be to use the
      //  playMP3(fileName) function, as long as you mapped
      //  the file names to trigger pins.

      if (result == 0)  // playTrack() returns 0 on success
      {
        // Success
      }
      else // Otherwise there's an error, check the code
      {
        // Print error code somehow, someway
      }
    }
  }

le premier for sert à quoi aussi d'ailleurs ?

524f0233757b7f69648b4569.png

Si tu veux 5 boutons et 5 leds tu utiliseras les 10 broches disponibles, donc pas de rab pour un éventuel potentiomètre... Sauf astuce que je ne connais pas.

Je suis parti du principe que la boucle for sert à vérifier quelle bouton est activé ou non donc j'ai remplacé par ça

void loop()
{
  for (int i=0; i<TRIGGER_COUNT; i++)
  {
    switch (i)
    {
      case 4: playMP3 (track001);
      case 5: playMP3 (track002);
      case 6: playMP3 (track003);
      case 7: playMP3 (track004);
      case 8: playMP3 (track005);
      default MP3player.stopTrack();
    }
  }
}

Qu'en penses-tu ?

C'est un début, le problème c'est que la boucle "for (int i=0; i<TRIGGER_COUNT; i++)" va faire varier i de 0 à TRIGGER_COUNT-1 mais a aucun moment tu récupères le numéro de la pins n°i. Or il te faut le numéro de pin pour ensuite déterminer (avec digitalRead) son état (si le bouton est appuyé ou pas). C'est seulement quand tu connaîtras l'état de la broche (reflétant l'état du bouton) que tu pourras déterminer si tu dois jouer le morceau associé.

Dans l'exemple ils y arrivent car dans le tableau triggerPins ils ont placés les numéros des pins à "surveillées". Ensuite ils parcourent le tableau "for (int i=0; i<TRIGGER_COUNT; i++)", récupèrent le numéro de pin via triggerPins* et l'utilisent dans digitalRead pour obtenir l'état.*
Je pense que tu gagnerais à bien comprendre les tableaux en C. En tapant tableau en C dans un célèbre moteur de recherche je trouve [un lien]https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15540-les-tableaux]un lien](https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15540-les-tableaux) sans doute très intéressant.
Et sinon, le potentiomètre il t'est nécessaire ou pas ?