YX5300 UART Control Serial MP3 Music Player Module For Arduino/AVR/ARM/PIC
ID: 128
Kategorie: Audio
Menge: 0
Position:

UART MP3 Player z układem YX5300

JeÅ›li już szukaÅ‚eÅ› w miarÄ™ taniego moduÅ‚u potrafiÄ…cego odtwarzać pliki dźwiÄ™kowe MP3 lub WAV, to zapewne  musiaÅ‚eÅ› siÄ™ trochÄ™ zawieść. Owszem, sÄ… dostÄ™pne dość drogie shieldy do Arduino lub o wiele taÅ„sze moduÅ‚y, które niestety nie oferujÄ… zbyt wiele w zamian. Mnie osobiÅ›cie brakowaÅ‚o czegoÅ› poÅ›redniego - nie drogiego, ale również nie okrojonego do granic możliwoÅ›ci.

PrzeglÄ…dajÄ…c ebay, natrafiÅ‚em na bardzo ciekawy moduÅ‚ MP3 bazujÄ…cy na ukÅ‚adzie YX5300 z komunikacjÄ… UART w cenie zaledwie 6$ z darmowÄ… wysyÅ‚kÄ….

Cechy YX5300

Pewnie zadajesz sobie pytanie, co może potrafić moduÅ‚ za 6 dolców? Wbrew pozorom - caÅ‚kiem sporo. UkÅ‚ad YX5300, który zostaÅ‚ zastosowany w tym module wyróżnia siÄ™ nastÄ™pujÄ…cymi cechami:

  • ObsÅ‚uga czÄ™stotliwoÅ›ci próbkowania 8kHz - 48kHz
  • Odtwarzanie plików MP3 / WAV
  • ObsÅ‚uga kart Micro SD i MIcro SDHC
  • 30 poziomów gÅ‚oÅ›noÅ›ci
  • Sterowanie UART TTL / 9600bps
  • NapiÄ™cie zasilania 3.2V - 5.2V
  • Poziomy logiczne 3.3V i 5V
  • ObsÅ‚uga folderów
  • Odtwarzanie pojedyncze lub w pÄ™tli (pliku lub folderu)
  • Tryb uÅ›pienia 10mA
  • Sporo komend sterujÄ…cych

Wysyłanie polecenia UART

Pewnie zadajesz sobie pytanie, co może potrafić moduÅ‚ za 6 dolców? Wbrew pozorom - caÅ‚kiem sporo. UkÅ‚ad YX5300, który zostaÅ‚ zastosowany w tym module wyróżnia siÄ™ nastÄ™pujÄ…cymi cechami:

0 1 2 3 4 5 6 7 8 9
0x7E 0xFF 0x06 CMD FBACK DAT1 DAT2 SUM1 SUM2 0xEF
  • 0x7E - bajt poczÄ…tkowy
  • 0xFF - wersja
  • 0x06 - dÅ‚ugość polecenia, nie liczÄ…c bajtu poczÄ…tkowego i koÅ„cowego
  • CMD - polecenie
  • FBACK - czy chcemy odpowiedź 0x00 (nie) lub 0x01 (tak)
  • DAT1, DAT2 - parametry
  • SUM1, SUM2 - suma kontrolna
  • 0xEF - bajt koÅ„czÄ…cy

Najbardziej kłopotliwe okazuje się wyliczenie sumy kontrolnej SUM1 i SUM2, jednak jest możliwe pominięcie tego mechanizmu, pomijając je po prostu przy wysyłaniu (nie zmieniając wartości określającej długość polecenia)

Zatem możemy wysÅ‚ać tylko 8 bajtów :

0 1 2 3 4 5 6 7
0x7E 0xFF 0x06 CMD FBACK DAT1 DAT2 0xEF

Komendy UART

ModuÅ‚ oferuje sporo ciekawych komend, za pomocÄ… których bÄ™dziemy mogli sterować ukÅ‚adem. DostÄ™pne sÄ… wszystkie podstawowe akcje jak pauza, play, stop, ustawienie gÅ‚oÅ›noÅ›ci. Dodatkowo jednak dostajemy sporo innych ciekawych poleceÅ„, które bez wÄ…tpienia przydadzÄ… siÄ™ w naszych projektach - tryb uÅ›pienia, tasowanie listy odtwarzania, zapÄ™tlanie utworu lub katalogu, czy sterowanie DAC. Nie wiem jak Wam, ale mnie ta "szeÅ›cio dolarowa" lista bardzo odpowiada:

