آموزش آردوینو – فصل سوم

//آموزش آردوینو – فصل سوم

آموزش آردوینو – فصل سوم

هر فصل از ۱۴ فصل آموزش آردوینوتقدیم میشه به یکی از امامان معصوم.این فصل تقدیم  میشه به:

امام  جواد (ع)

در دو فصل قبلی تا حدودی با بورد آردوینو وپینهای ورودی خروجی و … آشنا شدیم در این فصل میخواهیم یکمی بیشتر از مفاهیمی که یاد گرفتیم استفاده کنیم. در فصلهای قبل بیشتربا مثالهای ورودی در حالت آنالوگ یا دیجیتال و همینطور خروجی در حالت دیجیتال یا pwm آشنا شدیم .

اما حالتهایی هم وجود داره که فقط نمیخوایم که ورودی بدونیم چیه یا خروجی چیه بلکه میخایم زمانیکه ورودی مقدارخاصی داشته باشه خروجی رو بر مبنای اون تنظیم کنیم.خیلی پیچیده شد؟!!

ورودی و خروجی با هم! در دیجیتال

بذار اینجوری مثال بزنم: در حالت خیلی ساده شماکلید چراغ خونتون رو میزنین و چراغ خونه روشن میشه یا یبار دیگه میزنین و چراغ خونه خاموش میشه.حالا میخایم ببینیم این کار رو با آردوینوچجوری باید انجام بدیم!

این کار جالب هستا !! ولی یکمی پیش پا افتاده نیست بنظرت؟؟

بله ممکنه اینکار ساده باشه اما اگه بیشتر فکر کنیم میتونیم ببینیم که خیلی بیشتر از اینها کاربرد داره.

مثلا چی؟

مثلا یه سنسور گرما داری و اونو به آردوینو متصل کردی و میخای زمانیکه به یه دمای خاصی رسید یه آژیر روشن بشه و توبفهمی

یا یه سنسور تشخیص باران داری و میخای زمانیکه باران میاد متوجه بشی. یا یکی از پروژه های کانال تلگرام که کار کرده بودیم (کانال تلگرام @khodet_besazesh) که تو اون پروژه یه سنسور تشخیص حرکت رو متصل کرده بودیم به ماژول وای فای esp8266 و بعد وقتیکه کسی از جلوی سنسور رد میشد یه پیام تو تلگرام میفرستاد که کسی اینجاست! فیلمش تو کانال آپارات @khodet_besazesh هست میتونین ببینین. خلاصه مطلب, نیاز داریم زمانهایی ورودی و خروجی رو با هم بسنجیم.

این از کل مطلب و حالا بریم به قسمت جذابتر آموزش! چجوری باید بسازم؟

یه کلید کوچیک(پوش باتن) رو به یکی از پینهای آردوینو متصل کنین. یه led کوچیک هم به یکی دیگه از پینهای آردوینو و تمومه! زمانیکه کلید رو فشار میدیم led روشن میشه! به همین سادگی!

مطمئنی بهمین سادگی؟

خب برنامشو چجوری باید بنویسم؟ ( از لحاظ مفهومی)

اول یکی از پایه ها رو بعنوان ورودی دیجیتال و یکی دیگه رو بعنوان خروجی دیجیتال در نظر میگیریم. بعد اگه ورودی ما صفر یا یک شد خروجی یه پایه دیگه رو صفر یا یک میکنیم تا led روشن یا خاموش بشه.

خب میرسیم به برنامه نویسی:

پین ۱۳ که همون پین روی بورد هست رو بعنوان خروجی در نظر می گیریم و پایه ۲ رو بعنوان ورودی در نظر می گیریم.

 برنامه آردوینو رو باز کنین و بعد روی FILE و بعد روی NEW کلیک کنین و بعد برنامه رو بنویسین!

با توجه به آموزشهای قبل یه مقداری فکر کنین و برنامه رو بنویسین و بعد ادامه آموزشها رو بخونین.

اول  پایه ۱۳ رو بصورت خروجی و پایه ۲ رو بصورت ورودی تعریف میکنیم.

