WTV020 : i2C/SPI Music Player Module for Arduino

Author : Ila MulyandiNo comments


WTV020M01 adalah salah satu module music/audio player yang dapat digunakan baik secara standalone ataupun dengan microcontroller/Arduino.Module ini mendukung beberapa File Audio antara lain .mp3, .wav, dan .ad4. Beberapa sumber mengatakan Module ini sangat stabil dan fast Respon untuk File .ad4. Untuk mengubah file wav/mp3 menjadi file AD4 silahkan lihat tutorialnya disini.

Berikut adalah PIN Out Module Mp3 Player WTV020M01 (V1.01)

Yang perlu diingat adalah Module WTV020 menggunakan VCC 3.3V.Jangan diberi tegangan 5V pada pin VCCnya.Module ini tidak akan rusak apabila diberi tegangan VCC 5V tetapi akan merusak microSD yang ada di dalamnya karena pada power yang menuju ke VCC microSD belum terdapat IC Stepdownya (V1.01)

Pada Gambar diatas terihat sudah ada komponen pad untuk IC Stepdown ke jalur power microSD namun belum dipasang komponen oleh pabriknya.Artinya untuk keamanan module dan microSD gunakan power 3.3V saat beroperasi.Sedangkan untuk Level Serialnya sudah mendukung 3.3V dan 5V karena module ini sudah dilengkapi Serial level converter sehingga dapat langsung digunakan dengan Arduino 5V atau 3.3V tanpa memerlukan tambahan Level Converter.


Stand Alone Mp3 Player WTV020M01


Pada skema wiring diatas kita membutuhkan komponen tambahan antara lain :
6pcs Tombol Tactile Push Button (Play,Vol+,Vol-,Next,Previous,Reset)
1pcs LED 3mm/5mm sebagai indikator mp3 module (busy indicator)
1pcs Resistor 220-470 Ohm (untuk drive Led pada tegangan 3.3V)
1pcs mini Speaker sebagai media output suara (bisa menggunakan Earphone atau Headset)
Stand Alone Mp3 Player WTV020M01 + External Amplifier 





Kita bisa menggunakan beberapa jenis module Amplifier seperti type LM386, TDAxxx, PAMxxx dengan 1 channel (Mono) untuk mendapatkan suara yang jebih keras dengan daya dan ukuran speaker yang lebih besar pula.




WTV020 dan Arduino Uno koneksi serial







Silahkan download library Wtv020sd16p.h disini atau disini

Cobalah contoh Sketch coding dibawah ini

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
// Wtv20sd16p Pin <-> Arduino Pin
//              1 <-> 2
//              7 <-> 3
//              8 <-> to GND
//             10 <-> 4
//             15 <-> 5
//             16 <-> to 3,3V


#include <Wtv020sd16p.h>
 
int resetPin = 2; // The pin number of the reset pin.
int clockPin = 3; // The pin number of the clock pin.
int dataPin = 4; // The pin number of the data pin.
int busyPin = 5; // The pin number of the busy pin.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

double old_millis;
double old_millis2;
double old_millis3;


int Wtv_ElementiVettore=11;
int Wtv_VettArrivo[12] = {0,0,0,0,0,0,0,0,0,0,0}; 
void setup() {
//Initializes the module.
Serial.begin(115200); // set up Serial library at 115200
wtv020sd16p.reset();
old_millis=0;
old_millis2=0;
old_millis3=0;
}
 
 
void loop() {
 
     //siklus untuk menghapus , berguna untuk testing, memutar file 98 selama 90detik
     if (millis()-old_millis3 >= 100000 )
        {
        Serial.println("-------------- Memutar Lagu no.98 -------------");
        Wtv_PlaySong(98);  
        old_millis3 = millis();       
        }

     //siklus untuk menghapus , berguna untuk testing , memutar masing2 file selama 50detik  
     if (millis()-old_millis2 >= 60000 )
        {
             Serial.println("-------------- Memutar Lagu Selama 50 detik-------------");  
        Wtv_PlaySong(1);  
        Wtv_PlaySong(99);  
        Wtv_PlaySong(2);  
        Wtv_PlaySong(32);
        Wtv_PlaySong(2);         
        Wtv_PlaySong(2);        
        Wtv_PlaySong(2);         
        Wtv_PlaySong(2);  
        Wtv_PlaySong(3);  
        old_millis2 = millis();       
        }
    
 
     //Jika berikut ini untuk diletakkan di loop program utama
     //Lalu , dari mana saja dalam program Anda dapat menempatkan pendidikan Wtv_PlaySong ( 3 ) untuk membiarkan dia bermain , dalam hal ini file0003.ad4;  
     if (millis()-old_millis >= 50 )
        {
        Wtv_SendToWtv020sd16();
        old_millis = millis();       
        }
 }
 
 
