YX5200-MP3 Çözücü ve Oynatıcı Çip.

Yayınlandı: 09 Aralık 2017 / İncelemeler
Etiketler:, , , , , , , , ,

MP3 – MPEG 1 Audio Layer III  90’lı yılların sonlarında, henüz walkman’lerimizle gezindiğimiz ve tüm günü tek kasete sığan 15 tane parçayı  dinleyerek geçirdiğimiz zamanlarda tanıştığımız mükemmel ötesi bir kavramdı. MP3 formatındaki müzikler çok az elektronik hafıza kaplıyor ve bir cd’ye yüzlerce MP3 sığabiliyordu.  Daha sonra birden çakmak cebine sığabilen MP3 oynatıcılar piyasaya çıkmaya başladı ve neredeyse herkesin elinde bu cihazlardan bir tane görmek mümkündü o günlerde. Daha sonra Cep telefonlarının ve flash disklerin yaygınlaşmaya başlamasıyla binlerce MP3 formatında müzik parçasını aynı anda yanımızda taşıyabilir, arabamızda CD veya Kaset taşıma derdinden kurtulur hale geldik.  Kısacası MP3 artık günlük hayatımızda sıklıkla kullandığımız kelimelerden birisi oldu.  Normalde bir albüm  CD’si  15 civarı parça alabilirken nasıl oluyorda yüzlerce MP3 bir CD’ye sığabiliyor. MP3 bir parça, CDDA formatındaki bir albüm parçasının 10 katından daha küçük bir boyutta olabilmektedir. Peki bu MP3 parçalar nasıl oluyorda bu kadar küçük boyutlu olabiliyor? MP3 aslında frekans sıkıştırmayla elde edilen bir formattır. Örneğin 2 khz 5 sn’lik bi ses 44100hz stereo örneklemeyle yüksek boyutlar kaplamakteyken bunu 2 khz-5sn  gibi kodlarsak çok daha küçük bir boyut elde etmiş oluruz. Ayrıca insan kulağının algılayamayacağı frekanslardaki sesler de atlanarak boyut iyice düşürülebilir.  Fakat bu kodları çözerken aynı frekansları elde etmek zor olduğu için kayıplar meydana gelir ve ses kalitesinde azalmalar yaşanır. Eğer çok dikkatli bir müzik dinleyicisi değilseniz bu kayıpları farketmeyebilirsiniz.

Son günlerde seslendirme sistemleriyle ilgilenmeye başladığımdan, aliexpress’te gezinirken gözüme YX5200 çipi çarptı ve vaad ettiklerini okuyunca ve uygun fiyatını görünce sipariş ettim. (2.35$)  YX5200 MP3 ve WAV dosyalarını oynatabiliyor. Harici DAC çıkışları da mevcut. Yalnız şunu belirteyim ki datasheet’i çince veya japonca olduğu için detaylı bilgilere erişmek pek mümkün değil.  Eğer Japonca veya Çince bilmiyorsanız internette gezinen bilgilerle idare etmek zorundasınız. Ben de bulabildiğim PDF dosyalarını derleyerek kendime notlar çıkardım ve bu çipi kullanıp SD karta yüklediğim MP3 dosyalarını çaldırabildim.

YX5300 (YX5200) Catalex Modül

Benim satın almış olduğum modülün üzerindeki çipte YX5200 yazıyor fakat internette YX5300 diye satılıyor. Bu da ayrı bir karmaşaya sebep oluyor.

Çip UART üzerinden gönderilen komutlarla kontrol ediliyor.  Bağlantısı VCC(5V), RX,TX ve GND pinlerinden oluşmakta.  Modül üzerinde bulunan microSD kart yuvasına takabileceğimiz hafıza kartları aracılığı ile MP^dosyalarımızı oynatabiliyoruz. Hafıza kartının Fat16 veya Fat32 formatında biçimlendirilmesi gerekiyor.  Daha sonra kart içerisine “01” isminde bir klasör açıp içerisine MP3 dosyalarımızı “001-xxx.mp3”, “002-xxx.mp3” şeklinde isimlendirerek  kaydediyoruz. İstersek 02, 03 gibi farklı klasörler oluşturup onlara da farklı MP3 dosyaları kaydedebiliriz.