یه توضیح کوچیک راجع به دستور if :

دستور if در حقیقت یه شرط هست. به چه دردی میخوره؟ یه زمانی هست بابا به بچه اش میگه ! اگه مثلا درسهات رو خوب بخونی و نمره های کارنامت خوب بشه برات دوچرخه میخرم!

اینجا بابا یه شرط گذاشته که اگر نمره هات خوب باشه , برات دوچرخه می خرم. اگر نمره هات خوب نباشه چی؟ اگر نمره هات خوب نباشه دوچرخه ای در کار نیست!

برنامهIF بصورت زیر نوشته میشه:

بعد  IF  اون شرطی که میخایم بنویسیم رو داخل یه پرانتز میزاریم .مثلا میگیم اگر پایه ۲ که ورودی هست برابر با HIGH شد یا بعبارتی تو مثال بابا به بچه اش, اگر نمره هات خوب بشه :

بعد از اون اگر شرط برقرار باشه(شرط درست باشه) , پایه ۱۳ رو HIGH کن تا LED روشن بشه یا بعبارت دیگه براش دوچرخه میخره!:

که البته اون رو داخل دوتا آکولاد می نویسیم. حالا اگه شرط درست نبود چی؟

از دستور else استفاده میکنیم و داخل اون (داخل دوتا آکولاد) مینویسیم که چی بشه اگر ورودی HIGH نشده باشه  LED رو هم  HIGH  نکن و LOW کن تا LED خاموش بمونه یا تو مثال بابا به بچه اش, اگر نمره هات خوب نشه برات دوچرخه نمیخرم !

خب  حالا که برناممون رو نوشتیم اون رو روی بورد پروگرام میکنیم. (اگه نمیدونین چجوری باید پروگرام کنین فصل اول رو بخونین) :

حالا ببینیم چه اتفاقی میفته. وقتی بورد پروگرام میشه در حالتی که ورودی (پایه ۲) به جایی متصل نیست LED روشن میمونه!؟؟

وقتی به زمین یا گراند یا GND متصل میکنیم LED خاموش میشه. وقتی هم به VCC یا ۵ ولت بورد متصل میکنیم باز هم LED روشن میمونه( بنظر میرسه که LED پررنگ تر میشه).

خب سوال دارم.بله بفرمایین؟

در حالتی که ورودی متصل میشه به ۵ ولت, LED روشن میشه و خب این درست هست.

در حالتی که ورودی متصل میشه به زمین یا GND , LED خاموش میشه و خب این هم درست هست.

اما در حالتی که نه به ۵ ولت نه به زمین متصل هست چرا LED روشن میمونه؟

یادته بهت گفتم ” به همین سادگی؟” منظورم اینجا بود!! یعنی به این سادگیها نیست!

پایه ورودی شناور هست و معلوم نیست ۵ ولته یا زمین! خب کاری نداره شاید به اندازه کافی بورد آردوینو با هوش نیست ! اول برنامه تعیین میکنم که پین ۱۳ بورد آردوینو در حالت LOW باشه که LED خاموش باشه. و اونو پروگرام میکنم :

اما بازم فرقی نمیکنه مثل حالت قبل میشه ! حالا چیکار باید کرد؟!

ببین درآردوینو وقتی یه پایه رو بعنوان ورودی در نظر میگیری نباید اون رو در حالت کما بذاری!! باید حالت اون رو مشخص کنی یا HIGH یا  LOW.

یه چیز بد یا شایدم وحشتناک وجود داره که روی پین های آردوینو تاثیر میذاره و اونم نویز هست. باید کاری کنی که روی مدارت یا تاثیر نذاره یا تاثیرشو خیلی کم کنی که بستگی به شرایط محیط متفاوته.

خب چیکار کنم که پایه ورودی فقط در حالت LOW یا HIGH قرار بگیره؟

اگر پایه ورودی رو به زمین متصل کنی , پایه ورودی همیشه در حالت LOW قرار میگیره و اینجوری نمیره تو حالت کما!