//Beberapa Void untuk Mempermudah Fungsi Play File (sorry bahasa iTali soalnya copas)
 
 void Wtv_PlaySong(int numerofile)
     {
     //metti il valore in numero file in coda al vettore.
     //Però se è 98 allora cancella tutti i 99 presenti nel vettore e metti il 98 per primo in modo da suonarlo subito.
     //Se invece il valore in numerofile è uguale all'ultimo elemento precedentmente inserito allora non fa nulla.
     
     int Wtv_appo = 0;
     int Wtv_esci=0  ;
     //il primo valore è vuoto allora mettilo direttamente    
     if (Wtv_VettArrivo[0] == 0)
        {
        Wtv_VettArrivo[0] = numerofile;  //è il 98         
        Wtv_esci=1;  
        
        }
    
     if (numerofile!=98 && Wtv_esci==0)  
        {
        Wtv_appo = 0;
        Wtv_appo = Wtv_posizione();  
        if  (Wtv_appo >=1 && Wtv_VettArrivo[Wtv_appo-1]==numerofile )
             {
             //in pratica se il valore è uguale a quello precedente allora non lo metti nel buffer  
             }
         else
             {
             Wtv_VettArrivo[Wtv_appo] = numerofile;
             }
        }  
 
     //Se 98 elimina tutti i 99 e mettilo nel buffer
     if (numerofile==98)  
        {
        Wtv_appo = 0;
        Wtv_appo = Wtv_posizione();   //trova il primo valore a zero, così non faccio il for per tutti gli elementi  
        int Wtv_i = 0;
        //elimina tutti i 99 e 98 nel vettore
        while (Wtv_i <= Wtv_appo )
            {
            if (Wtv_VettArrivo[Wtv_i] == 99 || Wtv_VettArrivo[Wtv_i] == 98 )
               {
               Wtv_shiftvettore (Wtv_i);
               }
            else
               {
               Wtv_i=Wtv_i+1;   
               }
             }

        //sposta tutto il vettore in basso per poter mettere in prima posizione il 98
        for (int Wtv_i = Wtv_appo ; Wtv_i>=1 ; Wtv_i--)
            {
            Wtv_VettArrivo[Wtv_i] = Wtv_VettArrivo[Wtv_i-1];
            }
        
        Wtv_VettArrivo[0] = numerofile;  //è il 98
        }
    }  

 
 
 
 
 
void Visualizza()
     {
     //Per visualizzare gli elementi del vettore  
     int i=0;
     for (i=0; i<=Wtv_ElementiVettore; i++)  
         {
         Serial.print( i ) ;
         Serial.print( " -> " ) ;   
         Serial.println(  Wtv_VettArrivo[i]) ;
         }
     Serial.println("") ;    
     }  
 
 
 
 
void Wtv_SendToWtv020sd16()
   {   
   int Wtv_appo =0;
   if (digitalRead(busyPin) == 0 )    //solo se la scheda non sta suonando faccio quanto segue
      {   
    
      //Se è 99 allora riproponilo in coda sempre
      if (Wtv_VettArrivo[0] == 99)
         {
         Wtv_appo = Wtv_posizione();
         if (Wtv_appo == 1 || Wtv_VettArrivo[Wtv_appo - 1] != 99)
            { //se l'ultimo valore è già 99 allora non farlo
            Wtv_VettArrivo[Wtv_appo] = 99;
            }
         }
          
         if (Wtv_VettArrivo[0]!=0)   //se non è zero suonalo
            {
            wtv020sd16p.playVoice(Wtv_VettArrivo[0]);  //suonalo
            Wtv_shiftvettore(0);                       //shift-a il vettore cosi che la prima posizione viene sostituita dalla seconda e così via...  
            Visualizza();
            }
         }  
         


}
 
 
void Wtv_shiftvettore(int start)
   {
   //sposta tutti gli elementi. Da START+1 vengono portati di una posizione indietro.
   int Wtv_esci = 0;
   int Wtv_i=0;
   Wtv_i = start;
   while (Wtv_i <= Wtv_ElementiVettore - 1 && Wtv_esci == 0)
      {
      Wtv_VettArrivo[Wtv_i] = Wtv_VettArrivo[Wtv_i + 1];
      if (Wtv_VettArrivo[Wtv_i] == 0 && Wtv_VettArrivo[Wtv_i + 1] == 0)
         {Wtv_esci = 1;}
      Wtv_i = Wtv_i + 1;
      }
   Wtv_VettArrivo[Wtv_ElementiVettore] = 0;
     
   }

 
int Wtv_posizione()
   {
   //Questa funzione restituice il numero del primo elemento libero del vettore al fine di poterlo utilizzarlo.
   //La ricerca avviene tramite metodo dicotomico per ridurre il numero di cofronti necessari
   if (Wtv_VettArrivo[0] == 0 )
      {
      return 0  ;
      }
      else
      {
      int Wtv_inizio = 0;
      int Wtv_mezzo = 0;
      int Wtv_fine = 0;
      Wtv_fine = Wtv_ElementiVettore;
      while (Wtv_fine - Wtv_inizio > 1)
         {
         Wtv_mezzo = int((Wtv_inizio + Wtv_fine) / 2);
         if (Wtv_VettArrivo[Wtv_mezzo] == 0 )
            {
            Wtv_fine = Wtv_mezzo;
            }
            else
            {
            Wtv_inizio = Wtv_mezzo;
            }
         }
      return Wtv_fine;  //restituisci valore
      }
   }

Posted On : Sunday, January 29, 2017Time : 11:49 AM
SHARE TO :
| | Template Created By : Rajendroid | CopyRigt By : ARDUINO | |