CMD DAT1 DAT2 Opis
0x0C 0x00 0x00 Reset układu. Wymagana przerwa 500ms
0x09 0x00 0x02 Wybierz noÅ›nik odtwarzania TF. Wymagana przerwa 200ms
0x03 0x00 0x03 Odtwarzaj 3 plik
0x08 0x00 0x03 Odtwarzaj w pÄ™tli 3 plik
0x0F 0x02 0x01 Odtwarzaj 1 plik w 2 folderze
0x22 0x1E 0x04 Odtwarzaj 4 plik z gÅ‚oÅ›noÅ›ciÄ… 30 = 1E
0x17 0x02 0x00 Odtwarzaj pÄ™tle dla utworów w 2 folderze
0x18 0x00 0x00 Przetasowanie utworów
0x19 0x00 0x00 Włącz pętle dla obecnie odtwarzanego utworu
0x19 0x00 0x01 Wyłącz pętle dla obecnie odtwarzanego utworu
0x01 0x00 0x00 NastÄ™pny utwór
0x02 0x00 0x00 Poprzedni utwór
0x0E 0x00 0x00 Pauza
0x0D 0x00 0x00 Wznów odtwarzanie
0x16 0x00 0x00 Zatrzymaj odtwarzanie
0x04 0x00 0x00 Vol+
0x05 0x00 0x00 Vol-
0x06 0x00 0x1E Ustaw poziom gÅ‚oÅ›noÅ›ci na 30 = 1E
0x0A 0x00 0x00 Uśpienie układu (Sleep mode)
0x0B 0x00 0x00 Budzenie układu (Wake up)
0x1A 0x00 0x00 WÅ‚Ä…cz DAC
0x1A 0x00 0x01 Wyłącz DAC

Oprócz standardowych poleceÅ„ ukÅ‚ad zwraca również odpowiedzi na specjalne zapytania lub informuje nas o specyficznych zdarzeniach, jak wÅ‚ożenie karty pamiÄ™ci, zakoÅ„czeniu odtwarzania utworu i jego numerze itp:

CMD Odpowiedź Opis
-- 0x7E 0xFF 0x06 0x41 0x00 0x00 0x00 0xFE 0xBA 0xEF Dane odebrane prawidÅ‚owo
-- 0x7E 0xFF 0x06 0x3A 0x00 0x00 0x02 0xFE 0xBF 0xEF WÅ‚ożono kartÄ™ pamiÄ™ci TF
-- 0x7E 0xFF 0x06 0x3B 0x00 0x00 0x02 0xFE 0xBE 0xEF WyjÄ™to noÅ›nik pamiÄ™ci TF
-- 0x7E 0xFF 0x06 0x40 0x00 0x00 0x06 0xFE 0xB5 0xEF BÅ‚Ä…d - nie odnaleziono pliku
-- 0x7E 0xFF 0x06 0x3D 0x00 0x00 0x04 0xFE 0xBA 0xEF ZakoÅ„czono odtwarzać plik 4
0x42 0x7E 0xFF 0x06 0x42 0x00 0x02 0x00 0xFE 0xB6 0xE Stan odtwarzacza - zatrzymany (stop)
0x42 0x7E 0xFF 0x06 0x42 0x00 0x02 0x01 0xFE 0xB6 0xE Stan odtwarzacza - odtwarza (play)
0x42 0x7E 0xFF 0x06 0x42 0x00 0x02 0x02 0xFE 0xB6 0xE Stan odtwarzacza - wstrzymany (pauza)
0x48 0x7E 0xFF 0x06 0x48 0x00 0x00 0x07 0xFE 0xAC 0xEF Znaleziono 7 plików
0x4C 0x7E 0xFF 0x06 0x4C 0x00 0x00 0x04 0xFE 0xAB 0xEF Aktualnie odtwarzany 4 plik
0x4F 0x7E 0xFF 0x06 0x4F 0x00 0x00 0x02 0xFE 0xAA 0xEF Znaleziono 2 foldery
0x43 0x7E 0xFF 0x06 0x43 0x00 0x00 0x1E 0xFE 0x99 0xEF Aktualny poziom gÅ‚oÅ›noÅ›ci 30 = 1F

Struktura plików na karcie pamiÄ™ci

