ماژول DFPlayer Mini و ارتباط با میکروکنترلر AVR

0002-df-player-mini-featured-image

مدتی پیش برای پروژه‌ الکترونیکی، لازم شد که یکسری فایل با فرمت MP3 رو پخش کنم. پروژه برپایه میکروکنترلر Atmega8 از خانواده AVR بود. برای همین به دنبال ماژولی بودم که بتونم با استفاده از میکروکنترلر ارتباط برقرار کنم و همچنین قابلیت اتصال با یک آمپلیفایر رو هم داشته باشه. در نهایت به ماژول DFPlayer Mini رسیدم که هم قابلیت‌هایی رو که میخواستم داشت و هم اینکه قیمتش (۳۴ هزار تومان – امسال) با پروژه سازگار بود.

قابلیت‌های کلیدی ماژول DFPlayer Mini:

  • پشتیبانی از دیکودینگ MP3 و WAV
  • پشتیبانی از سمپل‌ریت‌های ۸KHz, 11.025KHz, 12KHz, 16KHz, 22.05KHz, 24KHz, 32KHz, 44.1KHz, 48KHz
  • خروجی DAC (دیجیتال به آنالوگ) ۲۴ بیت
  • پشتیبانی از سیستم‌فایل FAT16 و FAT32 تا حجم ۳۲ گیگابایت
  • امکان استفاده از microSD و همچنین USB Memory بعنوان فضای ذخیره سازی
  • دو روش کنترل با استفاده از ارتباط سریال و AD key control
  • آمپلیفایر داخلی ۳W
  • پشتیبانی از ۳۰۰۰ فایل موسیقی در فولدر ریشه (root)
  • پشتیبانی از ۱۰۰ فولدر و در هر فولدر حداکثر ۳۰۰۰ فایل موسیقی
  • پشتیبانی از صدای پس‌زمینه (inter-cut advertisements)
  • ۳۰ سطح بلندی صدا قابل تغییر و ۵ سطح اکولایز قابل تغییر

ویژگی‌های جالب و خوبی بودن که کاملا بدرد پروژه من میخورد. پس از اینکه تونستم باهاش با UART RS232 ارتباط برقرار کنم (در ادامه توضیح خواهم داد)، متوجه شدم که توضیحات دستوراتی که نوشته شده بود با چیزی که در عمل پس از ارسال دستور به ماژول میبینم متفاوت هست. بخاطر همین کلی توی اینترنت گشتم و در نهایت به این نتیجه رسیدم که اسم اصلی این ماژول FN-M16P Embedded MP3 Audio Module هست که شرکت Flyron Technology Co., Ltd اونو ساخته و خب شرکت چینی دیگه از روی اون کپی برداری کرده و تولید انبوه کرده و بفروش می‌رسونه. اما دیتاشیتی که ارایه داده کلی مشکل داره و دستوراتی که گفته حتی دستورات تستی که نوشته مشکل دارن و با اون دستورات اصلا نمیتونید ماژول رو راه انداز کنید. در نتیجه باید از دیتاشیت اصلی استفاده کنید و دیتاشیت پر مشکل ارایه شده توسط شرکت کپی کننده رو نادیده بگیرید. هر دو دیتاشیت در آخر پست برای دانلود قرار داده شدن که میتونید اونهارو دانلود کنید. برای این مقاله من از دیتاشیت بدون اشکال و اصلی استفاده کردم.

توی این پست من به اینکه پایه‌های این ماژول چجوری هستن و اینکه چجوری میشه با AD key control اونرو راه‌اندازی کرد نمیپردازم. چون به نظرم توی دیتاشیت اصلی و ناقص کپی شده این موارد رو به خوبی توضیح داده. برای همین به ارتباط سریال با استفاده از میکروکنترلر میپردازم.

همچنین کتابخانه‌ی اپن سورسی برای ارتباط سریال با این ماژول توسط Arduino نوشته شده که میتونید در انتهای پست بهش دستری پیدا کنید.

ارتباط سریال با ماژول DFPlayer Mini

