
به نام خدا
پروژه اندازه گیری سطح صدا با آردوینو بر حسب دسی بل با میکروفون
به علت تراکم جمعیت زیاد, آلودگی صوتی واقعا اهمیت دارد. گوش طبیعی انسان میتواند سطح صدا را از ۰ دسی بل تا ۱۴۰دسی بل بشنود که در آن سطح صدا از۱۲۰ دسی بل تا ۱۴۰دسی بل به عنوان نویز در نظر گرفته می شود .بلندی صدا یا سطح صدا معمولا برحسب دسی بل اندازه گیری میشوند .
ما بعضی از ابزار هایی را داریم که میتوانیم که سیگنال های صوتی را در دسی بل اندازه گیری کنیم اما این ابزار ها کمی گران هستند و متاسفانه ما از ماژول باکس برای اندازه گیری سطح صدا در دسی بل استفاده نمی کنیم و مقرون به صرفه نیست خرید میکروفن های گران قیمت .برای یک پروژه کوچک آردوینو که باید میزان صدا را در یک کلاس کوچک یا اتاق نشیمن اندازه گیری کند .
بنابراین در این پروژه از یک میکروفن ساده با آردوینو استفاده میکنیم و سعی میکنیم سطح آلودگی صدا یا سرو صدا را در دسی بل تا حد ممکن نزدیک به مقدار واقعی اندازه گیری کنیم.
ما یک مدار تقویت کننده عادی برای تقویت سیگنال های صوتی و تغذیه آن به آردوینو استفاده خواهیم کرد که در ان از روش رگرسیون برای محاسبه سیگنال های صوتی در دسی بل استفاده میکنیم .
برای بررسی این که آیا مقادیر بدست آمده صحیح هستند , میتوان از نرم افزاراندروید (وسیله صدا) استفاده کنیم ,اگر شما یک وسیله بهتر داشته باشید می توانید آنرا برای کالیبراسیون استفاده کنید.
توجه داشته باشید که هدف این پروژه دقت اندازه گیری برحسب دسی بل نیست و فقط مقادیر را که ممکن است به مقدار واقعی نزدیک می شود, ارایه دهد .
وسایل مورد نیاز:
آردوینو UNO
میکروفن
LM386
پتانسیومتر ۱۰ کیلو
مقاوت و خازن ها
دیاگرام مدار
مدار برای این پروژه( سطح صدای آردوینو) خیلی ساده است که ما ازیک تقویت کننده LM386 استفاده کردیم تا سیگنال ها را از میکروفن تقویت کنیم و آنرا به پورت آنالوگ آردوینو بفرستیم.
گین این عامل خاص را میتوان از ۲۰ تا ۲۰۰ با استفاده از مقاومت یا خازن بین پین ۱و ۸ تنظیم کرد.اگر آنها آزاد باشند ,گین آنها به طور پیش فرض به ۲۰ تنظیم خواهد شد. در پروژه مان, ما حداکثر گین ممکن را در این مدار بدست می آوریم .
بنابراین ما از یک خازن به ارزش ۱۰ میکروفاراد بین پین های ۱و۸ استفاده می کنیم , توجه داشته باشید که این پین حساس به قطب مثبت ومنفی است و پین منفی خازن باید به پین ۸ متصل شود . مدارتقویت کننده توسط ۵ ولت آردوینو تغذیه شده است.
خازن c2 برای فیلتر کردن نویز DC از میکروفن استفاده شده است .اساسا میکروفن وقتی صدا را حس میکند امواج صوتی را به سیگنال های AC تبدیل خواهد کرد.این سیگنال های AC ممکن است دارای یک نویز DC باشد که توسط این خازن فیلتر میشود. به طور مشابه,حتی پس از تقویت ,یک خازن C3 برای فیلتر کردن هر نویز DC که در طول تقویت ممکن است اضافه شود, استفاده میشود .
استفاده از روش رگرسیون برای محاسبه دسی بل از مقدار ADC:
هنگامی که مدارمان آماده هست ما می توانیم آردوینو را به کامپیوتر وصل کنیم و به طور مثال برنامه (سریال آنالوگ خوانده شده)را بارگذاری کنید در آردوینو , بررسی کنید که آیا مقادیر معتبر ADC را از میکروفن دریافت می کنیم . حالا ما باید این مقادیر ADC را به دسی بل تبدیل کنیم .
بر خلاف مقادیر دیگری مانند اندازه گیری دمای یا رطوبت ,اندازه گیری دسی بل کار ساده ای نیست. از آنجا که مقدار دسی بل با مقدار ADC رابطه خطی ندارد چند راه وجود دارد که در آن میتوانید دهید ولی ممکن است به نتایج خوبی نرسید .
برای این کاربرد , هنگام اندازه گیری مقادیر دسی بل , نیازی به دقت بالا برای اندازه گیری مقادیر db نداشتم و به همین خاطر تصمیم گرفتم مقادیر ADC را با استفاده از یک SPL متر مقایسه و کالیبره کنم . برای این کار ما نیاز به یک SPL متر خواهیم داشت (SPL meter یک ابزار است که میتواند مقدار های دسی بل را بخواند و آنرا نمایش دهد)، اما متاسفانه این وسیله را نداشتم .
بنابراین ما میتوانیم از نرم افزار های اندروید برای سنجش صدا استفاده کنیم که میتوانید به صورت رایگان آن را دانلود کنید . اپلیکیشن های زیادی برای این کار وجود دارد و شما میتوانید هر چیزی را به انتخاب خود دانلود کنید .
این برنامه ها از میکروفن داخلی موبایل برای تشخیص سطح سر و صدا استفاده میکنند و آنرا در تلفن همراه ما نمایش می دهند . داده های آنها دقیق نیستند اما مطمِئنا برای کار ما کافی خواهد بود . بنابراین با نصب برنامه اندروید شروع میکنیم, هنگامی که باز شد چیزی شبیه به زیر را مشاهده می کنید .
همانطور که قبلا گفتم رابطه بین مقادیر دسی بل و پورت آنالوگ خطی نخواهد بود و بنابراین ما باید این دو مقدار را در فواصل مختلف مقایسه کنیم. مقدار ADC روی صفحه نمایش داده می شود و مقدار دسی بل متناظر با این مقدار های ADC بر روی موبایل نمایش داده می شود . من ۱۰ بار نتیجه را خواندنم گرفتم که در زیر می بینید .
صفحه اکسل را باز کنید و در این مقادیر تایپ کنید. در حال حاضر ما از اکسل برای پیدا کردن مقادیر رگرسیون برای شماره بالا استفاده میکنیم قبل از آن ,نمودار را ترسیم کرده و نحوه ارتباط آن ها را بررسی کنید .
همانطور که میبینیم مقدار دسی بل به طور خطی با ADC ارتباطی ندارد,به این معنی که شما نمیتوانید یک ضریب مشترک برای تمام ADC داشته باشید تا مقدار دسی بل معادل آن را بدست آورید. در چنین مواردی میتوانیم از روش خطی رگرسیون استفاده کنیم .
اساسا این خط آبی نا منظم را به نزدیک ترین خط مستقیم ممکن(خط سیاه) تبدیل میکند و معادله ی این خط مستقیم را به ما میدهد.این معادله را میتوان استفاده کرد برای پیدا کردن مقدار معادل دسی بل برای هر مقدار از ADC,که جزئی ازابزارهای آردوینو است.
در اکسل ما یک پلاگین برای تجزیه و تحلیل داده ها داریم که به طور خودکار رگرسیون را برای مجموعه از مقادیرمنتشر میکند و داده های آن را منتشر میکند.من نمیخواهم در مورد چگونگی انجام این کار با اکسل صحبت کنم زیرا خارج از محدوده این پروژه است ,همچنین می توانید برای آموزش آن در گوگل سرچ کنید.
هنگامی که رگرسیون را برای این مقدار ها محاسبه میکنید ، اکسل برخی مقادیر مانند زیر را نشان میدهد .
هنگامی که این اعداد را دریافت میکنید میتوانید معادله زیر را بنویسید .
ADC = (11.003* dB) – ۸۳٫۲۰۷۳
حال می توانید به رابطه دسی بل برسید .
dB = (ADC+83.2073) / 11.003
برنامه آردوینو برای اندازه گیری سطح صدا در دسی بل :
برنامه کامل برای اندازه گیری دسی بل در زیر آمده است,چند خط مهم در زیر توضیح داده شده است .
در این دو خط زیر ,مقدار ADC پین A0 را می خوانیم و آن را با استفاده از معادله ای که از آن استخراج شده به دسی بل تبدیل میکنیم . این مقدار ممکن است ما را به ارزش واقعی دسی بل به درستی نرساند ,اما تقریبا نزدیک به مقدار نمایش داده شده در برنامه تلفن همراه است .
adc= analogRead(MIC); //Read the ADC value from amplifer dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values
برای بررسی اینکه آیا برنامه به درستی کار میکند ما همچنین یک LED را به پین ۳ دیجیتال آردوینو اضافه کردیم که در واقعی که صدایی بلند تر از ۶۰ دسی بل اندازه گیری می شود برای ۱ ثانیه High می شود ( روشن می شود ) .
if (dB>60) { digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(3, LOW); }
نحوه عملکرد پروژه :
وقتی مدار را بستید و برنامه ای را که دانلود کردید ، برنامه را بر روی برد آردوینو آپلود کنید ، حالا سریال مانیتور نرم افزار خود را باز کنید تا مقادیر dB اندازه گیری شده توسط آردوینو را ببینید . من این کد را در اتاقم آزمایش کردم که در آن سر و صدای زیادی وجود نداشت به جز ترافیک بیرون و مقادیر زیر را روی مانیتور سریال من نشان داد و برنامه اندروید نیز چیزی نزدیک به آن را نمایش داد.
تقویت کننده با مدار فیلتر :
در اینجا ما با استفاده از تقویت کننده فیلتر های کم پاس و پر قدرت را برای کاهش نویز در این مدار اندازه گیری سطح صدا به کار بردیم تا دقت را افزایش دهیم .
در مدار فوق، از تقویت کننده محبوب LM358 برای تقویت سیگنال های میکروفون استفاده می کنیم. همراه با تقویت کننده ما همچنین از دو فیلتر استفاده می کنیم، فیلتر بالاگذر توسط R5 ، C2 تشکیل شده است و فیلتر پایین گذر توسط C1 و R2 استفاده می شود.
این فیلترها برای عبور فرکانس هایی بین ۸ تا ۱۰ کیلوهرتز طراحی شده اند، زیرا فیلتر پایین گذر ، هرچیز کمتر از ۸ کیلو هرتز را فیلتر می کند و فیلتر بالا گذر هر چیزی بالاتر از ۱۵کیلوهرتز را فیلتر می کند.
این محدوده فرکانس به این دلیل انتخاب شده است زیرا میکروفون ما بین ۱۰ تا ۱۵ کیلو هرتز کار می کند . دیتاشیت میکروفون در زیر آمده است .
اگر فرکانس کاری شما فرق می کند , می توانید از فرمول زیر برای محاسبه مقدار مقاومت و خازن برای فرکانس مورد نیاز خود استفاده کنید .
Frequency (F) = 1/(2πRC)
همچنین توجه داشته باشید که مقدار مقاومت مورد استفاده ، در گین آمپلی فایر تاثیر خواهد گذاشت. محاسبه مقدار مقاومت و خازن مورد استفاده در این مدار در زیر نشان داده شده است.
دانلود کد پروژه:
دانلود فایلconst int MIC = 0; //the microphone amplifier output is connected to pin A0 int adc; int dB, PdB; //the variable that will hold the value read from the microphone each time void setup() { Serial.begin(9600); //sets the baud rate at 9600 so we can check the values the microphone is obtaining on the Serial Monitor pinMode(3, OUTPUT); } void loop(){ PdB = dB; //Store the previous of dB here adc= analogRead(MIC); //Read the ADC value from amplifer //Serial.println (adc);//Print ADC for initial calculation dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values if (PdB!=dB) Serial.println (dB); if (dB>60) { digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level) delay(2000); // wait for a second digitalWrite(3, LOW); } //delay(100); }
دیدگاهها (0)