Aby sprawnie odtwarzać pliki dźwiÄ™kowe z karty SD, zalecana jest struktura katalogów w formacie dwucyfrowym. Nawet jeÅ›li planujemy tylko jednÄ… playlistÄ™, warto trzymać jÄ… w folderze "01". Nazwy plików powinny mieć format jak poniżej, czyli kolejny numer trzycyfrowy i opcjonalna nazwa pliku. PrzestrzegajÄ…c tych zasad, w prosty sposób odtworzymy sprecyzowany przez nas plik MP3:

  1. bash-4.2$ tree

  2. .

  3. ├── 01

  4. │   ├── 001-blue-piano.mp3

  5. │   └── 002-gettin-ready.mp3

  6. ├── 02

  7. │   ├── 001-ukulele-in-my-heart.mp3

  8. │   ├── 002-inspiring-innovation.mp3

  9. │   └── 003-thanks-for-the-memories.mp3

  10. └── 03

  11.     ├── 001-a-hero-is-born.mp3

  12.     └── 002-lullaby.mp3

WysÅ‚anie poniższej komendy, spowoduje odtworzenie pliku  001-ukulele-in-my-heart.mp3 z folderu 02.

 0 1 2 3  4  5 6 7
0x7E 0xFF 0x06 0x0F 0x00 0x02 0x01 0xEF

Możliwe jest również wskazanie absolutnego numeru pliku do odtworzenia, niezależnie od folderu w którym siÄ™ znajduje. Należy jednak pamiÄ™tać, że moduÅ‚ nie sortuje zawartoÅ›ci katalogów, wiÄ™c jego struktura z punktu ukÅ‚adu wyglÄ…da tak:

  1. bash-4.2$ tree -U

  2. .

  3. ├── 01

  4. │   ├── 001-blue-piano.mp3

  5. │   └── 002-gettin-ready.mp3

  6. ├── 02

  7. │   ├── 003-thanks-for-the-memories.mp3

  8. │   ├── 002-inspiring-innovation.mp3

  9. │   └── 001-ukulele-in-my-heart.mp3

  10. └── 03

  11.     ├── 002-lullaby.mp3

  12.     └── 001-a-hero-is-born.mp3

Jak widzimy, trzecim utworem absolutnym jest 003-thanks-for-the-memories.mp3 zamiast spodziewanego 001-ukulele-in-my-heart.mp3. Aby odtworzyć plik o absolutnym numerze od poczÄ…tku listy, należy wysÅ‚ać polecenie:

0 1 2 3 4 5 6 7
0x7E 0xFF 0x06 0x03 0x00 0x00 0x03 0xEF

Przykładowy program

  1. #include

  2.  

  3. SoftwareSerial mp3(5, 6);

  4.  

  5. static uint8_t cmdbuf[8] = {0};

  6.  

  7. void command(int8_t cmd, int16_t dat)

  8. {

  9.   delay(20);

  10.  

  11.   cmdbuf[0] = 0x7e; // bajt startu

  12.   cmdbuf[1] = 0xFF; // wersja

  13.   cmdbuf[2] = 0x06; // liczba bajtow polecenia

  14.   cmdbuf[3] = cmd;  // polecenie

  15.   cmdbuf[4] = 0x00; // 0x00 = no feedback, 0x01 = feedback

  16.   cmdbuf[5] = (int8_t)(dat >> 8); // parametr DAT1

  17.   cmdbuf[6] = (int8_t)(dat); //  parametr DAT2

  18.   cmdbuf[7] = 0xef; // bajt konczacy

  19.  

  20.   for (uint8_t i = 0; i < 8; i++)

  21.   {

  22.     mp3.write(cmdbuf[i]);

  23.   }

  24. }

  25.  

  26. void setup()

  27. {

  28.   Serial.begin(9600);

  29.   mp3.begin(9600);

  30.  

  31.   delay(500); // Czekamy 500ms na inicjalizacje  

  32.  

  33.   command(0x09, 0x0002); // Wybieramy karte SD jako zrodlo

  34.   delay(200); // Czekamu 200ms na inicjalizacje

  35.  

  36.   command(0x06, 0x001E); // Ustaw glosnosc na 30

  37.   command(0x03, 0x0001); // Otwarzamy pierwszy utwor (kolejnosc nieposortowana)

  38. }

  39.  

  40. void loop() { }

