Arduino gra i śpiewa, czyli jak wydobyć dźwięk z naszej płytki.

Zapewne każdy z nas chciał w swoim projekcie umieścić możliwość odtwarzania różnych plików dźwiękowych. W internecie można natrafić na próby zrealizowania tego typu pomysłów. Najprostszym sposobem było, a niekiedy nadal jest kupno najtańszego odtwarzacza mp3 i podpięcie go do Arduino. Oczywiście pojawiał się problem, można było odtwarzać pliki tylko w kolejności, a odtwarzacz wyłączał się po określonym czasie, jeśli nic nie było odtwarzane. Tego problemu póki co nikt nie przeskoczył, a szkoda. Pomyślcie sobie, najtańszy odtwarzacz za kilkanaście złotych, do tego kilkanaście do kilkudziesięciu plików mp3 na karcie sd i już możemy się cieszyć muzyką lub innymi dźwiękami sterowanymi przez Arduino.

WTV020-SD
WTV020-SD

Niestety, aż tak dobrze nie ma, ale źle też nie jest. W ofercie nettigo.pl można znaleźć płytkę od Sparkfun’a z układem WTV020SD. Ten układzik może odtwarzać pliki dźwiękowe z kart microsd. Są niestety pewne ograniczenia. Po pierwsze układ odtwarza pliki o rozszerzeniu ad4, co jest pewną niewygodą w przygotowywaniu ich. Pliki ad4 możemy uzyskać odpowiednio konwertując pliki wav lub mp3, a program do tego typu zabiegu znajduje się na stronie sparkfun.com. Po drugie, układ wspiera karty do 2gb. Wydaje się, że to niewiele, ale tak naprawdę możemy zmieścić do 512 plików-więcej nie da rady.

Z technicznych aspektów, układ zasilany jest napięciem 3.3V lub akumulatorem LiPol ( na płytce jest stabilizator napięcia). WTV020SD oferuje działanie jako samodzielny moduł lub jako moduł sterowany przez mikrokontroler. Na forum arduino znajduje się biblioteka do obsługi modułu WTV020-SD-16P. Okazuje się, że jest to ten sam scalak co na płytce od Sparkfun’a, tyle że w innej obudowie. Tak więc mamy gotową bibliotekę, która jest bardzo przejrzyście napisana i łatwa w zrozumieniu.

Przygotowanie karty pamięci

Przed rozpoczęciem naszej muzycznej przygody należy wspomnieć o przygotowaniu karty oraz plików. Kartę pamięci musimy sformatować jako FAT. To na pewno nie będzie problemem, natomiast samo przygotowanie utworów muzycznych wymaga od nas wykonania kilku kroków. Przede wszystkim musimy posiadać pliki ad4, aby je uzyskać skorzystamy z programu zamieszczonego na stronie Sparkfun’a. Należy go zainstalować ignorując komunikat o instalacji dodatkowego sterownika. Następnie odpalamy program i wyszukujemy pliki wav lub mp3. Należy pamiętać, iż maksymalna prędkość próbkowania plików nie może być większa niż 33kHz. Po drugie musimy się upewnić, czy w folderze z plikami muzycznymi są tylko i wyłącznie te, które nas interesują. W przeciwnym razie program się zawiesi i będzie to robił do skutku. Na koniec musimy pamiętać, aby nasze skonwertowane pliki nazywać od 0000, 0001…. Inaczej może być problem z odtwarzaniem (np. 0000.ad4, 0001.ad4 etc.) Dlatego zanim zaczniemy zwalać winę na nieodtwarzające się dźwięki czy zepsuty głośnik, proponujemy skorzystać z gotowej paczki plików, która jest dostępna w dalszej części tekstu.

Uruchomienie

W pierwszej kolejności odpalimy nasz układ samodzielnie, a zasilanie weźmiemy z Arduino. Schemat w tym przypadku wydaje się zbędny, bowiem podłączenie jest na prawdę dziecinnie proste.

Pinologia WTV020-SD
Pinologia WTV020-SD

Vcc oraz 3.3V podłączamy do 3.3V w Arduino

GND do GND w Arduino

SPK-, SPK+ to podłączenie głośnika 8 Ohm/0.5W

PWM OUT (to wyjście do wzmacniacza)

PREV(poprzedni), PLAY(odtwarzaj), NEXT(następny) to podłączenie przycisków, które będą zwierać do masy układu

Powyższe połączenie w zupełności nam wystarczy, aby odpalić układ.

W naszym filmie jak i na zdjęciu poniżej może nie widać, ale nasz głośnik został podłączony do wyjścia PWM jako, że posiada wbudowany wzmacniacz, a pod ręką nie było żadnego głośniczka 8 Ohm.