برای ارتباط باید فرمان‌های سریال رو به ماژول ارسال کنید.

فرمان‌های سریال

ساختار فرمان‌های سریال

ساختار کلی فرمان‌های سریال به صورت زیر است:

$S Ver. Number Command Feedback Param_MSB Param_LSB Check_MSB Check_LSB $O // UART Send Command Format

که مفهوم هر کدام از بخش‌های فرمان سریال در زیر آمده است:

بخش مفهوم توضیحات
$S بایت شروع  ۰x7E کلیه‌ی بازخورد‌های فرمان‌ها هم با  ۰x7E شروع میشود
Ver. بایت نسخه ۰xFF اطلاعات نسخه
Number بایت تعداد ۰x06 تعداد بایت‌ها بعد از Number. دو بایت چک‌سام شمرده نمی‌شود.
Command بایت فرمان بایت فرمان که با توجه به جدول بعدی می‌بایست انتخاب شود.
Feedback دریافت‌ بازخورد ۰x01: دریافت بازخورد از میکروکنترلر

۰x00: عدم دریافت بازخورد

Param_MSB بایت پراهمیت پارامتر
Param_LSB بایت کم‌اهمیت پارامتر
Check_MSB بایت پراهمیت چک‌سام
Check_LSB بایت کم‌ا‌همیت چک‌سام
$O بایت پایانی ۰xEF

بطور مثال، اگر بخواهیم به ماژول فرمان بدهیم که از microSD Card اطلاعات را بخواند می‌بایست فرمان زیر را بفرستیم.

7E FF 06 09 00 00 02 FF F0 EF // Set microSD Command With Checksum

چک‌سام ها

قرار دادن چک‌سام برای ارسال فرمان ضروری نیست و میشه بجای دو بایت پرارزش و کم‌ارزش اون مقدار ۰x00 رو ست کرد و فرستاد. اما فرمول کلی محاسبه اون به این صورت هست که مقادیر بخش‌های اولیه فرمان ارسالی بجز بایت شروع ($S) رو با هم جمع میزنی و not اونرو با یک جمع میکنی و توی چک‌سام قرار میدی. یعنی:

Checksum = ~(Ver.+Number+Command+Feedback+Param_MSB+Param_LSB) + 1 // Checksum Calculation Formula

قرارگرفتن چک‌سام ها برای میکروکنترلر‌هایی که از کریستال خارجی استفاده نمی‌کنند توصیه شده. البته من برای بدون کریستال هم بدون چک‌سام فرستام و هیچ مشکلی بوجود نیومد.

بایت‌های فرمان

بایت‌های فرمانی که می‌توانید بجای Command در فرمان سریال جایگذاری کنید و ارسال کنید مطابق جدول زیر است:

فرمان اطلاعات فرمان توضیحات
۰x01 پخش بعدی
۰x02 پخش قبلی
۰x03 مشخص کردن پخش Track مد نظر مقدار: ۱-۳۰۰۰
۰x04 افزایش ولوم صدا
۰x05 کاهش ولوم صدا
۰x06 مشخص کردن ولوم صدا مقدار: ۰-۳۰
۰x07 مشخص کردن اکولایزر ۰: نرمال

۱: پاپ

۲: راک

۳: جَز

۴: کلاسیک

۵: باس

۰x08 مشخص کردن تکرار یک Track مقدار: ۱-۳۰۰۰
۰x09 مشخص کردن محل ذخیره‌سازی فایل‌ها برای پخش ۰: USB

۱: microSD

۰x0A وارد مد Sleep شدن در مد Sleep مصرف توان ماژول به حداقل میرسد.
۰x0B بدون کارایی (رزرو شده)
۰x0C ریست کردن
۰x0D پخش
۰x0E مکث کردن (Pause)
۰x0F مشخص کردن فولدر حاوی Track برای پخش مقدار: ۱-۹۹
۰x10 مشخص کردن امپلی‌فای کردن صدا بایت پرارزش ۱: روشن شدن