Odtworzenie pliku o absolutnym numerze wcale nie gwarantuje, że bÄ™dzie odtworzony ten, który oczekujemy na podstawie posortowanej listy. Dlatego najlepiej skorzystać z polecenia, podajÄ…c nazwÄ™ folderu i nazwÄ™ pliku w postaci poczÄ…tkowego numeru:

  1. void setup()

  2. {

  3.   Serial.begin(9600);

  4.   mp3.begin(9600);

  5.  

  6.   delay(500); // Czekamy 500ms na inicjalizacje  

  7.  

  8.   command(0x09, 0x0002); // Wybieramy karte SD jako zrodlo

  9.   delay(200); // Czekamu 200ms na inicjalizacje

  10.  

  11.   command(0x06, 0x001E); // Ustaw glosnosc na 30

  12.   command(0x0F, 0x0201); // Jesli chcemy miec pewnosc ze bedzie to 02/001?????.mp3

  13. }

Powyższy fragment programu spowoduje, że zostanie odtworzony plik 001-ukulele-in-my-heart.mp3 w folderze 02/. Jednak będzie to odtworzenie tylko tego utworu. Aby zapętlić odtwarzanie całego folderu 02/ wystaczy wydać inne polecenie:

  1. void setup()

  2. {

  3.   Serial.begin(9600);

  4.   mp3.begin(9600);

  5.  

  6.   delay(500); // Czekamy 500ms na inicjalizacje  

  7.  

  8.   command(0x09, 0x0002); // Wybieramy karte SD jako zrodlo

  9.   delay(200); // Czekamu 200ms na inicjalizacje

  10.  

  11.   command(0x06, 0x001E); // Ustaw glosnosc na 30

  12.   command(0x17, 0x0200); // Odtwarzaj w petli folder 02/

  13. }

Obsługa odpowiedzi układu

ModuÅ‚ wysyÅ‚a również komunikaty i odpowiedzi na poszczególne polecenia i zdarzenia. Poniższy program wykrywa wÅ‚ożenie i wyciÄ…gniÄ™cie karty pamiÄ™ci. Dodatkowo zostanie odtworzony w pÄ™tli folder 02/ gdy karta zostanie wÅ‚ożona.

  1. #include

  2.  

  3. SoftwareSerial mp3(5, 6);

  4.  

  5. static uint8_t cmdbuf[8] = {0};

  6. static uint8_t ansbuf[10] = {0};

  7.  

  8. void command(int8_t cmd, int16_t dat)

  9. {

  10.   delay(20);

  11.  

  12.   cmdbuf[0] = 0x7e; // bajt startu

  13.   cmdbuf[1] = 0xFF; // wersja

  14.   cmdbuf[2] = 0x06; // liczba bajtow polecenia

  15.   cmdbuf[3] = cmd;  // polecenie

  16.   cmdbuf[4] = 0x00; // 0x00 = no feedback, 0x01 = feedback

  17.   cmdbuf[5] = (int8_t)(dat >> 8); // parametr DAT1

  18.   cmdbuf[6] = (int8_t)(dat); //  parametr DAT2

  19.   cmdbuf[7] = 0xef; // bajt konczacy

  20.  

  21.   for (uint8_t i = 0; i < 8; i++)

  22.   {

  23.     mp3.write(cmdbuf[i]);

  24.   }

  25. }

  26.  

  27. // Funkcja upiekszajaca hex

  28. void byte2hex(uint8_t b)

  29. {

  30.   Serial.print("0x");

  31.   if (b < 16) Serial.print("0");

  32.   Serial.print(b, HEX);

  33.   Serial.print(" ");

  34. }

  35.  

  36. // Funkcja pobierania odpowiedzi

  37. boolean answer(void)

  38. {

  39.   uint8_t i = 0;

  40.  

  41.   // Pobieramy tylko 10 bajtow

  42.   while(mp3.available() && (i < 10))

  43.   {

  44.     uint8_t b = mp3.read();

  45.     ansbuf[i] = b;

  46.     i++;

  47.     byte2hex(b);

  48.   }

  49.  

  50.   Serial.println();

  51.  

  52.   // Jesli poprawny format odpowiedzi

  53.   if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF))

  54.   {

  55.     return true;

  56.   }

  57.  

  58.   return false;

  59. }

  60.  

  61. void setup()

  62. {

  63.   Serial.begin(9600);

  64.   mp3.begin(9600);

  65.  

  66.   delay(500); // Czekamy 500ms na inicjalizacje  

  67.   command(0x09, 0x0002); // Wybieramy karte SD jako zrodlo

  68.   delay(200); // Czekamu 200ms na inicjalizacje

  69. }

  70.  

  71. void loop()

  72. {

  73.   if (mp3.available())

  74.   {

  75.     if (answer()) // Jesli jest poporawna odpowiedz

  76.     {

  77.       if (ansbuf[3] == 0x3A) // Jesli wlozono kart

  78.       {

  79.         Serial.println("Wlozono karte");

  80.         command(0x17, 0x0100); // Odtwarzaj w petli folder 01/

  81.       }

  82.       if (ansbuf[3] == 0x3B) // Jesli wyciagnieto kart

  83.       {

  84.         Serial.println("Wyciagnieto karte");

  85.       }      

  86.     }

  87.   }

  88. }

