همه ما حتما پیچ کنترل صدای اسپیکر ماشین را چرخاندهایم، یا چراغهایی را روشن و خاموش کردهایم که کلیدهای پیچی داشتهاند. در واقع تمام این فعالیتها با استفاده از قطعهای به نام پتانسیومتر انجام شده که مسئولیت تغییر ولتاژ را در مدار به عهده دارد. در این مقاله یاد میگیرید که چطور با بردی شامل یک میکروکنترلر آردوینو، پتانسیومتر و یک LED، مقدار روشنایی LED را کنترل کنید. همچنین روش دومی به شما معرفی میشود که در آن به جای استفاده از پتانسیومتر از فتوسل استفاده کنید
آموزش ساخت دیمر با استفاده از پتانسیومتر
قطعات موردنیاز برای کنترل روشنایی یک LED با یک پتانسیومتر
- یک عدد LED
- یک عدد مقاومت حداقل 220 اهم (0.25 وات)
- یک عدد Potentiometer
- یک میکروکنترلر Arduino UNO
- دو عدد سیم جامپر
- یک کابل USB تایپ A به تایپ B
- یک عدد برد بورد
پتانسیومتر چیست؟
همانطور که در شکل زیر مشاهده میکنید، پتانسیومتر یک مقاومت متغیر سهپایه است که در هر لحظه تنها از دوپایه از سهپایه آن میتوان استفاده کرد. اگر از دوپایه 1 و 3 آن به صورت همزمان استفاده کنیم، مقاومت آن ثابت و برابر حداکثر میشود. برای این که مقاومت متغیر داشته باشیم، باید حتماً از پایه 2 استفاده کنیم و پایه دوم هرکدام از پایههای 1 یا 3 میتواند باشد. مقدار مقاومت یک قطعه با طول آن رابطه مستقیم دارد. پس هر چه فاصله پایه 2 از هر کدام از پایه های 1 یا 3 که استفاده کردیم، بیشتر باشد مقدار مقاومت بیشتر خواهد بود.
در واقع با چرخاندن استوانه روی پتانسیومتر، میتوان محل پایه 2 و در نتیجه مقاومت دو سر پتانسیومتر را تغییر داد. کاربرد این پتانسیومتر را میتوانید در تنظیم ولوم صدا در ضبط ماشین خود ببینید که با چرخاندن آن مقدار مقاومت یک پتانسیومتر را تغییر میدهید که در نتیجه حجم صدا تغییر کند.
برای خرید پتانسیومتر با بهترین قیمت کلیک کنید.
مفهوم PWM
PWM مخفف Pulse-Width Modulation به معنای مدولاسیون پهنای پالس است. PWM در واقع نوعی سیگنال است که از طرف میکروکنترلر ارسال میشود. این سیگنال یک قطار پالس بوده و این پالسها یکشکل موج مربعی را تشکیل میدهند. همانطور که در شکل زیر مشاهده میکنید، در هر زمان معین، مقدار موج مربعی یا برابر HIGH (5v) است یا برابر LOW (0v).
مدت زمانی که سیگنال در وضعیت HIGH قرار دارد را زمان روشن(On Time) و مدت زمانی که سیگنال در وضعیت LOW قرار دارد را زمان خاموش (Off Time) مینامیم.
در واقع مقدار Duty Cycle، تعیین میکند در نهایت ولتاژ تولیدی چند درصد از ولتاژ منبع است. مثلاً برای تولید ولتاژ 3 ولت از منبع 5 ولتی باید مقدار Duty cycle برابر 60% باشد.
اگر در یک دوره تناوب، متوسط ولتاژ تولیدی حساب کنیم، شکل بالا را میتوانیم به شکل زیر تبدیل کنیم. در هر بخش سطح میانگین ولتاژ با خط قرمز مشخص شده است. در بخش اول 0 ولت، در بخش دوم 1.25 ولت که برابر 25% ولتاژ منبع 5 ولت است. به همین ترتیب برای بخشهای بعدی مشاهده میکنید که میانگین ولتاژ تولیدی برابر درصدی از ولتاژ منبع است که آن درصد با مقدار Duty Cycle مشخص میشود.
میکروکنترلر Arduino UNO فقط در بعضی از پینهای دیجیتال میتواند خروجی PWM تولید کند. در شکل زیر یک میکروکنترلر Arduino UNO را مشاهده میکنید. در بخش پینهای دیجیتال آن پینهایی که دارای یک ~ هستند، قابلیت تولید سیگنال PWM را دارند.
هر سیگنال PWM مطابق شکل (3)، دارای دوره تناوب و فرکانسی متناسب با آن دوره تناوب است که مقدار آن هرکدام از پینهای آردوینو متفاوت خواهد بود. برای کار با این پایهها نیاز چندانی به دانستن فرکانس پینهای PWM ندارید، فقط لازم است بدانید که میکروکنترلر Arduino UNO یک میکروکنترلر 8 بیتی است. بهازای هر بیت داده 2 حالت 0 و 1 وجود دارد که در این صورت تعداد حالتهای ممکن برابر 28 = 256 حالت خواهد بود. یعنی Arduino UNO میتواند ولتاژ منبع تغذیه را به 256 جزء تقسیم کند.
بستن مدار دیمر کنترل روشنایی با استفاده از پتانسیومتر
پس از آشنایی با مفاهیم اولیه، مدار لازم برای طراحی یک دیمر کنترل روشنایی را میبندیم. مدار موردنیاز را در شکل زیر مشاهده میکنید.
پایه منفی LED به GND و پایه مثبت سری با یک مقاومت 220 اهم، به پین 5 متصل است.
از یک پتانسیومتر با حداکثر مقاومت 10 کیلو اهم استفاده شده است.
یکی از پایههای کناری را به پین 5v آردوینو و پایه دیگر را به پین GND متصل میکنیم. پایه وسط را به ورودی ANALOG آردوینو متصل میکنیم.
بدین ترتیب با چرخاندن استوانه پتانسیومتر، مقاومت پتانسیومتر و در نتیجه ولتاژ دو سر آن تغییر خواهد کرد. پین آنالوگ آردوینو ولتاژ دو سر پتانسیومتر را اندازه میگیرد. ورودی آنالوگ آردوینو 10 بیتی است؛ بنابراین برای هر بیت دو حالت 0 و 1 موجود باشد، در نهایت 210 = 1024 حالت به وجود میآید. مقدار دریافتی این پین مقداری در بازه (0,1023) خواهد داشت.
توان یک قطعه الکتریکی با ولتاژ دو سر آن رابطه مستقیم دارد. بنابراین، با تغییر میزان Duty Cycle که ولتاژ خروجی پین متصل به پایه مثبت LED را مشخص میکند، میتوان دریافتی LED که تعیینکننده میزان روشنایی آن است را مشخص کرد.
کدنویسی
همانطور که در بخشهای قبلی گفته شد، در تابع اول یعنی void setup() ورودی و خروجیهای سیستم را مشخص میکنیم. پینهای تغذیه (5v, GND) نیازی به تنظیمات ندارند. باتوجهبه شکل مدار، پین A0 ورودی آنالوگ ماست. آردوینو بهطورکلی خروجی آنالوگ ندارد و این پینها فقط برای ورودی استفاده میشوند؛ بنابراین مثل پینهای تغذیه، نیازی به تنظیمات ندارند. اما برای پین 5 که خروجی دیجیتال PWM ماست به دلیل وجود دو حالت ورودی/خروجی برای این پین، باید ذکر کنیم که این پین در چه حالتی مورداستفاده قرار گرفته است. همانطور که در شکل (6) مشاهده میکنید، با استفاده از تابع pinMode() وضعیت ورودی/خروجی پین دیجیتال مورداستفاده را تعیین کردهایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int LED = 5; int LDR = A0; void setup() { pinMode(5, OUTPUT); } void loop() { int p = analogRead(A0); int b = p / 4; analogWrite(5, b); } |
در تابع void loop() نیز کد کارهایی که میخواهیم میکروکنترلر به طور مداوم انجام دهد را مینویسیم. ابتدا باید مقدار خوانده شده از پین A0 را که ولتاژ دو سر مقاومت متغیر است را داخل یک متغیر بریزیم که این کار را با تابع AnalogRead() انجام میدهیم.
سپس مقدار آن را جوری مقیاسبندی میکنیم که با چرخاندن استوانه پتانسیومتر، کل بازه روشنایی LED را بتوانیم مشاهده کنیم. مقداری که از پین A0 میخوانیم عددی صحیح در بازه (0,1023) قرار میگیرد و مقداری Duty cycle ای که به پین 5 میتوانیم بدهیم عددی صحیح در بازه (0,255) است.
پیشتر گفته شد که مقادیری که به پینها اختصاص میدهیم باید مقادیری صحیح باشند، بنابراین برای تعریف آنها از الگوی استفاده شده در رابطه زیر استفاده میکنیم.
Int a = 5;
خود برنامه در صورت اعشاری بهدستآمدن نتیجه، مقدار آن را به پایین گرد میکند.
بنابراین، باتوجهبه شکل (6) از رابطه زیر برای تبدیل مقادیر استفاده میکنیم و طبق رابطه (4) آن را به فرم کد تبدیل میکنیم.
int p = analogeRead(A0);
int b= p/4;
مطابق دو خط کد بالا، متغیر p مقدار خوانده شده از پین A0 که مقدار ولتاژ دو سر مقاومت متغیر است و متغیر b برابر میزان روشنایی است که میخواهیم LED داشته باشد. همانطور که میدانید عدد 256 در واقع 1/4 عدد 1024 است. باتوجهبه مقیاسبندی گفته شده با تقسیم مقدار خوانده شده از پین آنالوگ در بازه (0,1023) به 4 میتوانیم بازه آن را حدوداً به بازه (0,255) تبدیل کنیم.
آموزش ساخت دیمر با استفاده از فتوسل
فرض کنید بهجای استفاده از یک پتانسیومتر، از یک سنسور نوری (فتوسل) برای کنترل روشنایی استفاده کنید! بدین صورت که هر چه محیط اطراف سنسور نوری تاریکتر بود، LEDها روشنتر باشند و هر چه محیط اطراف سنسور نوری روشنتر بود، LEDها خاموشتر باشند. در سیستم روشنایی نمای بعضی از ساختمانها از این روش استفاده میشود. در این صورت در هر لحظه، روشنایی چراغها در حد نیاز خواهد بود و این موضوع به استفاده بهینه از برق شهری کمک میکند. این پروژه در واقع مدلسازی این سیستم را با یک LED و یک سنسور LDR انجام میدهد.
فتوسل چیست؟
LDR مخفف Light Dependent Resistor به معنای مقاومت متغیر وابسته به نور است. در واقع این سنسور یک مقاومت متغیر با میزان تابش نور دارد. جنس فتوسل معمولا از یک قطعه نیمه رساناست و متناسب با مقدار نوری که به آن برخورد میکند، ولتاژ را کم و زیاد میکند.
بستن مدار دیمر با استفاده از فتوسل
برای کارکردن با این سنسور، آن را با یک مقاومت حداقل 220 اهم سری میکنیم. سپس نقطه اتصال این سنسور با مقاومت را به پین GND میکروکنترلر وصل میکنیم. پایه دیگر سنسور را به پین 5v و پایه دیگر مقاومت را به پین A0 وصل میکنیم.زیرا میخواهیم ولتاژ دو سر مقاومت سری شده با سنسور را بخوانیم. ابتدا به بحث تقسیم ولتاژ دو سر مقاومتها میپردازیم. مطابق شکل (10) منبع تغذیه 5v است و دو مقاومت 220 اهم و مقاومت سنسور نوری که متغیر است مصرفکنندگان این منبع تغذیه هستند.
بر اساس میزان روشنایی محیط اطراف سنسور LDR، مقاومت آن تغییر میکند و بر اساس مقدار مقاومتش در هر لحظه، مقدار سهم ولتاژش از منبع تغذیه تغییر میکند. چون ولتاژ منبع تغذیه ثابت است، پس اگر سهم ولتاژ سنسور LDR تغییر کند، سهم ولتاژ مقاومت سری با آن هم تغییر خواهد کرد.
کدنویسی
میتوان قبل از دو تابع void setup() و void loop() متغیرهایی را تعریف کرد. در زبان برنامهنویسی C اگر متغیری را بیرون از هر تابعی و بهصورت جامع (Global) تعریف کنید آن متغیر در همه توابع تعریف شده و قابلاستفاده است؛ بنابراین میتوانیم یک سری از متغیرها را که در هر دو تابع ذکر شده قرار است استفاده کنیم بهصورت جامع در ابتدای کد تعریف کنیم. یک دسته از این متغیرها، شماره پینهایی است که میخواهیم استفاده کنیم. برای این که هر ماژول یا قطعهای که در کد استفاده میکنیم را با شماره پین در کد برنامه نشناسیم و از اسم ماژول یا پارامتری اندازهگیری یک سنسور استفاده کنیم، در ابتدای کد یک اسم به هر شماره پینی که مورداستفاده قرار میگیرید اختصاص میدهیم.
در ابتدا کد طبق کدهای زیر پین 5 را LED و پین A0 را LDR ( اسم سنسور) تعریف میکنیم. توجه کنید که انتخاب این اسمها دلخواه است، اما اگر متغیرهایمان را با اسم منطقی انتخاب کنیم، بررسی و رفع ارور در کد سادهتر خواهد بود.
int LED = 5;
int LDR = A0;
سپس همانند بخش قبل در کنترل روشنایی با یک پتانسیومتر، نیازی به تعریف کردن پین A0 نداریم و فقط پین 5 را بهعنوان خروجی دیجیتال تعریف میکنیم:
pinMode(LED,OUTPUT);
در بخش تابع void loop() دو متغیر تعریف میکنیم. متغیر Brightness به معنای روشنایی دریافت شده توسط سنسور متصل پین A0 است. متغیر Dutycycle برابر همان مقدار روشنایی LED است که میخواهیم نسبت به تغییرات روشنایی محیط داشته باشد.
بدین صورت که هر چه محیط اطراف سنسور نوری تاریکتر باشد، LED روشنتر و هر چه محیط اطراف سنسور نوری روشنتر باشد، LED خاموشتر خواهد بود؛ بنابراین مقدار اندازهگیری شده توسط پین A0 را در دو حالت ماکسیمم و مینیمم اندازهگیری میکنیم. مثلاً برای تاریکی مطلق، یک جعبه کوچک روی سنسور نگه میداریم تا مقدار حداقلی را به دست آوریم و برای روشنایی حداکثر از یک چراغقوه استفاده میکنیم. نحوه محاسبه Dutycycle به شکل زیر خواهد بود:
روشنایی حداکثر:
Brightness =620 ⟹Dutycycle=650-Brightness2.44=620-6202.44=0 LED خاموش
تاریکی مطلق:
Brightness =0 ⟹Dutycycle=620-Brightness2.44=620-02.44=254 LED کاملاً روشن
از تقسیم 620 به 255 (حداکثر مقدار Dutycycle) عدد 2.44 به دست میآید و فرمول محاسبه Dutycycle را هم در روابط بالا و هم در کد زیر مشاهده میکنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int LED = 5; int LDR = A0; void setup() { pinMode(5, OUTPUT); } void loop() { int Brightness = analogRead(LDR); int Dutycycle =(620 - Brightness)/2.44 int analogWrite(LDR, Dutycycle); } |
جمعبندی
تبریک میگوییم! مدار دیمر شما آماده شده و میتوانید آن را تست کنید! در نظر داشته باشید که ممکن است در هنگام تست کردن یا نوشتن کد، به مشکلات کوچکی بربخورید که مطمئنا با مرور دوباره مطالب ذکر شده در این مقاله و چک کردن مدار و کد برنامهنویسی قادر به رفع آنها خواهید بود. با این وجود، اگر هر سوالی درباره ساخت مدار دیمر داشتید میتوانید زیر همین پست از ما بپرسید تا کارشناسان ما در اسرع وقت به شما جواب بدهند.