اردوينو – الدرس الحادي عشر – اصدار الأصوات (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;

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

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




نظام إنذار باستخدام الأشعة تحت الحمراء

في هذا الدرس سوف نتعلم كيفية عمل نظام إنذار بسيط جدًا باستعمال Infrared LED و برمجة كود الأدروينو الخاص بها. هذا الدرس رائع جدا للتدريب على استعمال الأدروينو للمبتدئين.

نظام-إنذار-بسيط-بإستعمال-الأردوينو-و-ا

المكونات

arduino uno r3

Arduino Uno

IR LED Emitter 5mm

IR LED Emitter

photodiode 5mm

Photo Diode (Receiver)

100k ohm

100 K Ohm Resistor

220 Ω resistor

220 Ohm Resistor

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

Piezo sounder

Piezo Sounder

ملحوظة :

في هذا الدرس، قمنا بإستعمال TCRT5000 module، والذي يحتوي على ترانزيستور للأشعة الحمراء بالإضافة إلى Infrared LED. وقمنا بإضافة Infrared LED خارجية لتقوية انبعاث الأشعة تحت الحمراء.

نظام-إنذار-بسيط-بإستعمال-الأردوينو-و-ا

كما يمكنك أن تستعمل دايود أشعة تحت الحمراء / ترانزيستور و لكن تأكد من وضع لاصق (أسود) حول الدايود أو الترانزيستور حتى لا يتأثر بالجوانب كما بالصورة.

نظام-إنذار-بسيط-بإستعمال-الأردوينو-و-ا

تصميم لوح التجارب

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

alert-system

 

alert-system

شرح الدارة

تقوم الدارة ببعث ضوء IR من خلال الـ LEDs الموضوعه، وعندما يتواجد سطح عاكس (تقريبا أي سطح عدا الاسطح السوداء فهي تمتص الضوء و لا تنعكس الا بجزء صغير)  تنعكس الأشعة تحت الحمراء لتقوم بالتأثير على الدايود أو الترانيستور وعندما يعمل الدايود يقوم بخفض الجهد نتيجة أن انخفاض مقاومته بشكل ملحوظ و يمكن من خلال الأردوينو قياس قيمة الفولت عن طريق استعمال Analog Read .

alert-system

برمجة الاردوينو :

قم بكتابة الكود كما هو موضح أدناه :

#define SENSOR A0
#define BUZZER 12

void setup() {
  pinMode(SENSOR, INPUT);
  pinMode(BUZZER,OUTPUT);
}

void loop() {
  if(readIR(600) == true)
    beep();
  // else
    // doNothing
}

void beep(void) {
  tone(BUZZER, 1000);
  delay(200);
  noTone(BUZZER);
  delay(200);
}

bool readIR(int refernceValue) {
  int x = analogRead(SENSOR);
  if(refernceValue > x)
    return true;
  else
    return false;
}

شرح الكود:

في البداية، نقوم بتسمية المدخل A0 بإسم SENSOR ، والمنفذ رقم 12 بإسم BUZZER . وهكذا يصبح الكود أسهل وأفضل في الفهم والتعامل.

داخل الدالة ()setup، نقوم بتعريف الـ SENSOR كمدخل، والـ BUZZER كمخرج.

#define SENSOR A0
#define BUZZER 12

void setup() {
  pinMode(SENSOR, INPUT);
  pinMode(BUZZER,OUTPUT);
}

في دالة ()loop، نقوم بالتحقق ما إذا كانت القراءة أقل من 600، فإذا تحقق الشرط نقوم بإصدار إنذار.

void loop() {
  if(readIR(600) == true)
    beep();
}

نقوم بإنشاء الدالة ()beep، لتوليد الإنذار. حيث تقوم الدالة بإصدار نغمة ذو تردد 1000 هيرتز، وتتوقف لمدة 200 ميلي ثانية بين النغمات.

void beep(void) {
  tone(BUZZER, 1000);
  delay(200);
  noTone(BUZZER);
  delay(200);
}

نقوم بإنشاء الدالة readIR، والتي تقوم بقراءة قيمة الحساس وإذا كانت القيمة أصغر من القيمة refernce value فإن الدالة تقوم بإرجاع قيمة صحيحة true وإلا تقوم بإرجاع قيمة خاطئ false .

bool readIR(int refernceValue) {
  int x = analogRead(SENSOR);
  if(refernceValue > x)
    return true;
  else
    return false;
}