MP3 dosyalarının hafıza kartına kaydedilmesi

Gelelim UART komutlarına. Komutlar hexadesimal olarak  “7E FF 06 01 00 00 00 EF” şeklinde.  0x7E başlangıç, 0xFF versiyon, 0x06 başlangıç ve bitiş hariç veri uzunluğu (6 byte), 0x01 komut (01 komutu-sıradaki şarkı), 0x00 geribesleme yok (0x01 olursa geri besleme gelir modülden) ve ardarda gelen iki byte 0 ise veri, 0xEF ise bitiş anlamlarına gelmektedir. Aşağıdaki tabloda komut örnekleri gösterilmiştir.

Şunu da belirtmeden geçmeyeyim; YX5200 bana çok stabil bir çip gibi gelmedi. Bazen SD kartı tanımakta zorlandı ve hata mesajları gönderdi. Bir kaçkez enerji kesip tekrar verince ve kartı çıkartıp takınca düzeldi. Belki de benim elime geçen modülde temassızlık gibi bir durum söz konusu olabilir. Piyasada bir kaç farklı tipte modül mevcut. Gördüğüm kadarıyla butonlarla kontrol edilebilen varyasyonları da mevcut. Bir tane de farklı yapıda bir modül alıp daha detaylı test gerçekleştireceğim çiple ilgili daha iyi bir kanıya varabilmek adına.  Modül bir kez kartı tanıdıktan sonra sıkıntısız çalışmaya başlıyor. Enerji keslip tekrar verilse de hatasız çalışmaya devam ediyor.  Bu arada 32GB’a kadar microSD kartları desteklediğini belirteyim.  Fakat bu çiple teorik olarak en fazla 255 klasör açıp, her klasörde en fazla  255 mp3 dosyası bulundurabilirsiniz. Bu da toplamda 255*255=65025 farklı MP3 dosyası oynatabileceğinizi gösterir.  Lafı fazla uzatmadan uygulamanın kodlarına geçelim. Uygulamayı Nodemcu ile yaptım ve 2 adet seri port kullandım. TX0 ve RX0 uçlarını 57600 baudrate ile PC iletişimi için kullanırken, TX1(D4-GPIO2) ucunu modül ile haberleşmek için kullandım. Modülden veri almayı tercih etmediğim için modülün TX ucu boşta kaldı.  Yaptığım uygulama ile PC’den, hafıza kartındaki “01” klasörünün içerisinde bulunan MP3 dosyalarını kontrol ettim. Kodlar aşağıdadır:


/************ Komutlar***********************/
#define CMD_NEXT 0X01 // Sıradaki Parça
#define CMD_PREV 0X02 // Önceki Parça
#define CMD_PLAYN 0X03 // Klasör ve dosya numarasıyla çal (Örn: 01/001.mp3 ==> 0x0101)
#define CMD_VOL_UP 0X04 // Sesi arttır
#define CMD_VOL_DOWN 0X05 // Sesi azalt
#define CMD_SET_VOL 0X06 // Sesi ayarla(0-30)
// 0x07 // Kullanılmıyor.
#define CMD_PLAY_SLOOP 0X08 // Single loop play.

#define CMD_SEL_DEV 0X09 // Kaynağı ayarla. 2 DEV_TF (SD Card)
#define CMD_SLEEP_MODE 0X0A // Uyku moduna geç
#define CMD_WAKE_UP 0X0B // Uyan
#define CMD_RESET 0X0C // Resetle

#define CMD_PLAY 0X0D // Başlat
#define CMD_PAUSE 0X0E // Duraklat
#define CMD_STOP_PLAY 0X16 // Durdur
#define CMD_FOLDER_CYCLE 0X17 // Dosyadaki tüm parçaları sırasıyla sürekli oynat(Cycle)

//#define CMD_PLAY_SHUFFLE 0x18 // Kullanılmıyor

