کنترل چشمه موزیکال توسط آردوینو

الکترونیک و رباتیک -> ماژول ها و سنسور ها 1866 3 کاربر آکادمی پارتینه

ایده اصلی در چشمه موزیکال این است که با دریافت موسیقی از هر منبع صوتی خارجی، مقادیر مختلفی ولتاژ مطابق با ریتم ایجاد شده  و بر اساس این مقادیر میزان روشنایی و طیف رنگ چراغ ها تغییر کند.

در این پروژه از ماژول تشخیص صدا برای تبدیل صوت به دامنه‌های مختلف استفاده شده است. سپس مقدار ولتاژ برای مقایسه سطح صدا با یک حد خاص به مقایسه‌گر اعمال شده و زمانی که اشباع مثبت برای آپ امپ اتفاق بیفتد یک رله تغییر حالت می‌دهد. بنابراین در آموزش به ساخت یک چشمه موزیکال توسط ماژول تشخیص صوت و آردوینو پرداخته می‌شود.

مواد اولیه :
# عنوان تعداد لینک
0 برد آردوینو 1 لینک خرید
1 LED 1 لینک خرید
2 ماژول صوت 1 لینک خرید

مرحله 1 : معرفی ماژول تشخیص صوت

ماژول تشخیص صوت همراه با یک میکروفون خارجی است که قابلیت تشخیص صدای محیط را دارد. ساختار داخلی این ماژول شامل یک مقایسه‌کننده LM393 و میکروفون است که  از آن برای تشخیص صدایی فراتر از حد آستانه تنظیم شده ، استفاده می‌شود. خروجی این ماژول یک سیگنال دیجیتالی است که نشان دهنده‌ی وجود یا عدم وجود صوت است. یک عدد پتانسیومتر جهت تنظیم حساسیت صدا روی ماژول قرار گرفته است. 

در این ماژول صدا ورودی اصلی است که ماژول این سیگنال صوتی را به سیگنال‌ الکتریکی تبدیل می‌کند. میزان خروجی سیگنال الکتریکی سنسور صدا به اندازه‌ای کوچک است که تجزیه و تحلیل آن دشوار بوده، بنابراین به منظور تقویت سیگنال خروجی نیاز به استفاده ازیک مدار تقویت کننده ترانزیستوری امیتر مشترک استفاده می‌شود. در خروجی تقویت کننده یک مقایسه‌گر LM393 اعمال شده که سیگنال الکتریکی دریافتی از میکروفون با سیگنال مرجع حاصل از مدار مقسم ولتاژ مقایسه کند.

مرحله 2 : اتصالات و دیاگرام مداری

همانطور که در دیاگرام مشخص شده است ، ماژول تشخیص صوت از 3.3 ولت بورد آردوینو نانو تغذیه شده و پین خروجی ماژول سنسور صدا به پین ورودی آنالوگ (A6) آردوینو متصل می‌شود. ماژول رله تک کانال و پمپ DC توسط منبع تغذیه خارجی 12 ولت تغذیه می‌شوند. سیگنال ورودی ماژول رله به پین خروجی دیجیتال (D10) آردوینو متصل می‌شود.

برای اثر نور دو رنگ مختلف نشانگر LED در نظر گرفته شده است که هر دو به پین‌های دیجیتال (D12 ،D11) آردوینو متصل شده‌اند. در اینجا پمپ به گونه‌ای وصل شده است که وقتی یک پالس HIGH به ورودی ماژول رله اعمال شود، رله تغییر وضعیت داده و یک مسیر بسته جهت اعمال جریان به پمپ و فعال شدن آن ایجاد می‌شود. پالس‌های HIGH / LOW بسته به ورودی صدا توسط آردوینو نانو تولید می‌شوند. مدار کامل مانند آنچه در تصویر نشان داده شده است،روی بورد هزار سوراخ لحیم کاری می‌شود.

همانطور که در تصویر مشاهده می‌کنید از یک جعبه پلاستیکی به عنوان ظرف چشمه و مینی پمپ 5 ولت به عنوان فواره استفاده شده است.

مرحله 3 : کدنویسی و تنظیمات نرم‌افزاری

در بخش اول برنامه متغیرهای لازم برای اختصاص شماره پین‌ها و یک مقدار مرجع ثابت برای ماژول تشخیص صدا تعریف شده‌اند. این مقدار مرجع 700 معادل با تعداد بایت‌های سیگنال الکتریکی خروجی سنسور صدا است.

int sensor = A6;
int redled = 12;
int greenled = 11;
int pump = 10;
#define REF 700

در قسمت void setup از دستور pinMode برای مشخص کردن نوع ورودی و خروجی سنسورها استفاده شده است. در اینجا سنسور به عنوان ورودی و سایر دستگاه‌های دیگر به عنوان خروجی تعریف شده‌اند.

void setup()
{
  pinMode(sensor,INPUT);
  pinMode(redled,OUTPUT);
  pinMode(greenled,OUTPUT);
  pinMode(pump,OUTPUT);
}

در داخل حلقه اصلی با دستور analogRead مقدار ورودی آنالوگ ماژول صوتی را دریافت کرده و آن را در یک متغیر به نام sensor_value ذخیره می‌کند.

int sensor_value = analogRead (sensor);

در قسمت آخر یک از ساختار شرطی else if برای مقایسه سیگنال آنالوگ ورودی با مقدار مرجع استفاده می‌شود. اگر مقدار ورودی بیشتر از مرجع باشد کلیه پین‌های خروجی HIGH شده به طوری که تمام LEDها و پمپ فعال می‌شوند، در غیر این صورت همه چیز خاموش است. همچنین برای متمایز کردن زمان روشن / خاموش شدن رله 70 میلی ثانیه تاخیر در نظر گرفته شده است.

               if (sensor_value>REF)
  {
    digitalWrite(greenled,HIGH);
    digitalWrite(redled,HIGH);
    digitalWrite(pump,HIGH);
    delay(70);
   }
   else
   {
    digitalWrite(greenled,LOW);
    digitalWrite(redled,LOW);
    digitalWrite(pump,LOW);
    delay(70);
   }

کدکامل برنامه:

int sensor = A6;
int redled = 12;
int greenled = 11;
int pump = 10;

#define REF 700

void setup()
{
  pinMode(sensor,INPUT);
  pinMode(redled,OUTPUT);
  pinMode(greenled,OUTPUT);
  pinMode(pump,OUTPUT);
 
}
void loop()
{
  
  int sensor_value = analogRead (sensor);
  
  if (sensor_value>REF)
  {
    digitalWrite(greenled,HIGH);
    digitalWrite(redled,HIGH);
    digitalWrite(pump,HIGH);
    delay(70);
   }
   else
   {
    digitalWrite(greenled,LOW);
    digitalWrite(redled,LOW);
    digitalWrite(pump,LOW);
    delay(70);
   }
}

نظرات سایر کاربران درباره این پست

علی

سلام خوبین بببخشید این پروژه چجوری میشه با اردوینو یونو کار کرد اگر لطف کنید بگید ممون میشم