مقدمـــــــة عن المشروع
لقد كان اردوينو نعمة للأشخاص الذين ليسوا من خلفية الإلكترونيات لبناء الأشياء بسهولة . لقد كانت أداة رائعة للنماذج أو لتجربة شيء رائع ، في هذا المشروع سنقوم ببناء بيانو صغير وممتع باستخدام الاردوينو .
هذا البيانو سهل إلى حد كبير مع ثمانية أزرار فقط و جرس . يستخدم وظيفة النغمة من الاردوينو لإنشاء أنواع مختلفة من ملاحظات البيانو على السماعة .
لتوسعة المشروع قليلاً أضفنا ميزة التسجيل في المشروع ، وهذا يتيح لنا تشغيل تسجيل لحن وتشغيله مرة أخرى بشكل متكرر عند الحاجة . صوت حق مثير للاهتمام ! لذلك دعونا نبدأ الان ….
متطلبات المشروع
Materials Required:
- Arduino Uno
- 16*2 LCD Display
- Buzzer
- Trimmer 10k
- SPDT switch
- Push button (8 Nos)
- Resistors (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Breadboard
- Connecting wires
-
جميع المنتجات, مفاتيح وسويتشات
6 × 6 × 5 ملم مفتاح زر الضغط Tactile push button switch
لمحة سريعة
- مثالي للتطبيقات عبر الفتحات.
- تستخدم في مجالات المنتجات الإلكترونية والأجهزة المنزلية وغيرها.
- تصميم آلية عالية الدقة يوفر عملية حادة وعمر خدمة طويل.
- مدمجة وخفيفة الوزن وسهلة الحمل والتفكيك.
- الموصلية الكهربائية الجيدة.
SKU: AC023 -
-
-
-
-
-
-
-
-
-
-
بوردات ولوحات نحاسية, جميع المنتجات
لوح التجارب 830 نقطة لون ابيض Solderless Breadboard
لمحة سريعة
- لوحة التجارب mb102
- 830 نقطة بدون لحام
- مثالي لتجربة تصميم الدوائر في المختبرات
- متوافق مع المقاومة والثنائيات والترانزستورات ومصابيح LED والمكثفات وأنواع أخرى من المكونات الإلكترونية
- إحداثيات ملونة لسهولة وضع المكونات.
- تقبل مجموعة متنوعة من أحجام الأسلاك 20-29 AWG
SKU: AA071
طريقة العمل والتوصيل
يمكن بناء مشروع البيانو الكامل على قمة اللوح مع بعض أسلاك التوصيل . يظهر الرسم التوضيحي للدوائر الذي يعرض طريقة عرض اللوح للمشروع أدناه .
ما عليك سوى اتباع مخطط الدائرة وتوصيل الأسلاك وفقًا لذلك ، وأزرار الضغط والجرس المستخدمة في وحدة PCB ولكن في الأجهزة الفعلية استخدمنا فقط المفتاح والجرس ، لا ينبغي أن يربكك كثيرًا لأنهما يمتلكان نفس نوع الإغلاق . يمكنك أيضًا الرجوع إلى الصورة أدناه للجهاز لإجراء توصيلاتك .
قيمة المقاومات من اليسار بالترتيب التالي ، 10k ، 560R ، 1.5k ، 2.6k ، 3.9 ، 5.6k ، 6.8k ، 8.2k و 10k. إذا لم يكن لديك نفس مفتاح DPST ، فيمكنك استخدام مفتاح التبديل العادي مثل المفتاح الموضح في مخطط الدائرة أعلاه .
عزف نغمات البيانو على اردوينو :
حسنًا ، قبل أن أبدأ في هذا الموضوع ، اسمحوا لي أن أوضح أنني مبتدئ مع النوتات الموسيقية أو البيانو ، لذا يرجى أن تسامحني إذا كان أي شيء مذكور تحت هذا العنوان هو رطانة .
نحن نعرف الآن أنه يمكننا استخدام وظيفة النغمات في الاردوينو لإنتاج بعض الأصوات ، ولكن كيف يمكننا تشغيل نغمات من ملاحظة معينة باستخدام نفس الشيء . من حسن حظنا وجود مكتبة تسمى “pitches.h” كتبها بريت هاجمان . تحتوي هذه المكتبة على جميع المعلومات المتعلقة بالتردد المكافئ لأي ملاحظة على البيانو . لقد فوجئت بمدى قدرة هذه المكتبة على العمل ولعب كل ملاحظة على البيانو تقريبًا ، فقد استخدمت نفس الشيء للعب نغمات البيانو مثل Pirates of Caribbean و Crazy Frog و Mario وحتى تيتانيك وبدا رائعين .
يحتوي مشروعنا على 8 أزرار ضغط فقط ، بحيث يمكن لكل زر تشغيل نوتة موسيقية واحدة فقط ، وبالتالي يمكننا تشغيل 8 نغمات فقط . لقد اخترت أكثر الملاحظات استخدامًا على البيانو ، ولكن يمكنك تحديد أي 8 أو حتى توسيع المشروع باستخدام المزيد من أزرار الضغط وإضافة المزيد من الملاحظات .
الملاحظات المحددة في هذا المشروع هي الملاحظات C4 و D4 و E4 و F4 و G4 و A4 و B4 و C5 والتي يمكن تشغيلها باستخدام الأزرار من 1 إلى 8 على التوالي .
الكــــــــود البرمجي
لتحميل الكود البرمجي اضغط هنا
#include <LiquidCrystal.h> int notes[] = {262, 294, 330, 349, 392, 440, 494, 523}; // Set frequency for C4, D4, E4, F4, G4, A4, B4, C5 const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; //Pins to which LCD is connected LiquidCrystal lcd(rs, en, d4, d5, d6, d7); char button = 0; int analogVal; char REC = 0; int recorded_button[200]; int pev_button; int recorded_time [200]; char time_index; char button_index = 0; unsigned long start_time; int note_time; void setup() { Serial.begin(9600); pinMode (6, INPUT); lcd.begin(16, 2); //We are using a 16*2 LCD display lcd.print("Arduino Piano"); //Display a intro message lcd.setCursor(0, 1); // set the cursor to column 0, line 1 lcd.print("-CircuitDigest"); //Display a intro message delay(2000); //Wait for display to show info lcd.clear(); //Then clean it } void loop() { while (digitalRead(6) == 0) //If the toggle switch is set in recording mode { lcd.setCursor(0, 0); lcd.print("Recording.."); lcd.setCursor(0, 1); Detect_button(); Play_tone(); } while (digitalRead(6) == 1) //If the toggle switch is set in Playing mode { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Now Playing.."); for (int i = 0; i < sizeof(recorded_button) / 2; i++) { delay((recorded_time[i]) * 10); //Wait for before paying next tune if (recorded_button[i] == 0) noTone(7); //user dint touch any button else tone(7, notes[(recorded_button[i] - 1)]); //play the sound corresponding to the button touched by the user } } } void Detect_button() { analogVal = analogRead(A0); //read the analog voltag on pin A0 pev_button = button; //remember the previous button pressed by the user if (analogVal < 550) button = 8; if (analogVal < 500) button = 7; if (analogVal < 450) button = 6; if (analogVal < 400) button = 5; if (analogVal < 300) button = 4; if (analogVal < 250) button = 3; if (analogVal < 150) button = 2; if (analogVal < 100) button = 1; if (analogVal > 1000) button = 0; /****Rcord the pressed buttons in a array***/ if (button != pev_button && pev_button != 0) { recorded_button[button_index] = pev_button; button_index++; recorded_button[button_index] = 0; button_index++; } /**End of Recording program**/ } void Play_tone() { /****Rcord the time delay between each button press in a array***/ if (button != pev_button) { lcd.clear(); //Then clean it note_time = (millis() - start_time) / 10; recorded_time[time_index] = note_time; time_index++; start_time = millis(); } /**End of Recording program**/ if (button == 0) { noTone(7); lcd.print("0 -> Pause.."); } if (button == 1) { tone(7, notes[0]); lcd.print("1 -> NOTE_C4"); } if (button == 2) { tone(7, notes[1]); lcd.print("2 -> NOTE_D4"); } if (button == 3) { tone(7, notes[2]); lcd.print("3 -> NOTE_E4"); } if (button == 4) { tone(7, notes[3]); lcd.print("4 -> NOTE_F4"); } if (button == 5) { tone(7, notes[4]); lcd.print("5 -> NOTE_G4"); } if (button == 6) { tone(7, notes[5]); lcd.print("6 -> NOTE_A4"); } if (button == 7) { tone(7, notes[6]); lcd.print("7 -> NOTE_B4"); } if (button == 8) { tone(7, notes[7]); lcd.print("8 -> NOTE_C5"); } }
هل من الممكن أن اعمل بيانوا في جهاز المحاكاة وليس في الواقع