Arduino jako odtwarzacz audio

Arduino jako odtwarzacz audio

Witajcie, dziś chciałbym przedstawić wam poradnik jak odtwarzać pliki audio przy pomocy Arduino.
Nie jest to wcale takie trudne jakby się mogło wydawać :)
Wystarczy czytnik kart SD i jakiś wzmacniacz np. głośniki komputerowe z wbudowanym wzmacniaczem.

ArduinoPlayer

czytnikSD czytnikSD2

1. Czytnik kart SD

Bardzo łatwo wykonać go samemu chociaż można kupić gotowy moduł.
Ale oczywiście powiem wam jak wykonać go sobie samemu bo wychodzi szybciej i taniej :)

Będzie nam potrzebna karta SD lub SDHC sformatowana na FAT16 lub FAT32

Do wykonania czytnika kart SD potrzebujemy:

  • pojedynczą listwę goldpin’ów
  • podwójną listwę goldpinów (opcjonalnie jeśli nie chcemy się bawić w klejenie ze sobą pojedynczych listw)
  • 3szt. rezystorów 1.8kΩ i 3szt. rezystorów 3.3kΩ aby zrobić dzielnik napięcia dla sygnałów z Arduino zasilanego 5V
  • kondensator ceramiczny 100nF

Do wykonania czytnika kart oczywiście potrzebujemy jeszcze płytki stykowej i przewodów a jeśli jesteś już bardziej doświadczony możesz go wykonać na uniwersalnej płytce PCB.

Schemat czytnika kart SD:

czytnikSD_schemat

Wykonujemy złącze do karty SD:

Łamiemy listwę pojedynczych goldpin’ów na 3 części po 7 pinów albo na jedną część 1×7 i jedną podwójną 2×7.

SD1

Wyginamy po jednej stronie piny w taki sposób aby utworzyć styki do karty SD, drugą stronę zostawiamy jak jest i łączymy je ze sobą.

SD2    SD3

Jeśli użyliśmy pojedynczych goldpinów to polecam skleić je “kropelką”/”super glue” bądź klejem na gorąco “termoglutem” a jeśli użyliśmy podwójnej listwy problem klejenia mamy z głowy :D

Do części która będzie się stykać z kartą przylutowujemy z drugiej strony odcinek 1×7 goldpinów. Gotowe złącze powinno wyglądać tak :)

SD4    SD5

Jeśli nie mamy goldpinów możemy wykorzystać adapter do kart microSD i bezpośrednio do niego przylutować kabelki.

Wszystkie części łączymy na płytce stykowej tak jak na poniższym obrazku.

Pamiętaj że karta musi być zasilana napięciem 3.3V

Czytnik_SD

2. Podłączenie do wzmacniacza (np. starych głośników PC) / słuchawek

Długo szukałem schematu jak poprawnie podłączyć wyjście PWM z Arduino (generujące sygnał audio) i ostatecznie to okazało się najlepsze.

Zalecam ustawić potencjometr obracając go do końca w prawo i wtedy dopiero podłączyć układ do wzmacniacza i dobrać właściwe ustawienie.

Nie odpowiadam za uszkodzenie wzmacniacza w wyniku nieumiejętnego podłączenia.

Potrzebujemy:

  • Kondensator elektrolityczny 100µF (na napęcie 16V lub wyższe)
  • Rezystor 1kΩ
  • Kondensator ceramiczny 10nF
  • Potencjometr montażowy 10kΩ
  • Gniazdo stereo jack 3.5mm na przewód lub do druku (ja użyłem do druku)

Schemat:

schemat_do_wzmacniacza

Połączenie na płytce stykowej:

podlaczenie_do_wzmacniacza

3. Czytnik kart SD razem z filtrem do wzmacniacza na płytce stykowej

Arduino_WAV_Player_Breadboard

3. Program i biblioteka SimpleSDAudio

Jest to chyba najlepsza biblioteka do odtwarzania plików audio jaką udało mi się znaleźć w sieci.
Obsługuje częstotliwości do 62.500 kHz i tryb STEREO chociaż według mnie MONO nam w zupełności wystarczy :)

Biblioteke możemy pobrać tutaj SimpleSDAudio_V1.03.zip
Wypakowujemy ją do folderu “libraries” tam gdzie zainstalowaliśmy Arduino.

Wgrywamy na kartę pamięci plik EXAMPLE.AFM (znajdziemy go w folderze “examples”)

Przykładowy szkic z biblioteki SimpleSDAudio:

 