اگرم بخایم با وجوداینکه در حالت LOW هست در حالت HIGH هم قرار بگیره ! باید پایه مثبت ۵ رو هم بهش متصل کنیم!!!

مطمئنی ؟ اینجوری پایه مثبت و منفی رو بهم متصل کردی که!! یعنی اتصال کوتاه ! یعنی فاجعه!!.

خب چیکار کنیم که هم پایه منفی به مدار متصل باشه که تو کما نره و هم اینکه وقتی مثبت ۵ رو متصل کنیم اتصال کوتاه نشه؟

برای این کار پایه ورودی آردوینو رو با یه مقاومت (مقاومت بزرگ در حد ۱۰ کیلو اهم) متصل میکنیم به GND یا زمین. در نتیجه همیشه ورودی زمین میشه و یا در حالت LOW قرار داره. حالا اگه مثبت ۵ ولت رو هم به پایه ورودی متصل کنی دیگه مثبت و منفی بهم نمیخوره چون یه مقاومت بینشون گذاشتی.

پس در حالتی که فقط یه مقاومت و زمین داری که متصل شده به ورودی , ولتاژ ورودی برابر صفر هست و زمانیکه مثبت ۵ ولت رو متصل میکنی به پایه ورودی, ولتاژ ورودی برابر ولتاژی هست که روی دو سر مقاومت میفته که اونهم برابر ۵ ولت هست.  اسم این کاری که کردیم میشه PULL-DOWNکردن.

شکل مدار بصورت زیر هست:

البته در اینجا به جای کلید ازیک سیم استفاده کردیم که با اتصال سیم ۵ ولت به ورودی متصل میشه و چراغ روی بورد که همون پین ۱۳ باشه روشن میشه:

حدیث از امام جواد (ع) :      

 با سه خصلت، دوستی را به دست می آورند: انصاف در معاشرت، همدردی (با دیگران) در خوشی و ناخوشی، و داشتن قلبی پاک (از گناهان).

“بحارالانوار، جلد ۷۸، صفحه ۸۲- کشف الغمه، جلد ۳، صفحه ۱۳۹”

خب تا اینجا یاد گرفتیم که چجوری میشه با زدن کلید یه led رو روشن کنیم اما اگه بخایم led با زدن کلید تغییر حالت بده چطور؟

یعنی با هر بار که کلید زده میشه اگه led روشن هست خاموش بشه و اگر خاموش هست روشن بشه چطور؟

چجوری باید برنامشو بنویسیم؟

یه مقداری فکر کنین!

فکر میکنم باید یه چیزی باشه که برنامه بفهمه که حالت قبلی led چی بوده. مثلا اگر روشن بوده قبلش وقتی کلید زده میشه خاموش بشه. چجوری باید بگیم آقای اردوینو یه چیزی هست که شما وقتی میخای led رو روشن یاخاموش کنی برو اول اونو نگاه کن! اگر تو اون چیز نوشته شده بود الان روشنه, خاموش کن و اگر خاموشه, روشنش کن؟

اون چیز رو باید یه متغیر تعریف کنیم. مثل یه ظرف که نگاه میکنی داخلش چیه.اما چجوری به آردوینو بگیم اینو؟

میتونین بگیم آقای آردوینو شما یه متغیری(ظرفی) داری که اسمش مثلا zarf هست.هرموقع کلید فشرده شد بیا اون توی ظرف رو نگاه کن اگر zarf برابر ۰ بود یعنی led خاموشه و اگر برابر ۱ بود یعنی led روشنه بهمین سادگی. خب پس اول کار قبل از void loop تعریف می کنیم که این ظرف از ابتدا صفر باشه .

چرا صفر؟

چون در حالت اولیه پایه ورودی با مقاومت به زمین خورده پس مقدار اولیمون میشه صفر. به محض اینکه کلید فشار داده بشه مقدار قبلی ظرف چون صفر بوده تبدیل میشه به ۱ و led روشن میشه. و اگه یبار دیگه کلید فشارداده بشه مقدار قبلی ظرف چون ۱ بوده تبدیل میشه به صفر وled خاموش میشه.این ظرف از نوع صحیح هست مثلا ۰ یا ۱ یا ۲ یا ..   پس اون رو int یا صحیح تعریف میکنیم:

