- المواد المطلوبة:
- مخطط الرسم البياني:
- المخططات والشرح:
- فهم
- العزف على نغمات البيانو على الأردوينو:
- برمجة اردوينو:
- العب ، سجل ، أعد التشغيل وكرر! :
لقد كان Arduino نعمة للأشخاص الذين ليسوا من خلفية الإلكترونيات لبناء الأشياء بسهولة. لقد كانت أداة رائعة للنماذج الأولية أو لتجربة شيء رائع ، في هذا المشروع سنقوم ببناء بيانو صغير ولكنه ممتع باستخدام Arduino. هذا البيانو سهل للغاية مع 8 أزرار ضغط وجرس فقط. يستخدم وظيفة النغمة () في Arduino لإنشاء أنواع مختلفة من ملاحظات البيانو على السماعة. لإضفاء الإثارة عليه قليلاً ، أضفنا ميزة التسجيل في المشروع ، وهذا يمكننا من تشغيل نغمة وتسجيلها وتشغيلها مرة أخرى بشكل متكرر عند الحاجة. صوت مثير للاهتمام حق !! فلنبدأ بالبناء…
المواد المطلوبة:
- اردوينو اونو
- 16 * 2 شاشة ال سي دي
- صفارة
- الانتهازي 10 كيلو
- مفتاح SPDT
- زر ضغط (8 لا)
- المقاومات (10 كيلو ، 560R ، 1.5 كيلو ، 2.6 كيلو ، 3.9 ، 5.6 كيلو ، 6.8 كيلو ، 8.2 كيلو ، 10 كيلو)
- اللوح
- توصيل الأسلاك
مخطط الرسم البياني:
يمكن بناء مشروع Arduino Piano الكامل أعلى لوح التجارب ببعض الأسلاك المتصلة. يظهر أدناه مخطط الدائرة المصنوع باستخدام الفريتز الذي يوضح عرض اللوح للمشروع
ما عليك سوى اتباع الرسم التخطيطي للدائرة وتوصيل الأسلاك وفقًا لذلك ، وأزرار الضغط والجرس كما هو مستخدم مع وحدة PCB ولكن في الأجهزة الفعلية استخدمنا المفتاح والجرس فقط ، ولا ينبغي أن يربكك كثيرًا لأن لديهم نفس نوع الدبوس.. يمكنك أيضًا الرجوع إلى الصورة أدناه للجهاز لإجراء اتصالاتك.
قيمة المقاومات من اليسار بالترتيب التالي ، 10 كيلو ، 560 آر ، 1.5 كيلو ، 2.6 كيلو ، 3.9 ، 5.6 كيلو ، 6.8 كيلو ، 8.2 كيلو ، 10 كيلو. إذا لم يكن لديك مفتاح DPST نفسه ، فيمكنك استخدام مفتاح التبديل العادي مثل المفتاح الموضح في مخطط الدائرة أعلاه. الآن دعنا ننظر في مخططات المشروع لفهم سبب إجراء الاتصالات التالية.
المخططات والشرح:
يتم تقديم مخططات الرسم التخطيطي للدائرة الموضحة أعلاه أدناه ، وقد تم إجراؤها أيضًا باستخدام Fritzing.
أحد الروابط الرئيسية التي يجب أن نفهمها هو كيفية توصيل أزرار الدفع الثمانية بـ Arduino من خلال دبوس Analog A0. نحتاج أساسًا إلى 8 دبابيس إدخال يمكن توصيلها بأزرار دفع الإدخال الثمانية ، ولكن بالنسبة لمشاريع مثل هذه ، لا يمكننا استخدام 8 دبابيس من وحدة التحكم الدقيقة فقط لأزرار الضغط لأننا قد نحتاج إليها لاستخدامها لاحقًا. في حالتنا لدينا شاشة LCD ليتم ربطها.
لذلك نستخدم دبوس Arduino التناظري ونشكل مقسمًا محتملاً بقيم مقاومة متغيرة لإكمال الدائرة. بهذه الطريقة عند الضغط على كل زر ، سيتم توفير جهد تناظري مختلف للدبوس التناظري. يتم عرض عينة دارة بمقاومين فقط وزرين ضغط أدناه.
في هذه الحالة ، سيتلقى دبوس ADC + 5V عندما لا يتم الضغط على أزرار الضغط ، وإذا تم الضغط على الزر الأول ، فسيتم إكمال الحاجز المحتمل من خلال المقاوم 560R وإذا تم الضغط على الزر الثاني ، فسيتم منافسة الحاجز المحتمل باستخدام 1.5 المقاوم ك. بهذه الطريقة سوف يتغير الجهد الذي يستقبله دبوس ADC بناءً على صيغ المقسم المحتمل. إذا كنت تريد معرفة المزيد حول كيفية عمل الحاجز المحتمل وكيفية حساب قيمة الجهد الذي يتلقاها دبوس ADC ، فيمكنك استخدام صفحة حاسبة المقسم المحتمل هذه.
بخلاف ذلك ، تكون جميع التوصيلات مباشرة للأمام ، وشاشة LCD متصلة بالمسامير 8 و 9 و 10 و 11 و 12. يتم توصيل الجرس بالدبوس 7 ومفتاح SPDT متصل بالدبوس 6 في Arduino. يتم تشغيل المشروع بالكامل من خلال منفذ USB للكمبيوتر المحمول. يمكنك أيضًا توصيل Arduino بمصدر 9V أو 12V من خلال مقبس DC وسيظل المشروع يعمل بنفس الطريقة.
فهم
تتميز Arduino بوظيفة سهلة الاستخدام () يمكن استخدامها لتوليد إشارات تردد متفاوتة يمكن استخدامها لإنتاج أصوات مختلفة باستخدام الجرس. لذلك دعونا نفهم كيف تعمل الوظيفة وكيف يمكن استخدامها مع Arduino.
قبل ذلك يجب أن نعرف كيف يعمل جرس بيزو. ربما تعلمنا عن بلورات بيزو في مدرستنا ، فهي ليست سوى بلورة تحول الاهتزازات الميكانيكية إلى كهرباء أو العكس. هنا نطبق تيارًا متغيرًا (ترددًا) تهتز فيه البلورة ، مما ينتج عنه صوتًا. ومن أجل جعل الجرس بيزو يصدر بعض الضوضاء ، علينا أن نجعل بلورة بيزو الكهربائية تهتز ، وتعتمد درجة ونغمة الضوضاء على مدى سرعة اهتزاز البلورة. ومن ثم يمكن التحكم في النغمة والنغمة عن طريق تغيير تردد التيار.
حسنًا ، كيف نحصل على تردد متغير من Arduino؟ هذا هو المكان الذي تأتي فيه وظيفة النغمة (). يمكن أن تولد النغمة () ترددًا معينًا على دبوس معين. يمكن أيضًا ذكر المدة الزمنية إذا لزم الأمر. صيغة النغمة () هي
نغمة بناء الجملة (دبوس ، تردد) نغمة (دبوس ، تردد ، مدة) دبوس المعلمات: الدبوس الذي يتم إنشاء تردد النغمة عليه: تردد النغمة بالهرتز - المدة غير الموقعة: مدة النغمة بالمللي ثانية (اختياري 1) - بدون توقيع طويل
يمكن أن تكون قيم الدبوس أيًا من الدبوس الرقمي. لقد استخدمت رقم التعريف الشخصي 8 هنا. يعتمد التردد الذي يمكن إنشاؤه على حجم المؤقت في لوحة Arduino. بالنسبة إلى UNO ومعظم اللوحات الشائعة الأخرى ، يكون الحد الأدنى للتردد الذي يمكن إنتاجه هو 31 هرتز والحد الأقصى للتردد الذي يمكن إنتاجه هو 65535 هرتز. ومع ذلك ، يمكننا نحن البشر سماع ترددات فقط بين 2000 هرتز و 5000 هرتز.
العزف على نغمات البيانو على الأردوينو:
حسنًا ، حتى قبل أن أبدأ في هذا الموضوع ، دعني أوضح أنني مبتدئ مع النوتات الموسيقية أو البيانو ، لذا يرجى أن تسامحني إذا كان أي شيء مذكور تحت هذا العنوان هو هراء.
نحن نعلم الآن أنه يمكننا استخدام وظيفة النغمات في Arduino لإنتاج بعض الأصوات ، ولكن كيف يمكننا تشغيل نغمات نغمات معينة باستخدام نفس الشيء. من حسن حظنا أن هناك مكتبة تسمى "Pitches.h" كتبها بريت هاجمان. تحتوي هذه المكتبة على جميع المعلومات حول التردد الذي يعادل أي نغمة على البيانو. لقد فوجئت بمدى قدرة هذه المكتبة على العمل بشكل جيد ولعب كل نغمة تقريبًا على البيانو ، لقد استخدمت نفس الشيء لعزف ملاحظات البيانو الخاصة بـ Pirates of Caribbean و Crazy Frog و Mario وحتى titanic وقد بدوا رائعين. وجه الفتاة! لقد خرجنا قليلاً عن الموضوع هنا ، لذلك إذا كنت مهتمًا بذلك ، تحقق من عزف الألحان باستخدام مشروع Arduino. ستجد أيضًا المزيد من الشرح حول مكتبة Pitches.h في هذا المشروع.
يحتوي مشروعنا على 8 أزرار انضغاطية فقط بحيث يمكن لكل زر تشغيل نوتة موسيقية معينة ، وبالتالي يمكننا عزف 8 نغمات فقط. لقد اخترت أكثر النغمات استخدامًا على البيانو ، ولكن يمكنك تحديد أي 8 أو حتى توسيع المشروع باستخدام المزيد من الأزرار الانضغاطية وإضافة المزيد من الملاحظات.
الملاحظات المحددة في هذا المشروع هي الملاحظات C4 و D4 و E4 و F4 و G4 و A4 و B4 و C5 والتي يمكن تشغيلها باستخدام الأزرار من 1 إلى 8 على التوالي.
برمجة اردوينو:
يكفي من الناحية النظرية ، دعونا نصل إلى الجزء الممتع من برمجة Arduino. يتم تقديم برنامج Arduino الكامل في نهاية هذه الصفحة ، يمكنك القفز لأسفل إذا كنت حريصًا أو تقرأ المزيد لفهم كيفية عمل الكود.
في برنامج Arduino الخاص بنا ، يتعين علينا قراءة الجهد التمثيلي من الدبوس A0 ، ثم توقع الزر الذي تم الضغط عليه وتشغيل النغمة الخاصة بذلك الزر. أثناء القيام بذلك ، يجب علينا أيضًا تسجيل الزر الذي ضغط عليه المستخدم والمدة التي ضغطها ، حتى نتمكن من إعادة إنشاء النغمة التي تم تشغيلها بواسطة المستخدم لاحقًا.
قبل الانتقال إلى الجزء المنطقي ، يجب أن نعلن أي 8 نوتات سنلعبها. ثم يتم أخذ التردد الخاص بالملاحظات من مكتبة pitches.h ثم يتم تشكيل مجموعة كما هو موضح أدناه. هنا تردد تشغيل الملاحظة C4 هو 262 وهكذا.
ملاحظات دولية = {262 ، 294 ، 330 ، 349 ، 392 ، 440 ، 494 ، 523} ؛ // ضبط التردد لـ C4 ، D4 ، E4 ، F4 ، G4 ، A4 ، B4 ،
بعد ذلك ، يجب أن نذكر المسامير التي تتصل بها شاشة LCD. إذا كنت تتبع نفس المخططات المذكورة أعلاه ، فلن تضطر إلى تغيير أي شيء هنا.
const int rs = 8 ، en = 9 ، d4 = 10 ، d5 = 11 ، d6 = 12 ، d7 = 13 ؛ // الدبابيس التي تتصل بها شاشة LCD LiquidCrystal LCD (rs، en، d4، d5، d6، d7) ؛
بعد ذلك ، داخل وظيفة الإعداد الخاصة بنا ، نقوم فقط بتهيئة وحدة LCD والشاشة التسلسلية لتصحيح الأخطاء. نعرض أيضًا رسالة مقدمة فقط للتأكد من أن الأشياء تعمل كما هو مخطط لها. بعد ذلك ، داخل وظيفة الحلقة الرئيسية ، لدينا حلقتان أثناء.
سيتم تنفيذ حلقة واحدة طالما تم وضع مفتاح SPDT في تسجيل المزيد. في وضع التسجيل ، يمكن للمستخدم دفع النغمات المطلوبة وفي نفس الوقت سيتم أيضًا حفظ النغمة التي يتم تشغيلها. لذا تبدو حلقة while كما يلي
while (digitalRead (6) == 0) // إذا تم ضبط مفتاح التبديل في وضع التسجيل {lcd.setCursor (0 ، 0) ؛ lcd.print ("تسجيل..") ؛ lcd.setCursor (0 ، 1) ؛ Detect_button () ، Play_tone () ؛ }
كما لاحظت ، لدينا وظيفتان داخل حلقة while. يتم استخدام الوظيفة الأولى Detect_button () للعثور على الزر الذي ضغط عليه المستخدم والوظيفة الثانية Play_tone () المستخدمة لتشغيل النغمة المعنية. بصرف النظر عن هذه الوظيفة ، تقوم وظيفة Detect_button () أيضًا بتسجيل الزر الذي يتم الضغط عليه وتسجيل وظيفة Play_tone () مدة الضغط على الزر.
داخل وظيفة Detect_button () ، نقرأ الجهد التناظري من الدبوس A0 ونقارنه ببعض القيم المحددة مسبقًا لمعرفة الزر الذي تم الضغط عليه. يمكن تحديد القيمة إما باستخدام حاسبة مقسم الجهد أعلاه أو باستخدام الشاشة التسلسلية للتحقق من القيمة التناظرية التي تتم قراءتها لكل زر.
باطل Detect_button () { analogVal = analogRead (A0) ؛ // قراءة Voltag التناظرية على دبوس A0 pev_button = زر ؛ // تذكر الزر السابق الذي ضغط عليه المستخدم إذا كان (analogVal <550) button = 8 ؛ إذا كان الزر (analogVal <500) = 7 ؛ إذا (analogVal <450) زر = 6 ؛ إذا كان الزر (analogVal <400) = 5 ؛ إذا كان (analogVal <300) زر = 4 ؛ إذا (analogVal <250) زر = 3 ؛ إذا كان (analogVal <150) زر = 2 ؛ إذا كان (analogVal <100) زر = 1 ؛ إذا (analogVal> 1000) زر = 0 ؛ / **** تسجيل الأزرار المضغوطة في مصفوفة *** / إذا (button! = pev_button && pev_button! = 0) { selected_button = pev_button؛ button_index ++ ؛ الزر المسجل = 0 ؛ button_index ++ ؛ } / ** نهاية برنامج التسجيل ** / }
كما قيل ، داخل هذه الوظيفة نسجل أيضًا التسلسل الذي يتم فيه الضغط على الأزرار. يتم تخزين القيم المسجلة في مصفوفة تسمى زر _ مسجل. نتحقق أولاً مما إذا كان هناك زر جديد مضغوط ، إذا تم الضغط عليه ، فإننا نتحقق أيضًا مما إذا لم يكن الزر 0. حيث لا يكون الزر 0 شيئًا ولكن لا يتم الضغط على أي زر. داخل حلقة if ، نقوم بتخزين القيمة في موقع الفهرس المعطى بواسطة المتغير button_index ثم نقوم أيضًا بزيادة قيمة الفهرس هذه حتى لا نزيد الكتابة في نفس الموقع.
/ **** سجل الأزرار المضغوطة في مصفوفة *** / if (button! = pev_button && pev_button! = 0) { register_button = pev_button؛ button_index ++ ؛ الزر المسجل = 0 ؛ button_index ++ ؛ } / ** نهاية برنامج التسجيل ** /
داخل وظيفة Play_tone () ، سنقوم بتشغيل النغمة الخاصة بالزر المضغوط باستخدام شروط if متعددة. سنستخدم أيضًا مصفوفة باسم Register_time والتي سنوفر بداخلها المدة الزمنية التي تم فيها الضغط على الزر. تشبه العملية تسلسل زر التسجيل من خلال استخدام وظيفة millis () لتحديد المدة التي تم فيها الضغط على كل زر ، وأيضًا لتقليل حجم المتغير نقسم القيمة على 10. بالنسبة للزر 0 ، مما يعني أن المستخدم ليس كذلك الضغط على أي شيء نلعبه بدون نغمة لنفس المدة. يظهر الرمز الكامل داخل الوظيفة أدناه.
void Play_tone () { / **** سجل التأخير الزمني بين كل زر اضغط في مصفوفة *** / if (button! = pev_button) { lcd.clear ()؛ // ثم نظفها note_time = (millis () - start_time) / 10 ؛ Register_time = note_time ؛ time_index ++ ؛ start_time = مللي () ؛ } / ** End of Recording program ** / if (button == 0) { noTone (7)؛ lcd.print ("0 -> إيقاف مؤقت..") ؛ } إذا (زر == 1) { نغمة (7 ، ملاحظات) ؛ lcd.print ("1 -> NOTE_C4") ؛ } إذا (زر == 2) { نغمة (7 ، ملاحظات) ؛ lcd.print ("2 -> NOTE_D4") ؛ } إذا (زر == 3) { نغمة (7 ، ملاحظات) ؛ lcd.print ("3 -> NOTE_E4") ؛ } إذا (زر == 4) { نغمة (7 ، ملاحظات) ؛ lcd.print ("4 -> NOTE_F4") ؛ } إذا (زر == 5) { نغمة (7 ، ملاحظات) ؛ lcd.print ("5 -> NOTE_G4") ؛ } إذا (زر == 6) { نغمة (7 ، ملاحظات) ؛ lcd.print ("6 -> NOTE_A4") ؛ } إذا (زر == 7) { نغمة (7 ، ملاحظات) ؛ lcd.print ("7 -> NOTE_B4") ؛ } إذا (زر == 8) { نغمة (7 ، ملاحظات) ؛ lcd.print ("8 -> NOTE_C5") ؛ } }
أخيرًا بعد التسجيل ، يتعين على المستخدم تبديل DPST إلى الاتجاه الآخر لتشغيل النغمة المسجلة. عند الانتهاء من ذلك ، ينفصل البرنامج عن حلقة while السابقة ويدخل الحلقة الثانية while loop حيث نقوم بتشغيل النغمات في تسلسل الأزرار التي يتم الضغط عليها لمدة تم تسجيلها مسبقًا. رمز القيام بالشيء نفسه موضح أدناه.
while (digitalRead (6) == 1) // إذا تم ضبط مفتاح التبديل في وضع التشغيل { lcd.clear () ؛ lcd.setCursor (0 ، 0) ؛ lcd.print ("قيد التشغيل الآن..")؛ ل(كثافة العمليات ط = 0؛ ط <sizeof (recorded_button) / 2، وأنا ++) { تأخير ((recorded_time) * 10)؛ // انتظر قبل دفع النغمة التالية إذا ( الزر_ المسجل == 0) noTone (7) ؛ // لمس المستخدم أي زر آخر نغمة (7 ، ملاحظات - 1)]) ؛ // تشغيل الصوت المقابل للزر الذي لمسه المستخدم } } }
العب ، سجل ، أعد التشغيل وكرر!:
اجعل الجهاز وفقًا لمخطط الدائرة الموضح ، وقم بتحميل الكود على لوحة Arduino والوقت الموضح. ضع SPDT في وضع التسجيل وابدأ في تشغيل النغمات التي تختارها ، وسيؤدي الضغط على كل زر إلى إصدار نغمة مختلفة. أثناء هذا الوضع ، ستعرض شاشة LCD عبارة " Recording…" وفي السطر الثاني سترى اسم الملاحظة التي يتم الضغط عليها حاليًا كما هو موضح أدناه
بمجرد تشغيل نغمتك ، قم بتبديل مفتاح SPDT إلى الجانب الآخر ويجب أن تعرض شاشة LCD عبارة " Now Playing.." ثم ابدأ تشغيل النغمة التي قمت بتشغيلها للتو. سيتم تشغيل نفس النغمة مرارًا وتكرارًا طالما ظل مفتاح التبديل في الموضع كما هو موضح في الصورة أدناه.
يمكن العثور على العمل الكامل للمشروع في الفيديو أدناه. أتمنى أن تكون قد فهمت المشروع واستمتعتم ببنائه إذا كان لديك أي مشاكل في بناء هذا المنشور عليها في قسم التعليقات أو استخدم المنتديات للحصول على المساعدة الفنية في مشروعك. لا تنس أيضًا التحقق من فيديو العرض التوضيحي أدناه.