4. Plik audio WAV konwertujemy na format który obsługuje biblioteka SimpleSDAudio

Potrzebny nam będzie plik audio w formacie “.wav” który skonwertujemy do formatu który obsługuje biblioteka. Jeśli nie mamy pliku w formacie “.wav” tylko np. “.mp3” to będziemy musieli użyć jakiegoś programu do konwersji mp3 na wav.
Pokażę wam jak to zrobić na przykładzie darmowego programu Switch Sound File Converter do pobrania tutaj.

konwersja_na_wav_1   konwersja_na_wav_2   konwersja_na_wav_3

Ok, jeśli mamy plik “.wav” możemy przystąpić do przerobienia go na format który odczytuje biblioteka.
W tym celu, w miejscu z rozpakowaną biblioteką SimpleSDAudio wchodzimy do folderu “tools”, następnie do “Arduino with 16 MHz” i nasz plik “plik_audio.wav” przenosimy na plik “FullRate@16MHz_Mono” który to nam go przerobi.

konwersja_wav_1   konwersja_wav_2

Mamy już plik “plik_audio.afm” który możemy wrzucić na kartę pamięci.

 

No i mamy gotowy odtwarzacz :)

Teraz pytanie do czego go możemy wykorzystać? Możemy np. zrobić dzwonek do drzwi lub podłączyć czujnik ruchu aby odtwarzał dźwięk gdy wykryje ruch. Jeśli chodzi o czujnik ruchu to dobry pomysł jakby ktoś chciał zrobić straszną dynie wydającą jakieś upiorne głosy na zbliżający się Halloween (oczywiście jeśli ktoś u nas obchodzi to amerykańskie święto :D).
Przyszedł mi do głowy jeszcze pomysł mówiącego zegarka który próbuje zrobić ale wydaje mi się że jeden mikrokontroler temu nie podoła i trzeba by zrobić jakąś komunikacje pomiędzy dwoma aby jeden służył za odtwarzacz a drugi go kontrolował.

Przykład zastosowania:

Dzwonek do drzwi (z przykładowego kodu “doorbell”):

Kiedy już mamy podłączony czytnik kart SD i filtr do wzmacniacza, możemy podłączyć przycisk który będzie działał jak dzwonek do drzwi.
Z folderu “examples” który rozpakowaliśmy razem z biblioteką, wrzucamy na kartę pamięci pliki DONG.AFS i DING.AFS.

Do podłączenia przycisku potrzebujemy rezystor 10kΩ

przycisk

Kod:

 

No i to by było na tyle ;) Mam nadzieje że poradnik będzie dla was pomocny a jeśli macie jakieś inne pomysły zastosowania to piszcie ;)

Ocena: 4.76/5 (głosów: 70)

Podobne posty

