اذهب إلى المحتوى

نوضح في هذا المقال كيفية إصدار الأصوات والنغمات من خلال لوحة الأردوينو 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%، ونمرر لهذه الدالة ثلاثة وسطاء عند وهي:

  1. رقم القطب الموصول عليه الجرس الإلكتروني Buzzer، ويمكن استخدام أي قطب من الأقطاب الرقمية في لوحة الأردوينو أونو Arduino Uno
  2. التردد الخاص بالإشارة المربعة، وبتغير قيمة هذا الوسيط سنحصل على نغمات وأصوات مختلفة، ويجب أن لا يقل تردد الإشارة عن 31 هرتز
  3. الوسيط الثالث اختياري ويمكن عدم كتابته، وهو مدة تشغيل الجرس بالمللي ثانية، وفي حال عدم وضعه سيستمر الجرس بالعمل

دالة إيقاف صوت الجرس 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 والمفتاح اللحظي.

إضافة العناصر في موقع وكوي

نغيّر ألوان المفاتيح للتميز بينها من خلال الضغط عليها فتظهر لنا نافذة في الأعلى نستطيع من خلالها اختيار اللون.

تغير لون المفتاح

نرتب العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.

نكتب الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة، ونلاحظ الحالات الآتية:

  1. نضغط على المفتاح الأول الموصول على القطب رقم 10 في لوحة الأردوينو أونو Arduino Uno، سنلاحظ أن الجرس الإلكتروني Buzzer يصر صوت بنفس التردد الأول، وعند إزالة الضغط عن المفتاح سيتوقف الجرس عن العمل وذلك بسبب الدالة ()noTone.
  2. نجرب الضغط على المفاتيح الأخرى ونلاحظ أن كل مفتاح يسبب إصدار صوت مختلف عن الآخر
  3. في حال الضغط على المفاتيح بشكل تسلسلي بالترتيب سنلاحظ أن الأصوات أو النغمات متناسقة لأننا استخدمنا الترددات الأساسية في السلم الموسيقي، ويمكن تجربة ترددات مختلفة حتى نحصل على النتيجة التي نريدها

النتيجة النهائية لمحاكاة المشروع الثامن

الخلاصة

تعلمنا في هذا المقال كيفية إصدار أصوات من خلال الأردوينو Arduino، وتعرفنا على عنصر إلكتروني جديد وهو الجرس الإلكتروني Buzzer وآلية عمله وأنواعه، وقمنا ببناء مشروع جديد من هذه السلسلة وهو بناء آلة البيانو الموسيقية باستخدام الأردوينو Arduino، وختمنا المقال بعرض خطوات محاكاة للمشروع من خلال منصة وكوي Wokwi.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...