Thursday, October 25, 2018

صرصور الليل الإلكتروني - توليد صوت صرصور الليل باستخدام أردوينو

من منا سمع صوت صرصور الليل من قبل وقد استمر في إطلاق صوته المشهور الذي قد يضايق الكثيرين ليلاً


هناك الكثيرين ممن قد يجد هذا الصوت مزعجاُ بينما قد يجده الآخرون يبعث على الإسترخاء والإحساس بجمال الطبيعة

قد يكون هذا الصوت مزعجاُ بالفعل لو أنه بالقرب من مكان نومك بالليل ولا تستطيع إيجاده أو إسكاته

بينما قد يجده البعض مساعداً على النوم خاصة لو كان الصوت خاقتاُ وذلك لأنه مستمر ذو إيقاع ثابت

حتى أن هناك بعض البرامج على هواتف آيفون وأندرويد تساعد على النوم عن طريق تشغيل هذه الأصوات المستمرة

اليوم فكرت في أنني أستطيع تشغيل هذا الصوت باستخدام أردوينو وسماعة

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

كما أنه كتب هذا البرنامج بحيث يصدر الأصوات بطريقة عشوائية لا يمكن اكتشافها ليكون بمثابة مزحة لأصدقائه

وأيضاُ كتب نسخة أخرى من البرنامج بحيث تصدر الأصوات بانتظام كما يمكنك التحكم في شدة الصوت عن طريق إشارات تعديل إتساع النبضة
PWM Pulse Width Modulation


وقد أعجبتني هذه النسخة كثيراً حيث أنها تشبه صرصور الليل الطبيعي الذي يصدر أصواتاً ذات إيقاع منتظم

هذه هي الخطوات التي قمت بتنفيذها

الأدوات المستخدمة

قم بتحميل البرنامج على لوحة أردوينو


قم بتوصيل السماعة بلوحة أردوينو



استخدم الدائرة






#include "Volume3.h"
#define speakerPin 9

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
  chirpFade();
  delay(random(100,5000));
}

void chirpFade() {
  uint16_t f = 3900;

  uint8_t times = random(1,3);
  float master = 1.0;
  uint16_t v = 0;
  uint8_t vDir = 1;
  float vb = 0;

  while (times > 0) {
    while (vb < 1.0) {
      if (v < 1023 && vDir == 1) {
        v += 16;
      }
      else {
        vDir = 0;
      }

      if (v > 0 && vDir == 0) {
        v -= 16;
      }
      else {
        vDir = 1;
      }

      vol.tone(speakerPin, f, v * constrain(vb, 0.0, 1.0)*master);
      delayMicroseconds(50);
      vb += 0.003;
    }
    while (vb > 0.0) {
      if (v < 1023 && vDir == 1) {
        v += 16;
      }
      else {
        vDir = 0;
      }

      if (v > 0 && vDir == 0) {
        v -= 16;
      }
      else {
        vDir = 1;
      }

      vol.tone(speakerPin, f, v * constrain(vb, 0.0, 1.0)*master);
      delayMicroseconds(50);
      vb -= 0.001;
    }
    times--;
    master -= 0.75;
  }
  vol.noTone();

}