Parlons Arduino > Vos projets
Un mini module sonore
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
[#] Page suivante
Utiliser la version classique