بایت کم ارزش: ۰-۳۱ مقدار Gain

۰x11 تکرار پخش کلیه‌ی آهنگ‌ها ۱: شروع

۲: پایان

۰x12 مشخص کردن فولدر MP3 برای پخش
۰x13 پخش صدای پس‌زمینه (inter-cut advertisements)
۰x14 نامشخص
۰x15 متوقف کردن پخش صدای پس‌زمینه و آماده شدن برای پخش فایل دیگر
۰x16 متوقف شدن
۰x17 مشخص کردن پخش تکراری یک فولدر
۰x18 مشخص کردن پخش رندوم
۰x19 مشخص کردن پخش تکراری Track در حال پخش
۰x1A فعال کردن DAC

همچنین میتوان دستورات دریافت اطلاعات (Query) از ماژول را هم فرستاد که در نتیجه آن ماژول اطلاعاتی برای میکروکنترلر بصورت سریال ارسال میکند. این مبحث رو در این مقاله بررسی نمیکنیم.

نمونه‌هایی از فرمان سریال

عنوان فرمان با چک‌سام بدون چک‌سام توضیحات
پخش بعدی ۷E FF 06 01 00 00 00 FE FA EF ۷E FF 06 01 00 00 00 EF
پخش آهنگ در دایرکتوری ریشه ۷E FF 06 03 00 00 0A FE EE EF ۷E FF 06 03 00 00 0A EF پخش آهنگ ۱۰م
مشخص کردن ولوم صدا ۷E FF 06 06 00 00 1E FE D7 EF ۷E FF 06 06 00 00 1E FE D7 EF ولوم ۳۰
مد Sleep ۷E FF 06 0A 00 00 00 FE F1 EF ۷E FF 06 0A 00 00 00 EF

نمونه برنامه با Codevision

پیش‌نیاز

برای ارتباط با ماژول می‌بایست USART میکروکنترلر رو در مد Asynchronous و با Baud Rate 9600 فعال کنید. مطابق کد زیر برای Codevision:

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

سپس باید پایه‌ی TX میکروکنترلر رو به پایه‌ی RX ماژول وصل کنید. البته اگر بصورت مستقیم وصل کنید صدای خارج شده از بلندگو نویز زیادی خواهد داشت. برای همین بهتره یک مقاومت بزرگ (من از ۵ کیلو اهم استفاده کردم) رو وسط اتصال این دو پایه قرار بدید.

نمونه کد

برای نمونه، من کدی رو نوشتم که بتونید با استفاده از اون سه تابع تعیین ولوم صدا، مشخص کردن پخش با تکرار یک Track و مکث کردن Track در حال پخش رو به میکرو ارسال کنید.

در کد ابتدا یک بافر پیشفرض مشخص کردم که درون اون پیشفرض فرمان سریال قرار داده شده. این بافر برای ریست کردن بافر دستور ارسالی استفاده میشه.

int default_buffer[10] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Default Buffer
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

همچنین یک بافر مشخص کردم که هر دستور که می‌خواهیم بفرستیم، درون این بافر ریخته میشه و پس از ارسال دستور به حالت پیشفرض برمی‌گرده.

int buffer_data[10] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Sending Buffer
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

سپس تابع ارسال فرمان سریال که از تابع putchar استفاده میکنه.

// Send Buffer to UART TX Pin
void send_buffer(void) {
int i;
for( i=0; i< 10; i++){
putchar(buffer_data[i]);
buffer_data[i] = default_buffer[i];
}
}
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

و در نهایت سه تابع مدنظر:

  • تابع تعیین ولوم صدا (ولوم صدا ۰ تا ۳۰)

// Set Volume And Send it's Serial Command
void set_volume( int volume ) {
buffer_data[3] = 0x06;
buffer_data[6] = volume;
send_buffer();
}
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

  • تابع پخش با تکرار یک Track

// Set a Track to Play Continuous
void play_current_track_continuous(void) {
buffer_data[3] = 0x08;
buffer_data[6] = current_track_number;
send_buffer();
}
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

  • تابع مکث کردن Track در حال پخش