68 komentarzy do “Arduino jako odtwarzacz audio

    • Hehe spoko, dzięki za ocenę :) Ja myślałem bardziej o podpięciu do tego modułu RF aby bezprzewodowo drugim mikrokontrolerem sterować odtwarzanymi plikami ale to może wkrótce i jeśli podoła bo według twórców biblioteki zużycie RAM’u wynosi ~1.3 kB czyli nie wiele nam zostaje z 2kB które ma Atmega328

      Odpowiedz
    • Dzięki, zainspirowałem się jakimś tematem z forum bo ktoś napisał że chce aby mu coś grało przy uruchamianiu komputera i ktoś napisał AVR WAV Player czy coś takiego więc googlowałem w poszukiwaniu czegoś na Arduino i okazało się że jest a to dość ciekawy temat że takie urządzonko może odtwarzać muzykę :) Męczę się z tym gadającym zegarem ale mam problem bo brakuje mi pamięci RAM (czy tam SRAM :D) w procku jak dodałem char* array z nazwami plików godzin i minut. Wydaje mi się że najlepiej będzie zrobić jakąś transmisje pomiędzy dwoma mikrokontrolerami i ten z odtwarzaczem będzie tylko pliki z karty odpalał.

      Odpowiedz
  • Świetna sprawa!
    Jak czytałem to obawiałem się że zamiast porządnego dźwięku będzie to po prostu piszczałka, ale na filmiku słychać że (jak na tak proste rozwiązanie) dźwięk jest bardzo czysty.
    Super post!

    Odpowiedz
  • Nie ma to jak pasja bawienia się elektroniką. Ja wiele lat temu też się lutowaniem bawiłem, ale nie wciągnęło mnie to. I mimo że skończyłem szkołę o profilu elektronicznym nie czuję dziś za bardzo tematu lutowania. Poza tym wszystko jest modułowe. Ale pasja jak każda pasja jest warta rozwoju.

    Odpowiedz
    • Ja tą pasje odziedziczyłem :) Tylko że jakoś uczyć się w tym kierunku nie mam ochoty bo wiem że nie jest to takie proste, ta cała matematyka i fizyka której nikt nie potrafi ludziom wytłumaczyć w jakiś przyjemny sposób :D No cóż ale podstaw elektroniki i programowania akurat chcę się nauczyć i powoli to robię :)

      Poradniki tutaj piszę z dwóch powodów, pierwszy jest taki że robię to dla siebie hehe :D Dokładniej… aby mieć wszystko zanotowane i nie zapomnieć jak to leciało :D Drugi powód to promować idee Arduino aby każdy mógł bawić się elektroniką ;)
      Chciałbym jeszcze napisać dla Was poradnik jak tworzyć projekty na Arduino bez Arduino które jest dość drogie i ogólnie zbędne w końcowym projekcie ale cały czas nie mogę go jakoś ukończyć ponieważ chciałbym aby był napisany jak najłatwiej do zrozumienia :( No a ja cały czas badam ten temat :D

      Odpowiedz
      • Apropos notowania na stronie w celu zapamiętania i uwiecznienie dla siebie. Jest to rzeczywiście bardzo dobry sposób.

        Ja tak samo robię (między innymi w tym celu) w serwisach, które prowadzę poświęconych programom komputerowym, sprzętowi komputerowemu, tworzeniu stron www – w których, oprócz innych podstron, wpisuję takie, które mają mi w przyszłości przypomnieć jak rozwiązałem jakiś problem, co po kolei zrobiłem. A że te serwisy też do innych celów przy okazji służą …

        Zawsze jest to jakaś podwójna czy zwielokrotniona motywacja …

        Odpowiedz
  • Witam
    Bawiłem się tą biblioteką już jakiś czas temu, lecz wciąż nie mogę sobie poradzić z trzaskiem na początku i końcu odtwarzania.
    Układ robiłem z prostym podłączeniem gniazda jack/głośnika – może pomógł by jakiś filtr na te trzaski? a może jakiś trick w kodzie programu? (gdy się “zatrzyma” dźwięk funkcją pause, wtedy nie ma trzasku na końcu) ale co ze startem?
    jakieś pomysły?

    Odpowiedz
    • No słychać lekki trzask ale niestety nie mam pomysłu jak by go można było wyeliminować :( Mi tam szczerze powiedziawszy on wcale nie przeszkadza i dopiero po tym jak napisałeś to go zauważyłem :D
      Ogólnie najważniejsze jest to że to w ogóle odtwarza dźwięk w całkiem niezłej jakości bo do odtwarzacza mp3 to mu daleko :D

      Odpowiedz
      • do odtwarzania utworów ten trzask nie przeszkadza, lecz do odtwarzania krótkich komunikatów po 2-3 sec (tak jak ja chciałem) to jest już dość mocno zauważalny :)

        a co do tego, że do odtwarzacza mp3 jemu daleko to nie byłbym taki pewien ;)
        skonwertuj sobie utwór na plik *.wav o parametrach próbkowania 32kHz, 8 bit, stereo, i w programie ustaw:

        “HALFRATE” i “STEREO”

        to zobaczysz, że gra całkiem przyjemnie :)

        aha – plików nie trzeba konwertować do tych dziwnych formatów – mogą być normalne pliki *.wav wrzucone na kartę ;) (byle z odpowiednim próbkowaniem)

        i można zrobić nawet 16 bit stereo na tej bibliotece :)

        Odpowiedz
  • “Masz dowód na to że u mnie te trzaski nie są słyszalne”

    faktycznie u Ciebie nie ma tego… hmm… to czemu u mnie są? :/
    kod masz zwykły, standardowy…
    chyba będę musiał uruchomić czytnik kart pamięci i sprawdzić na czytniku, bo aktualnie odtwarzam dźwięki przy pomocy ethernetsheld’a, może to jego wina…

    szum jest, to fakt, ale bez przesadyzmów ;) przynajmniej ja nie jestem jakimś melomanem by mieć bóg wie jaką jakość dźwięku ;)

    dla bardziej zainteresowanych tym tematem to jet strona tej biblioteki gdzie jest więcej opisu:
    http://www.hackerspace-ffm.de/wiki/index.php?title=SimpleSDAudio

    Pozdrawiam ;)

    Odpowiedz
    • Po usłyszeniu Twoich próbek dźwięku zacząłem dociekać w czym leży problem – i znalazłem! :)

      a mianowicie problem leży w… plikach *.wav ;)

      to nieprzekonwertowane na te dziwne formaty pliki .wav tworzą trzaski przy odtwarzaniu – po przekonwertowaniu na .afs czy *.ahs nie słychać żadnych trzasków zarówno na początku jak i na końcu dźwięku :)

      jako, że już wcześniej miałem przygotowane pliki dźwiękowe to korzystałem z nich, a że odtwarzało poprawnie (nie licząc trzasków) to tak zostało :)

      w takim razie odtwarzanie nieskonwertowanych plików *.wav można uznać za ciekawostkę w tym projekcie ;)

      krzxsiek dzięki za lepszą próbkę dźwięku, bo bez niej pewnie bym odpuścił ten pomysł i myślał o kupnie jakiegoś shield’a do odtwarzania w lepszej jakości (ceny ~ 30-50zł) – bez trzasków po prostu, bo jakość z tego układu jest dla mnie odpowiednia – a tak? zdeterminowałeś mnie do szukania błędu – dzięki :)

      Odpowiedz
  • Genialny pomysł, i nawet z tą instrukcją wydaję się “do zrobienia”. Będę próbował w weekend coś pomajsterkować. Przyznam szczerze, że pomysł na dzwonek do drzwi najbardziej mi podchodzi, bo ten mój aktualny to jakiś dziwny jest.

    Odpowiedz
  • “Bardzo łatwo wykonać go samemu chociaż można kupić gotowy moduł.”

    Gdybym jednak chciał wykorzystać gotowy moduł – który masz na myśli i jak wyglądał by schemat oraz połączenia na płytce stykowej?

    Proszę o info – dziękuję :)

    Odpowiedz
    • Powiedz jaki masz moduł. Ale ogólnie podłączenie jest takie samo. Spójrz na kartę SD na obrazku i masz podpisane MISO, MOSI, SCK, CS. Jeśli masz najtańszy moduł z eBay’a lub naszego Allegro (czyli zapewne bez bufora) to musisz tak samo jak tutaj zrobić dzielniki napięcia z rezystorów. Zasilanie podłączasz już bez kondensatora bo w module już powinien być.

      Więc jeśli masz ten po lewej na poniższym obrazku to tak jak pisałem a jeśli ten po prawej to nie musisz wykonywać dzielnika napięcia bo posiada układ dopasowujący poziomy napięć.
      http://www.bajdi.com/wp-content/uploads/2012/01/sd-modules.jpg

      Odpowiedz
    • Z tego co widać to wydaje mi się że ma ale nie jest to dzielnik napięcia tylko normalnie podłączone w szereg a na jednej ze stron nie zalecają takiego podłączania także lepiej kupić ten z prawej albo dać dzielnik napięcia tak jak u mnie.

      Odpowiedz
    • A masz zdjęcie z przodu? Bo jak jest już w module to nie musisz. Ogólnie to sam zobaczysz, jak będą się dziwne rzeczy działy np. będzie przerywał podczas odtwarzania to daj bo to filtruje trochę zakłócenia.

      Odpowiedz
  • Uooo

    Mam złożonego Hackintosha (komputer PC w obudowie od Mac Pro z zainstalowanym Mac OS X). Jedyne co mi do szczęścia brakowało to dźwięk uruchamiania kompa typowy dla Apple’a.
    Teraz już wiem jak to zrobię :)
    Weeeeeeee

    Odpowiedz
  • a mi cały czas wywala błąd, coś robię źle ? : C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:1:21: error: Arduino.h: No such file or directory

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp: In function ‘void SD_L0_Init()’:

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:32: error: ‘OUTPUT’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:32: error: ‘pinMode’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:33: error: ‘HIGH’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:33: error: ‘digitalWrite’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:40: error: ‘INPUT’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:45: error: ‘LOW’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:45: error: ‘digitalWrite’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:47: error: ‘HIGH’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp: In function ‘void SD_L0_DeInit()’:

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:75: error: ‘INPUT’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:75: error: ‘pinMode’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:79: error: ‘HIGH’ was not declared in this scope

    C:UsersMARCELDesktoparduino-0022mkarduino-0022mklibrariesSimpleSDAudiosd_l0.cpp:79: error: ‘digitalWrite’ was not declared in this scope

    Odpowiedz
  • Witam, katuje ten projekt … i karta działa bez problemu jednak dzwięku za nic nie mogę uzyskać … ma ktoś jakieś pomysły ? na leonardo to w ogóle ruszy ? proszę o pomoc ..

    Odpowiedz
    • Miałem ten sam problem z Leonardo. Rozwiązanie jest banalne, aczkolwiek dojście do niego wymagało zajrzenia w kod biblioteki. Wystarczy ustawić pinMode(9, OUTPUT) na początku programu (przykładowego) – i śmiga! :)

      Odpowiedz
  • Swietna sprawa, działa ale przy odgrywaniu dzwięku slychac takie buczenie. Czy ktoś może wie jak się tego pozbyć ? Przy odtwarzaniu tego pliku na komputerze problemu nie ma.

    Odpowiedz
  • Witam. Co zrobić jeśli nie działa? Nie wiem nawet co zrobić bo sprawdziłem połączenia i wszystko ok zasilanie jest masy są i nie gra próbowałem na różne sposoby konwertować i wrzucać pliki nic. Bzyczy chwilkę w głośniku i przestaje. czy karta jest czy jej nie ma. Mam czytnik z LC. soft więc nie dawałem oporników bo ma je na płytce ma też stabilizator ale ja podłączałem 5V i 3v3 i też nic.

    Czy ktoś miał taki przypadek ?

    Pozdrawiam

    Odpowiedz
  • Hej,
    Super tutorial, działa jak marzenie. W moim przypadku to będzie przycisk awaryjny do pracy (odtwarzający refren piosenki Mikromusic- niemiłość 2).
    @up w moim przypadku było tak, że ostatni element czyli rezystor 10k nie łączył, a i na początku nie zmieniłem rozszerzenia w kodzie, bo myślałem, że tylko te z przykładu może być.
    Mam też komentarz do bitrate obsługiwanego. Mój sample audio był pobrany z youtube do wav, przycięty i okazało się że odtwarza się 2X za szybko. Nie znalazłem nic szybkiego do obcięcia pliku, ale po przejrzeniu dokumentacji znalazłem zafixowany bitrate, więc w pliku bat podwoiłem je. Teoretycznie powinno się zwiesić ale tylko odtwarzanie zwolniło – do poziomu normalnego.

    Obecnie będę składał samo arduino z komponentów i dołożę ten projekt.

    Odpowiedz
  • Mam pytanie odnośnie tego rozwiązania. Czy da się zagrać dwa sample np. ding i dong w tym samym czasie? Chodzi mi aby zagrane zostały w taki sposób aby się na siebie nałożyły tak jak ma to miejsce np. podczas odtwarzania dwóch filmów na raz na YouTub’e. Mam fajny pomysł ale musi w tym przypadku to tak zadziałać.

    Odpowiedz
  • Witam
    potrzebowałbym zbudować taki projekt, odtwarzanie dźwięku pliku po wybraniu odpowiedniego przycisku np. z klawiatury lub switcha. Czyli mam arduino + jakiś moduł kart SD + klawiaturę + głośnik. I teraz naciskam klawisz 1 odtwarza mi plik nr1, klawisz 2 odtwarza plik nr.2. W przypadku np. klawiatury membranowej klawisz A to STOP, B -Pauza. Czy to jest do wykonania ? Połączenia pewnie wykonam gorzej z programowaniem :)

    Odpowiedz
  • A można nagrać kilka utworów i dołączyć wyświetlacz żeby ich nazwy wyświetlał i joy`em albo klawiaturą wybierać żądany utwór

    Odpowiedz
    • Tak można w przykładach biblioteki masz pokazane jak wyświetlać utwory znajdujące się na karcie. Resztę powinieneś dać radę zaprogramować samemu

      Odpowiedz
  • Jeszcze lepszą jakość dźwięku można otrzymać po przekonwertowaniu pliku za pomocą Adobe Audition do ośmiobitowego z parametrem Dither Depth 0.7 bit, p.d.f. Triangular, Noise Shaping C3 (dla 31250Hz, dla 62500Hz będzie Noise Shaping E2). Otrzymujemy czysty dźwięk na samych ośmiu bitach (na jednym liczniku tylko) jakości mniej więcej dobrej taśmy magnetofonowej. Przy pracy BRIDGE nie tylko jest głośniej, ale szumy własne od wewnętrznego życia procesorka są mniej uciążliwe.

    Więcej na ten temat w rozdziale “osiem bitów”: http://przypadkiadama.com/151228/index.htm

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?