Parlons Arduino > Vos projets

Un mini module sonore

(1/15) > >>

Dominique:
J'ai réalisé ce week-end un petit module sonore.

Le réalisme du modélisme nécessite de déclencher des sons selon des événements précis, à des endroits bien choisis. Pour cela j'ai besoin d'un petit module bon marché.

J'ai assemblé un mini, une carte lecteur microSD, un transistor NPN pour amplifier le son vers un haut-parleur 8 ohm standard et un régulateur 7809 pour pouvoir alimenter le montage avec du 12V.
Le mini est programmé avec une petite carte FTDI232 basic.

Le principe est simple, le programme attend que la pin 2 passe au 0V pour délivrer le son inscrit dans un fichier.

Il utilise les bibliothèques SD, SPI et TMRpcm

Voici le programme que vous pouvez adapter à vos besoins :


--- Code: ---/*
 * Module sonore - Passage à Niveau
 * Base : un Nano + lecteur microSD + ampli BD241 + haut parleur
 * Version du 13/3/2016 Dominique Bultez
 */
 
#include <SD.h>                   // need to include the SD library
#define SD_ChipSelectPin 10       // using digital pin 10 on arduino nano 328, can use other pins
#include <TMRpcm.h>               //  also need to include this library...
#include <SPI.h>
/*
 * SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).
 */
TMRpcm tmrpcm;                    // create an object for use in this sketch
File root;
int val;
int bouton, oldbouton = 0;
bool debouncing = false;
#define _Bouton 2
#define _LedSon 4
#define _niveau 4

/////////////////////// SETUP /////////////////

void setup(){

  tmrpcm.speakerPin = 9;              //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
  pinMode(_LedSon,OUTPUT);            //LED Connected to pin 4
  digitalWrite(_LedSon, LOW);
  pinMode(_Bouton, INPUT_PULLUP);     // pour bouton ou commande extérieure sur pin 2
 
  Serial.begin(115200);
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
    Serial.println("SD fail"); 
    while(1) {
      // led clignote
      digitalWrite(_LedSon, HIGH);    // allume Led
      delay(250);
      digitalWrite(_LedSon, LOW);     // eteint led
      delay(250);
    }
  }
  root = SD.open("/");
  //printDirectory(root, 0);
  //delay(500);
  Serial.println("SD OK");
  val = _niveau;
  //Joue(val);
}

//////////////////// LOOP //////////////////

void loop(){ 

while (Serial.available() > 0)
  {
    val = Serial.parseInt();  // lecture entier
    if (Serial.read() == '\n')
    {
      Serial.print("valeur : ");
      Serial.println(val);
      if (val == 0) {
        printDirectory(root, 0);
      } else {
        Joue(val);
      }
    }
  }

  bouton = digitalRead(_Bouton);
  if (bouton == LOW) {
    if (tmrpcm.isPlaying()) {
    } else {
      Joue(_niveau);
      //digitalWrite(_LedSon, HIGH);      // allume Led
    }
  } else {                              // bouton HIGH
      tmrpcm.stopPlayback();            // Stop all playback
      //digitalWrite(_LedSon, LOW);       // eteint Led
  }
 
  if(tmrpcm.isPlaying())  {
    digitalWrite(_LedSon, HIGH);
   } else {
    digitalWrite(_LedSon, LOW);
    }
}

//////////////// fin de loop ///////////////

void Joue(int a_val) {
      Serial.print("je joue ");Serial.println(a_val);
      switch (a_val) {
        case 1:
        tmrpcm.play((char*)("1.wav"));       
        break;
        case 2:
        tmrpcm.play((char*)("2.wav"));
        break;
        case 3:
        tmrpcm.play((char*)("3.wav"));
        break;
        case 4:
        tmrpcm.play((char*)("4.wav"));
        break;
        case 5:
        tmrpcm.play((char*)("5.wav"));
        break;
        case 6:
        tmrpcm.play((char*)("6.wav"));
        break;
        case 7:
        tmrpcm.play((char*)("7.wav"));
        break;
        case 8:
        tmrpcm.play((char*)("8.wav"));
        break;
        case 9:
        tmrpcm.play((char*)("9.wav"));
        break;
      }
}

void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       Serial.println("fin");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}

--- Fin du code ---

Et il reste 14 pins libres ...

DDEFF:
Tout simplement !  :D
Et tu as 9 sons sur ta SD.

Thierry:
C'est ce que tu avais proposé dans un article ?

Dominique:

--- Citation de: Thierry le mars 14, 2016, 05:37:26 pm ---C'est ce que tu avais proposé dans un article ?

--- Fin de citation ---

Oui c'est une suite logique de l'article, une mise en œuvre nettement moins coûteuse.

En plus je vais essayer de faire fonctionner un passage à niveau en même temps avec des capteurs genre ILS et 2 relais.

J'ai mis 9 sons identiques sur la carte avec des niveaux différents pour choisir celui qui rend le mieux en fonction du HP choisi et de son emplacement.

Pour préparer les fichiers sons : Audacity !

Je ferais bien un circuit imprimé ...

Papachef:
Bonsoir,
Le son est en boucle, comment faire pour qu'il ne passe qu'une fois. La fonction Delay ne fonctionne pas
Merci
 :)

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique