جلسه ششم: استفاده از کنسول آردوینو

سلام رسیدیم به جلسه 6.
این جلسه میخوایم تمرکز کنیم روی کنسول آردوینو. تا حالا کنسول آردوینو رو باز کردید اصن؟ خب بیاید روی این آیتم: Untitled

وقتی که روی شکل کلیک می کنید وارد صفحه اصلی کنسول میشید. Untitled

خب اصن این کنسول به چه دردی میخوره؟
یکی از کاربردها استفاده از کنسول به عنوان نمایشگر هست. فرض کنید یه GPS داریم که میخوایم اطلاعات مربوط به اون رو مشاهده کنیم.یه راه اینه که LCD بزاریم و داده ها رو روش چاپ کنیم. یه موقع کاربری که داره کار می کنه نیازی نداره که داده روی LCD براش چاپ بشه همین که داده رو روی کامپیوتر ببینه براش کافیه. تو این شرایط بهترین و بی هزینه ترین روش اینه که از کنسول آردوینو استفاده کنه. یه نمونه از چاپ داده GPS رو میتونید تو شکل زیر ببینید: Read_data_from_serial_monitor

ما از همین ویژه گی کنسول برای دیباگ کردن برنامه هامون هم استفاده می کنیم. یه موقع پروژه اینه که داده های سنسور دما رو روی یه سون سگمنت چاپ کنیم. کد رو می نویسیم و آپلود می کینم. به ظاهر همه چیز خوب پیش رفته و کامپایلر هم ارور نداده ولی می بینیم روی سون سگمنت هیچ عددی نمایش داده نمیشه. یکی از احتمالاتی که وجود داره اینه که داده سنسور یه جایی از بین رفته باشه(خطای کد نویسی). با استفاده از همین کنسول سریال میتونیم خط به خط برناممون رو دیباگ کنیم و ببینیم کجا داده سنسور از دست رفته(در جلسه های بعد مثال عملی می زنیم).
بیاین یه مثال عملی بزنیم. یه کد بنویسیم که هر کسی اسمشو توی کنسول آردوینو چاپ کنه. خب اسکچ رو باز کنید. با این صحنه مواجه میشید: Untitled

