Go Down

Topic: scheda audio economica WTV020-SD-16P con microsd (Read 1 time) previous topic - next topic

onesky

Jul 15, 2012, 01:27 am Last Edit: Jul 15, 2012, 01:29 am by onesky Reason: 1
qualcuno è riuscito a far funzionare correttamente questa scheda audio con arduino?


"V1.5 / 2012.01.12"

l'ho presa da ebay hong kong per la ridicola cifra di 4,50 euro, supporta microsd fino a 1gb e il formato wav/ad4

ho cambiato la saldatura del pin da 3,3v a 5v in modo da connetterla direttamente all'alimentazione dell'arduino nano (i 3,3v dell'arduino non funzionano se non viene alimentato dalla miniUsb).

ho collegato i pin CLK, DATA e RESET ai pin analogici dell'arduino A4, A5, A3 come in questo schema





finora sono riuscito a farla "cantare" sia con wav che con ad4, in particolare con quest'ultimo formato ho eliminato parecchi problemi di compatibilità di compressione

il problema è che non riesco a "comandare" con esattezza la lista di esecuzione e anche il volume.

Praticamente parte il primo file, poi si sente il secondo mentre il terzo non parte. Oppure parte il primo e poi basta. Insomma fa come gli pare.


questo è il codice che sto usando finora, di derivazione della nota schedina Somo che usa lo stesso integrato.

Code: [Select]
/*
 SOMO-14D Test
 Control a SOMO-14D module to play sounds

 Reference
 http://www.4dsystems.com.au/prod.php?id=73

 Created 20 October 2009
 By Shigeru Kobayashi
*/

const int clockPin = A4;  // the pin number of the clock pin
const int dataPin = A5;  // the pin number of the dataPina pin
const int resetPin = A3;  // the pin number of the reset pin

const unsigned int VOLUME_0 = 0xFFF0;
const unsigned int VOLUME_1 = 0xFFF1;
const unsigned int VOLUME_2 = 0xFFF2;
const unsigned int VOLUME_3 = 0xFFF3;
const unsigned int VOLUME_4 = 0xFFF4;
const unsigned int VOLUME_5 = 0xFFF5;
const unsigned int VOLUME_6 = 0xFFF6;
const unsigned int VOLUME_7 = 0xFFF7;

const unsigned int PLAY_PAUSE = 0xFFFE;
const unsigned int STOP = 0xFFFF;

void setup() {
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
 pinMode(resetPin, OUTPUT);

 digitalWrite(clockPin, HIGH);
 digitalWrite(dataPin, LOW);

 // reset the module
 digitalWrite(resetPin, HIGH);
 delay(100);
 digitalWrite(resetPin, LOW);
 delay(10);
 digitalWrite(resetPin, HIGH);
 delay(100);

 sendCommand(VOLUME_7);
}

void loop() {
   delay(4000);
 // play "0000.ad4"
 sendCommand(0x0002);
 delay(3000);

 // play "0001.ad4"
 sendCommand(0x0004);
 delay(4000);

 // play "0002.ad4"
 sendCommand(0x0002);
 delay(4000);
 
 // stop playing
 sendCommand(STOP);
 delay(1000);
}

void sendCommand(int addr)
{
 digitalWrite(clockPin, LOW);
 delay(2);
 for (int i=15; i>=0; i--)
 {
   delayMicroseconds(50);
   if((addr>>i)&0x0001 >0)
     {
       digitalWrite(dataPin, HIGH);
       //Serial.print(1);
     }
   else
      {
        digitalWrite(dataPin, LOW);
       // Serial.print(0);
      }
   delayMicroseconds(50);
   digitalWrite(clockPin, HIGH);
   delayMicroseconds(50);
   
   if(i>0)
   digitalWrite(dataPin, LOW);
   else
   digitalWrite(dataPin, HIGH);
   delayMicroseconds(50);
   
   if(i>0)
   digitalWrite(clockPin, LOW);
   else
   digitalWrite(clockPin, HIGH);
 }
 
 delay(20);
}


questa è la wave form della trasmissione seriale a 2 (dal manuale):



questo è il manuale

infine il video del primo test:
http://www.youtube.com/watch?v=hCRpr2SnBac



uwefed

Praticamente stai alimentando il modulo con 5V?
Ciao Uwe

Testato

uwe ha notato la cosa giusta, nel manuale infatti si cita:
- working voltage DC2.7~3.5V

inoltre complimenti per l'esposizione del problema, un post da citare come esempio  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Paolo S

ne ho acquistate due anche io.
alimentandole con i 3,3 V di arduino (io uso luigino 328) non funziona... è come se metesse in corto l'alimentazione. Luigino si riavvia. La tensione dei 3.3 scende sotto i due volt e nulla non funge...

Credo di avere la vers. 1.5 che forse hanno modificato per usarla a 5 v ... (io non capisco bene l'inglese)...

collegato direttamente ai 5 V invece funziona, comunque gli ho messo in serie 2 diodi e l'ho collegato ai 5 v e funziona ...

il problema e che non mi suona tutti file caricati ma solo i primi 2 o tre.... anche io non capisco...

io avrei bisogno di una funzione tipo

if (busy)
play (volume, file)


ma non riesco.... qualche suggerimento????

Testato

dall'uscita 3,3V di arduino puoi prelevare solo 50mA, e' normale che non funziona.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Paolo S

ok.. grazie per questa info....

e per il resto .. qualcuno ha realizzato una funzione che consente di "suonare" il generico file ????.....


Paolo S

#6
Sep 15, 2012, 09:03 pm Last Edit: Sep 15, 2012, 09:22 pm by Paolo S Reason: 1
Risolto diversi problemi .....

innanzitutto i nomi dei file da suonare  devono avere sempre essere composti da un numero compreso tra 0000 e 0511. io sbagliavo nello scrivere il nome del file ecco perchè non me li suonava tutti ...

per suonare un generico file gli invio il comando così

Code: [Select]
void sendData(int Comando)
{
int ClockCounter=0;
int ClockCycle=15;//0x0f;

digitalWrite(pinClock,HIGH); delay(300); digitalWrite(pinClock,LOW); delay(2);  // guardare il datasheet del WTV020

while(ClockCounter <= ClockCycle)
  { digitalWrite(pinClock,LOW); delayMicroseconds(100);
    if (Comando & 0x8000){digitalWrite(pinData,HIGH);} else {digitalWrite(pinData,LOW);} // spedisce il bit
    Comando = Comando << 1;
    digitalWrite(pinClock,HIGH); delayMicroseconds(100);
    ClockCounter++;
   }

digitalWrite(pinData,LOW);
digitalWrite(pinClock,HIGH);
}


quindi per suonare il file "0010.ad4"  basta inviare sendData(10)

ancora guardando il datasheet

per impostare il volume a 5    sendData(0xfff5)
per mettere pause/play  sendData(0xfffe)
per stoppare la riproduzione sendData(0xffff)...

insomma mi pare che funzioni bene ......

Go Up