الصنّاع العرب

دائرة إصدار نغمات صوتية بالأردوينو

وصف المشروع

باستخدام مقاومة ضوئية وسماعة وبعض الأكواد البرمجية سيمكنك إصدار نغمات صوتية مختلفة حسب شدة الإضاءة الساقطة على المقاومة الضوئية (حرك يديك واستمع إلى أصوات النغمات المختلفة).

جدول المكونات

العدد النوع
1 لوحة أردوينو أونو Arduino Uno board
1 مقاومة ضوئية Photo resistor LDR
1 سماعة صغيرة speaker
1 مقاومة10 كيلو أوم Resistor 10 k ohm
1 لوحة اختبار Bread board
مجموعة أسلاك توصيل connecting wires

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

شرح المكونات

  • لوحة Arduino Uno

نستخدمها في التحكم فى الدائرة، استقبال وإرسال الإشارات بتوقيت معين وكيفية معينة نختارها طبقاً لعمل الدائرة وبواسطة الكود الذى سيتم شرحه لاحقاً.

يرجى تثبيت البرنامج الخاص بالأردوينو من هنا والذي سنستخدمه في كتابة الكود وعمل compiling ورفعه إلى لوحة الأردوينو عن طريق كابل USB، ولمعرفة كيفية تثبيت البيئة التطويرية المتكاملة لأردوينو (Arduino IDE) من هنا.

لتحميل ورقة البيانات datasheet الخاصة بلوحة الأردوينو أونو Arduino Uno اضغط هنا، ولتحميل نسخة أخرى اضغط هنا، ويوجد هنا في موقع الصناع العرب مواضيع مفصله عن الأردوينو وكيفية تنصيب البرنامج، وللمزيد يمكنك زيارة الموقع الخاص به من هنا.

  • مقاومة 10 كيلو أوم Resistor 10 k ohm

  • المقاومة هي عنصر كهربى فائدته إعاقة مرور التيار بقدر معين يتناسب مع قيمة المقاومة، فالتيار المار في مقاومة 100 أوم يكون أكبر من التيار المار في مقاومة 10 كيلو أوم عند تطبيق نفس قيمة الجهد عليهما.
    تقاس المقاومة بوحدة الأوم (ohm) ويرمز له بهذا الرمز: وشكل المقاومة في الدوائر كالتالي:

    أو

    وللمقاومة ألوان يتم من خلال ترتيب الألوان هذه تحديد قيمة كل مقاومة، والجدول التالي يوضح القيم الخاصة بكل لون:

    والمقاومة المستخدمة في الدائرة قيمتها 10 كيلو أوم (بهذا اللون)

  • وهنا وضعنا المقاومة لسبب هام جداً وهو: المقاومة الضوئية تعتبر عنصر إدخال للأردوينو على الطرف رقم A2، فعندما تعمل المقاومة الضوئية فإنها تصدر جهد يتم قراءته بالاردوينو، إذاً ماذا يحدث إذا لم توجد إشارة دخل؟ لن يعرف الاردوينو أن هذه القيمة صفر إلا اذا أوصلنا هذا الطرف بالأرضى، فنقوم بوضع مقاومة طرفها الاول مشترك على طرف A2 مع المقاومة الضوئية، والطرف الآخر موصل بالأرضى، ونجعل قيمة المقاومة كبيرة ولتكن 10 كيلو أوم حتى تمر الإشارة الخارجة من المقاومة الضوئية إلى طرف الأردوينو A2 لأنه أقل مقاومة من الناحية الأخرى (وهو المقاومة 10 كيلو) وهو ما يعرف علمياً باسم pull down resistor كما توضحه الصور التالية:

والمفتاح فى الصورة هو عبارة عن مصدر ادخال الإشارة إذا عمل تمر الإشارة إلى طرف الدائرة وإذا لم يعمل فيكون طرف الدائرة قيمته صفر (low) لانه موصل بالارضي فقط.