// Pause Current Playing Track
void pause_current_track() {
buffer_data[3] = 0x0E;
send_buffer();
}
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

سخن آخر

همونطور که در بالا نوشتم، این ماژول یک ماژول بسیار کاربردی هست و امکانات خیلی خوبی هم داره. اما متاسفانه دیتاشیت اصلی ارایه شده توسط کمپانی سازنده پر از اشکال هست. ولی من پس از جستجوی زیاد توی اینترنت و چند روز سروکله زدن با این ماژول تونستم دیتاشیت اصلی و بدون اشکالش رو پیدا کنم و در اختیار شما بزارم.

امیدوارم از این مطلب استفاده کافی رو برده باشید و منتظر نظرات و سوالات شما هستم.

 

پیوست‌ها

پیوست اول

تابع پخش یک آهنگ با توجه به شماره‌ی آهنگ آن اضافه شد. این تابع برای ساختاری قابل استفاده است که آهنگ‌ها را بصورت پشت سر هم در ریشه‌ی فضای ذخیره سازی SD قرار داده باشید. همچنین نام آهنگ‌ها از ۰۰۰۰ شروع شده و تا ۳۰۰۰ ادامه داشته باشه. این تابع خودش مقدار شماره آهنگ رو چک می‌کنه و با توجه به مقدارش بایت‌های پر ارزش و کم ارزش بافر رو می‌سازه.

// Set a Track (1-3000) to Play
void play_track(int track_id) {
buffer_data[3] = 0x03;
if(track_id < 256) {
buffer_data[6] = track_id;
} else {
buffer_data[5] = track_id / 256;
buffer_data[6] = track_id - 256 * buffer_data[6];
}
send_buffer();
}
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

پیوست دوم

تابع پخش یک فایل با مشخص کردن فولدر برای آن اضافه شد. نکته‌ای که وجود داره این هست که با اینکه گفته شده که میشه تا ۳۰۰۰ فایل رو در هر فولدر قرار داد، اما تنها ۲۵۵ فایل اول اون قابل انتخاب برای پخش هست. بخاطر اینکه ما تنها دو بخش در فرمان ارسالی برای مشخص کردن پارامتر‌هامون داریم (Param_MSB و Param_LSB) که خب هرکدوم نهایتا ۲۵۶ مقدار میتونن بگیرن. وقتی میخواییم فولدر رو مشخص کنیم، بایت پر ارزش برای مشخص کردن فولدر استفاده میشه و فقط بایت کم ارزش رو برای مشخص کردن شماره فایل داریم. همچنین چون هم فولدر و هم فایل از شماره‌ی ۱ شروع میشه (برای فولدر ۰۱ و برای فایل درون فولدر ۰۰۱، در نتیجه مقدار شماره فولدر و فایل یکی کم میشه و ۲۵۵ فولدر و ۲۵۵ فایل رو می‌تونیم برای پخش داشته باشیم).

// Set a Folder (1-255) and Track (1-255) to Play
void play_track(int folder_id, int track_id) {
buffer_data[3] = 0x0F;
buffer_data[5] = folder_id;
buffer_data[6] = track_id;
send_buffer();
}
view raw dfplayer_mini_avr.c hosted with ❤ by GitHub

پیوست سوم

برای اینکه بفهمیم که کی ماژول پخش یک فایل رو تموم کرده سه راه وجود داره.

راه‌حل اول: استفاده از وقفه

