قياس مستوى الصوت باستخدام الاردوينو

 في هذا المشروع سنقوم بتعلم كيفية استخدام الأردوينو لقياس مستوى الصوت، وسيتم توضيح مستوى الصوت على مجموعة من الـ LEDs.

المكونات المطلوبة

arduino uno r3

Arduino Uno

Electret Microphone

10K Ohm Potentiometer

LM386

Capacitor 10uF 50V

100nF capacitor

Red LED

 

220 Ω resistor

220 Ohm Resistor

10K Ohm Resistor

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

 

LM386 :

هو عبارة عن دارة متكاملة تحتوي على مكبر عمليات (Operational Amplifier) ،يقوم بتكبير الاشارة الصوتية القادمة اليه من المايكروفون

نقوم بقراءة هذه الإشارة الصوتية بعد تكبيرها عن طريق الأردوينو، الذي بدوره يقوم بتشغيل الـ LEDs حسب شدة الإشارة الصوتية.

توصيل الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

قياس مستوى الصوت باستخدام الاردوينو

سنقوم ببرمجة الأردوينو بحيث يقوم بقراءة الإشارة الصوتية التي يلتقطها المايكروفون بعد تكبيرها من خلال LM386، ثم يوضح شدة الصوت على مجموعة من الـ LEDs.

قياس مستوى الصوت باستخدام الاردوينو

 

الكود البرمجي

#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8

int value;

void setup()
{
  //set pins attached to LEDs as outputs
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
  pinMode(LED5,OUTPUT);
  pinMode(LED6,OUTPUT);
}

void loop()
{
  value = analogRead(5); 
  
  //glow the LEDs depending on the ammount of sound detected by the electret  
  if (value > 455 && value <555)
  {//glow first LED
    Clear(4);
    Glow(4);
  } 
  else if (value > 378 && value < 624)
  {//glow 2nd LED
    Clear(5);
    Glow(5);
  }
  else if (value > 311 && value < 693)
  {//glow 3rd LED
    Clear(6);
    Glow(6);
  }
  else if (value > 244 && value < 762)
  {//glow 4th LED
    Clear(7);
    Glow(7);
  }
  else if (value > 177 && value < 831)
  {//glow 5th LED
    Clear(8);
    Glow(8);
  }
  else if (value < 177 || value > 831)
  {//glow 6th LED
    Clear(9);
    Glow(9);
  }
  
}

void Glow(int initial)//function to glow LEDs
{
  for(int i=3;i<initial;i++)	digitalWrite(i,HIGH);
}

void Clear(int initial)//function to clear LEDs
{
  for(int i=initial;i<9;i++)	digitalWrite(i,LOW);
}

شرح الكود :

في البداية نقوم بتسمية منافذ الأردوينو المستخدمة في المشروع. ونقوم بالإعلان عن المتغير value الذي سيستخدم في تخزين قيمة قراءة الإشارة الصوتية :

#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8

int value;

في الدلة ()setup ، نقوم بضبط الإعدادات اللازمة مثل ضبط المنافذ الموصله مع الـ LEDs كمخرج :

void setup()
{
  //set pins attached to LEDs as outputs
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
  pinMode(LED5,OUTPUT);
  pinMode(LED6,OUTPUT);
}

في الدالة ()loop ، نقوم بقراءة الإشارة الصوتية الناتجة عن المايكروفون بعد تكبيرها بواسطة LM386 :

value = analogRead(5);

بعد ذلك نقوم بإختبار القيمة المقاسه وإعتمادا على هذه القيمة نقوم بإضاءة الـ LEDs بإستخدام الدالتين Clear وGlow للتعبر عن مدى ارتفاع أو انخفاض شدة الإشارة الصوتية :

  if (value > 455 && value <555)
  {//glow first LED
    Clear(4);
    Glow(4);
  } 
  else if (value > 378 && value < 624)
  {//glow 2nd LED
    Clear(5);
    Glow(5);
  }
  else if (value > 311 && value < 693)
  {//glow 3rd LED
    Clear(6);
    Glow(6);
  }
  else if (value > 244 && value < 762)
  {//glow 4th LED
    Clear(7);
    Glow(7);
  }
  else if (value > 177 && value < 831)
  {//glow 5th LED
    Clear(8);
    Glow(8);
  }
  else if (value < 177 || value > 831)
  {//glow 6th LED
    Clear(9);
    Glow(9);
  }

نستخدم الدالة Glow لإضاءة الـ LEDs تدريجيا حسب قيمة شدة الصوت :

void Glow(int initial)//function to glow LEDs
{
  for(int i=3;i<initial;i++)	digitalWrite(i,HIGH);
}

نستخدم الدالة Clear لإطفاء الـ LEDs تدريجيا حسب قيمة شدة الصوت :

void Clear(int initial)//function to clear LEDs
{
  for(int i=initial;i<9;i++)	digitalWrite(i,LOW);
}



اردوينو – الدرس الحادي عشر – اصدار الأصوات (Piezo sounder)

مقدمة

في هذا الدرس سنتعلم كيفية اصدار الأصوات بمتحكم الأردوينو.
أولاً ستقوم بتشغيل مقطع صوتي، ثم القيام بالتلاعب بمستوى الصوت عبر المستشعر الضوئي ‘photocell’.

اصدار الأصوات

المواد والأدوات