WTV020-SD jako samodzielny odtwarzacz
WTV020-SD jako samodzielny odtwarzacz

Nota katalogowa dostępna na stronie produktu zawiera schemat prostego wzmacniacza, który możemy podłączyć do WTV020-SD.

Wzmacniacz z noty katalogowej
Wzmacniacz z noty katalogowej

Na karcie został wgrany zestaw przykładowych plików ze strony buildcircuit.com. Samą paczkę dźwiękową można pobrać stąd.

Widać, że układ zadziałał od pierwszego uruchomienia, nie ma tu żadnego skomplikowania. Teraz spróbujemy podłączyć WTV020SD z Arduino. Jak już pisaliśmy wcześniej, skorzystamy z forumowej biblioteki, którą można ściągnąć z forum.arduino.cc

Programowanie – niech Arduino gra

Poniższy przykładowy kod odtworzy nam pierwszy, drugi i trzeci plik dźwiękowy (pliki zaczynają się od 0000,0001,0002…).

/*
 Example: Control a WTV020-SD-16P module to play voices from 
 an Arduino board.
 Created by Diego J. Arevalo, August 6th, 2012.
 Released into the public domain.
 */

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

/*
Create an instance of the Wtv020sd16p class.
 1st parameter: Reset pin number.
 2nd parameter: Clock pin number.
 3rd parameter: Data pin number.
 4th parameter: Busy pin number.
 */
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

void setup() {
  //Initializes the module.
  wtv020sd16p.reset();
}

void loop() {
  //Plays synchronously an audio file. Busy pin is used 
  //for this method.
  wtv020sd16p.playVoice(0);
  //Plays asynchronously an audio file.
  wtv020sd16p.asyncPlayVoice(1);
  //Plays audio file number 1 during 5 seconds.
  delay(5000);
  //Pauses audio file number 1 during 5 seconds.  
  wtv020sd16p.pauseVoice();
  delay(5000);
  //Resumes audio file number 1 during 5 seconds.
  wtv020sd16p.pauseVoice();
  delay(5000);  
  //Stops current audio file playing.
  wtv020sd16p.stopVoice();
  //Plays synchronously an audio file. Busy pin is used 
  //for this method.  
  wtv020sd16p.asyncPlayVoice(2);
  delay(2000);   
  //Mutes audio file number 2 during 2 seconds.
  wtv020sd16p.mute();
  delay(2000);
  //Unmutes audio file number 2 during 2 seconds.
  wtv020sd16p.unmute();
  delay(2000);    
  //Stops current audio file playing.
  wtv020sd16p.stopVoice();

}

 

WTV020-SD połączone z Arduino
WTV020-SD połączone z Arduino

 

Naszą płytkę podłączyliśmy do Arduino zgodnie z tym co jest w bibliotece, oczywiście można dowolnie zmienić piny pamiętając o ich zmianie w kodzie, jeśli te aktualnie są zajęte przez coś innego. Warto od razu wspomnieć o pinach w bibliotece i tych na płytce. Otóż reset oznaczony na płytce jest jako RESET, ale już clock to DCLK, a data to DIN, busy jest BUSY. Niby nic takiego, a w internecie ludzie mieli z tym problemy, przynajmniej jak przeglądaliśmy różne fora.

 

Poniżej przedstawiliśmy małą ściągawkę, za co odpowiadają poszczególne komendy.

void reset() – przywołanie tej komendy w Setup, powoduje zresetowanie układu i przygotowanie go do odbioru komend

void playVoice(int voiceNumber) – odtwarzanie pliku, zgodnego z numerem na karcie microSD

void asyncPlayVoice (int voiceNumber) – ta komenda również odtwarza odpowiedni plik, ale asynchronicznie, czyli ta komenda nie blokuje kodu, który w czasie odtwarzania może być wykonywany dalej

void stopVoice() – ten kod zatrzymuje aktualnie asynchronicznie odtwarzany plik

void pauseVoice() – typowa pauza, po wznowieniu plik jest odtwarzany od momenty kiedy został zatrzymany. Wznawiamy odtwarzanie wywołując tą funkcję drugi raz

void mute() – wyciszenie odtwarzanego utworu, nie powoduje jest zatrzymania

void unmute() – cofnięcie wyciszenia utworu, który aktualnie jest odtwarzany

Teraz nie pozostaje nam nic innego jak przygotować własne dźwięki i przegrać je na kartę pamięci. Dzięki tej małej płytce i prostej bibliotece nasz robot lub inny projekt może wydawać odgłosy, odtwarzać muzykę, bądź służyć jako dzwonek z własną ulubioną melodią.