بناء لعبة بيانو مع الاردوينو و تسجيل واعادت اللحن 1

تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث الحرائق أو غيرها لا سمح الله.

مقدمـــــــة عن المشروع

لقد كان اردوينو نعمة للأشخاص الذين ليسوا من خلفية الإلكترونيات لبناء الأشياء بسهولة . لقد كانت أداة رائعة للنماذج أو لتجربة شيء رائع ، في هذا المشروع سنقوم ببناء بيانو صغير وممتع باستخدام الاردوينو .

هذا البيانو سهل إلى حد كبير مع  ثمانية أزرار فقط و جرس . يستخدم وظيفة النغمة من الاردوينو  لإنشاء أنواع مختلفة من ملاحظات البيانو على السماعة .

لتوسعة المشروع قليلاً أضفنا ميزة التسجيل في المشروع ، وهذا يتيح لنا تشغيل تسجيل لحن وتشغيله مرة أخرى بشكل متكرر عند الحاجة . صوت حق مثير للاهتمام ! لذلك دعونا نبدأ الان ….

متطلبات المشروع

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

طريقة العمل والتوصيل

يمكن بناء مشروع البيانو الكامل على قمة اللوح مع بعض أسلاك التوصيل . يظهر الرسم التوضيحي للدوائر  الذي يعرض طريقة عرض اللوح للمشروع أدناه .

Circuit-diagram-for-Arduino-based-Piano

ما عليك سوى اتباع مخطط الدائرة وتوصيل الأسلاك وفقًا لذلك ، وأزرار الضغط والجرس المستخدمة في وحدة PCB ولكن في الأجهزة الفعلية استخدمنا فقط المفتاح والجرس ، لا ينبغي أن يربكك كثيرًا لأنهما يمتلكان نفس نوع الإغلاق . يمكنك أيضًا الرجوع إلى الصورة أدناه للجهاز لإجراء توصيلاتك .

Circuit-hardware-for-Arduino-based-Piano-with-Recording-and-Replay

قيمة المقاومات من اليسار بالترتيب التالي ، 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");
  }
}

One Comment

  1. هل من الممكن أن اعمل بيانوا في جهاز المحاكاة وليس في الواقع

    بان عبد الحسن راضي

اترك تعليقاً



لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *