Pengantar
JQ6500 adalah sebuah modul MP3 decoder atau MP3 Player yang dapat dikontrol secara manual melalui beberapa tombol atau dikontrol dengan program melalui protokol komunikasi serial UART.
Jika menggunakan komunikasi serial UART dengan Mikrokontroller atau Arduino dengan level operasi tegangan 5V maka harus ditambahkan resistor 1K yang dihubungkan pada pin Tx Arduino / Mikrokontroller dengan pin Rx JQ6500.
Jika menggunakan Arduino atau Mikrokontroller yang dioperasikan pada level tegangan 3.3V maka pin Tx Arduino / Mikrokontroller bisa langsung dihubungkan dengan Rx JQ6500 tanpa perlu menambahkan resistor 1K.
Jika menggunakan JQ6500 yang dikontrol dengan tombol manual maka modul JQ6500 bisa berfungsi secara independen tanpa menggunakan Mikrontroller atau Arduino karena pada JQ6500 sudah tersedia memory internal FLASH sebesar 2MB yang bisa digunakan untuk menyimpan file musik atau audio dan support langsung dihubungkan ke speaker 3W 8 Ohm pada mode Mono / Left Channel.
Selain memory internal, pada modul JQ6500 juga support penggunaan Micro SD Card namun hanya khusus pada tipe JQ6500-28P, sedangkan pada tipe JQ6500-16P tidak tersedia feature Micro SD Card.
Terdapat 2 model JQ6500 yang ada dipasaran yaitu :
1. JQ6500-28P
Module JQ6500-28P support penggunaan Micro SD Card sebagai media penyimpanan file audio atau musik dengan kapasitas sampai 32G dengan 100 folder dan 1000 files. Disarankan memberi nama foldernya 00 – 99 dan filenya 001.mp3 – 999.mp3 untuk memudahkan pengurutan lagu / musik nya.
JQ6500-28P mempunyai pin dengan jumlah 28 sesuai nama modulnya.
2. JQ6500-16P
Sesuai namanya JQ6500-16P yaitu model JQ6500 yang mempunya 16 pin. Seperti yang bisa dilihat pada kedua gambar model JQ6500, pin yang ada pada model JQ6500-28P namun tidak tersedia pada JQ6500-16P yaitu
- DM
- DP
- NXT / VOL+
- PRV / VOL-
- VPP / IR
- PLAY MODE
- SRC
- PL / PAUSE
Untuk mengetahui fungsi masing-masing pin di atas, silahkan buka dan pelajari link yang kami berikan pada akhir artikel ini. Pada artikel tersebut, dikupas lebih mendalam terkait modul JQ6500.
Spesifikasi JQ6500
Berikut ini adalah spesifikasi dari JQ6500 :
- Supported Sampling Rates KHz: 8/11.025/12/16/22.05/24/32/44.1/48
- 24 bit DAC output
- 90dB, 85dB SNR Support
- Support FAT16, FAT32, TF Card atau MicroSD
- Flash memory size 2MB
- Pause function
- 30 Levels of Volume adjustment
- 10 EQ Levels
- Push Button Mode to select audio to play.
Upload File Musik / Audio ke Modul JQ6500
1. Menggunakan Memory Internal
- Tancapkan modul JQ6500 ke PC atau Laptop menggunakan kabel USB
- JQ6500 akan dikenali sebagai sebuah CD ROM Drive, kemudian klik dengan mouse untuk melihat isi dari CD ROM tersebut
- Sebuah file aplikasi uploader “MusicDownload.exe” ada di dalam CD ROM tersebut, kemudian double klik untuk menjalankannya
- Aplikasi Uploader tersebut berbahasa china tetapi tidak perlu khawatir karena cukup beberapa klik untuk mengoperasikannya.
- Klik tab kedua dari kiri
- Klik tombol yang ada pada tab tersebut
- Sebuah open file dialog akan muncul, pilih file yang akan diupload
- Klik tombol Open
- Klik tab yang pertama atau yang kiri
- Klik tombol pada tab tersebut untuk Upload file yang sebelumnya sudah dipilih
2. Menggunakan Micro SD Card
- Penggunaan Micro SD Card untuk media penyimpanan file musik hanya untuk JQ6500-28P. Cara menyimpan filenya tinggal copy dan paste ke dalam SD Card. Untuk memudahkan pengurutan file, disarankan memberi nama folder : 00 – 99 dan nama file : 001.mp3 – 999.mp3
Hardware Yang Dibutuhkan
Adapun kebutuhan hardware pada tutorial pemakaian modul JQ6500 untuk MP3 Player kali ini antara lain :
1. Jika Menggunakan Kontrol Manual dengan Tombol / Button Melalui ADKEY
- Modul JQ6500
- Speaker 1W / 2W / 3W 8 Ohm
- Beberapa Push Button untuk kontrol
- Beberapa Resistor
- Beberapa kabel dan kabel jumper F – F / M – F
2. Jika Menggunakan Full Kontrol dengan Program Arduino
- Modul JQ6500
- Arduino UNO / Arduino Nano / Arduino Pro Mini
- Speaker 1W / 2W / 3W 8 Ohm
- Resistor 1K jika Arduino beroperasi pada level tegangan 5V
- Beberapa kabel jumper F – F / M – F
Rangkaian / Wiring Diagram
Pertama solder speaker dengan kabel dan sambungkan ke modul JQ6500 pin SPK+ dan SPK-.
1. Jika Menggunakan Kontrol Manual dengan Tombol / Button Melalui ADKEY
- Buat rangkaian yang dihubungkan ke pin ADKEY untuk tombol kontrol seperti terlihat pada gambar berikut :
- Tombol / Button Kontrol One – Five pada rangkaian diatas bisa diganti dengan button yang langsung dihubungkan ke pin K1 – K5 dan GND.
2. Jika Menggunakan Full Kontrol dengan Program Arduino
JQ6500 | Arduino |
Rx | Melalui resistor 1K ke pin 9 untuk Arduino yang beroperasi pada level tegangan 5V. Langsung ke pin 9 jika Arduino beroperasi pada tegangan 3.3V |
Tx | pin 8 |
VCC | VCC (5V / 3.3V) |
GND | GND |
Contoh Program JQ6500 Menggunakan Arduino
Sebelumnya download terlebih dahulu library JQ6500 untuk Arduino DISINI atau DISINI. Setelah didownload, ekstrak lalu copy dan paste ke dalam folder library dari Arduino IDE. Setelah itu buka contoh program yang ada pada library tersebut atau copy dan paste sketch program sederhana berikut :
#include <Arduino.h> #include <SoftwareSerial.h> #include <JQ6500_Serial.h> // Create the mp3 module object, // Arduino Pin 8 is connected to TX of the JQ6500 // Arduino Pin 9 is connected to one end of a 1k resistor, // the other end of the 1k resistor is connected to RX of the JQ6500 // If your Arduino is 3v3 powered, you can omit the 1k series resistor JQ6500_Serial mp3(8,9); void setup() { mp3.begin(9600); mp3.reset(); mp3.setVolume(20); mp3.setLoopMode(MP3_LOOP_ALL); mp3.play(); } void loop() { // Do nothing, it's already playing and looping :-) }
Atau contoh program full kontrol berikut :
#include <Arduino.h> #include <SoftwareSerial.h> #include <JQ6500_Serial.h> // Create the mp3 module object, // Arduino Pin 8 is connected to TX of the JQ6500 // Arduino Pin 9 is connected to one end of a 1k resistor, // the other end of the 1k resistor is connected to RX of the JQ6500 // If your Arduino is 3v3 powered, you can omit the 1k series resistor JQ6500_Serial mp3(8,9); void setup() { // put your setup code here, to run once: Serial.begin(9600); mp3.begin(9600); mp3.reset(); statusAndHelpOutput(); } void loop() { byte b; if(Serial.available()) { b = Serial.read(); switch(b) { case 'p': Serial.println("Play"); mp3.play(); return; case 'r': Serial.println("Restart"); mp3.restart(); return; case ' ': Serial.println("Pause"); mp3.pause(); return; case '>': Serial.println("Next"); mp3.next(); return; case '<': Serial.println("Prev"); mp3.prev(); return; case ']': Serial.println("Next Folder"); mp3.nextFolder(); return; case '[': Serial.println("Prev Folder"); mp3.prevFolder(); return; case '+': Serial.println("Vol +"); mp3.volumeUp(); return; case '-': Serial.println("Vol -"); mp3.volumeDn(); return; case 'm': Serial.println("Vol 0"); mp3.setVolume(0); return; case 'v': { char volBuff[10]; memset(volBuff, 0, sizeof(volBuff)); Serial.readBytesUntil('\n',volBuff, sizeof(volBuff)-1); mp3.setVolume(max(0,min(30, atoi(volBuff)))); Serial.print("Vol "); Serial.println(max(0,min(30, atoi(volBuff)))); } return; case 'e': { do { while(!Serial.available()); // Wait b = Serial.read(); if(b != ' ') break; // Allow "e N" or "eN" etc... } while(1); Serial.print("Equalizer "); switch(b) { case 'N': Serial.println("Normal"); mp3.setEqualizer(MP3_EQ_NORMAL); break; case 'P': Serial.println("Pop"); mp3.setEqualizer(MP3_EQ_POP); break; case 'R': Serial.println("Rock"); mp3.setEqualizer(MP3_EQ_ROCK); break; case 'J': Serial.println("Jazz"); mp3.setEqualizer(MP3_EQ_JAZZ); break; case 'C': Serial.println("Classic"); mp3.setEqualizer(MP3_EQ_CLASSIC); break; case 'B': Serial.println("Bass"); mp3.setEqualizer(MP3_EQ_BASS); break; } } return; case 'l': { do { while(!Serial.available()); // Wait b = Serial.read(); if(b != ' ') break; // Allow "e N" or "eN" etc... } while(1); Serial.print("Loop "); switch(b) { case 'A': Serial.println("All"); mp3.setLoopMode(MP3_LOOP_ALL); break; // Plays the tracks one after another and repeats case 'F': Serial.println("Folder"); mp3.setLoopMode(MP3_LOOP_FOLDER); break; // Loop within folder case 'O': Serial.println("One (repeat playing same file)"); mp3.setLoopMode(MP3_LOOP_ONE); break; // | These seem to do the same, repeat the same track over and over case 'R': Serial.println("??? - Don't know what it means exactly, in the datasheet it is \"RAM\""); mp3.setLoopMode(MP3_LOOP_RAM); break; //- case 'N': case 'S': Serial.println("None (play file and stop)"); mp3.setLoopMode(MP3_LOOP_ONE_STOP); break; // Default, plays track and stops } } return; case 's': { do { while(!Serial.available()); // Wait b = Serial.read(); if(b != ' ') break; // Allow "e N" or "eN" etc... } while(1); Serial.print("Source "); switch(b) { case 'S': Serial.println("SD Card (if available)."); mp3.setSource(MP3_SRC_SDCARD); break; case 'B': Serial.println("on board memory.");mp3.setSource(MP3_SRC_BUILTIN); break; } } return; case 'f': { char fnumBuff[10]; memset(fnumBuff, 0, sizeof(fnumBuff)); Serial.readBytesUntil('\n',fnumBuff, sizeof(fnumBuff)-1); unsigned int fnum = strtoul(fnumBuff, NULL, 10); Serial.println(); Serial.print("Play file #"); Serial.print(fnum); Serial.println(F(" (if it exists).")); mp3.playFileByIndexNumber(fnum); // 48 == ord('0') return; } return; case 'F': { char fnumBuff[10]; memset(fnumBuff, 0, sizeof(fnumBuff)); Serial.readBytesUntil('/',fnumBuff, sizeof(fnumBuff)-1); unsigned int folnum = strtoul(fnumBuff, NULL, 10); memset(fnumBuff, 0, sizeof(fnumBuff)); Serial.readBytesUntil('\n',fnumBuff, sizeof(fnumBuff)-1); unsigned int fnum = strtoul(fnumBuff, NULL, 10); fnum = max(1,min(fnum, 999)); folnum = max(1,min(folnum, 99)); Serial.print("Play "); if(folnum < 10) Serial.print('0'); Serial.print(folnum); Serial.print('/'); if(fnum < 10) Serial.print("00"); else if(fnum < 10) Serial.print('0'); Serial.print(fnum); Serial.println(".mp3 (if it exists)."); mp3.playFileNumberInFolderNumber(folnum, fnum); // 48 == ord('0') } return; case '?': statusAndHelpOutput(); return; case 'S': Serial.println("Sleep"); mp3.sleep(); return; case 'z': Serial.println("Reset"); mp3.reset(); return; } } static unsigned long m = millis(); if(millis() > 1000 && m < (millis() - 1000)) { if((mp3.getStatus() == MP3_STATUS_PLAYING)) { Serial.print(F("Playing, Current Position: ")); Serial.print(mp3.currentFilePositionInSeconds()); Serial.print(F("s / ")); Serial.print(mp3.currentFileLengthInSeconds()); Serial.println('s'); } m = millis(); } } void statusAndHelpOutput() { Serial.println(); Serial.println(F("JQ6500 MP3 Player Demo")); Serial.println(F("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")); Serial.print(F("Status : ")); switch(mp3.getStatus()) { case MP3_STATUS_STOPPED: Serial.println(F("Stopped")); break; case MP3_STATUS_PLAYING: Serial.println(F("Playing")); break; case MP3_STATUS_PAUSED: Serial.println(F("Paused")); break; } Serial.print(F("Volume (0-30) : ")); Serial.println(mp3.getVolume()); Serial.print(F("Equalizer : ")); switch(mp3.getEqualizer()) { case MP3_EQ_NORMAL: Serial.println(F("Normal")); break; case MP3_EQ_POP: Serial.println(F("Pop")); break; case MP3_EQ_ROCK: Serial.println(F("Rock")); break; case MP3_EQ_JAZZ: Serial.println(F("Jazz")); break; case MP3_EQ_CLASSIC: Serial.println(F("Classic")); break; case MP3_EQ_BASS: Serial.println(F("Bass")); break; } Serial.print(F("Loop Mode : ")); switch(mp3.getLoopMode()) { case MP3_LOOP_ALL: Serial.println(F("Play all tracks, then repeat.")); break; case MP3_LOOP_FOLDER: Serial.println(F("Play all tracks in folder, then repeat.")); break; case MP3_LOOP_ONE: Serial.println(F("Play one track then repeat (loop track).")); break; case MP3_LOOP_RAM: Serial.println(F("Unknown function exactly, seems to play one track then repeat?")); break; case MP3_LOOP_ONE_STOP: Serial.println(F("Play one track then stop.")); break; } Serial.println(); Serial.print(F("# of On Board Memory Files : ")); Serial.println(mp3.countFiles(MP3_SRC_BUILTIN)); Serial.print(F("\"Current\" On Board Memory File Index: ")); Serial.println(mp3.currentFileIndexNumber(MP3_SRC_BUILTIN)); Serial.println(); Serial.print(F("# of SD Card Files : ")); Serial.println(mp3.countFiles(MP3_SRC_SDCARD)); Serial.print(F("# of SD Card Folders : ")); Serial.println(mp3.countFolders(MP3_SRC_SDCARD)); Serial.print(F("\"Current\" SD Card File Index: ")); Serial.println(mp3.currentFileIndexNumber(MP3_SRC_SDCARD)); Serial.print(F("\"Current\" SD Card File Name : ")); char buff[120]; mp3.currentFileName(buff, sizeof(buff)); Serial.println(buff); Serial.println(); Serial.println(F("Controls (type in serial monitor and hit send): ")); Serial.println(F("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")); Serial.println(F("? Display this menu.\n")); Serial.println(F("p Play\t\t> Next\t\t< Prev\n[space] Pause\tr Restart from start of file\n] Next folder\t[ Prev folder\n")); Serial.println(F("f[1-65534] Play file by (FAT table) index number\nF[01-99]/[001-999].mp3 Play [001-999].mp3 in folder [01-99]\n")); Serial.println(F("+ Vol up\t- Vol down\tm Mute\nv[0-30] Set volume\n\ne[N/P/R/J/C/B] Equalizer (N)ormal, (P)op, (R)ock, (J)azz, (C)lassic, (B)ass\nl[A/F/O/R/N] Loop (A)ll, (F)older, (O)ne, (R)???, (N)o Loop\ns[S/B] Switch to (S)D Card/(B)uilt In Memory\n\n")); }
Jika ingin mempelajari JQ6500 secara lebih mendalam diantaranya :
- Mempelajari fungsi pin tambahan pada JQ6500-28P
- Trouble Shooting apabila tidak bisa upload file musik ke dalam memory internal
- Ingin mempelajari protokol komunikasi serial JQ6500
- Ingin membuat Library JQ6500 sendiri
Silahkan buka dan pelajari artikel berikut :
Selain module JQ6500, ada modul lainnya yang bisa digunakan sebagai MP3 Player yang cukup mudah, murah, bagus dan support penggunaan Micro SD Card yaitu DFPlayer Mini. Untuk mempelajari modul DFPlayer Mini, silahkan buka artikel berikut :
Demikian tutorial membuat MP3 Player dengan JQ6500 baik dengan kontrol tombol manual maupun full kontrol dengan program Arduino.
+++++ Semoga Bermanfaat +++++
Leave a Reply