چرا ۳۰۰ میلی ثانیه delay یا وقفه انداختیم؟

برای اینکه انقدر سرعت آردوینو زیاده که وقتی کلید رو میزنین هرچقدر هم که سریع باشین آردوینو از شما سریعتر و حلقه یبار دیگه تکرار میشه و متوجه نمیشین که led روشن خاموش شده. میتونین delay رو بردارین و تست کنین ببینین چی میشه.

ورودی و خروجی با هم! در آنالوگ

در این قسمت همون مثال قبل رو میخوایم با آنالوگ توضیح بدیم. یعنی میخایم چیکار کنیم؟ میخایم ورودی رو بخونیم و تو خروجی که پورت سریال هست نشون بدیم و بعد بریم سراغ یک مثال عملی .

خب حالا باید چیکار کنیم که ورودی ولتاژ یکی از پین های آردوینو متغیر بشه؟

معلومه باید یه چیزی بزاریم سر راهش که ولتاژش رو متغیر کنه مثلا دو تا مقاومت بذاریم ویکی از مقاومتهایی که به ورودی اردوینو میخوره رو تغییر بدیم مدام ,در نتیجه مقدار ولتاژی که روی مقاومت قرار میگیره متفاوته و در نتیجه مقدار ولتاژ ورودی به آردوینو متفاوت میشه.

یکمی پیچیده شد .من درست متوجه نشدم!!

بذار با شکل برات توضیح بدم.به شکل زیر نگاه کن:

دوتا مقاومت R1و R2 داریم که بصورت بالا بهم متصل شده اند.حالا ورودی PIN2 چه ولتاژیه ؟

ولتاژ V3.

و ولتاژ V3 برابر چه ولتاژیه؟ معلومه ولتاژی که دوسر مقاومت R2 افتاده که میشه V2.

حالا اگه مقدار مقاومت R2 تغییر کنه , مقدار ولتاژ ورودی به PIN2 هم تغییر میکنه. پتانسیومتر هم همینه کارش! یه مقاومتی هست(مثل ولوم صدای ضبط) که هی اونو میچرخونی و مقدار مقاومتش کم و زیاد میشه. کاری که میخایم بکنیم اینه :

یه پتانسیومتر رو تو ورودی آناگوگ A0 قرار میدیم و بعد اون پتانسیومتر رو تغییر میدیم و مقدار ولتاژ ورودی رو در پورت سریال مشاهده میکنیم. پس مدار رو باید بصورت زیر ببندیم:

خوب بریم سراغ برنامه نویسی. مثال  AnalogReadSerialرو بیارین :

مقدار delay رو بیشتر کنین تا بهتر بتونیم خروجی رو ببینیم مثلا بذارین ۳۰۰و بعد بورد آردوینوتون رو پروگرام کنین:

تحلیل کدهای برنامه:

تو حلقه اول(void setup) که پورت سریال رو با سرعت ۹۶۰۰ در نظر گرفتیم . در حلقه دوم (void loop) یه متغیری از جنس int یا صحیح(integer) به نام sensorValue درنظر گرفتیم که برابر پورت آنالوگ A0 ورودی هست. مقدارsensorvalue پس میشه مقدار ورودی A0که اونهم به پتانسیومتر خورده. وقتی پتانسیومتر رو میچرخونین مقدار ولتاژ ورودی رو تغییر میدین و در نتیجه مقدار ورودی A0 تغییر میکنه. بعد مقداری که از ورودی A0 خونده شده رو میتونیم تو پورت سریال ببینیم. Delay هم برای وقفه انداختن هست شما اونو به ۳۰۰ تغییر بدین(یعنی ۳۰۰ میلی ثانیه یکبار ورودی آنالوگ رو نشون بده) که بهتر بتونین تغییرات خروجی رو ببینین.(این عدد سلیقه ای هست)راجع به delay فصلهای قبل صحبت کردیم.

