وحدة مشغل ملفات mp3
ماهي وحدة مشغل ملفات الـ mp3
هي عبارة عن وحدة صغيرة منخفضة السعر متصلة بمضخم صوت مدمج مع إخراج مبسط مباشرة الى السماعة. بالإمكان تشغيل هذه الوحدة كوحدة قائمة بذاتها مع بطارية متصلة ومكبر صوت وأزرار ضغط أو استخدامها مع متحكم إلكتروني دقيق أو لوحة تطوير مثل الأردوينو التي توفر خاصية ارسال/استقبال RX/TX تواصل تسلسلي. وبالتالي من خلال أوامر تسلسلية بسيطة يمكن تشغيل ملفات ال mp3 المخزنة في الذاكرة وأداء وظائف أخرى مثل تشغيل الملفات الصوتية التالية أو السابقة أو التبديل العشوائي بينهم أوإيقاف الملف المشغل حاليا وما إلى ذلك. تدعم الوحدة بحد اقصى ذاكرة 32 جيجابايت.

التوصيل
نحتاج 4 أسلاك فقط للتوصيل بين الأردوينو و الوحدة.
أردوينو نانو | وحدة mp3 |
---|---|
5v | Vcc |
Gnd | Gnd |
D10 | Tx |
D11 | Rx |
أما السماعة يجب توصيلها بالوحدة عن طريق المنفذين SPK_1 و SPK_2

السماعة
في هذا الدرس سيتم استخدام السماعة المستخدمة للكمبيوتر (سماعة
بمنفذ USB ) حيث انها تعطي صوت أعلى و أوضح من السماعات الصغيرة. لتوصيل السماعة يجب اولا تزويدها بالطاقة عبر منفذ USB بعد ذلك تحتاج لقطع مخرج الصوت التقليدي (audio jack) وقم بتوصيل الأسلاك بـ SPK_1 و SPK_2

المكتبة
لتسهيل التعامل مع وحدة مشغل mp3 تستخدم مكتبة DFRobotDFPayerMini.
يمكن تنزيل المكتبة عن طريق Library Manager كما توضح الصورة. كما يمكن تحميل المكتبة بشكل ماشر من موقع Github

التمرين 1
في هذا التمرين يتم تشغيل جميع ملفات mp3 الموجودة في الذاكرة بشكل عشوائي متكرر. لاحظ استخدام مكتبة SoftwareSerial التي تسمح باستخدام منافذ رقمية أخرى للاتصال التسلسلي. حيث يتم تمرير ارقام المنافذ المختارة للكائن عند تعريفه (mySoftwareSerial(10, 11) في المثال). بعد ذلك يتم تعريف الكائن mDFPlayer في حالة كان اتصال الأردوينو بالوحدة ناجحا يتم استخدام الأمر myDFPlayer.randomAll لتشغيل ملفات mp3 بشكل عشوائي ومتككر. أما إذا فشل الاتصال سيتم ارسال رسالة خطأ عبر شاشة السيريال بشكل متكرر.
لا تنسى وضع ملفات صوتية بصيغة mp3 داخل الذاكرة.
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void setup(){
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println();
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with player.
Serial.println(F("Unable to begin:"));
while(true);}
Serial.println(F("DFPlayer Mini online."));
delay(500);
myDFPlayer.randomAll();} //Random play all the mp3
void loop(){}
التمرين 2
في هذا التمرين يتم تشغيل موسيقى معينة عند الضغط على أحد الأزرار. يوجد ثلاث أزرا كل منهم مخصص موسيقى محددة أما الرابع يستخدم لإيقاف تشغيل الموسيقى . لاحظ أن الأمر ()myDFPlayer.play يستخدم لتشغيل ملف صوتي محدد حيث يتم تمرير قيمة رقمية تمثل ترتيب الملف المراد تشغيله داخل الذاكرة. في حين يمكن اطفاء ايقاف الاصوات عن طريق الأمر ()myDFPlayer.pause

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
int Pause = 6;
int track1 = 5;
int track2 = 4;
int track3 = 3;
void setup(){
pinMode(Pause, INPUT_PULLUP);
pinMode(track1, INPUT_PULLUP);
pinMode(track2, INPUT_PULLUP);
pinMode(track3, INPUT_PULLUP);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println();
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); //checking if the dfplay is connected and ready to play
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with player.
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."));
delay(500);}
void loop(){
if (digitalRead(track1) == LOW) { myDFPlayer.play(1); delay(1000);} // button track1 is pressed play song 1
else if (digitalRead(track2) == LOW) { myDFPlayer.play(2); delay(1000);} // button track2 is pressed play song 2
else if (digitalRead(track3) == LOW) {myDFPlayer.play(3); delay(1000);} // button track3 is pressed play song 3
else if (digitalRead(Pause) == LOW){myDFPlayer.pause();}} // button Pause is pressed pause all
التمرين 3
في هذا التمرين يتم قياس درجة الحرارة باستخدام الحساس DHT 22. عند ارتفاع درجة الحرارة عن الحد المعين يتم اصدار تبيه صوتي. كما يتم تشغيل ملف صوتي مختلف عند انخفاض درجة الحرارة عن الحد المسموح. يجب تنزيل مكتبة DHT للتعامل مع الحساس DHT 22 حيث يمكن تنزيلها من الرابط التالي
لاحظ أنه يتم قراءة قيمة الحرارة من الحساس في المتغير t باستخدام الأمر
()dht.readTemperature

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void setup(){
mySoftwareSerial.begin(9600); //checking if the dfplay is connected and ready to play
Serial.begin(115200);
dht.begin();
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with player.
Serial.println(F("Unable to begin:"));
while(true);}
Serial.println(F("DFPlayer Mini online."));
delay(500);}
void loop(){
float t = dht.readTemperature();
Serial.println(t);
if (t >25) {myDFPlayer.play(1); delay(2500);}
if (t<10) {myDFPlayer.play(2); delay(2500);}}
استخدام المشغل بدون الأردوينو (previous/next)
يمكن تشغيل مشغل الـ mp3 دون الحاجة لأردوينو. يمكن تشغيل ملفات
الـ mp3 بشكل متتالي (previous/next) او اختيار ملف mp3 محدد للتشغيل. يسمح المشغل باختيار اكثر من 14 ملف صوتي مختلف. تستخد المنافذ IO1
و IO2 لتشغيل الملف الصوتي السابق\التالي كما يمكن من خلالها زيادة
و تخفيض الصوت. كل ما نحتاجه مصدر للطاقة (من 3.2 إلى 5 فولت) وأزرار لإعطاء النبضات للمشغل
لاحظ أن منافذ المشغل active Low أي أنها تعمل عند الحصول على نبضة LOW
المنفذ | الوظيفة |
---|---|
IO1 | ضغطة خفيفة لتشغيل الملف السابق/ ضغطة طويلة لإنقاص الصوت |
IO2 | ضغطة خفيفة لتشغيل الملف التالي/ ضغطة طويلة لزيادة الصوت |

