<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>انجمن های تخصصی برق و الکترونیک ECA - ماژول ها و سنسورهای الکترونیکی و مخابراتی</title>
		<link>https://forum.eca.ir/</link>
		<description />
		<language>fa</language>
		<lastBuildDate>Sat, 14 Nov 2026 22:01:45 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://forum.eca.ir/images/logo/apple-touch-icon.png</url>
			<title>انجمن های تخصصی برق و الکترونیک ECA - ماژول ها و سنسورهای الکترونیکی و مخابراتی</title>
			<link>https://forum.eca.ir/</link>
		</image>
		<item>
			<title>چرا DFPlayer با اسم دلخواه آهنگ ها رو پخش میکنه ولی وقتی به میکرو وصلش میکنیم روی اسم فایل و پوشه گیر میده؟</title>
			<link>https://forum.eca.ir/forum/ماژول-ها-و-سنسورهای-الکترونیکی-و-مخابراتی/سایر-ماژول-ها/1166914-چرا-dfplayer-با-اسم-دلخواه-آهنگ-ها-رو-پخش-میکنه-ولی-وقتی-به-میکرو-وصلش-میکنیم-روی-اسم-فایل-و-پوشه-گیر-میده؟</link>
			<pubDate>Sat, 14 Nov 2026 12:35:13 GMT</pubDate>
			<description>یکی از اون دردسرهای بامزه DFPlayer Mini دقیقا همین جاست 
 
