Pages: [1]   Go Down
Author Topic: scheda audio economica WTV020-SD-16P con microsd  (Read 1528 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Full Member
***
Karma: 3
Posts: 151
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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



« Last Edit: July 14, 2012, 06:29:51 pm by onesky » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 248
Posts: 21154
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Praticamente stai alimentando il modulo con 5V?
Ciao Uwe
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5780
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Oristano
Offline Offline
Sr. Member
****
Karma: 0
Posts: 252
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5780
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Oristano
Offline Offline
Sr. Member
****
Karma: 0
Posts: 252
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok.. grazie per questa info....

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

Logged

Oristano
Offline Offline
Sr. Member
****
Karma: 0
Posts: 252
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 ......
 
« Last Edit: September 15, 2012, 02:22:32 pm by Paolo S » Logged

Pages: [1]   Go Up
Jump to: