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 :
/*
* 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();
}
}
Et il reste 14 pins libres ...