قدم اول برای ایجاد ارتباط سریال بین آردوینو و کامپیوتر، تعیین کردن نرخ ارسال داده (Baude Rate) هست به عبارت دیگه باید نرخ ارتباط سریال رو کانفیگ کنیم. دستوری که باهاش این کار رو انجام میدیم Serial.begin هست. خب از اسم دستور معلومه یعنی کامپیوتر عزیز ارتباط سریال رو شروع کن. این دستور یه آرگومان عددی داره که بیانگر Baude Rate مربوط به ارتباط سریال هست مثلا 9600. بنابراین برای کانفیگ کردن ارتباط سریال بین آردوینو و کامپیوتر از دستور (Serial.begin(9600 استفاده می کنیم. حالا این دستور کجا باید نوشته بشه؟ توی setup یا loop ؟ این سوال رو خودتون باید بتونید جواب بدید. به خاطر این که داریم کانفیگ می کنیم و تنها یک بار لازمه این تنظیم رو انجام بدیم این دستور توی تابع setup نوشته میشه. Untitled

قدم بعد (قدم آخر) باید یه دستور بنویسیم که اسممون رو توی کنسول چاپ کنه. از دستور Serial.print یا Serial.println استفاده میکنیم. دستور Serial.print هر چیزی که به عنوان آرگومانش بهش داده بشه پشت سر هم چاپ می کنه میره. اما دستور Serial.println بعد از چاپ آرگومانش میره خط بعدی. این دستورها تنها یه آرگومان به عنون ورودی میگیرن که باید حتما توی علامت دبل کوتیشن نوشته بشه مثلا (“Serial.println(“aftab . حالا من میخوام هر بار که قراره اسمم چاپ بشه بره تو یه خط جدید اجرا بشه بنابراین از دستور Serial.println استفاده میکنم. خب بازم سوالی که پیش میاد اینه که دستور Serial.println کجا نوشته بشه؟ setup یا loop ؟ این دفعه بزارین هر دو مورد رو امتحان کنیم تا فرقشو کامل متوجه بشید. اول دستور رو میزاریم تو تابع loop. کد رو اپلود میکنیم.
Untitled

خروجی توی کنسول آردوینو به اینصورت میشه(نترسید): Untitled

همونطور که قبلا هم در موردش حرف زدیم دستوراتی که توی تابع loop نوشته میشن تا زمان ابد تکرار میشن و ادامه دارن.
حالا دستور رو توی تابع setup می نویسیم و آپلود می کنیم:
Untitled

و خروجی کنسول:
Untitled
می بینید که تنها و تنها یک بار چاپ میشه و تا هزار سال دیگه هم که بشینید هیچ خبری نمیشه. فکر کنم الان کاملا با تفاوت تابع setup و loop آشنا شده باشید.
حالا اگه خواستیم با فاصله زمانی یک ثانیه اسممون رو چاپ کنیم چطوری کد بنویسیم؟
Untitled

خب بدون شک میریم تو تابع loop ، دستورچاپ رو مینویسیم فقط یه تاخیر 1 ثانیه ای بینش قرار میدیم . با این کد نویسی اول تابع Serial.println اجرا میشه و روی کنسول نمایش داده میشه بعد به مدت 1 ثانیه روی همون دستور می ایسته و دوباره بر میگرده به اول تابع loop و تکرار روند.

پایان جلسه

جلسه پنجم: ساختار کدنویسی در اسکچ

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

خب میریم وسط داستان. هر برنامه ای که برای آردوینو میخوایم بنویسیم دو قسمت مجزا داره. یکی تابع setup یکی تابع loop. دقت کنید تمام برنامه ها باید حتما شامل این دو تا تابع باشن. طرح خالی برنامه به این شکله:Untitled

حالا این که این دو تا تابع چی هستن و چیکار میکنن؟
اول تابع setup: به زبون نیمه علمی بخوام بگم کامپایلر آردوینو این تابع رو فقط و فقط 1 بار اجرا می کنه یعنی تمام خط های برنامه که توی این تابع نوشته میشن تنها 1 بار فراخوان میشن. خب این قسمت به چه دردی میخوره اصن؟ فرض کنید یه پروژه داشته باشیم که بخواد میزان الودگی هوای محیط یه کارخونه رو روی یه LCD نشون بده. همچنین تاکید کرده باشن که اول برنامه لوگوی اون کارخونه نمایش داده بشه. خب شما کافیه که دستور چاپ لوگوی اون کارخونه رو توی تابع setup قرار بدید، با این کار لوگو یک بار و تنها یک بار اونم اول برنامه نشون داده میشه.

setup یه کاربرد دیگه هم داره که اصطلاحا بهش میگن کانفیگ(config) کردن. کانفیگ کردن اینجا یعنی تنظیمات مربوط به قطعه هاتون رو توی همین تابع انجام بدید. مثلا فرض کنید دارید با ارتباط سریال با یه بلوتوث ارتباط برقرار میکنید. طبق خواص ارتباط سریال لازمه که نرخ تبادل اطلاعات (Baude Rate) رو تعیین کنید. برای این کار کافیه توی تابع setup این نرخ تبادل رو یه بار معین کنید.

میریم سراغ LOOP . این تابع تنها یه مفهوم داره: اجرا شدن تا ابد. روند اجرای دستورات در loop به این صورت هست که کامپایلر شروع میکنه به اجرای خط به خط برنامه ها. از خط اول شروع میکنه تا برسه به خط آخری که در تابع loop نوشته شده. وقتی رسید به خط اخر دوباره برمیگرده از خط اول و اجرا میکنه(دقیقا نقش همون (1)while توی کدنویسی avr در سایر برنامه ها).
برای درک بهتر فرض کنید یه ماهواره قراره اطلاعاتی که دریافت کرده رو به زمین مخابره کنه، تو ایستگاه زمینی برای دریافت اطلاعات از آردوینو استفاده شده باشه.برای دریافت اطلاعات در ایستگاه لازمه یه سری کد نویسی هایی در آردوینو انجام بشه. فرض کنید اشتباها کد دریافت داده تو setup گذاشته بشه. تو این شرایط ماهواره دائم داده میفرسته ولی ایستگاه زمینی ما (آردوینو) فقط یک بار اون داده رو گرفته بعدش دیگه هیچ کاری نمیکنه در حالی که ماهواره داره اطلاعات مخابره میکنه و تمام اون اطلاعات هم دارن از دست میرن. درستش اینه که کدهای مربوط به دریافت اطلاعات بیاد توی
loop قرار بگیره تا ارتباط همزمان ماهواره و ایستگاه برقرار باشه.

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

دستور pinMode :

Untitled

یادتون هست تو جلسه های قبلی در مورد پین های دیجیتال و آنالوگ حرف زدیم. گفتیم 14 تا پین دیجیتال داریم که هم میتونن ورودی باشن هم خروجی. از اون طرف 6 تا پین آنالوگ داشتیم که فقط و فقط ورودی بودن. برای این که به آردوینو بفهمونیم قراره از این پین ها چجوری استفاده کنیم میریم سراغ دستور pinMode . این دستور دو تا آرگومان(ورودی) داره.

توی آرگومان اول بهش میگیم که داریم از کدوم پین استفاده می کنیم. اگه پین مورد استفاده دیجیتال بوده باشه عدد 0 تا 13 به عنوان آرگومان نوشته میشه. اگه از پین آنالوگ استفاده کرده باشیم A0 تا A5 نوشته میشه.
ورودی دوم تابع pinMode مربوط میشه به این که ما از پین (که در آرگومان اول معرفیش کردیم) چجوری داریم استفاده می کنیم. کلا 3 حالت وجود داره: INPUT , OUTPUT و INPUT_PULLUP . در صورتی که از پین دیجیتال استفاده کنیم یکی از سه حالت بالا میتونه اتفاق بیفته، ولی اگه پین استفاده شده آنالوگ باشه فقط و فقط INPUT مجاز خواهد بود.

نمیدونم حواستون بود یا نه دستور pinMode توی تابع setup نوشته شده. دستور pinMode از اون دستورایی هست که برای کانفیگ کردن استفاده میشه. در حقیقت ما با این دستور یک پین از آدوینو رو کانفیگ می کنیم.

دستور digitalWrite :
1
برای این که به پین های دیجیتال (دقت کنید پین های دیجیتال) مقدار داده بشه از دستور digitalWrite استفاده می کنیم. این دستور دو تا آرگومان داره. آرگومان اول شماره پین دیجیتال رو میگیره که چون بحث روی دیجیتاله میشه 0 تا 13. آرگومان دوم مقدار میگیره یعنی LOW و HIGH. اگه قراره روی پین مقدار 1 بیفته از HIGH و اگه قراره 0 باشه از LOW استفاده می کنیم.

دستور delay :
1

این دستور یه آرگومان عددی داره به این صورت که هر عددی که توش بنویسید بر حسب میلی ثانیه محاسبه میشه و آردوینو همون اندازه صبر می کنه. مثلا ما این جا نوشتیم (delay(1000 این یعنی به مدت 1000 میلی ثانیه (همون یک ثانیه) آردوینو صبر میکنه بعد خط بعدی برنامه رو اجرا میکنه.

امیدوارم دقت کرده باشید که دو تا تابع digitalWrite و delay توی loop نوشته شدن. یعنی اجرای این دستورها تا ابد ادامه خواهد داشت.

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

شروع می کنیم.
کامپایلر اول میره سراغ تابع setup. توی تابع setup اومدیم با دستور (pinMode(13, OUTPUT به آردوینو فهموندیم که میخوایم از پین شماره 13 (همون پینی که LED داخلی بهش وصله) به صورت خروجی استفاده کنیم. در حقیقت با این کار پین 13 رو به عنوان خروجی کانفیگ کردیم.
قدم بعد کامپایلر وارد تابع loop میشه. خط اول از دستور ( digitalWrite(13, HIGH استفاده کرده. طبق آرگومان هایی که بهش داده شده، میاد روی پین شماره 13 سطح منطقی HIGH رو قرار میده و با این کار LED داخلی روشن میشه.
خط بعد از دستور delay با آرگومان 1000 استفاده شده. با این کار آردوینو به مدت 1 ثانیه روی همین خط برنامه متوقف میشه و این در حالیه که led داخلی اون قبلا روشن شده.
بعد از گذشت یک ثانیه خط بعدی با دستور (digitalWrite(13, LOW اجرا میشه. با این دستور led داخلی آردوینو خاموش میشه.
خط آخر برنامه که دستور delay هست، باز هم برنامه رو به مدت 1 ثانیه متوقف میکنه با این تفاوت که الان led داخلی آردوینو خاموشه.

خب خط های برنامه تموم شد آیا روند اجرای برنامه متوقف میشه؟
کسانی که بحث رو دنبال کرده باشن میتونن جواب این سوال رو بدن. خیر روند اجرایی برنامه متوقف نمیشه چرا که تمام این دستور ها توی تابع loop نوشته شده. بنابراین دوباره از خط اول تابع loop که همون( digitalWrite(13, HIGH هست برنامه شروع میکنه به انجام شدن.

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

این جلسه هم تموم شد موفق باشید.