فرض کنید چند تا فایل صوتی داریم با اسم های دلخواه مثل alarm.mp3 و welcome.mp3 و music.mp3...</description>
			<content:encoded><![CDATA[یکی از اون دردسرهای بامزه DFPlayer Mini دقیقا همین جاست<br />
<br />
فرض کنید چند تا فایل صوتی داریم با اسم های دلخواه مثل alarm.mp3 و welcome.mp3 و music.mp3<br />
<br />
فایل ها رو روی کارت حافظه میریزیم و ماژول رو بدون میکروکنترلر راه میندازیم. با کلیدهای Next و Previous هم آهنگ ها یکی یکی پخش میشن و همه چیز مرتبه.<br />
<br />
حالا همون ماژول رو به آردوینو وصل میکنیم و میخوایم با یه فرمان مشخص صدای هشدار رو پخش کنیم.<br />
<br />
اینجاست که ممکنه آهنگ اشتباهی پخش بشه یا اصلا خبری از صدا نباشه!<br />
<br />
آدم اول فکر میکنه مشکل از ارتباط سریال یا برنامه آردوینو هست ولی خیلی وقت ها ماجرا به روش پیدا کردن فایل ها برمیگرده.<br />
<br />
<b>چرا پخش مستقل با هر اسمی کار میکنه؟</b><br />
<br />
ماژول DFPlayer Mini علاوه بر ارتباط UART قابلیت کنترل مستقیم با کلیدهای IO و ADKEY رو هم داره.<br />
<br />
وقتی از کلیدهای Next و Previous استفاده میکنیم ماژول معمولا بین فایل های صوتی شناسایی شده جابه جا میشه.<br />
<br />
برای این کار لازم نیست حتما اسم فایل ها معنی خاصی داشته باشه.<br />
<br />
ماژول اطلاعات فایل ها رو از سیستم فایل کارت حافظه میخونه و میتونه بین اونها حرکت کنه.<br />
<br />
ولی یه نکته مهم وجود داره.<br />
<br />
ترتیب پخش لزوما براساس اسم فایل ها نیست و در بعضی فرمان ها به ترتیب ثبت فایل ها روی کارت حافظه بستگی داره.<br />
<br />
یعنی ممکنه فایلی که اسمش 0001.mp3 هست اولین آهنگ پخش شده نباشه!<br />
<br />
<b>پس وقتی میکروکنترلر وارد ماجرا میشه چی تغییر میکنه؟</b><br />
<br />
در واقع خود ماژول عوض نشده. فقط روش انتخاب آهنگ فرق کرده.<br />
<br />
وقتی از طریق UART فرمان ارسال میکنیم چند روش مختلف برای انتخاب فایل داریم که هر کدوم قواعد خودشون رو دارن.<br />
<br />
مثلا در کتابخانه معروف DFRobotDFPlayerMini فرمان زیر وجود داره.<br />
<br />
myDFPlayer.play(1);<br />
<br />
این فرمان معمولا آهنگ شماره 1 رو براساس ترتیب داخلی فایل های شناسایی شده انتخاب میکنه و الزاما دنبال فایلی با اسم 0001.mp3 نمیگرده.<br />
<br />
پس اگه فایل ها رو با ترتیب متفاوت روی کارت حافظه کپی کرده باشیم ممکنه نتیجه چیزی نباشه که انتظار داریم.<br />
<br />
ولی فرمان زیر داستان متفاوتی داره.<br />
<br />
myDFPlayer.playMp3Folder(1);<br />
<br />
در فریمورهای سازگار این فرمان سراغ پوشه مخصوص MP3 میره و فایل شماره 0001.mp3 رو انتخاب میکنه.<br />
<br />
ساختار فایل ها باید به این شکل باشه.<br />
MicroSD<br />
└── MP3<br />
├── 0001.mp3<br />
├── 0002.mp3<br />
└── 0003.mp3<br />
<br />
حالا اگه بخوایم آهنگ ها رو داخل پوشه های جداگانه قرار بدیم میتونیم از فرمان انتخاب پوشه و فایل استفاده کنیم.<br />
<br />
مثلا<br />
<br />
myDFPlayer.playFolder(1, 2);<br />
<br />
در ماژول های سازگار با این پروتکل یعنی فایل 002.mp3 از پوشه 01 پخش بشه.<br />
<br />
ساختار کارت حافظه هم به این صورت میشه.<br />
MicroSD<br />
├── 01<br />
│ ├── 001.mp3<br />
│ └── 002.mp3<br />
└── 02<br />
├── 001.mp3<br />
└── 002.mp3<br />
<br />
طبق مستندات اصلی DFPlayer در این روش پوشه ها معمولا از 01 تا 99 شماره گذاری میشن و هر پوشه میتونه تا 255 فایل با شماره های سه رقمی داشته باشه.<br />
<br />
<b>یه نکته ریز که حسابی دردسر درست میکنه!</b><br />
<br />
فرض کنید روی کارت حافظه 3 تا آهنگ داریم.<br />
<br />
اول فایل 0003.mp3 رو کپی میکنیم و بعد 0001.mp3 و در آخر 0002.mp3 رو.<br />
<br />
ممکنه وقتی فرمان play با شماره 1 رو میفرستیم فایل 0003.mp3 پخش بشه!<br />
<br />
چون در این روش شماره آهنگ میتونه به ترتیب ثبت فایل ها روی کارت وابسته باشه نه شماره ای که داخل اسم فایل نوشته شده.<br />
<br />
حالا اگه فقط اسم فایل ها رو تغییر بدیم لزوما ترتیب داخلی هم اصلاح نمیشه.<br />
<br />
برای همین یکی از راه های کم کردن خطا اینه که کارت حافظه رو با FAT32 فرمت کنیم و فایل ها رو به ترتیب دلخواه دوباره کپی کنیم.<br />
<br />
البته برای انتخاب دقیق و قابل پیش بینی فایل بهتره از ساختار پوشه و نام گذاری مخصوص فرمان مورد استفاده کمک بگیریم.<br />
<br />
<b>آیا همه DFPlayer Mini ها دقیقا همین رفتار رو دارن؟</b><br />
<br />
اینجا باید حواسمون جمع باشه.<br />
<br />
بردهای مختلفی با اسم DFPlayer Mini توی بازار وجود دارن و ممکنه تراشه و فریمور داخلی اونها متفاوت باشه.<br />
<br />
برای همین پشتیبانی از بعضی فرمان ها و نحوه تفسیر شماره فایل همیشه یکسان نیست.<br />
<br />
حتی ممکنه یه برد با کلیدها کاملا درست کار کنه ولی با یه فرمان خاص از کتابخانه آردوینو نتیجه متفاوتی بده.<br />
<br />
پس اگه اسم گذاری رو درست انجام دادیم و باز هم فایل مورد نظر پخش نشد بهتره سازگاری فرمان و کتابخانه با نسخه ماژول رو هم بررسی کنیم.<img src="https://forum.eca.ir/core/images/smilies/Various-017.png" border="0" alt="" title="Various 017" smilieid="341" class="inlineimg" /><br />
]]></content:encoded>
			<category domain="https://forum.eca.ir/forum/ماژول-ها-و-سنسورهای-الکترونیکی-و-مخابراتی/سایر-ماژول-ها">سایر ماژول‌ها و سنسورهای کاربردی</category>
			<dc:creator>دکتر شیبابا</dc:creator>
			<guid isPermaLink="true">https://forum.eca.ir/forum/ماژول-ها-و-سنسورهای-الکترونیکی-و-مخابراتی/سایر-ماژول-ها/1166914-چرا-dfplayer-با-اسم-دلخواه-آهنگ-ها-رو-پخش-میکنه-ولی-وقتی-به-میکرو-وصلش-میکنیم-روی-اسم-فایل-و-پوشه-گیر-میده؟</guid>
		</item>
		<item>
			<title>چرا CC2541 با گوشی اطلاعات رد و بدل میکنه ولی توی لیست دستگاه های Pair شده دیده نمیشه؟</title>
			<link>https://forum.eca.ir/forum/ماژول-ها-و-سنسورهای-الکترونیکی-و-مخابراتی/ماژول-های-rf-ism-band-و-بلوتوث/1166911-چرا-cc2541-با-گوشی-اطلاعات-رد-و-بدل-میکنه-ولی-توی-لیست-دستگاه-های-pair-شده-دیده-نمیشه؟</link>
			<pubDate>Sat, 14 Nov 2026 12:11:49 GMT</pubDate>
			<description>یکی از عجیب ترین اتفاقاتی که موقع کار با ماژول های BLE ممکنه پیش بیاد اینه که گوشی به ماژول وصل میشه و اطلاعات هم بدون مشکل رد و بدل میشن ولی وقتی...</description>
			<content:encoded><![CDATA[<br />
یکی از عجیب ترین اتفاقاتی که موقع کار با ماژول های BLE ممکنه پیش بیاد اینه که گوشی به ماژول وصل میشه و اطلاعات هم بدون مشکل رد و بدل میشن ولی وقتی وارد تنظیمات بلوتوث گوشی میشیم هیچ خبری از اسم ماژول توی لیست دستگاه های Pair شده نیست!<br />
<br />
اینجاست که آدم با خودش میگه مگه میشه دوتا دستگاه با هم ارتباط داشته باشن ولی Pair نشده باشن؟ ????<br />
<br />
اتفاقا میشه و این موضوع در BLE کاملا طبیعیه.<br />
<br />
<span style="color:#000000"><b>داستان از تفاوت BLE با بلوتوث کلاسیک شروع میشه</b></span><br />
<br />
ماژول CC2541 از Bluetooth Low Energy نسخه 4.0 استفاده میکنه.<br />
<br />
این تراشه برخلاف ماژول هایی مثل HC-05 که با بلوتوث کلاسیک کار میکنن برای ارتباط کم مصرف طراحی شده.<br />
<br />
توی بلوتوث کلاسیک معمولا وقتی گوشی رو به یه ماژول سریال مثل HC-05 وصل میکنیم اول عملیات Pairing انجام میشه و دستگاه توی فهرست دستگاه های جفت شده قرار میگیره.<br />
<br />
اما توی BLE برای برقراری ارتباط و تبادل اطلاعات همیشه نیازی به Pairing نداریم.<br />
<br />
<b><span style="color:#ff0000">پس گوشی چطوری بدون Pair شدن اطلاعات میفرسته؟</span></b><br />
<br />
برای فهمیدن ماجرا باید 3 تا مفهوم رو از هم جدا کنیم.<br />
<br />
اولی Connection هست که یعنی گوشی و ماژول یه ارتباط BLE با هم برقرار کردن.<br />
<br />
دومی Pairing هست که طی اون دو دستگاه درباره روش امنیتی توافق میکنن و در صورت نیاز کلیدهای رمزنگاری ارتباط رو ایجاد میکنن.<br />
<br />
سومی Bonding هست که باعث میشه اطلاعات امنیتی و کلیدهای لازم برای ارتباط های بعدی ذخیره بشن.<br />
<br />
نکته جالب اینجاست که اتصال GATT و تبادل اطلاعات از طریق Characteristic هایی که نیاز به احراز هویت یا رمزنگاری ندارن میتونه بدون Pairing و Bonding انجام بشه.<br />
<br />
یعنی گوشی میتونه به CC2541 متصل بشه و از طریق Read و Write یا Notification اطلاعات بفرسته و دریافت کنه بدون اینکه دستگاه توی فهرست Pair شده ها ثبت بشه.<br />
<br />
پس این رفتار لزوما نشونه خرابی ماژول نیست.<br />
<br />
<span style="color:#ff0000"><b>حالا چرا بعضی وقت ها اسم ماژول توی تنظیمات بلوتوث هم دیده نمیشه؟</b></span><br />
<br />
اینجا باید یه تفاوت دیگه رو هم در نظر بگیریم.<br />
<br />
گوشی های اندرویدی و آیفون برای پیدا کردن دستگاه های BLE از مکانیزم اسکن مخصوص این فناوری استفاده میکنن.<br />
<br />
برنامه هایی مثل nRF Connect میتونن پیام های Advertising ماژول رو اسکن کنن و سرویس ها و Characteristic های اون رو نمایش بدن.<br />
<br />
ولی صفحه تنظیمات بلوتوث گوشی قرار نیست همیشه تمام دستگاه های BLE اطراف رو مثل ماژول های بلوتوث کلاسیک نشون بده.<br />
<br />
بسته به سیستم عامل و نوع دستگاه ممکنه ماژول توی برنامه اسکن BLE دیده بشه ولی توی لیست دستگاه های جفت شده وجود نداشته باشه.<br />
<br />
حتی در بعضی شرایط وقتی برنامه به ماژول وصل شده ممکنه خود ماژول دیگه Advertising قابل اتصال نفرسته و از لیست اسکن هم ناپدید بشه.<br />
<br />
این موضوع رو نباید با قطع شدن ارتباط اشتباه بگیریم.<br />
<br />
<span style="color:#ff0000"><b>چطوری بفهمیم ارتباط واقعا برقرار شده؟</b></span><br />
<br />
برای بررسی بهتر میشه از برنامه nRF Connect استفاده کرد.<br />
<br />
اول ماژول رو روشن میکنیم و با گوشی اسکن BLE انجام میدیم.<br />
<br />
اگه ماژول Advertising داشته باشه و قابل شناسایی باشه باید بتونیم اون رو داخل برنامه پیدا کنیم.<br />
<br />
بعد از اتصال میتونیم سرویس های GATT رو بررسی کنیم و ببینیم کدوم Characteristic قابلیت Read یا Write یا Notification داره.<br />
<br />
اگه اطلاعات از طریق همین بخش ها رد و بدل میشن یعنی ارتباط BLE برقرار شده و لازم نیست حتما اسم ماژول توی فهرست Pair شده های گوشی وجود داشته باشه.<br />
<br />
برای گوشی اندرویدی یه روش دقیق تر هم هست.<br />
<br />
میشه داخل برنامه وضعیت Bonding رو با دستور getBondState بررسی کرد.<br />
<br />
اگه نتیجه BOND_NONE باشه یعنی دستگاه Bond نشده و کلید امنیتی ذخیره شده مشترک نداره.<br />
<br />
اگه نتیجه BOND_BONDED باشه یعنی عملیات Bonding با موفقیت انجام شده.<br />
<br />
جالب اینجاست که ممکنه ارتباط GATT برقرار باشه ولی وضعیت همچنان BOND_NONE باقی بمونه.<br />
<br />
<span style="color:#ff0000"><b>اگه بخوایم CC2541 حتما Pair بشه باید چیکار کنیم؟</b></span><br />
<br />
اینجا همه چیز به فریمور ماژول بستگی داره.<br />
<br />
خود تراشه CC2541 از امکانات امنیتی BLE و مکانیزم Pairing و Bonding پشتیبانی میکنه ولی اینکه ماژول آماده ما این قابلیت ها رو چطور پیاده سازی کرده باشه به برنامه داخلی اون مربوط میشه.<br />
<br />
مثلا در فریمورهای مبتنی بر استک Texas Instruments تنظیماتی برای فعال کردن Bonding و تعیین روش Pairing وجود داره.<br />
<br />
اما نباید فرض کنیم تمام بردهای CC2541 موجود در بازار دقیقا از دستورات AT ماژول HM-10 پشتیبانی میکنن.<br />
<br />
برای همین اگه هدف پروژه ذخیره اطلاعات جفت سازی یا برقراری ارتباط رمزنگاری شده باشه باید اول فریمور ماژول شناسایی بشه و مشخص بشه قابلیت Bonding و تنظیمات امنیتی اون در دسترس هست یا نه.<br />
<br />
در ضمن Pair شدن به تنهایی به معنی امن بودن کامل تبادل اطلاعات نیست. سطح امنیت به روش احراز هویت و تنظیمات رمزنگاری هم بستگی داره.<br />
<br />
<b>یه نکته مهم برای پروژه های اندروید و iOS</b><br />
<br />
اگه داریم یه اپلیکیشن اختصاصی برای ارتباط با CC2541 مینویسیم بهتره از API مخصوص BLE استفاده کنیم.<br />
<br />
در اندروید این کار معمولا با BluetoothGatt انجام میشه و در iOS از CoreBluetooth استفاده میکنیم.<br />
<br />
برای پیدا کردن و اتصال به ماژول هم نباید صرفا به لیست دستگاه های Pair شده تکیه کنیم.<br />
<br />
مخصوصا در پروژه هایی که فقط قراره اطلاعات سنسور دریافت بشه یا چند فرمان کنترلی ارسال کنیم ممکنه اصلا نیازی به Bonding نداشته باشیم.<br />
<br />
البته اگه اطلاعات حساس باشن یا بخوایم فقط گوشی های مجاز به دستگاه دسترسی داشته باشن باید امنیت ارتباط رو جداگانه طراحی کنیم.]]></content:encoded>
			<category domain="https://forum.eca.ir/forum/ماژول-ها-و-سنسورهای-الکترونیکی-و-مخابراتی/ماژول-های-rf-ism-band-و-بلوتوث">ماژول های RF - ISM Band و بلوتوث</category>
			<dc:creator>دکتر شیبابا</dc:creator>
			<guid isPermaLink="true">https://forum.eca.ir/forum/ماژول-ها-و-سنسورهای-الکترونیکی-و-مخابراتی/ماژول-های-rf-ism-band-و-بلوتوث/1166911-چرا-cc2541-با-گوشی-اطلاعات-رد-و-بدل-میکنه-ولی-توی-لیست-دستگاه-های-pair-شده-دیده-نمیشه؟</guid>
		</item>
	</channel>
</rss>
