نوضح في هذا المقال كيفية إصدار الأصوات والنغمات من خلال لوحة الأردوينو Arduino وعنصر الجرس الإلكترونية Buzzer ومجموعة من مفاتيح الضغط اللحظية Push Button لبناء مشروع لآلة البيانو الموسيقية.
فكرة مشروع بناء آلة البيانو الموسيقية
سنصمم بيانو صغير يحتوي على سبعة مفاتيح لحظية Push Buttons، يسبب كل مفتاح إصدار صوت بتردد Frequency مختلف عند الضغط عليه من خلال الجرس الإلكتروني Buzzer وهو العنصر المسؤول عن إصدار الصوت، حيث أن هذه الترددات السبعة التي اخترناها هي الترددات الأساسية في السلم الموسيقي دو، ري، مي، فا، صول، لا، سي وسنخزن هذه الترددات في الذاكرة الخاصة بلوحة الأردوينو، مما يتيح لنا إمكانية تغيير أصوات البيانو برمجيًا عن طريق تعديل هذه الترددات.
العناصر المستخدمة لمشروع بناء آلة البيانو الموسيقية باستخدام أردوينو
سنستخدم في مشروعنا مجموعة من العناصر الإلكترونية والأدوات وهي:
- لوحة أردوينو أونو Arduino Uno
- كابل البرمجة USB Cable
- لوحة توصيل التجارب Breadboard
- مفتاح الضغط اللحظي Push Button عدد 7
- جرس إلكتروني Buzzer غير فعال Passive
- مجموعة أسلاك توصيل من نوع Male to Male
وقد تعاملنا مع معظم هذه العناصر في المشاريع التي طورناها في المقالات السابقة من سلسلتنا دليل أردوينو وسنتعامل في هذا المشروع مع عنصر إلكتروني جديد لم يسبق لنا استخدامه وهو الجرس الإلكتروني Buzzer.
الجرس الإلكتروني Buzzer
هو عبارة عن عنصر إلكتروني يستخدم لتوليد الأصوات والنغمات من خلال تحويل الطاقة الكهربائية إلى صوت مسموع، ويتكون من غشاء يشبه الطبل يصنع عادة من مواد مرنة قابلة للاهتزاز كالبلاستيك أو المعدن،عندما يمر التيار الكهربائي عبر الجرس، يُسبب ذلك تشوه الغشاء. وعندما يتوقف التيار الكهربائي، يعود الغشاء إلى شكله الطبيعي، ومع تكرار مرور التيار وإيقافه بسرعة سيؤدي ذلك إلى اهتزاز هذا الغشاء مما سيؤدي بدوره لتوليد الصوت، ويستخدم الجرس الإلكتروني Buzzer في العديد من التطبيقات مثل أجهزة الإنذار والألعاب والهواتف وغيرها.
هناك نوعان من الأجراس الإلكترونية Buzzers الأول هو النوع الفعّال Active، والذي يحتوي على دائرة كهربائية داخلية مدمجة تمكنه من العمل عند تغذيته مباشرة من مصدر جهد مستمر ثابت DC. أما النوع الثاني فهو النوع غير الفعّال Passive، والذي يختلف عن النوع الأول بأنه لا يحتوي على دائرة داخلية لتوليد الصوت، وبالتالي يحتاج إلى مصدر تغذية يعمل بتردد معين لتوليد الأصوات.
تحديد نوع الجرس الإلكتروني
يمكن تحديد نوع الجرس الإلكتروني بسهولة من خلال تجربة توصيله بمصدر تغذية مستمر بجهد 5V. فإذا أصدر الجرس صوتًا عند توصيله، فإن الجرس يكون من النوع الفعّال Active، ويُستخدم هذا النوع عادة في التطبيقات التي تتضمن دوائر إلكترونية بسيطة دون وجود وحدة تحكم، إذ يُستخدم الجرس لإصدار تنبيهات بسيطة من خلال تشغيله وإيقافه مباشرة. أما إذا لم يصدر الجرس أي صوت عند توصيله، فسيكون من النوع غير الفعّال Passive، ويُستخدم هذا النوع في الدوائر الإلكترونية الأكثر تعقيدًا والتي تحتوي على وحدة تحكم، حيث يُمكن التحكم بالصوت بشكل أكبر وتوليد نغمات وأصوات مخصصة.
توضح الصورة التالية الفرق بين الجرس الإلكتروني الفعّال Activ وغير الفعّال Passive.
يعد الجرس الإلكتروني عنصرًا رقميًّا ويمكننا توصيله مع أحد الأقطاب الرقمية والتحكم في تشغيله من خلال الدالة المدمجة ()digitalWrite
، ومن الممكن أيضًا توصيله مع أقطاب تقنية تعديل عرض النبضة PWM للحصول على نغمات وأصوات مختلفة، كما تتيح بيئة تطوير أردوينو Arduino IDE دوال مدمجة أخرى خاصة بالتعامل مع الجرس الإلكتروني Buzzer بسهولة وسنتعرف عليها في الفقرات التالية.
الدوال البرمجية الخاصة بالجرس الإلكتروني Buzzer
يمكننا إنشاء الأصوات والتحكم في نغمات الجرس الإلكتروني، من خلال الدوال التالية:
دالة إصدار صوت الجرسtone
تستخدم الدالة ()tone
لتوليد إشارة مربعة لتشغيل الجرس بتردد محدد وبدورة عمل Duty Cycle تساوي 50%، ونمرر لهذه الدالة ثلاثة وسطاء عند وهي:
- رقم القطب الموصول عليه الجرس الإلكتروني Buzzer، ويمكن استخدام أي قطب من الأقطاب الرقمية في لوحة الأردوينو أونو Arduino Uno
- التردد الخاص بالإشارة المربعة، وبتغير قيمة هذا الوسيط سنحصل على نغمات وأصوات مختلفة، ويجب أن لا يقل تردد الإشارة عن 31 هرتز
- الوسيط الثالث اختياري ويمكن عدم كتابته، وهو مدة تشغيل الجرس بالمللي ثانية، وفي حال عدم وضعه سيستمر الجرس بالعمل
دالة إيقاف صوت الجرس noTone
تستخدم الدالة ()noTone
لإيقاف توليد الإشارة المربعة المولدة من الدالة ()tone
أي أنها توقف الجرس عن العمل، وتأخذ وسيطًا واحدًا وهو رقم القطب الموصول عليه الجرس الإلكتروني Buzzer
مخطط توصيل مشروع آلة البيانو الموسيقية باستخدام أردوينو
لتنفيذ فكرة المشروع، اتبع الخطوات الآتية لتوصيل العناصر والأسلاك مع لوحة الأردوينو Arduino
- صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
- صل الرجل الأقصر التي تمثل القطب السالب الخاصة بالجرس الإلكتروني Buzzer مع المسرى السالب في لوحة توصيل التجارب BreadBoard
- صل الرجل الأطول التي تمثل القطب الموجب الخاصة بالجرس الإلكتروني Buzzer مع القطب رقم 12 في لوحة الأردوينو أونو Arduino Uno
- صل الطرف الأول لجميع مفاتيح الضغط اللحظية Push Buttons مع المسرى السالب للوحة التجارب BreadBoard، ثم صل الطرف الثاني للمفاتيح Push Buttons على الترتيب مع الأقطاب في لوحة الأردوينو أونو Arduino Uno من القطب رقم 10 وحتى القطب رقم 4
- سنفعّل مقاومة الرفع الداخلية للمتحكم الموجود في لوحة الأردوينو Arduino برمجيًا لذلك لا داعي لتوصيل مقاومات رفع Pull-Up أو مقاومات خفض Pull-Down مع مفاتيح الضغط اللحظية Push Buttons
الكود البرمجي لمشروع بناء آلة البيانو الموسيقية بأردوينو
في البداية سنعرف مجموعة من الماكرو خاصة بالترددات التي تمثل النغمات الرئيسية في السلم الموسيقي دو، ري، مي، فا، صول، لا، سي ويمكننا اختيار أي نغمات نريدها بوضع تردد النغمة فقط.
#define C_4 261 #define D_4 293 #define E_4 329 #define F_4 349 #define G_4 392 #define A_4 440 #define B_4 493
نحتاج لتعريف مجموعة أخرى من الماكرو خاصة بأقطاب المفاتيح التي ستوصل مع لوحة الأردوينو بالإضافة إلى القطب الذي سيوصل الجرس الإلكتروني Buzzer مع لوحة الأردوينو
#define C 10 #define D 9 #define E 8 #define F 7 #define G 6 #define A 5 #define B 4 #define Buzz 12
شرحنا كيفية استخدام الماكرو في مقال تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino كما يمكنك الاطلاع أكثر على مفهوم الماكرو وأنواعه من خلال مقال الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C.
سنضبط في الدالة الرئيسية ()setup
نوع الأقطاب المستخدمة، حيث أن القطب الخاص بالجرس الإلكتروني Buzzer يُضبط كقطب خرج OUTPUT
والاقطاب الخاصة بالمفاتيح اللحظية Push Buttons تُضبط كأقطاب دخل مع تفعيل مقاومة الرفع الداخلية INPUT_PULLUP
، حيث أن الدالة المدمجة المسؤولة عن ضبط نوع القطب هي ()pinMode
والتي تأخذ وسيطين الأول رقم القطب والثاني نوع القطب إما خرج OUTPUT
أو دخل INPUT
.
void setup() { pinMode(C, INPUT_PULLUP); pinMode(D, INPUT_PULLUP); pinMode(E, INPUT_PULLUP); pinMode(F, INPUT_PULLUP); pinMode(G, INPUT_PULLUP); pinMode(A, INPUT_PULLUP); pinMode(B, INPUT_PULLUP); pinMode(Buzz, OUTPUT); }
وسنستخدم في الدالة التكرارية ()loop
عدة حلقات تكرارية ()While
كل حلقة خاصة بكل مفتاح وسيكون الشرط بداخل كل حلقة هو أن يكون المفتاح مضغوط LOW
حيث نقرأ حالة المفتاح من خلال الدالة المدمجة ()digitalRead
التي تأخذ وسيطًا واحدًا وهو رقم القطب وتعيد القيمة الفيزيائية الموجودة على القطب، فعند الضغط على المفتاح الأول الموصول على القطب رقم 10 مثلًا سيتحقق الشرط الخاص بالحلقة التكرارية الأولى ويعمل الجرس الإلكتروني Buzzer وفق التردد الأول 261 هرتز ونستخدم الدالة المدمجة ()tone
لتشغيل الجرس الإلكتروني Buzzer كما شرحنا سابقًا.
void loop() { while (digitalRead(C) == LOW) { tone(Buzz, C_4); } while (digitalRead(D) == LOW) { tone(Buzz, D_4); } while (digitalRead(E) == LOW){ tone(Buzz, E_4); } while (digitalRead(F) == LOW) { tone(Buzz, F_4); } while (digitalRead(G) == LOW) { tone(Buzz, G_4); } while (digitalRead(A) == LOW) { tone(Buzz, A_4); } while (digitalRead(B) == LOW) { tone(Buzz, B_4); }
عند تجربة الكود السابق نلاحظ أنه يعمل بشكل جيد ولكن مع وجود مشكلة صغيرة فعند إزالة الضغط عن المفتاح سيستمر الجرس الإلكتروني Buzzer بإصدار الصوت بنفس التردد السابق حتى الضغط على مفتاح آخر ليصدر الجرس الإلكتروني Buzzer صوت آخر بتردد مختلف، لذا نحتاج لحل هذه المشكلة بحيث يتوقف الجرس عن إصدار الصوت بشكل تام عند إزالة الضغط عن أي مفتاح. ونستطيع حل هذه المشكلة بسهولة من خلال إيقاف تشغيل الجرس الإلكتروني Buzzer في نهاية الكود من خلال استدعاء الدالة ()noTone
التي شرحناها سابقًا
noTone(Buzz);
بهذه الطريقة يكون الكود البرمجي جاهزًا لتجربته. كما يمكننا التعديل على الكود فمثلًا يمكن استخدام العبارات الشرطية if
و else if
بدلًا من الحلقة التكرارية While
وتعديل ما يلزم، أو إضافة ميزات أخرى مثل إضافة الليد متعدد الألوان RGB LED ليضيء بلون مختلف عند كل صوت مختلف فمثلًا عند الضغط على المفتاح الأول سيضيء الليد متعدد الألوان RGB LED باللون الأحمر وستصبح الحلقة التكرارية الأولى بالشكل الآتي:
while (digitalRead(C) == LOW) { tone(Buzz, C_4); analogWrite(Red_Pin, 255); analogWrite(Green_Pin, 0); analogWrite(Blue_Pin, 0); }
ولكن علينا الانتباه لتعديل مخطط التوصيل بحيث أن أقطاب الليد متعدد الألوان RGB LED يجب أن توصل مع أقطاب لوحة الأردوينو التي تدعم تقنية تعديل عرض النبضة PWM والتي نجد بجانبها الرمز ~
وأرقام هذه الأقطاب هي 3، 5، 6، 9، 10، 11
الكود البرمجي النهائي لمشروع آلة بيانو باستخدام الأردوينو
#define C_4 261 #define D_4 293 #define E_4 329 #define F_4 349 #define G_4 392 #define A_4 440 #define B_4 493 #define C 10 #define D 9 #define E 8 #define F 7 #define G 6 #define A 5 #define B 4 #define Buzz 12 void setup(){ pinMode(C, INPUT_PULLUP); pinMode(D, INPUT_PULLUP); pinMode(E, INPUT_PULLUP); pinMode(F, INPUT_PULLUP); pinMode(G, INPUT_PULLUP); pinMode(A, INPUT_PULLUP); pinMode(B, INPUT_PULLUP); } void loop(){ while (digitalRead(C) == LOW){ tone(Buzz, C_4); } while (digitalRead(D) == LOW){ tone(Buzz, D_4); } while (digitalRead(E) == LOW){ tone(Buzz, E_4); } while (digitalRead(F) == LOW){ tone(Buzz, F_4); } while (digitalRead(G) == LOW){ tone(Buzz, G_4); } while (digitalRead(A) == LOW){ tone(Buzz, A_4); } while (digitalRead(B) == LOW){ tone(Buzz, B_4); } noTone(Buzz); }
محاكاة مشروع آلة البيانو باستخدام الأردوينو
سنتبع نفس الخطوات التي تعلمناها في مقالٍ التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino للوصول الى الصفحة الخاصة بمحاكاة مشروعنا على موقع وكوي Wokwi.
نضيف العناصر الإلكترونية اللازمة للمشروع وهي لوحة التجارب BreadBoard والجرس الإلكتروني Buzzer والمفتاح اللحظي.
نغيّر ألوان المفاتيح للتميز بينها من خلال الضغط عليها فتظهر لنا نافذة في الأعلى نستطيع من خلالها اختيار اللون.
نرتب العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
نكتب الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة، ونلاحظ الحالات الآتية:
-
نضغط على المفتاح الأول الموصول على القطب رقم 10 في لوحة الأردوينو أونو Arduino Uno، سنلاحظ أن الجرس الإلكتروني Buzzer يصر صوت بنفس التردد الأول، وعند إزالة الضغط عن المفتاح سيتوقف الجرس عن العمل وذلك بسبب الدالة
()noTone
. - نجرب الضغط على المفاتيح الأخرى ونلاحظ أن كل مفتاح يسبب إصدار صوت مختلف عن الآخر
- في حال الضغط على المفاتيح بشكل تسلسلي بالترتيب سنلاحظ أن الأصوات أو النغمات متناسقة لأننا استخدمنا الترددات الأساسية في السلم الموسيقي، ويمكن تجربة ترددات مختلفة حتى نحصل على النتيجة التي نريدها
الخلاصة
تعلمنا في هذا المقال كيفية إصدار أصوات من خلال الأردوينو Arduino، وتعرفنا على عنصر إلكتروني جديد وهو الجرس الإلكتروني Buzzer وآلية عمله وأنواعه، وقمنا ببناء مشروع جديد من هذه السلسلة وهو بناء آلة البيانو الموسيقية باستخدام الأردوينو Arduino، وختمنا المقال بعرض خطوات محاكاة للمشروع من خلال منصة وكوي Wokwi.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.