الهدف من المشروع هو عمل بيانو بسيط باستخدام الاردوينو يقوم باصدار الاصوات و النغمات بالضغط على المفاتيح
المكونات المطلوبة
السماعه Piezo
هي عبارة عن كريستال تسمى بيزوكريستال عند تعريضها لجهد كهربائي تقوم باصدار صوت، سنستخدمها في هذا المشروع لاصدر نغمات مختلفة كالبيانو
شرح الدارة
قم بتوصيل الدائرة كما هو موضح بالصورة :
سنقوم بعمل بيانو بسيط بإستخدام 8 مفاتيح من النوع PushButton، سيتم توليد النغمات المختلفة باستخدام الأردوينو وسماعة البيزو . كل مفتاح يصدر صوت بنغمة ذو تردد مختلف.
الكود البرمجى
// butt_c --> pin 2 #define BUTT_C 2 // butt_d --> pin 3 #define BUTT_D 3 // butt_e --> pin 4 #define BUTT_E 4 // butt_f --> pin 5 #define BUTT_F 5 // butt_g --> pin 6 #define BUTT_G 6 // butt_a --> pin 7 #define BUTT_A 7 // butt_b --> pin 8 #define BUTT_B 8 // butt_h --> pin 9 #define BUTT_H 9 // speaker --> pin 13 #define SPEAKER 13 // variables to store the state of the buttons int C = 0, D = 0, E = 0, F = 0, G = 0, A = 0, B = 0, H = 0; //NOTES 'c' , 'd', 'e', 'f', 'g', 'a', 'b', 'h' int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; //freq int Cur_tone = 0; void setup() { pinMode(BUTT_C, INPUT); pinMode(BUTT_D, INPUT); pinMode(BUTT_E, INPUT); pinMode(BUTT_F, INPUT); pinMode(BUTT_G, INPUT); pinMode(BUTT_A, INPUT); pinMode(BUTT_B, INPUT); pinMode(BUTT_H, INPUT); pinMode(SPEAKER, OUTPUT); } void loop() { C = digitalRead(BUTT_C); D = digitalRead(BUTT_D); E = digitalRead(BUTT_E); F = digitalRead(BUTT_F); G = digitalRead(BUTT_G); A = digitalRead(BUTT_A); B = digitalRead(BUTT_B); H = digitalRead(BUTT_H); // check if any button is being pressed if((C == HIGH) || (E == HIGH) || (G == HIGH) || (D == HIGH) || (F == HIGH) || (A == HIGH) || (B == HIGH) || (H == HIGH) ) { // if a button is being pressed, check which one if (C == HIGH){ Cur_tone = tones[0]; } if (E == HIGH){ Cur_tone = tones[1]; } if (G == HIGH){ Cur_tone = tones[2]; } if (D == HIGH){ Cur_tone = tones[3]; } if (F == HIGH){ Cur_tone = tones[4]; } if (A == HIGH){ Cur_tone = tones[5]; } if (B == HIGH){ Cur_tone = tones[6]; } if (H == HIGH){ Cur_tone = tones[7]; } digitalWrite(SPEAKER, HIGH); delayMicroseconds(Cur_tone); digitalWrite(SPEAKER, LOW); delayMicroseconds(Cur_tone); } else{ //switch off the speaker if no button is being pressed digitalWrite(SPEAKER, LOW); } }
شرح الكود:
في البداية نقوم بتعريف متغيرات لإستخدامها في تسجيل حالة الـ Push Buttons . ونقوم بالاعلان عن مصفوفة tones[] ، والتي سيتم تسجيل قيم الترددات عليها لإستخدامها في توليد النغمات المختلفة عن طريق الـ Buzzer .
في الدالة setup() قمنا بتفعيل المنافذ الموصله مع المفاتيح كمدخل، والمنفذ الموصل مع الـ Buzzer كمخرج.
// variables to store the state of the buttons int C = 0, D = 0, E = 0, F = 0, G = 0, A = 0, B = 0, H = 0; //NOTES 'c' , 'd', 'e', 'f', 'g', 'a', 'b', 'h' int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; //freq int Cur_tone = 0; void setup() { pinMode(BUTT_C, INPUT); pinMode(BUTT_D, INPUT); pinMode(BUTT_E, INPUT); pinMode(BUTT_F, INPUT); pinMode(BUTT_G, INPUT); pinMode(BUTT_A, INPUT); pinMode(BUTT_B, INPUT); pinMode(BUTT_H, INPUT); pinMode(SPEAKER, OUTPUT); }
ثم نقوم بقراءة حالة الـ Push Buttons وتخزينها، وتخزينها في المتغيرات التي تم الاعلان عنها سابقا :
void loop() { C = digitalRead(BUTT_C); D = digitalRead(BUTT_D); E = digitalRead(BUTT_E); F = digitalRead(BUTT_F); G = digitalRead(BUTT_G); A = digitalRead(BUTT_A); B = digitalRead(BUTT_B); H = digitalRead(BUTT_H);
نقوم بعملية التحقق من المفتاح الذي تم الضغط عليه. بعد ذلك يتم تسجيل قيمة معينة في متغير Cur_tone حسب المفتاح المضغوط عليه. ثم نقوم بتشغيل الـ Buzzer بتأخير زمني يعتمد على قيمة المتغير Cur_tone :
// check if any button is being pressed if((C == HIGH) || (E == HIGH) || (G == HIGH) || (D == HIGH) || (F == HIGH) || (A == HIGH) || (B == HIGH) || (H == HIGH) ) { // if a button is being pressed, check which one if (C == HIGH){ Cur_tone = tones[0]; } if (E == HIGH){ Cur_tone = tones[1]; } if (G == HIGH){ Cur_tone = tones[2]; } if (D == HIGH){ Cur_tone = tones[3]; } if (F == HIGH){ Cur_tone = tones[4]; } if (A == HIGH){ Cur_tone = tones[5]; } if (B == HIGH){ Cur_tone = tones[6]; } if (H == HIGH){ Cur_tone = tones[7]; } digitalWrite(SPEAKER, HIGH); delayMicroseconds(Cur_tone); digitalWrite(SPEAKER, LOW); delayMicroseconds(Cur_tone); } else{ //switch off the speaker if no button is being pressed digitalWrite(SPEAKER, LOW); }
استخدم مفاتيح أخرى لإصدار نغمات مختلفة .