آموزش آردوینو جلسه دوم
بصورت پروژه محور با ربات NK-100
در جلسه اول با برد آردوینو Nano و نحوه کار با پایههای ورودی و خروجی دیجیتال و ورودی آنالوگ آشنا شدیم. در این جلسه تصمیم داریم به بهانه سخنگو کردن ربات NK-100 به نحوه کار با پورت سریال مجازی و ماژول پخش صدای DF Player بپردازیم.
ماژول DFPlayer mini یک ماژول فشرده ٥ ولت برای پخش فایلهای صوتی MP3 میباشد که می توان کارت حافظه فرمت شده با FAT16 یا FAT32 با ظرفیت حداکثر ٣٢ گیگابایت را به آن متصل کرد. این ماژول ٥ ولت بوده و دارای آمپلیفایر داخلی است. ماژول DF Player را می توان بدون آردوینو نیز راهاندازی کرد و امکان اتصال کلید به پایههای آن وجود دارد. با این حال ما در این پروژه از پورت سریال استفاده میکنیم و با سرعت ٩٦٠٠ بیت در ثانیه به ماژول متصل میشویم.
سخت افزار:
ماژول DFPlayer یک برد ١٦ پایه است که فقط از پایههای بلندگو، تغذیه و RX و TX آن استفاده میکنیم. این ماژول مطابق نقشه زیر به برد آردوینو متصل میشود. پایههای TX و RX ماژول به دو پایه دیجیتال دلخواه از برد آردوینو متصل میشود و بعنوان یک نکته مهم وجود مقاومت یک کیلو اهم روی پایه RX ماژول ضروری است. اگر از این مقاومت استفاده نکنید صدای نویز بسیار زیادی از بلندگوی ماژول پخش میشود.
ما برد DFPlayer را مطابق نقشه پایین به آردوینو نانو متصل کردهایم. پایههای ١٠ و ١١ آردوینو بعدا در برنامه بعنوان پروت سریال مجازی باز میشود. تغذیه این ماژول نیز ٥ ولت بوده و برای پخش صدا میتوان یک بلندگوی استاندارد ٨ اهم را به پایههای SPK_1 و SPK_2 متصل نمود.
در شکل زیر نیز جایگذاری ماژول Mini DFPlayer در داخل ربات NK-100 نوین کیت مشاهده میشود. ماژول با یک قطعه پلاستیک به پشت بلندگو متصل شده است.
نصب کتابخانه DFPlayer
برای ارتباط با این ماژول نیاز به ارسال کدهای دستوری پیچیدهای است که برای راحتتر شدن کار از کتابخانه DFRobotDFPlayerMini.h استفاده میکنیم. برای نصب این کتابخانه مطابق شکل زیر از منوی Sketch روی Include Library و سپس Manage Libraries کلیک کرده و در پنجره باز شده در فیلد جستسجو عبارت DFRobotDFPlayerMini را تایپ و اینتر میکنیم. پس از این که کتابخانه DFRobotDFPlayerMini نمایان شد با کلیک بر روی Install آن را نصب مینماییم.
کدنویسی:
بعد از نصب کتابخانه نوبت به کدنویسی میرسد. قبل از کدنویسی چند فایل MP3 با بیتریت حداکثر 48kbps داخل یک مموری کارت میکرو SD ذخیره کرده و مموری را داخل ماژول قرار دهید. ما از نرمافزار خریداری شده و اورجینال آریانا فایل از شرکت عصر گویش پرداز برای ایجاد فایلهای صوتی استفاده میکنیم و از نوشتههای فارسی خروجی MP3 میگیریم.
کتابخانه DFRobotDFPlayerMini بر اساس نام فایل کار نمیکند بنابراین اسم فایل مهم نیست، اما ترتیب کپی فایل مهم است. یعنی اولین فایلی که داخل مموری کپی میکنید بعنوان فایل شماره یک شناخته میشود و فایل بعدی فایل شماره دو، الی آخر. بنابراین بجای کپی کردن یکباره فایلها سعی کنید فایلها را یکییکی داخل موری کپی کنید تا بتوانید ترتیب فایلها را بخاطر بسپارید.
برای کار با این ماژول کدهای زیر را داخل کامپایلر Arduino وارد کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
const int LED = 2; #include <SoftwareSerial.h> #include "DFRobotDFPlayerMini.h" SoftwareSerial mySoftwareSerial(10, 11); // RX, TX DFRobotDFPlayerMini myDFPlayer; void setup() { // put your setup code here, to run once: pinMode(LED,OUTPUT); digitalWrite(LED,HIGH); Serial.begin(9600); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); mySoftwareSerial.begin(9600); if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while(true); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms //----Set volume---- myDFPlayer.volume(30); //Set volume value (0~30). 20 is good //----Set different EQ---- myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); //----Set device we use SD as default---- myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); } void loop() { // put your main code here, to run repeatedly: myDFPlayer.play(1); delay(2000); myDFPlayer.play(2); delay(2000); } |
در خط اول برای پایه شماره ٢ آردوینو را که در سخت افزار ربات NK-100 به LED چشمها و دهان ربات متصل شده یک نام مستعار به اسم LED تعریف کردهایم و در واقع ثابتی به نام LED ایجاد کردهایم که مقدار آن را برابر با ٢ قرار دادهایم و برای روشن کردن چشمها و دهان ربات استفاده میشود.
در خط بعدی کتابخانه SoftwareSerial.h را اضافه کردهایم. با توجه به اینکه ماژول DFPlayer به پورت سریال متصل میشود با استفاده از این کتابخانه میتوانیم روی هریک از پایههای دیجیتال آردوینو یک پورت سریال مجازی دلخواه باز کنیم. (پورت سریال اصلی آردوینو برای پروگرم کردن برد استفاده میشود و نباید به ماژول دیگری متصل شود)
در خط بعد کتابخانه DFRobotDFPlayerMini.h اضافه شده است. این کتابخانه شامل توابع کاربردی برای کار با ماژول پخش صدای DF Player است.
در خط بعدی با دستور SoftwareSerial mySoftwareSerial(10, 11) یک پورت سریال مجازی به نام mySoftwareSerial روی پایه های ١٠ و ١١ آردوینو باز می کنیم. آرگومان اول یعنی پایه ١٠ آردوینو بعنوان RX و آرگومان دوم یعنی پایه ١١ آردوینو بعنوان TX تعریف میشود. خاطر نشان میشود که در ارتباطات سریال باید پایه RX آردوینو به پایه TX ماژول و پایه TX آردوینو با یک مقاومت یک کیلو اهم (در این ماژول) به پایه RX ماژول متصل شود.
با دستور DFRobotDFPlayerMini myDFPlayer یک شی به نام myDFPlayer از کلاس اصلی یعنی کلاس DFRobotDFPlayerMini میسازیم. با توجه به اینکه زبان اصلی آردوینو C++ میباشد از تکنولوژی شیگرایی استفاده میکند.
در تابع Setup دستورات زیر تقریبا تکراری هستند و در جلسه قبل با آنها آشنا شدهاید:
1 2 3 4 5 6 7 |
pinMode(LED,OUTPUT); digitalWrite(LED,HIGH); Serial.begin(9600); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); mySoftwareSerial.begin(9600); |
دستور اول و دوم برای تعیین پایه متصل به LED به عنوان خروجی و روشن کردن آن بکار میرود. دستور بعدی پورت سریال اصلی را با سرعت یا باود ٩٦٠٠ باز میکند و در سه خط بعدی هم ابتدا یک خط خالی و سپس عباراتی روی ترمینال آردوینو چاپ میشود که دلخواه بوده و نشان دهندهی شروع کار ماژول DF Player است. در خط بعدی نیر پورت سریال مجازی متصل به ماژول با سرعت ٩٦٠٠ باز میشود.
نکتهای که در دستورات printLn این جلسه تازگی دارد وجود تابع F() در داخل تابع پرینت است. وقتی از این تابع استفاده کنیم رشتهها در فضای حافظه Flash نوشته شده و SRAM میکرو اِشغال نمیشود. اما در صورتی که رشته را مستقیم در داخل PrintLn بنویسیم رشته مورد نظر داخل SRAM میکرو کپی میشود و باعث مصرف حافظه رم میگردد. اگر در برنامه دچار کمبود رم بودید از تابع F() استفاده کنید.
در داخل دستور شرطیif (!myDFPlayer.begin(mySoftwareSerial)) ابتدا تابع begin از شی myDFPlayer با آرگومان پورت سریال مجازی اجرا میشود و اگر نتیجه False بود یعنی ارتباط با ماژول برقرار نشده یا مموری کارت داخل ماژول نبوده و عبارتهای مناسب چاپ میشود و برنامه در یک حلقه نامحدود while گرفتار میشود (ادامه برنامه اجرا نمیشود).
در غیر اینصورت دستورهای زیر اجرا می شود:
1 2 3 4 5 |
Serial.println(F("DFPlayer Mini online.")); myDFPlayer.setTimeOut(500); myDFPlayer.volume(30); myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); |
دستور اول عبارتی مناسب چاپ میکند که بیانگر شروع به کار موفق ماژول پخش صدا است. دستور بعدی مقدار تاخیر زمانی پورت سریال ماژول را تنظیم میکند. دستور بعد برای تنظیم صدای خروجی ماژول است که یک عدد بین ١ تا ٣٠ میگیرد. دستور بعدی تنظیمات اکولایزر ماژول است که برای فایل صوتی صحبت کردن روی نرمال قرار داده میشود (برای موسیقی میتوان اکولایزر را تغییر داد). دستور آخر حافظه میکرو SD را بعنوان حافظه ذخیره سازی انتخاب میکند. برای هر کدام از این توابع میتوان مقادیر مختلفی را تنظیم کرد که با اجرای مثالهای کتابخانه DFPlayer میتوانید مقادیر دیگر را مشاهده نمایید.
بعد از setup نوبت به حلقه اصلی برنامه یعنی تابع loop میرسد.
1 2 3 4 5 6 |
void loop() { myDFPlayer.play(1); delay(2000); myDFPlayer.play(2); delay(2000); } |
در این حلقه با دستور myDFPlayer.play(1); فایل صوتی شماره یک را اجرا میکنیم. همانطوریکه قبلا ذکر شد با نام فایل ذخیره شده در مموری کاری نداری، منظور از 1 در آرگومان این تابع یعنی فایلی که اول در داخل حافظه کپی شده است. سپس با دستور Delay به اندازه زمان فایل اول صبر میکنیم. مثلا اگر طول فایل اول ٢ ثانیه است ما با آرگومان ٢٠٠٠ میلیثانیه به مدت ٢ ثانیه صبر میکنیم تا فایل به طور کامل پخش شود، سپس با دستور بعدی فایل دوم را اجرا میکنیم و باز به اندازه زمان فایل صبر میکنیم. این دستورات به تناوب تکرار میشوند. به کمک این دستورات میتوانیم فایلهای صوتی مناسبی را که در داخل مموری ذخیره کردهایم در شرایط مناسب پخش کرده و یک ربات سخنگو بسازیم.
بعضی از کاربردهای این ماژول: سیستم اعلام صوتی طبقات آسانسور، ساخت ساعت گویا، سیستم خودکار اذانگو با ترکیب ماژول ساعت، سیستم خوشامدگویی در فروشگاهها، ساخت راهنمای صوتی برای دستگاه های مختلف، اعلام صوتی اخطارهای مختلف مثل عبور از سرعت غیر مجاز در خودرو، ساخت اسباب بازی و عروسک موزیکال و آهنگهای دلخواه، روباتهای هوشمند، ساخت اسباب بازیهای آموزشی مثل جمع و تفریق یا نام حیوانات و هزاران کاربرد دیگر.
ویدیوی خروجی جلسه دوم آموزش آردوینو روی ربات NK-100:
منابع:
https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299
در این جلسه با ماژول DFPlayer Mini و نحوه اتصال و برنامهنویسی آن برای برد آدوینو و به منظور سخنگو کردن روبات NK-100 آشنا شدیم. در جلسه بعد به امید خدا با ماژول آلتراسونیک SRF05 که برای تعیین فاصله و موانع به کار میرود آشنا میشویم و با کنترل چرخهای ربات و تشخیص موانع، حالت تدافعی به ربات میبخشیم.
دانلود سورس آردوینو و PDF این مقاله
بازدیدها: 1056