OczywiÅ›cie to tylko przykÅ‚ad, bowiem możemy jeszcze odpytać moduÅ‚ o ilość plików i folderów na karcie pamiÄ™ci lub sprawdzać, czy moduÅ‚ aktualnie odtwarza utwór oraz pobrać jego absolutny numer.

  1. #include

  2.  

  3. SoftwareSerial mp3(5, 6);

  4.  

  5. static uint8_t cmdbuf[8] = {0};

  6. static uint8_t ansbuf[10] = {0};

  7.  

  8. unsigned long int last = 0;

  9.  

  10. void command(int8_t cmd, int16_t dat)

  11. {

  12.   delay(20);

  13.  

  14.   cmdbuf[0] = 0x7e; // bajt startu

  15.   cmdbuf[1] = 0xFF; // wersja

  16.   cmdbuf[2] = 0x06; // liczba bajtow polecenia

  17.   cmdbuf[3] = cmd;  // polecenie

  18.   cmdbuf[4] = 0x00; // 0x00 = no feedback, 0x01 = feedback

  19.   cmdbuf[5] = (int8_t)(dat >> 8); // parametr DAT1

  20.   cmdbuf[6] = (int8_t)(dat); //  parametr DAT2

  21.   cmdbuf[7] = 0xef; // bajt konczacy

  22.  

  23.   for (uint8_t i = 0; i < 8; i++)

  24.   {

  25.     mp3.write(cmdbuf[i]);

  26.   }

  27. }

  28.  

  29. // Funkcja upiekszajaca hex

  30. void byte2hex(uint8_t b)

  31. {

  32.   Serial.print("0x");

  33.   if (b < 16) Serial.print("0");

  34.   Serial.print(b, HEX);

  35.   Serial.print(" ");

  36. }

  37.  

  38. // Funkcja pobierania odpowiedzi

  39. boolean answer(void)

  40. {

  41.   uint8_t i = 0;

  42.  

  43.   // Pobieramy tylko 10 bajtow

  44.   while(mp3.available() && (i < 10))

  45.   {

  46.     uint8_t b = mp3.read();

  47.     ansbuf[i] = b;

  48.     i++;

  49.     byte2hex(b);

  50.   }

  51.  

  52.   Serial.println();

  53.  

  54.   // Jesli poprawny format odpowiedzi

  55.   if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF))

  56.   {

  57.     return true;

  58.   }

  59.  

  60.   return false;

  61. }

  62.  

  63. void setup()

  64. {

  65.   Serial.begin(9600);

  66.   mp3.begin(9600);

  67.  

  68.   delay(500); // Czekamy 500ms na inicjalizacje  

  69.   command(0x09, 0x0002); // Wybieramy karte SD jako zrodlo

  70.   delay(200); // Czekamu 200ms na inicjalizacje

  71.  

  72.   command(0x17, 0x0100); // Odtwarzaj w petli folder 01/

  73.  

  74.   last = millis();

  75. }

  76.  

  77. void loop()

  78. {

  79.   if (mp3.available())

  80.   {

  81.     if (answer()) // Jesli jest poporawna odpowiedz

  82.     {

  83.       if (ansbuf[3] == 0x4C) // Aktualnie odtwarzany

  84.       {

  85.         Serial.print("Aktualnie odtwarzam plik: ");

  86.         Serial.println(ansbuf[6]);

  87.       }

  88.     }

  89.   }

  90.  

  91.   if ((millis() - last) > 5000) // Pytamy co 5 seknud

  92.   {

  93.     last = millis();

  94.     command(0x4C, 0x0000); // Zapytaj o numer odtwarzanego pliku

  95.   }

  96. }

Materiał filmowy

 

 

 


Support sampling frequency (kHz):8 / 11.025 / 12 / 16 / 22.05 / 24 / 32 / 44.1 / 48
Support file format:MP3/WAV
Support Micro SD card, Micro SDHC Card
30 class adjustable volume
UART TTL serial control playback mode, baud rate is 9600bps
Power supply can be 3.2 ~ 5.2VDC
Size:43mm x 25mm