El cacharro:
Un vídeo con el cacharro dentro de la vaca peluche:
Ya aparecieron los problemas:
- El volumen del altavoz es bajísimo. En la web del del waveshield encuentro dos comentarios que hablan sobre ello:
- Añadirle un amplificador (el de velleman p.ej. en venta en todoelectronica y conectrol)
- Utilizar un altavoz amplificado
- Amplificar el volumen de los wavs,
aunque parece que no ayuda mucho, debe ser lo más inmediato. Sí que es suficiente con amplificar el wav con audicity.
Quiero hace un par de modificaciones al soft del proyecto:
- Nombrar el fichero de sonido con los últimos 8 caracteres de la etiqueta rfid en vez de los 8 primeros. Coge bien los 8 últimos... pero luego dice que no puede reproducir el fichero... ¿por qué?
- No reproducir un fichero hasta que no se haya terminado el actual (utilizando "while (wave.isplaying)" ). Esto funciona bien sin mayor problema. -> Hecho
- Parar la reproducción si se acerca la tarjeta "silenciadora". -> Hecho
- Añadir un interruptor. -> Añadido
El código me ha quedado así:
/ An interactive bear for Charlie -- RFID triggered sound responses #include <FatReader.h> #include <SdReader.h> #include "WaveHC.h" #include "WaveUtil.h" SdReader memcard; FatVolume vol; FatReader root; FatReader file; WaveHC wave; #define ENABLE 7 // Set the pin number for enabling the RFID reader. The Audio Shield uses pins 2-5. #define STOPTAG "3D001EDA94" // Code of the TAG that stops any sound int val = 0; char code[10]; int bytesread = 0; char filename[1][13]; void setup() { //////// Set up RFID reader to collect tag information ///////////////////// Serial.begin(2400); // RFID reader SOUT pin connected to Serial RX pin at 2400bps pinMode(ENABLE,OUTPUT); // Set digital pin 7 as OUTPUT to connect it to the RFID /ENABLE pin digitalWrite(ENABLE, LOW); // Activate the RFID reader //////// Set the pins to output for driving the Audio Shield pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); ////////// Set up the Audio Shield by initializing the memory card for reading //////// if (!memcard.init()) { // If something went wrong sdErrorCheck prints out the error check putstring_nl("Card init. failed!"); cardErrorCheck(); return; } //This will optimize the reading of the memory card -- remove it if it times out memcard.partialBlockRead(true); // Find a FAT formatted partition by looking in teh first five slots. Remember your memory card should be FAT16 or FAT32 formatted uint8_t partition; for (partition = 0; partition < 5; partition++) { if (vol.init(memcard, partition)) break; } if (partition == 5) { putstring_nl("No valid FAT partition"); cardErrorCheck(); while(1); // This is a point of no return. Format your memory card properly and try again. } // Open the root directory for reading the files if (!root.openRoot(vol)) { putstring_nl("Can't open root directory"); while(1); // Something went wrong here so investigate the file system on your memory card. } // If you got this far then the card is ready to read /*Serial.println("STOP TAG is : "); Serial.println(STOPTAG); putstring_nl("Ready to go");*/ } // If we find an error, check what the error is and show it on the serial terminal void cardErrorCheck(void) { if(!memcard.errorCode()) return; putstring("\n\rSD I/O error:"); Serial.print(memcard.errorCode()); putstring(", "); Serial.print(memcard.errorData()); while(1); // Stick here if there is an error } void loop() { if(Serial.available() > 0) { // if data available from reader if((val = Serial.read()) == 10) { // check for header bytesread = 0; while(bytesread<10) { // read 10 digit code if( Serial.available() > 0) { val = Serial.read(); if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading break; // stop reading } code[bytesread] = val; // add the digit bytesread++; // ready to read next digit } } if(bytesread == 10) { // if 10 digit read is complete if(memcmp(code,STOPTAG,10) == 0 ){ // check if the TAG is the STOP TAG silence(); //Serial.println("STOP TAG "); } else if (! wave.isplaying){ // do nothing if a file is alredy playing playsound(code); // Serial.print("TAG code is: "); // possibly a good TAG // Serial.println(code); // print the TAG code Serial.flush(); // Flush the serial buffer before trying to read a new code } } bytesread = 0; } } } void playsound(char codetoplay[]) { Serial.print("File name is: "); // possibly a good TAG //for(int i = 2; i<10; i++) { // Make a filename from the first 8 characters of the RFID tag number NOT WORKING for(int i = 0; i<8; i++) { filename[0][i]=codetoplay[i]; //Serial.print(codetoplay[i]); // print the name code } filename[0][8]='.'; filename[0][9]='w'; filename[0][10]='a'; filename[0][11]='v'; //Serial.println(".wav"); // print the name code silence(); //shut down anything that is currently playing and close that file playfile(filename[0]); } void playfile(char *name) { if (!file.open(root, name)) { putstring_nl("Couldn't open file"); return; } if (!wave.create(file)) { putstring_nl("Not a valid WAV"); return; } wave.play(); } void silence() { if(wave.isplaying) { wave.stop(); } }