ويوجد نوع عكسه اسمه pull up resistor بهذا الشكل:

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

  • المقاومة الضوئية (Photo Resistor (LDR

والحروف LDR هي اختصار لـ Light Dependent Resistor وهي أيضاً مقاومة متغيرة لكن ليست تتغير مثل السابقة إنما تتغير حسب كمية الضوء الساقط عليها، أي أن قيمتها عند وجود ضوء ساقط عليها تختلف عن قيمتها عند وجود ظلام، ويمكنك تجربتها باستخدام جهاز multi-meter وضبطه على وضع أوم ohm وتسليط الضوء على المقاومة ثم حجبه ولاحظ قراءة جهاز القياس بنفسك.

ولها طرفان كما هو موضح فى الصورة، وشكلها فى دوائر كالتالي:

  • سماعة Speaker

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

  • لوحة اختبار الدوائر Bread board

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

تحتوي معظم اللوحات هذه على صفين على الجوانب أحدهما أحمر والآخر أزرق كما بالصورة بالأسفل (A و D)، وكل النقاط فى طول هذا الصف متصلة ببعض.

باقي النقاط فى المنتصف يمين ويسار الفراغ المنتصف (B و C) مقسمة طولياً وليس أفقياً كما بالأحمر والأزرق، والصورة التالية توضح لك النقاط المتصلة ببعضها:

ويتم تركيب العناصر بإدخال الأطراف المعدنية في الفراغات، والعناصر المراد توصيلها معاً يتم إدخال الأطراف في نفس العمود (حيث كل 4 نقاط رأسية متصلة ببعض).

ملحوظة: الصفين الموجب يمين ويسار اللوحة غير متصلين ببعض، والصفين الأرضي أيضاً لذا عليك توصيلهم بهذا الشكل:

وهذه الصورة توضح كيفية تغذية اللوحة بمصدر الجهد والأرضي من الأردوينو:

يمكنك تتبع الصورة في بداية الشرح لإتمام توصيل العناصر ببعضها، وللمزيد عن كيفية استخدام لوح التجارب (Breadboard) اضغط هنا.

  • مجموعة أسلاك التوصيل Connecting wires

ينصح بالحصول على مجموعة أسلاك للتوصيل مثل التي بالصورة وتستخدم في توصيل العناصر ببعضها أو التوصيل بأجزاء خارجية مثل لوحة الأردوينو والحساسات وغيرها.

وللمزيد عن استخدام الأسلاك (wires) اضغط هنا.

الكود البرمجي وتجربة وتشغيل الدائرة:

#define speaker 9                     //speaker connected to digital pin 9
#define photoresistor A0              //photoresistor connected to analog pin A0
long val = 0;                         //to store value from photoresistor
long maxread = 0;                     //maximum value from calibration phase
long minread = 1000;                  //minimum value from calibration phase
double f = 0;                         //frequency of tone
double normf = 0;                     //normalized frequency
double log_f = 0;                     //logarithm of normalized frequency
int ilogf = 0;                        //rounded logarithm
int i = 0;                            //loop dummy variable
double factor = 0;                    //scaling factor for calibration
double shift = 0;                     //shift for calibration
long maxfreq = 1048;                  //maximum desired frequency after calibration
long minfreq = 131;                   //minimum desired frequency after calibration
                                      //magic numbers that make the intervals sound pleasing
double gap = 1.148698355;             //ratio of consecutive notes (pentatonic)
                                      // it's the 5th root of 2
                                      //double gap = 1.059463094;           //ratio of consecutive notes (chromatic)
                                      // its the 12th root of 2
void setup()
{
  pinMode(speaker, OUTPUT);           // sets the digital pin as output
                                      // calibration loop to determine a rasonable range of light levels (minread to maxread)
                                      // and map that to frequencies between minfreq and maxfreq
  for (i = 0; i < 500; i++) { // calibration loop runs for 5 seconds val = analogRead(photoresistor); tone(speaker, val); // play raw tone to guide calibration if (val > maxread)
    {
      maxread = val;                  //store the largest value
    }
    if (val < minread)
    {
      minread = val;                   //store the smallest value
    }
    delay(10);                         // reasonable delay
  }
                                       //Now we use the calibration to calculate scale and shift parameters
  factor = (double)(maxfreq - minfreq) / (double)(maxread - minread); // scale parameter
                                       //it's like a slope
  shift = factor * minread - minfreq;  //shift parameter: it's like an offset
}
void loop()
{
  val = analogRead(photoresistor);     // read photocell
  f = factor * val - shift;            // this linearly maps the frequency to
                                       // a value between minfreq and maxfreq
                                       // according to the calibration result
  normf = f / (double) minfreq;        // Dividing an exponential function by the min value
  log_f = log(normf) / log(gap);       // allows us to take the log (base gap) and the result
  ilogf = round(log_f);                // is the number of notes above the lowest, once we round it.
  f = minfreq * pow(gap, ilogf);       // we better "unlog" it.
  tone(speaker, f);                    // this produces the tone signal
}

قم بإنشاء ملف مشروع جديد بالاسم الذي تريده واكتب الكود السابق فيه واحفظه عندك على جهازك، قم بتوصيل لوحة الأردوينو بالكمبيوتر لديك وارفع الكود إلى لوحة الأردوينو (upload).

يمكنك تجربة محاكاة الدائرة من هنا، وفى هذا الرابط ستجد الدائرة مرسومة كما هو مُوضح بالأعلى، للتشغيل اضغط على زر Start Simulation لبدء المحاكاة، قم بالضغط على المقاومة الضوئية وغير قيمتها بتحريك النقطة السوداء يميناً ويساراً كما بالشكل:

يمكنكم تحميل رسم وتصميم الدائرة ببرنامج Fritzing من هنا وملف كود الأردوينو من هنا.

ولتحميل برنامج Fritzing المجاني من خلال الموقع الخاص به اضغط هنا.

ويمكنك أيضا البحث فى موقع Fritzing وموقع المحاكاة circuits.io عن تصميمات ورسومات لدوائر مختلفة واسعة المجال وتطبيقات متنوعة ورائعة (جربها الآن).

أتمنى أن يكون الدرس ممتعاً لكم.

محمد عبد الحميد

أضف تعليق

اترك رد

تابعنا