#define CMD_SET_SNGL_CYCL 0X19 // Sürekli aynı parçayı döndür.
#define CMD_SET_DAC 0X1A // DAC çıkışını ayarla
#define DAC_ON 0X00 // DAC çıkışını aktif et
#define DAC_OFF 0X01 // DAC çıkışını kapat.

#define CMD_PLAY_W_VOL 0X22 // Sesi ayarlayıp istenilen parçayı çaldır (Örn: 0x1E01 ==> Sesi 30 yap ve 1. parçayı çaldır (0x1E = 30))

// Query Commands
#define CMD_PLAYING_N 0x4C // Çalan dosyayı döndürür
#define CMD_QUERY_STATUS 0x42 // Durum bilgilerini döndürür
#define CMD_QUERY_VOLUME 0x43 // Ses seviyesini döndürür
#define CMD_QUERY_FLDR_TRACKS 0x4E // Ses dosyası barındıran klasörlerin sayısını döndürür
#define CMD_QUERY_TOT_TRACKS 0x48 // Toplam dosya sayısını döndürür
#define CMD_QUERY_FLDR_COUNT 0x4F // Toplam klasör sayısını döndürür
/************ Opitons **************************/
#define DEV_TF 0X02 // TF Kartı tanımlayan numara

char Tampon[8] = {0} ;
char sayac=0;

void Komut_gonder(int komut, int veri)
{
char i=0;
delay(20);
Tampon[0] = 0x7e; //Başlangıç
Tampon[1] = 0xff; //versiyon
Tampon[2] = 0x06; //Başlangıç ve bitiş byteları hariç toplam gönderilecek byte sayısı.
Tampon[3] = komut; //
Tampon[4] = 0x00;//0x00 = Geri besleme yok , 0x01 = Geri besleme isteniyor.
Tampon[5] = (int)(veri >> 8); //data MSB
Tampon[6] = (int)(veri); //data LSB
Tampon[7] = 0xef; //Bitiş
for(i=0; i<8; i++)//
{
Serial1.write(Tampon[i]);
}
}

void setup()
{
Serial1.begin(9600);
Serial.begin(57600);
delay(500); // Çip kurulumu için bir miktar bekle..
Komut_gonder(CMD_SEL_DEV,DEV_TF);// Kaynak olarak TF kartı belirledik.
delay(100);
Komut_gonder(CMD_SET_VOL, 0x0018);// Sesi 24 olarak belirledik
}

void loop()
{
if (Serial.available())
{
char gelen = Serial.read();
if(gelen=='d')
{
Komut_gonder(CMD_STOP_PLAY, 0x0000);// Müziği durdur
Serial.println("Durdu");
}
if(gelen=='b')
{
Komut_gonder(CMD_FOLDER_CYCLE, 0X0100);// 01 isimli klasördeki parçaları döndürmeye başla
Serial.println("Basladi");
}
if(gelen=='>')
{
Komut_gonder(CMD_NEXT, 0X0000); //Sıradaki parça
Serial.println("Siradaki Parca");
}

if(gelen=='<')
{
Komut_gonder(CMD_PREV, 0X0000);//Önceki parça
Serial.println("Onceki Parca");
}

if(gelen=='+')
{
Komut_gonder(CMD_VOL_UP, 0X0000); // Sesi arttır
Serial.println("Ses +");
}

if(gelen=='-')
{
Komut_gonder(CMD_VOL_DOWN, 0X0000); // Sesi azalt
Serial.println("Ses -");
}

if(gelen=='p')
{
sayac++; // Sayacı arttır
if(sayac==1)//eğer sayaç 1 ise
{
Komut_gonder(CMD_PAUSE, 0X0000);// Parçayı duraklat
Serial.println("Duraklatildi.");
}
if(sayac==2)// eğer sayac 2 ise
{
Komut_gonder(CMD_PLAY, 0X0000); // Parçayı kaldığı yerden oynat
Serial.println("Devam ediliyor.");
sayac=0;
}
}


}

}

Yaptığım uygulamanın terminal görüntüsü ise aşağıdaki gibidir;

Umarım faydalı bir yazı olmuştur. İyi çalışmalar.

 

 

 

 

Yorum bırakın