Boite musicale

Bonjour à tous.
Je reviens vers vous en quête d'aide pour un nouveau projet.

Ce projet consiste à réaliser une boite ou le visiteur actionne une manivelle (dynamo), qui lance automatiquement un son d'oiseaux (je travail pour un parc animalier..)
Pas d’afficheur, ni de dialogue série, je veux que l'arduino lance la lecture de la première (et seule) piste présente sur la carte SD.

La boite est prête, la dynamo et les enceintes aussi, le projet n'attendent plus que la programation..

j'ai trouvé ce code sur le net :

#include <MP3Player_KT403A.h>

#include <SoftwareSerial.h>



boolean __ardublockDigitalRead(int pinNumber)
{
  pinMode(pinNumber, INPUT);
  return digitalRead(pinNumber);
}


SoftwareSerial mp3(19,18);

void setup() {
 
 /* Initialise le port série */ 
 Serial.begin(9600);
  
  /* Initialise le module MP3 */
  resetPlayer();
  selectSourceDevice(DEVICE_SDCARD);
  setVolume(15);

  /* Lit le premier fichier sur la carte SD */
  playTrack(1);
}

/** Fonction loop() */
void loop() {

}

Mais il ne fonctionne pas (j'ai pourtant installé les bibliothèques..)

j'ai ça qui s'affiche :

projet_MP3_branf3_ino.ino: In function ‘void setup()’:
projet_MP3_branf3_ino.ino:22:15: error: ‘resetPlayer’ was not declared in this scope
projet_MP3_branf3_ino.ino:23:22: error: ‘DEVICE_SDCARD’ was not declared in this scope
projet_MP3_branf3_ino.ino:23:35: error: ‘selectSourceDevice’ was not declared in this scope
projet_MP3_branf3_ino.ino:24:15: error: ‘setVolume’ was not declared in this scope
projet_MP3_branf3_ino.ino:27:14: error: ‘playTrack’ was not declared in this scope

J'ai aussi testé ça mais sans succès également :

#include <MP3Player_KT403A.h>

boolean __ardublockDigitalRead(int pinNumber)
{
  pinMode(pinNumber, INPUT);
  return digitalRead(pinNumber);
}


SoftwareSerial mp3(19,18);

void setup()
{
  pinMode( 2 , INPUT);
  pinMode( 4 , OUTPUT);
  mp3.begin(9600);
  delay(100);

  SelectPlayerDevice(0x02);       // Select SD card as the player device.
}

void loop()
{
  if (!__ardublockDigitalRead(2))
  {
    digitalWrite(4 , HIGH);
    SetVolume(500);
    SpecifyMusicPlay(1);
  }
}

Mes sources viennent d'ici et mon module c'est celui là

Un immense merci d'avance pour vos réponses.

Salut

Je ne sais pas d'où vient ton premier code mais dans MP3Player_KT403A.h :
resetPlayer n'existe pas
selectSourceDevice n'existe pas, par contre il y a une fonction SelectPlayerDevice
setVolume s'écrit SetVolume avec un S majuscule.

Ton deuxième code se compile.
Par contre un SoftwareSerial sur les pins 19 et 18 me semble étrange.
Comment le module est-il branché ?

Il faut repartir de l'exemple fourni avec la librairie ICI.

@+

C'est fou le nombre de gens qui posent une question et qui n'ont apparemment rien à foutre des réponse qu'on leur donne.

Cela donne vraiment envie de se casser le cul pour eux ...

@+

hbachetti:
C'est fou le nombre de gens qui posent une question et qui n'ont apparemment rien à foutre des réponse qu'on leur donne.

Cela donne vraiment envie de se casser le cul pour eux ...

@+

Bonsoir hbachetti
reste zen ;D
le topic a été ouvert hier à ~11h00
t'a répondu hier (un week-end) à ~11h20

l'auteur precise aussi

je travail pour un parc animalier

peut etre que compte tenu de l'epoque des vacances , il à "aussi" des contraintes horaires d'emploi ...
:grin:

Bonjour Messieurs
et merci pour vos réponses,

Effectivement comme le précise Artouste je travail en parc animalier en temps que directeur de séjours , donc j'ai posté avant de partir et ne rentre que ce jour,
Je pars demain en vacances donc j'aurai le temps de me remettre à l'arduino!
Hbachetti, merci pour ta réponse très claire, je vois ça dans la semaine, et te tiens au courant des modifs.
Merci encore et mes excuses pour le retard involontaire de ma réponse.

la dynamo va alimenter le montage ? Si oui il faudra peut-être prévoir de mieux filtrer l'alimentation qu'avec le régulateur intégré à l'arduino

Si c'est vraiment une dynamo, il faudra surtout redresser

bah non ? une dynamo produit du courant redressé, l'induit est sur le rotor et il y a un collecteur et des balais qui redressent le courant produit.

Sinon c'est un alternateur, là l'induit est au stator, et ça produit de l'alternatif.

La confusion vient souvent de ce qu'on appelle à tord une "dynamo" de vélo,qui est en fait un alternateur

Bonjour,
Alors oui sur mon montage, j'ai une dynamo, un pont redresseur, et régulateur 12-24V/5v pour l'arduino et les enceintes USB, l'alimentation est donc stabilisée à 5v.

J'ai réussi à faire fonctionner la bête aujourd'hui en suivant ce tuto :

Maintenant, je suis preneur si quelqu'un arrive à modifier ce code pour que le programme lise automatiquement la prmière piste de la microSD.

J'ai essayé mais sans succès pour le moment :slight_smile:

D'avance merci pour vos réponses :slight_smile:

Je viens de tester ça :

/**
 * Code de démonstration d'utilisation d'un module MP3 KT403A avec une carte Arduino.
 */

/* Constantes pour la communication avec le module KT403A */
const byte COMMAND_BYTE_START = 0x7E;
const byte COMMAND_BYTE_VERSION = 0xFF;
const byte COMMAND_BYTE_STOP = 0xEF;

/* Constantes pour la commande setEqualizer() */
const byte EQUALIZER_NORMAL = 0x00;
const byte EQUALIZER_POP = 0x01;
const byte EQUALIZER_ROCK = 0x02;
const byte EQUALIZER_JAZZ = 0x03;
const byte EQUALIZER_CLASSIC = 0x04;
const byte EQUALIZER_BASS = 0x05;

/* Constantes pour la commande selectSourceDevice() */
const byte DEVICE_UDISK = 0x01;
const byte DEVICE_SDCARD = 0x02;
const byte DEVICE_AUX = 0x03; // Not used
const byte DEVICE_PC = 0x04; // Debug only
const byte DEVICE_FLASH = 0x05;
const byte DEVICE_SLEEP = 0x06;


/** Play the next song (all folders) WARNING: files are ordered by creation date! */
void playNextSong() {
  send_kt_command(0x01, 0, 0, 10);
}

/** Play the previous song (all folders) WARNING: files are ordered by creation date! */
void playPreviousSong() {
  send_kt_command(0x02, 0, 0, 10);
}

/** Play the given track number (0 ~ 2999) (all folders) WARNING: files are ordered by creation date! */
void playTrack(uint16_t track_number) {
  send_kt_command(0x03, highByte(track_number), lowByte(track_number), 10);
}

/** Increase the volume */
void volumeUp() {
  send_kt_command(0x04, 0, 0, 10);
}

/** Decrease the volume */
void volumeDown() {
  send_kt_command(0x05, 0, 0, 10);
}

/** Set the volume to the given level (0 ~ 30) */
void setVolume(byte volume) {
  if (volume > 30) volume = 30;
  send_kt_command(0x06, 0, volume, 10);
}

/** Set the equalizer to the given audio mode */
void setEqualizer(byte mode) {
  send_kt_command(0x07, 0, mode, 20);
}

/** Repeat a single track (0 ~ 2999) (all folders) WARNING: files are ordered by creation date! */
void repeatSingleTrack(uint16_t track_number) {
  send_kt_command(0x08, highByte(track_number), lowByte(track_number), 10);
}

/** Select the source device for playing */
void selectSourceDevice(byte device) {
  send_kt_command(0x09, 0, device, 200);
}

/** Enter standby / low power mode */
void enterStandbyMode() {
  send_kt_command(0x0A, 0, 0, 20);
}

/** Exit standby / low power mode */
void exitStandbyMode() {
  send_kt_command(0x0B, 0, 0, 20);
}

/** Reset the MP3 module */
void resetPlayer() {
  send_kt_command(0x0C, 0, 0, 100);
}

/** Play/resume the music */
void playResumeMusic() {
  send_kt_command(0x0D, 0, 0, 20);
}

/** Pause the music */
void pauseMusic() {
  send_kt_command(0x0E, 0, 0, 20);
}

/** Select the source folder and track for playing */
void selectSourceFolderAndTrack(byte folder_number, byte track_number) {
  send_kt_command(0x0F, folder_number, track_number, 10);
}

// 0x10 "Volume adjust set" - NOT SUPPORTED

/** Enable or disable looping of all music files */
void loopAllMusic(byte enabled) {
  send_kt_command(0x11, 0, !!enabled, 10);
}

/** Select the source track from the "MP3" (case insensitive) folder */
void selectSourceTrackInMp3Directory(uint16_t track_number) {
  // Assert 0 ~ 9999
  send_kt_command(0x12, highByte(track_number), lowByte(track_number), 10);
}

/** Pause the current track and insert an advertisement song from the "ADVERT" (case insensitive) folder */
void insertSongFromAdvertDirectory(uint16_t track_number) {
  // Assert 0 ~ 9999
  send_kt_command(0x13, highByte(track_number), lowByte(track_number), 10);
}

/** Play the given song in the given directory (big directory version) */
void selectSourceBigFolderAndTrack(byte folder, uint16_t track_number) {
  // Assert folder 0 ~ 15, track number 0 ~ 9999
  // 0b1100 011111001111 = 4bits folder, 12 bits track number
  send_kt_command(0x14, (folder << 4) | highByte(track_number) & 0x0f, lowByte(track_number), 10);
}

/** Stop playing the inserted advertisement song and resume playing the user track */
void stopInsertedSongAndResumePlaying() {
  send_kt_command(0x15, 0, 0, 20);
}

/** Stop the music */
void stopMusic() {
  send_kt_command(0x16, 0, 0, 20);
}

/** Loop all music in the given folder */
void loopFolder(byte folder_number) {
  send_kt_command(0x17, 0, folder_number, 10);
}

/** Random playing */
void shufflePlay() {
  send_kt_command(0x18, 0, 0, 20);
}

/** single repeat the currently playing track track */
void repeatCurrentTrack(byte enabled) {
  send_kt_command(0x19, 0, !enabled, 10);
}

/** Mute sound output **/
void muteSound(byte enabled) {
  send_kt_command(0x1A, 0, !!enabled, 10);
}


/** Fonction de bas niveau pour envoyer une commande au module KT403A */
void send_kt_command(byte command, byte data_h, byte data_l, unsigned long cmd_delay) {
  Serial.write(COMMAND_BYTE_START);
  Serial.write(COMMAND_BYTE_VERSION);
  Serial.write((byte) 0x06);
  Serial.write(command);
  Serial.write((byte) 0x00);
  Serial.write(data_h);
  Serial.write(data_l);
  Serial.write(COMMAND_BYTE_STOP);
  // 16-bits checksum is optionnal
  delay(cmd_delay);
}


/* Fonction setup() */
void setup() {
 
  /* Initialise le port série */  
  Serial.begin(9600);
  
  /* Initialise le module KT403A */
  resetPlayer();
  selectSourceDevice(DEVICE_SDCARD);
  setVolume(15);
  
  /* Lit le premier fichier sur la carte SD */
  playTrack(1);
}

/** Fonction loop() */
void loop() {
  
}

Mais il ne veut pas me lire playTrack(1); dans le setup..

Il joue la piste 1 lorsque je met playTrack(1); dans la boucle mais la redémarre en permanence du coup j'ai mis un delay(8000) mais la encore ça ne fonctionne pas bien.. il commence par 8s de silence avant d'envoyer le premier morceau (alors que les 8s viennent après normalement...)
playTrack(1);
delay (8000);

Bref si qu'elqu'un à une solution.. merci :slight_smile:

J'utilise le DFPLAYER MINI, mais il y a des ressemblances.

Il joue la piste 1 lorsque je met playTrack(1); dans la boucle mais la redémarre en permanence

Oui, comme son nom l'indique loop() est appelée en boucle.

il commence par 8s de silence avant d'envoyer le premier morceau (alors que les 8s viennent après normalement...)

C'est comme si la première commande playTrack ne marchait pas.

Tu as essayé de faire la même chose avec selectSourceFolderAndTrack() ?

Le dossier DOIT être nommé par un identifiant numérique à deux chiffres. Pour les numéros de dossiers inférieurs à 10, un 0 doit être ajouté pour obtenir deux chiffres. Exemple : 00, 01, 02, 03, 15, 25, 99.

N.B. Le numéro de dossier va de 00 à 99. Il n'est pas possible d'avoir plus de 100 dossiers.

Le(s) fichier(s) dans le dossier DOIT être nommé par un identifiant numérique à trois chiffres. Pour les numéros de fichiers inférieurs à 100, un ou deux 0 doit être ajouté pour obtenir trois chiffres. Exemple : 000.mp3, 001.mp3, 002.mp3, 015.mp3, 025.mp3, 100.mp3, 125.mp3, 255.mp3.

N.B. Le numéro de fichier va de 000 à 255. Il n'est pas possible d'avoir plus de 256 fichiers par dossier avec cette fonction.

@+

Apparemment DFPLAYER MINI et KT403 sont basés sur le même circuit.

Je n'ai jamais utilisé la fonction de lecture par index, uniquement la fonction de lecture d'un fichier nommé dans un dossier nommé.

Suis les convention de nommage des répertoires et fichiers et fais un essai avec selectSourceFolderAndTrack().

@+

peyodu5656:
Bonjour,
Alors oui sur mon montage, j'ai une dynamo, un pont redresseur,

Plutot un alternateur,non,si tu as besoin du pont ?

Bon alors j'ai essayé avec la fonction selectSourceFolderAndTrack()
Mais ça ne fonctionne pas non plus.. il ne compile même pas.

Je ne comprend pas pourquoi playTrack(1); fonctionne dans la boucle mais pas dans le SETUP >:(
Y a t il une façon simple de lire une piste jusqu'au bout si je place playTrack(1); dans la boucle, sans être obligé de mettre un delay() ??

Si quelqu'un connait un code simple avec un grove 2 je suis preneur..

Merci en tous les cas !

Ayééééééééé j'ai trouvé, enfin j'ai surtout trouvé la solution sur le net !!!
Sur ce forum d'ailleur, pour ceux que ça intéresse : voici mon code :

#include <SoftwareSerial.h>
#include <MP3Player_KT403A.h>

// Note: You must define a SoftwareSerial class object that the name must be mp3, 
//       but you can change the pin number according to the actual situation.
SoftwareSerial mp3(6, 7);

void setup()
{
    mp3.begin(9600);
    Serial.begin(9600); 
    delay(100);
   
    SelectPlayerDevice(0x02);       // Select SD card as the player device.
    SetVolume(0x1E);                // Set the volume, the range is 0x00 to 0x1E.


   
    PlayLoop();
    
}

void loop(){
}

Alors il faut juste relier le RX du GROVE MP3 au pin 7 de la UNO (dans mon cas)
Et dès que la carte uno est alimentée, la piste 1 se lance puis tourne en boucle, parfait pour ma boite musicale!

Merci à tout ceux qui m'ont répondu.
A+