راه اول که ساده‌تر هست و خود من هم ازش استفاده کردم، استفاده از پایه‌ی BUSY یا پایه‌ی ۱۶ ماژول هست. این پایه وقتی در حال پخش هست Low میشه و وقتی در حالت Standby هست High میشه. باید این پایه رو به یکی از اینتراپت‌های خارجی میکرو وصل کنیم و اون رو روی مد لبه‌ی بالارونده قرار دهیم. اینجوری هربار که از Busy به Standby میریم وقفه ما فراخونی میشه. بعد وقتی میخواییم چندتا فایل رو پشت سر هم پخش کنیم، کافیه ترتیب پخش فایل‌ها و فایلی که در حال حاضر در حال پخش هست رو توی دوتا متغیر ذخیره کنیم. بعد توی کدی که برای وقفه مینویسیم با استفاده از این دوتا متغیر فایل بعدی رو ارسال کنیم. یک مثال بزنم. میخوایمم اعداد ۱ و ۲ و ۳ رو پشت سر هم بخونیم. فرض میگیریم که فایل‌های متناظر با اعداد ۰۰۰۱ و ۰۰۰۲ و ۰۰۰۳ مشخص شده باشند. خب وقتی که میخواییم اولین رو بخونیم، میاییم توی متغیر که برای ترتیب فایل ها برای پخش داریم (که یک آرایه هست) عدد‌های ۱ و ۲ و ۳ (اندیس ۰ تا ۲). بعد فایل اول رو می‌خواییم پخش کنیم. تو یک متغیر دیگه اندیس فایلی که برای پخش داریم میفرستیم رو میزاریم (اینجا ۰). دستور پخش رو میدیدم و منتظر وقفه میشینم. وقتی وقفه اومد اول چک میکنیم که آیا به انتهای آرایه پخش رسیدیم یا نه (اینجا نه). اگر رسیده بودیم که اون دوتا متغییر رو به حالت پیشفرض بر میگردونیم. اگر نه متغییر اندیس رو یکی اضافه میکنیم و از آرایه مقدار متناظر به اندیس رو برای ماژول میفرستیم (اینجا ۲). و همینجور الی آخر….

راه حل دوم: استفاده از داده‌های ارسالی از ماژول

ماژول خودش از طریق پایه‌ی TXاش داده هایی رو برای ما میفرسته. ما باید به این داده‌های ارسالی گوش بدیم و با توجه به اون‌ها کاری که میخواییم رو انجام بدیم. ماژول در هنگام پایان پخش هر فایل دستوراتی رو برای میکرو میفرسته. این دستورات بطور کلی دو دسته هستند. این دو دسته براساس اینکه از کارت SD داره فایل پخش میشه یا از USB ایجاد شدن. مطابق جدول زیر:

معنی داده دریافت شده
فایل با شماره‌ی XX XX از USB پخشش تموم شد. ۷E FF 06 3C 00 XX XX CC CC EF
فایل با شماره‌ی XX XX از کارت SD پخشش تموم شد. ۷E FF 06 3D 00 XX XX CC CC EF

یعنی برای USB مقدار چهارم دستور دریافتی ۳C و برای کارت SD مقدار چهارم برابر ۳D هست. بعد مقادیر ۶ و ۷ام مشخص کننده‌ی شماره‌ی فایلی هست که پخشش تموم شده. بطور مثال اگر فایل اول روی کارت SD پخشش تموم شده باشه این دستور بر‌می‌گرده:

۷E FF 06 3D 00 00 01 CC CC EF

و خب اون دوتا مقدار CC CC هم چک‌سام هستند.

برای اینمورد هم مشابه حالت اول دوتا متغیر تعین کنید ولی بجای منتظر وقفه بودن، منتظر دریافت اطلاعات از سمت ماژول بمونید.

راه‌حل سوم: استفاده از دستورات Query

در این راه حل ما یک دستور Query به ماژول میفرستیم و اون به ما جواب میده. دستوری که می‌فرستیم دستور ۰x42 هست. این دستور برای دریافت وضعیت جاری (Current Status) ماژول هست. دستوری که میفرستیم بصورت زیر هست:

۷E FF 06 42 00 00 00 FE B9 EF

در جواب ماژول چهار تا وضعیت برای ما میفرسته. این وضعیت ها شامل در حال پخش (Playing)، توقف موقت (Paused)، توقف کامل (Stopped) و در مد Sleep بودن هست. برای سه وضعیت اول، بازهم با توجه به اینکه از کارت SD داره استفاده میشه یا از USB مقادیر متفاوتی ارسال میشه. اما حضور در مد Sleep همواره یک مقدار مشخص داره. مقدار ۶‌ام دستور دریافتی مشخص کننده کارت SD و USB و مد Sleep هست. مقدار ۷ام مشخص کننده‌ی وضعیت هست.

