scheda audio economica WTV020-SD-16P con microsd

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.

/*
  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:

Praticamente stai alimentando il modulo con 5V?
Ciao Uwe

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 :slight_smile:

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????

dall'uscita 3,3V di arduino puoi prelevare solo 50mA, e' normale che non funziona.

ok.. grazie per questa info....

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

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ì

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 ......