استخدام المشغل بدون الأردوينو (تحديد ملف MP3)
يمكن تحديد ملف من 14 ملف مختلف داخل الذاكرة عن طريق المنفذين ADKEY1 و ADKEY2 حيث يعمل المشغل على قراءة الدخل التماثلي الواصل للمنفذين ثم يقوم بتشغيل احد الملفات بناء على هذه المدخلات. يمكن توصيل الدخل بمقاومات بقيم مختلفة لتشغيل ملف معين. يمكنك ملاحظة أن ADKEY1 يمكن ان يتحكم بتشغيل الملفات من 1-4 بالإضافة لعدد من الخيارات كزيادة او انقاص الصوت. يمكن تشغيل الملفات من 5-14 عن طريق ADKEY2.

التمرين 4
في هذا التمرين سنقوم بوضع 6 ملفات صوتية مختلفة (لتوضيح الفكرة كل ملف يحتوي على العدد بشكل صوتي). بعد ذلك سنستخدم اربع ازرار مختلفة مع المقاومات لتشغيل الملفات 2،3،5،6 عند الضغط على الزر المخصص لكل ملف. لتشغيل الملفات 2 و 3 سنتحتاج لمقاومات 3k (مع الزر المخصص لـ 2) و 6.2k (مع الزر المخصص لـ 3) وسنوصل للزر ADKEY1. لتشغيل الملفات 5 و 6 لن نحتاج مقاومة لتشغيل الزر المخصص لـ 5 ونستخدم 3K لتشغيل 6.
لاحظ أن الملف 1 هو أول ملف تم نسخه على بطاقة الذاكرة وهكذا.اي ان ترتيب الملفات يعتمد على ترتيب نسخهم لبطاقة الذاكرة.

التمرين 5
في هذا التمرين سنقوم بتشغيل ملف صوتي تنبيهي يعمل وفقا لحساس اللهب. يعطي الحساس HIGH عند عدم وجود اللهب و LOW عند وجوده. حيث سنقوم بربط خرج الحساس بالمنفذ ADKEY1 الخاص بالمشغل لتشغيل ملف الـ MP3 الخاص بالتنبيه. عند استشعار اللهب سيعطي الحساس LOW مما يحفز المشغل لتشغيل الملف الخاص بالتحذير.