خب بریم مدار رو ببندیم.پایه بالا و پایین پتانسیومتر به ۵ ولت و زمین متصل میشه (فرقی نمیکنه کدوم پایه به ۵ ولت بخوره و کدوم پایه به زمین) و پایه وسط هم میخوره به ورودی آنالوگ A0 بصورت زیر:

با تغییر پتانسیومتر مقدار دریافتی از ورودی آنالوگ A0 نیز در پورت سریال نمایش داده می شود:

مقدار ورودی همونطور که توفصلهای قبل داشتیم بین ۰ تا ۱۰۲۳ هست.برای تمرین خودتون برنامه رو طوری تغییر بدین که وقتی پتانسیومتر رو تغییر میدیم تو پورت سریال به جای اعداد ۰ تا ۱۰۲۳ مقدار ولتاژ ورودی به ورودی آنالوگ A0 رو نشون بده.

انجام یک پروژه عملی با PWM  (دومین پروژه)

تو فصل قبل یاد گرفتیم که pwm چی هست و همچنین الان یاد گرفتیم که چجوری ورودی و خروجی رو با هم داشته باشیم بهتره یک کار جالبناک بکنیم.

مثلا چی؟

یادته الان یاد گرفتی که چجوری میشه با تغییر پتانسیومتر, مقدار عدد در یافتی در ورودی آنالوگ تغییربکنه؟

خب!

حالا یه کاری بکنیم که با تغییر پتانسیومتر نور یک led کم و زیاد بشه!

پس این کار دوقسمت داره :

اول اینکه: ورودی آنالوگ پایه A0 رو بخونیم. این کار رو در قسمت قبل یاد گرفتیم.

دوم اینکه : مقدار خروجی رو بر اساس ورودی کم وزیاد کنیم. در فصل دوم گفتیم که در بورد آردوینو برای اینکه بتونیم خروجی آنالوگ داشته باشیم باید از PWM استفاده کنیم.اگه هنوز نمیدونین PWM چیه و چجوری میشه روی بورد آردوینو پیاده سازیش کرد به فصل دوم برین و اون قسمت رو بخونین و بر گردین اینجا دوباره.

خب کافیه به مدار قسمت قبل یک LED و یه مقاومت حدود ۱۲۰ اهم اضافه کنیم. مثلا من اینجا مقاومت ۱۰۰ اهم دارم از اون استفاده میکنم. حالا باید LED رو به همراه مقاومت متصل کنین به پایه ای که PWM رو پشتیبانی میکنه. دفعه پیش پایه ۹ رو در نظر گرفته بودیم این دفعه پایه ۳ رو در نظر میگیریم:

همون مثال قبل رو کافیه چند تا کد بهش اضافه کنیم:

(pinMode(3, OUTPUT

  (analogWrite(3,SensorValue

یعنی اولاپایه ۳ رو خروجی قرار بده

وثانیا مقدار خروجی پایه ۳رو هم مساوی مقدار ورودی که از پایه A0 دریافت میکنی قرار بده. یعنی هر چقدر پتانسیومتر رو بچرخونیم ولتاژ بیشتری وارد ورودی A0 بشه , مقدار خروجی A0 نیز بیشتر میشه در نتیجه مقدار نور LED هم بیشتر میشه.

پس کدهای برنامه بصورت زیر میشه:

حالا یه سوال! چرا مقدار SensorValue رو تقسیم بر ۴ کردیم؟

برای اینکه وقتی از ورودی آنالوگ میخونیم عددی بین ۰تا ۱۰۲۳ دریافت میکنیم اما در خروجی فقط با PWM میتوانیم عددی بین ۰ تا ۲۵۵ قراردهیم خب برای اینکار ۱۰۲۳ را تقسیم بر ۴ میکنیم .

مثلا اگرمقدار ماکزیمم یا ۵ ولت در ورودی داشته باشیم مقداری که از پورت آنالوگ میخونیم ۱۰۲۳ هست.

زمانیکه این عدد رو تقسیم بر ۴ میکنیم میشه تقریبا ۲۵۵ که همون ماکزیمم خروجی میشه که برابر ۵ ولت میشه.

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

یه سوال؟ اگه نخواستیم مقدار ورودی رو تقسیم بر ۴ کنیم چی؟ راهی داره که متناسب با ولتاژ ورودی که دریافت میکنیم ولتاژ خروجی تغییر کنه؟ یعنی چی؟

یعنی اینکه به نسبت ورودی , خروجی تغییر کنه؟ یعنی اگه ۱۰۲۳ درورودی دریافت کرد در خروجی ۲۵۵ قرار بگیره یا اگه مقدار ولتاژ ورودیمون نصف شد , مقدار ولتاژ خروجیمون به همون نسبت نصف بشه  یابعبارت دیگه یک رنجی رو (۰تا ۱۰۲۳) بیاد تبدیل کنه به یک رنج (۰ تا ۲۵۵) دیگه؟

بله , یه راهی وجود داره! یه دستوری وجود داره در آردوینو که همین کار رو میکنه و بهش map کردن میگن. اون دستور بصورت زیر هست:

در دستور بالا ابتدا مقداری که میخایم تبدیل کنیم رو مینویسم که در اینجا مقداری که میخایم تبدیل کنیم چیه؟

بله درسته, مقدارای که میخایم تبدیل کنیم sensorValue هست, پس در ابتدا sensorValue رو مینویسیم.بعد رنجی که sensorValue داره رو مشخص میکنیم. رنج sensorValue برابر ۰ تا  ۱۰۲۳ هست. بنابراین مقادیر بعدی رو از صفر تا ۱۰۲۳ مینویسیم و درآخر رنجی که میخایم sensorValue داشته باشه رو مینویسیم که برابر ۰تا ۲۵۵ هست. و سپس مقداری که sensorValue بدست اومده رو در خروجی قرار می هیم و باتوجه به مقدار اون نور led کم و زیاد میشه.

پس با دستور بالا مقدار بین ۰تا ۱۰۲۳ تبدیل میشه به ۰تا ۲۵۵  بنابراین کدهای جدید بصورت زیر میشه:

شاید بشه گفت این مبحثی که ذکر شد, مقدار زیادی از خواندن اطلاعات از سنسورهایی که خروجیشون بر حسب ولتاژ هست رو پوشش میده. مثلا سنسور دما lm35 , این سنسور بر حسب دما یه ولتاژ خروجی میده .حالا اگه این ولتاژ رو بتونیم بخونیم و بفهمیم چه مقدار هست بر حسب اون میتونیم خیلی از کارها رو انجام بدیم.مثلا اگر دما به یه مقداری رسید آلارم بده یا یه led روشن بشه و…

 

 

تمرین:

با یک فتوسل (سنسور حساس به نور) و یک LED مداری بسازید که بمحض نزدیک کردن دست به فتوسل و تاریک شدن سنسور, LED روشن بشه و زمانیکه دست رو از فتوسل دور میکنین LED خاموش بشه. تقریبا شبیه این پروژه هست که صبح وقتی نور خورشید هست چراغ باید خاموش بمونه و زمانیکه شب میشه با تاریک شدن هوا چراغها باید بصورت اتوماتیک روشن بشه .

کلیپ آماده مداری رو که گفتم در قسمت پایین میذارم. مدارتون باید یه چیزی شبیه به این باشه. سعی کنین خودتون بسازین. انشاا… در فصل بعد روش ساختنش توضیح داده میشه.

حدیث از امام جواد (ع) :      

هر كس نداند كارى را از كجا آغاز كند، از به سرانجام رساندن آن درماند.

    “بحار الأنوار: ۷۱ / ۳۴۰ /۱۳ ، میزان الحكمه، جلد ۳ صفحه: ۵۴”

توسط | ۱۳۹۷/۸/۲۱ ۲۱:۴۵:۳۳ شهریور ۱۶ام, ۱۳۹۷|آموزش آردوینو|بدون ديدگاه

ثبت ديدگاه