نحن نسمع الأصوات من حولنا، نستيقظ عند سماع رنين المنبه، نرفع سماعة الهاتف عند سماع جرسه، عند تشغيل الحاسوب نسمع رنينه، عند الحصول على رسالة قصيرة في الهاتف المحمول إلخ…
لوحة أردوينو لم تصنع لتكون جهاز موسيقى و لكن يمكن به إنشاء بعض الأصوات عبر مكبر صوت صغير.
ينشأ الصوت عندما يهتز الهواء، يقوم مكبر الصوت بتحويل الموجات الكهربائية المنتجة من طرف أردوينو إلى ذبذبات صوتية يمكن سماعها.
ما يلزمنا
- لوحة أردوينو
- لوحة تجارب
- مكبر صوت هزّاز (piezo)صمام لد أحمر
- أسلاك توصيل.
قم بانشاء التركيب التالي
في الجدول التالي قمنا بتحرير بعض النغمات مع تواتورها.
لاحظ أن التواتر يمثل عدد التغيرات في الثانية لحدث ما. مثلا إذا كان لدينا مصباح يتوهج ثم ينطفئ 50 مرة في الثانية، نقول أن تواتر التوهج هو 50 هرتز. أما الدور فهو زمن كل توهج أي 50/1 ما يساوي 0,02 ثانية.
زمن الإشارة وهي في الوضع الأعلى يساوي نصف الدور.
لاحظ الصورة المقابلة تبين كيفية حساب الدور و زمن الإشارة العليا:
فيما يلي سوف نقوم بكتابة برنامج يولِد لنا سلسلة النغمات المدونة في الجدول السابق.
إفتح واجهة التطوير و حرر نص البرنامج التالي:
int piezo_pin = 10;
char name[] = {‘c’,’d’,’e’,’f’,’g’,’a’,’b’,’C’};
unsigned int frequency[] = {261,294,329,349,392,440,493,523};
byte nbre_note = sizeof(name);
char melody[] = “ccggaagfeeddc ggffeedggffeed ccggaagffeeddc “;
const byte long_melody = sizeof(melody);
void setup()
{}
void loop()
{
for (int i = 0; i < long_melody; i++){
int periode = 333;
play_Note(melody[i], duree);
}
delay(4000);
}
void play_Note(char note, int periode){
for (int i = 0; i < nbre_note; i++){
if (name[i] == note)
tone(piezo_pin, frequency[i], periode);
}
delay(periode);
}
قم بفحص نص البرنامج ثم إرفعه إلى اللوحة.
قبل أن نشرح عمل البرنامج، سوف نشرح نوعين آخرين من القيم الخاصة بلغة C لأردوينو و هما :
السلاسل الحَرفية (النصوص) string
عند ترتيب عدد من الحروف جنبا إلى جنب فإنه ينتج لدينا سلسلة حروف. يمكن أن تُمثل سلسلة الأحرف هذه بصفوف من نوع « char» مع إضافة حرف يمثل الصفر، تلقائيا فى النهاية.
أمثلة
char Str1[15];
char Str2[8] = {‘a’, ‘r’, ‘d’, ‘u’, ‘i’, ‘n’, ‘o’};
char Str3[8] = {‘a’, ‘r’, ‘d’, ‘u’, ‘i’, ‘n’, ‘o’, ‘\0’};
char Str4[ ] = “arduino”;
char Str5[8] = “arduino”;
كيفية تحديد و تعيين سلسلة الأحرف
يمكن تحديد و تعيين سلسلة الأحرف بواحدة من الطرق التالية:
- تحديد عدد الأحرف في السلسلة دون تعيين العناصر كما في المثال الأول.
- تحديد عدد الأحرف في السلسلة (مع إضافة واحد) مع ترك أردوينو يضيف الحرف «0» كما في المثال الثاني.
- إضافة الحرف «0» كما في المثال الثالث.
- ترك أردوينو يقوم بحساب عدد العناصر و إضافة الحرف «0» كما في المثال الرابع.
- تحديد و تعيين العناصر مع الأخذ بعين الإعتبار لاحرف «0» كما في المثال الخامس.
الحرف النهائي «0»
هذا الحرف و رمزه « 0\» يستعان به في تحديد نهاية سلسلة حروف في ذاكرة المتحكم الدقيق لتجنب الوقوع في الأخطاء بتجاوز مجالها.
unsigned int
الأعداد الصحيحة (بدون فاصلة) و بدون إشارة تأخذ، كالأعداد الصحيحة (2 بايت) و لكنها لا تُسجل الأعداد السالبة مما يجعل مداها أكبر إذ تُسجل قيم أكبر بين 0 و 65535 (216 – 1).
يكمن الإختلاف بين العدد الصحيح (unsigned int) و غير الصحيح (int) في البت الأعلى وزنا و الذي يسمى بت الإشارة.
برنامج أردوينو يفرق بين عدد من نوع (int) به إشارة موجبة إذا كان البت الأعلى وزنا يساوي 0 و سالب إذا كان البت الأعلى وزنا يساوي 1. مايفسر لماذا العدد من نوع (int) ، أعلى قيمة موجبة فيه هي:
32767 (215 – 1). لأننا نستعمل 15 بت فقط للعدد (و السادس عشر للإشارة).
كيفية عمل البرنامج
نبدأ أولا بتعيين النغمات المراد استعمالها مع إدخال قيم تواتراتها (كما رأينا في الجدول السابق). لهذا الغرض قمنا بتعريف صف سلسلة أحرف name[] بها أسماء النغمات. بعدها عرَّفنا صف آخر به قيم التواترات لهذه النغمات.
char name[] = {‘c’,’d’,’e’,’f’,’g’,’a’,’b’,’C’};
unsigned int frequency[] = {261,294,329,349,392,440,493,523};
التعليمة sizeof(name) تزودنا بالعدد الكلي للنغمات (عدد عناصر الصف) المعرفة في الصف و هو 8.
و أخيرا الصف
char melodie[] = “ccggaagfeeddc ggffeedggffeed ccggaagffeeddc “;
يحتوي على النغمات التي نريد عزفها.
نحسب عدد النغمات الموجودة في الصف السابق long_melodie = sizeof(melodie);
في الحلقة نقوم بعزف كل نغمة لمدة 333 ملي ثانية و في النهاية ننتظر 4 ثواني ثم نعيد الكرة.
loop()
تعليمة أردوينو tone() هي التي تسمح لنا بعزف النغمات.
عمل التعليمة tone()
هذه التعليم تنتج إشارة (مربعة الشكل) لها دور خدمة يساوي 50 % في المخرج المعين. يمكن تحديد مدة الإشارة و إلا فإن الإشارة نسمعها إلى أن ننفذ التعليمة noTone().
يمكن فقط إصدار إشارة واحد في وقت واحد. إذا أصدرنا إشارة في مخرج واحد فإن أي تنفيذ للتعليمة tone() لا يكون له أي أثر.
نص التعليمة
tone(pin, frequency)
tone(pin, frequency, periode)
المعاملات
pin :المخرج المستعمل.
frequency :تواتر النغمة بالهرتز.
periode :زمن العزف بالملي ثانية.
الإرجاع:
لاشيء.
تشغيل التعليمة tone() يتم عن طريق الدالة play_Note(char note, int periode) و التي زودناها بمعاملين، دليل النغمة و زمن عزفها. إذا أشار الدليل إلى مسافة (الحرف مسافة) فإن الدالة تقوم باستراحة زمنية مدتها قيمة المتغير periode.
ماتعلمناه
- كيفية توليد ذبذبات
- تعريف متغيرات من نوع string
- تعريف متغيرات من نوع unsigned int
- التعليمة tone()
- التعليمة noTone()
- الحرف 0/ المتمم لسلسلة أحرف.
تمرين
قم بانشاء برنامج باستغلال مراقب الوصل بحيث يقوم بعزف واحدة من النغمات الثمانية عند الضغط على واحد من المفاتيح من 1 إلى 8.