مقادیر ممکن برای مقدار ۶ام:

مقدار معنی
۰۱ USB
۰۲ کارت SD
۱۰ مد Sleep

مقادیر ممکن برای مقدار ۷ام:

مقدار معنی
۰۰ حالت توقف کامل (Stopped)
۰۱ حال پخش (Playing)
۰۲ توقف موقت (Paused)

نمونه دستورات دریافتی و معانی اونها:

داده‌ی برگشت داده شده وضعیت متناظر
۷E FF 06 42 00 02 02 xx xx EF یک فایل از USB در حال پخش است.
۷E FF 06 42 00 02 02 xx xx EF یک فایل روی کارت SD بصورت موقت متوقف شده است.
۷E FF 06 42 00 01 00 xx xx EF یک فایل از USB پخشش تمام شده است.
۷E FF 06 42 00 10 00 xx xx EF ماژول در مد Sleep هست.

حالا شما برای فهمیدن اینکه فایل پخشش تموم شده، پس از ارسال فایل اول برای پخش، باید یک حلقه بزارید که مثلا هر ۱۰۰ میلی ثانیه از میکرو وضعیت رو درخواست کنه و اون وضعیت رو چک کنید تا ببینید پخش فایل تموم شده یا نه. و باز مشابه دو روش قبلی ترتیب پخش فایل‌ها و فایلی که در حال پخش هست رو ذخیره کنید و متناظر به اون دستورات جدید رو ماژول بفرستید.

 

آپدیت‌ها

آپدیت اول (۲۰ دی ۹۴): اضافه کردن پیوست اول.

آپدیت دوم(۱۱ اسفند ۹۶): اضافه کردم پیوست دوم.

آپدیت سوم(۱۱ اسفند ۹۶): اضافه کردن پیوست سوم.

آپدیت چهارم(۱۱ اسفند ۹۶): بروز رسانی دیتاشیت بدون مشکل ماژول

آپدیت پنجم(۵ آذر ۹۷): بروز رسانی دیتاشیت بدون مشکل ماژول

 

لینک‌ها

 

29
<i class=icon-comment></i> گفتگو

avatar
15 Comment threads
14 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
16 Comment authors
آرشاحمد دلبریناشناسalirdnناشناس Recent comment authors
  اشتراک  
جدیدترین‌ها قدیمی‌ترین‌ها بیشترین رای
با خبر شدن از
Mohammad reza
مهمان
Mohammad reza

سلام

خیلی خیلی خیلی خیلی مرسی واقا دستت درد نکنه!

میشه لطفا تابع پخش آهنگ با شماره آهنگ رو هم بزاری یا توضیح بدی؟؟

بازم مرسی

MEHDI PADIDEH
مهمان
MEHDI PADIDEH

سلام مهندس خیلی ممنون.مهندس نمونه کد بیسیک میشه بذارین ؟؟

حمید
مهمان
حمید

سلام
من از خروجی DAC_R , DAC_L , GND برای اتصال به اسپیکر کامپیوتر استفاده کردم ولی صدا نویز دارد. آیا مدار یا راه حلی وجود دارد؟؟؟

شهرام
مهمان
شهرام

سلام جناب مهندس، واقعاً از مطالب شما سپاسگذارم. بسیار مفید بود میشه خواهش کنم یکم بیشتر در مورد زبان بسکام توضیح بدین، اینکه واسه راه اندازی ابتدا توی برنامه چه فراخوانی هایی لارم هست و اینکه فرمت دستورات توی بسکام باید چطور باشن؟ مثلاً تصور کنین میخواهیم یک آهنگ را در دایرکتوری اصلی انتخاب و پخش کنیم، با یک ولوم ثابت از پیش تعیین شده.