arduino-lesson-11-making-sound

1× (1 kΩ Resistor)

اصدار الأصوات

 1× سماعة البيزو (Piezo sounder)

arduino-lesson-11-making-sound

 1× المستشعر الضوئي (Photocell)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو

اصدار الأصوات

الصوت هو عبارة عن ذبذبة في ضغط الهواء سرعة الذبذبة (دورات بالثانية أو هيرتز) هي ما يصدر الصوت. كلما زادت قوة الذبذبة كلما زاد علو الصوت.

اصدار الأصوات

المتوسط C عادة يعرف بالتردد 261Hz. وكأنك قمت بتشغيل واطفاء منفذ رقمي ‘digital pin’ لاكثر من 261 مره بالثانية .

لسماع النتيجة، عليك القيام بتركيب قطعه تقوم بترجمة التردادت الالكترونية إلى صوت هذا يمكن عن طريق تركيب سماعات كبيره او عبر استخدامك لسماعة البيزو ‘piezo sounder’.

سماعة piezo تستخدم نوع خاص من الكريستال تتمدد وتنكمش كتردد الكتروني والتي ينتج عنها الصوت.

توصيل الدائرة

في هذا الجزء ستجد ان سماعة البيزو ‘piezo buzzer’ موضوعة على لوح التجارب.

الرجل القصيرة موصولة بالمجال الأرضي GND والرجل الأخرى مربوطه بالمنفذ الرقمي digital pin 12 على الاردوينو.

الدائرة رقم (1):

اصدار الأصوات

اصدار الأصوات

آلة Pseudo-Theremin الموسيقية الدائرة رقم (2):

يمكن اصدار الأصوات عند تمرير يدك امامها ،
ستصنع آلة مشابهه في الوظيفة للتحكم والتأثير على مستوى الصوت بمجرد تمرير يدك فوق المستشعر الضوئي ‘photocell’.

اضف المستشعر الضوئي ‘photocell’ و المقاوم resistor للوح التجارب.

اصدار الأصوات

اصدار الأصوات

 

الكود البرمجي

ارفع الكود البرمجي التالي للدائرة رقم (1) على متحكم الاردوينو:

int speakerPin = 12;
 
int numTones = 10;
int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};
//            mid C  C#   D    D#   E    F    F#   G    G#   A
 
void setup()
{
  for (int i = 0; i < numTones; i++)
  {
    tone(speakerPin, tones[i]);
    delay(500);
  }
  noTone(speakerPin);
}
 
void loop()
{
}

لتشغيل مقطع صوتي، حدد المجال الترددي. انظر للجزء التالي من الدرس المخصص للصوت .
كل مجال ترددي لكل نوته صوتية تم الاحتفاظ به في مصفوفه ‘array’ . المصفوفه ‘array’ هي مثل القائمة، وبذلك يتم تشغيل المقطع عبر الانتقال لكل نوته صوتية بالقائمه.

في حلقة ‘for’ loop سيبدأ العد من 0 وحتى 9 باستخدام القيمه i . للحصول على المجال الترددي للنوته الصوتية لتشغيلها بكل خطوه نقوم باستخدام ‘tone[i]’. هذا يعني ان القيمة الموجودة في مصفوفة ‘tones’  في موضع ‘i’
كمثال ، قيمة ‘[0]tones’ هي 261 ، وقمية ‘[1]tones’ هي 277 .. وهكذا ..

الأمر ‘tone’ في الاردوينو يقوم بأخذ متغيرين اثنين، الأول هو المنفذ الذي يقوم باصدار الأصوات والثاني هي التردد الصوتي للمقطع لتشغيله.

عند الانتهاء من تشغيل من جميع النوتات الصوتية ، أمر ‘noTone’ يقوم بإيقاف اصدار الأصوات.

كان بإمكانك ان تضع الكود البرمجي لتشغيل الاصوات داخل دالة loop عوضاَ عن دالة setup وذلك لأنها ستكرر المقطع الصوتي مره بعد مره دون توقف مما سيتسبب بالإزعاج لذلك تم وضعه داخل دالة setup
لذلك دالة loop فارغة .

لاعادة تشغيل المقطع الصوتي كل ما عليك فعله هو الضغط على زر reset الموجود بمتحكم الاردوينو .

ارفع الكود للدائرة (2) على متحكم الاردوينو:

int speakerPin = 12;
int photocellPin = 0;
 
void setup()
{
}
 
void loop()
{
  int reading = analogRead(photocellPin);
  int pitch = 200 + reading / 4;
  tone(speakerPin, pitch);
}

الكود واضح، استخدم المنفذ التناظري ‘analog pin’  للقراءة من A0 لقياس الضوء. وستكون القيمة مابين 0 و 700.

اضفنا القيمة 200 لجعل التردد 200Hz كأقل تردد، وببساطه يتم اضافة القراءه عبر قسمة القيمة على 4 ، لاصدار تردد ما بين 200Hz و 370Hz.

أنشطة أخرى

حاول تغيير القيمة 4 بالسطر التالي لخفض القيم المرتفعة:

int pitch = 200 + reading / 4;

تغيير القيمه سيرفع أو يقلل من التردد اعتمادًا على الرقم الذي قمت بوضعه.

يمكنك التلاعب بقيم النوتات الصوتية لترى ماذا سيحدث.