جلسه یازدهم دوره آردوینو – آموزش ورودی های آنالوگ در آردوینو
مقدمه
با سلام خدمت شما. در جلسه قبل ابتدا موج های PWM رو معرفی کردیم و سپس یادگرفتیم که چگونه نور یک LED رو با استفاده از موج PWM میتونیم تنظیم کنیم. در این جلسه میخوایم وارد بحث کاربردی ورودی های آنالوگ بشیم. مثل همیشه مستقیم میریم سر اصل مطلب.
ورودی آنالوگ
در جلسات قبل یادگرفتیم که آردوینو با استفاده از دستور digitalRead() تعیین میکنه که آیا ولتاژی به یکی از پایه های آردوینو اعمال شده یا نه. این نوع عملکرد برای بسیاری از موارد کاربردی و خوب هست. این دستور دیجیتال بود یعنی تعیین میکرد که آیا ولتاژی اعمال شده یا نه. حالا فرض کنید ما یه چراغ در خروجی داریم که باید با توجه به مقدار نوری که در محیط وجود داره نور خودش رو تنظیم کنه. اگه بخوایم از دستور digitalRead() استفاده کنیم که چراغ همواره دو حالت داره. یا روشن هست و یا خاموش. اما هیچوقت چراغ ما نمیتونه یه حالتی بین این دو حالت باشه. به خاطر همین میان به جای این که از دستوری مثل digitalRead استفاده کنن از یه دستور دیگه استفاده میکنن که میتونه میزان ولتاژ ورودی رو بخونه ( فرض کنید که از یه فتوسل استفاده میکنیم که میتونه با توجه به نور دریافتی ولتاژی رو به یکی از پایه های آردوینو اعمال کنه.) و با توجه به اون میزان ولتاژ به چراغ که به خروجی وصل هست بگه که چه مقدار روشن باشه.
بر روی برد آردوینو 6 پایه وجود داره که با نام “Analog In” مشخص شده ( پایه های A0 تا A5).این پایه ها همون پایه های ورودی آنالوگ هستند که میتونن مقدار دقیق ولتاژ ورودی به پایه هاشون رو بخونن و عملکردی که رو در پارگراف قبل میخواستیم رو برامون اجرا کنن. برای این کار از دستور analogRead() استفاده میکنیم
توضیح دستور analogRead
با استفاده از این دستور ما میتونیم مقدار ولتاژی رو که به یکی از این 6 تا پین وصل میشه رو به صورت خیلی دقیقتر بخونیم .این تابع یه آرگومان داره که این آرگومان شماره پایه ای هست که میخوایم مقدار ولتاژ رو ازش بخونیم. یعنی مثلا دستور analogRead(0) یعنی میخوایم مقدار ولتاژ بر روی پایه شماره 0 از ورودی های آنالوگ رو بخونیم. بدیهی هست که برای ذخیره مقدار خروجی این تابع باید یه متغیر تعریف کنیم و نتیجه خروجی این تابع رو برابر این متغیر قرار بدیم.
و یه عدد رو از 0 تا 1023 برگردونیم که این عدد نشون میده که مقدار ولتاژ ما در ورودی چقدر هست. مثلا اگه ولتاژی ورودی 0 ولت باشه تابع ما مقدار 0 رو برمیگردونه یا اگه ولتاژ ورودی 2.5 ولت باشه تابع ما مقدار 512 رو برمیگردونه و در نهایت اگه ولتاژ ورودی مقدار 5 ولت باشه تابع ما مقدار 1023 رو برمیگردونه.
خوب حالا مداری که در شکل زیر اومده رو ببندید و همچنین کد مربوط به اون رو بنویسید. ( در این مثال قصد داریم LED بسته به میزان نور محیط چشمک بزنه. چون قرار چشمک بزنه باید 0 یا 1 بشه بنابراین باید از دستور digitalWrite() استفاده کنیم.
خوب حالا این کد رو بر روی بردتون بریزید و اگه همه این کارها رو درست انجام داده باشید خواهید دید که بسته به میزان نور محیط تون، LED روی برد ( البته میتونید یه LED خارجی هم به برد وصل کنید) چشمک میزنه.
سوال : کد را تحلیل کنید و بگویید که چرا بسته به میزان نور محیط LED روی بردبرد چشمک میزند؟
در مثال بعد قصد داریم نور یک LED رو مطابق با نور محیط تنظیم کنیم. به این معنا که اگر محیط تاریک بود نور LED کم باشد و اگر محیط روشن تر شد ، نور LED زیاد باشد.
مدار این مثال البته یه خورده با مدار قبل فرق داره و باید به پایه شماره 9 یک LED متصل کنید. حالا کد زیر را در کامپایلر بنویسید و اجرا کنید و روی برد خودتون بریزید. ( سعی کنید ابتدا کد را خودتان تحلیل کنید)
سوال: چرا در کد بالا و در دستور analogWrite مقدار متغیر val بر عدد 4 تقسیم شده است؟
راه اندازی سنسورهای مشابه
با استفاده از مداری که در بخش قبل معرفی کردیم میشه تعداد زیادی سنسورهای مقاومتی دیگه ای هم متصل کرد بدون این که عملکردهاشون تفاوت خیلی زیادی با هم داشته باشن. به عنوان مثال میتونید یه ترمیستور وصل کنید. ( ترمیستور قطعه ای هست که مقاومتش با تغییر دما تغییر میکنه). در این بخش میخوایم نشون بدیم که چگونه تغییر در مقدار مقاومت میتونه باعث تغییر در مقدار ولتاژ اندازه گیری شده توسط آردوینو بشه.
در کار با ترمیستور حتما دقت داشته باشید که بین مقدار دمایی که می خونید و دمای واقعی اندازه گیری شده یه رابطه ی مستقیم وجود نداره. اگه شما میخواید دماتون دقت اندازه گیری بالایی داشته باشه شما باید عددی که از پایه آنالوگ مربوط به این سنسور رو بخونید و همزمان با اون هم دما رو دماسنج اندازه بگیرید. سپس باید این اعداد رو در یک جدول در کنار هم قرار بدید و سپس با استفاده از این جدول دمای واقعی رو در دفعات بعد و بدون استفاده از دماسنج بدست بیارید.
تاکنون ما از یک LED فقط برای نمایش وضعیتمون استفاده کردیم. اما چطور میتونیم مقادیری که آردوینو از سنسورها میخونه رو یه جایی نمایش بدیم. برای این کار از ارتباط سریال استفاده میکنیم و با استفاده از ارتباط سریال با کامپیوترمون حرف میزنیم. در جلسه بعد وارد بحث ارتباط سریال میشیم.
مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید.
10 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام.من تازه کارم.
جواب 2 تا سوالی که پرسیده بودین توی درس :
1 – مقدار آنالوگ ورودی خونده شده ، در val ذخیره میشه و ما برای خاموش و روشن کردن LED از مقدار val در تابع delay استفاده کردیم ، پس هر چی مقدار آنالوگ ورودی بیشتر باشه (محیط پرنور تر) ، تاخیر بیشتر و هر چی مقدار آنالوگ ورودی کمتر باشه (محیط کم نور تر) ، تاخیر کمتر است. و از اونجایی که چشمک زدن LED به واسطه ی خاموش و روشن شدنش به وجود میاد ، اینطوری میشه که LED بسته به میزان نور چشمک میزنه.
2- دلیل تقسیم val بر 4 اینه که در تابع analogRead و پایه های آنالوگ ورودی، محدوده اعداد ما تا 0 – 1023 است ولی در پایه های خروجی آنالوگ (PWM) و تابع analogWrite محدوده ی اعداد
0 – 255 است بنابراین val که مقداری بین 0 – 1023 دارد باید بر 4 تقسیم شود تا بتوان آنرا در تابع digitalWrite استفاده کرد.
سلام و درود بر شما.
جواب های شما کاملا صحیح می باشد.
موفق باشید.
باسلام ممنون از فعالیتتون یه سوالی برای من پیش اومده الان این کدی که شما نوشتید به نظر من یه مشکلی داره نمی دونم شاید اشتباه از من باشه ولی مقدار روشنایی شما با مقدار نور نسبت مستقیم داره یعنی با افزایش نور هست که ledروشن تر میشه.
آیا نباید اول متغییرvalتقسیم بر چهار کردو در آخر متغییر val رو ببریم تو مخرج؟
val=val/4
analogWrite(led,1/val)
با سلام خدمت شما و ممنون از دفت نظری که داشتید. جمله ای که قبل از این مثال آورده شده ، به لحاظ ادبی مقداری ایراد داشت و دچار ابهام بود که ویرایش شد. در واقع همانطور که فرمودید ، هدف ما این هست که با افزایش نور محیط ، نور LED زیاد شود و با کاهش نور محیط هم نور LED کم شود.
اما یک نکته : فرض کنید ما میخواستیم با کاهش نور محیط ، نور LED خود را زیاد کنیم. در این صورت باید از چه کدی استفاده میکردیم؟ آیا باید پارامتر دستور analogWrite را برابر با 1/val قرار میدادیم؟ آیا با این کار به هدف خود دست پیدا میکردیم؟ قطعا نه. اما چرا؟
وقتی مقدار val که میتواند از 0 تا 1023 تغییر کند را معکوس میکنیم ، پارامتر analogWrite از 1 تا 0.000977 تغییر میکرد و عملا LED ما هیچوقت روشن نمیشد. باید این پارامتر از 0 تا 255 تغییر کند و با این دستور ما به این هدف نمیرسیدم. در اینجا باید ابتدا مقدار val از عدد 1023 کم شود و سپس این مقدار بر 4 تقسیم شود. با این حساب اگر مقدار val برابر صفر باشد ( یعنی تاریکی مطلق داشته باشیم ) ، مقدار پارامتر analogWrite برابر 255 می شود که بیشترین روشنایی را دارد و هر چه نور محیط افزایش پیدا کند ، مقدار تفاضل 1023 و val ، کمتر می شد و نور LED نیز کاهش پیدا میکرد. البته راه های دیگری هم برای این کار وجود دارد که از آوردن در اینجا خودداری میکنیم.
پیروز باشید.
سلام.
برای این تقسیم بر 4 شده که PWM تا عدد 255 می تونه بگیره اما ADC تاعدد 1023 بر می گردونه.
درست گفتم؟
با سلام. درود بر شما. همینطور هست که میفرمایید.
سلام و خسته نباشید خیلی وقته منتظره این مبحث بودم خواسته اصلی اندازه گیری جریان با مقاومت شنت هستم
چگونه باید نوشته بشه درگیر هستم اگر امکانش هست توضیح بدید ممنون
با سلام خدمت شما. سوالی که فرمودید سوال بسیار خوبی هست ولی از اونجای که جواب دقیق و کامل به این سوال در قالب یک کامنت نمی گنجد به امید خدا در یک یا نهایتا دو هفته آینده یک جلسه به صورت کامل در مورد اندازه گیری جریان با آردینو و مقاومت شنت در سایت قرار داده میشه.
موفق باشید.