Rasoul
مهمان
Rasoul

سلام
عاااااااااااااااااااااااااالی
من هم با دیتا شیت سازنده یه روزی سر کار بودم. ولی اطلاعات شما عالی بود . از هدر رفتن بیشتر وقتم جلوگیری کردی.ممنون

mohammad
مهمان
mohammad

سلام با این ماژول میشه سیستم نوبت دهی بانک رو اجرا کرد؟؟؟
مثلا چندتا کلید به عنوان چندتا باجه داشته باشیم
وبا زدن هر کلید شماره ی بعدی اعلام بشه از طریق بلندگو
مثلا بازدن کلید باجه ی یک اعلام بشه””شماره یک به باجه ی یک””
پس از اون با زدن کلید باجه ی ۳ اعلام بشه””شماره ی دو به باجه ی سه””
و الی آخر؟؟؟؟؟؟؟لطفا جواب بدید

محمد
مهمان
محمد

ممنون بابت توضیحات عالی شما .موفق باشید

محسن
مهمان
محسن

ضمن احترام و خسته نباشید.
من در مورد ارسال دیتا و ارتباط برای پخش یا کنترل پخش مشکلی ندارم. لطفا در مورد query ها نمونه کد اگر دارید بگذارید. تو این بخش ماژول احتمالا کمی مشکل داره چون در بیشتر موارد هنگ میکنه.

حسین
مهمان
حسین

با سلام خیلی کاربردی بود .
اگه امکانش هست اون قسمتی که میشه شماره فولدر و شماره ترک رو انتخاب کرد برای پلی کردن رو اضافه کنید عالی میشه
باتشکر.
برنامه کاملا کار کرد.

محمد صادق
مهمان
محمد صادق

سلام تشکر از مطالب خوبتون .
من یک سوال دارم خیلی سعی کردم و برایم مهمه اگه اطلاع دارید لطفا کمک کنید ، می خواهم آهنگ که پخش می شود مدت زمان پخش شده آهنگ را بفهمم تو query هم نگاه کردم . ( مدت زمان فعلی یا کل آهنگ )

سعیدی
مهمان
سعیدی

سلام ممنون بابت سایت عالیتون . جناب دبیری نژاد بنده این ماژول رو با بسکام راه انداختم الان یه مشکلی دارم میخوام یک عددی رو رو مثلا ۱۲۳ رو بعد از دریافت با این ماؤول پخش کنم ولی باید عدد ها رو یکی یکی ظبط وپخش کنم حالا از کجا بدونم ترکی که شماره ۱ رو اعلام میکنه پخش شد و پایان پذیرفت تا ترک مربوط به شماره ۲ رو پخش کنه وبعد از اون شماره ۳ بعضی وقتها شماره ها بعد از یه جمله خاص باید پخش بشه از کجا بدونم ترک جمله پخش شد وتموم شد تا برنامه… ادامه دیدگاه »

ناشناس
مهمان
ناشناس

سلام
خسته نباشید
واقعا کارتون خیلی خیلی خوب و تمیز و دقیق هست
با تشکر از سایت خوبتون

ناشناس
مهمان
ناشناس

سلام و خسته نباشید
در مورد فرمول محاسبه چکسام هر چی محاسبه میکنم درست در نمیاد
اصلا اونی که تو دیتاشیت هست در نمیاد
مشکل از کجاست؟

با تشکر از سایت خوبتون

احمد دلبری
مهمان
احمد دلبری

سلام.ممنون از زحمتهای بی دریغ شما مهندس عزیز.سوال من اینه که برای ضبط صدا هم میشه استفاده کرد ازاین ماژول؟
چ راهکاری هست؟ ممنون

آرش
مهمان
آرش

می خواستم از مطلب خوب وکاملی که گذاشتین تشکر کنم
و یه سوال دارم اینکه این ماژول mp3 تا حداکثر چه کیفیتی رو می تونه پخش کنه ؟
۱۲۸ kbps یا ۲۵۶ یا ۳۲۰ ؟