جلسه هفتم: کنسول به عنوان ورودی

جلسه قبل از کنسول به عنوان خروجی استفاده کردیم یعنی یه سری پیغام رو تو کنسول چاپ کردیم. این جلسه روند معکوس میشه یعنی تصمیم داریم از کنسول به عنوان ورودی استفاده کنیم و از اون داده دریافت کنیم. برای وارد کردن پیغام در کنسول آردوینو از قسمت بالای کنسول استفاده می کنیم. Untitled3-300x229 خب شروع می کنیم به کد نویسی. طبق معمول اول باید نرخ ارتباط سریال رو کانفیگ کنیم. این دفعه Baude Rate رو به جای 9600 روی 115200 تنظیم می کنیم. البته هیچ اصراری نیست که Baude Rate رو تغییر بدید صرفا محظ تنوع این کارو می کنیم.ddهدفمون تو این برنامه این هست که اول از کنسول سریال یه داده دریافت کنیم بعد همون رو توی کنسول چاپ کنیم. روند کد نویسی برای خوندن از کنسول سریال به این صورته که اول چک میکنیم اصلا داده ای برای دریافت وجود داره یا نه! اگر داده ای دریافت شده بود اون رو بر می داریم و توی کنسول چاپ می کنیم اگر نه خب هیچی. 

دستوری که معین میکنه اصن داده برای دریافت وجود داره یا نه Serial.available هست. خروجی این دستور تعداد کاراکترهای دریافتی از کنسوله. برای این که بدونیم اصن داده ای توسط کنسول سریال دریافت شده یا نه کافیه همین دستور رو بنویسیم و چک کنیم که آیا خروجیش بزرگتر از صفر هست یا نه. اگر بزرگتر از صفر بود که یعنی یه داده اومده توکنسول سریال و آماده خوندنه اگر نه یعنی هیچ داده ای دریافت نشده. همین شرطی که میذاریم (خروجی دستور بزرگتر از صفر هست یا نه)  تو عالم کدنویسی یعنی استفاده از دستور if . فرم کد نویسی این دستور میشه این شکلی: Untitled درمورد ساختار دستور if حتما یه مطالعه ای بکنید. حالا فرض کنید شرط if برقرار باشه یعنی تو بافر ارتباط سریال داده وجود داشته باشه، وقتشه که اون داده خونده بشه. بدون شک دستور خوندن باید تو تابع if و درون کروشه های تابع if نوشته بشه چون عملا اگه داده ای برای خوندن وجود نداشته باشه خب خوندنش کار بیخودیه. محل مورد نظر ما توی شکل نمایش داده شده: Untitledو اما قدم نهایی: خوندن داده. دستوری که باهاش می خونیم Serial.read هست. خروجی این دستور یک کاراکتر هست. یعنی وقتی این دستور رو می نویسیم کامپایلر میره اولین کاراکتر عبارت ما رو برمیگردونه. مثلا اگه aftab رو نوشته باشیم با دستورSerial.read کاراکتر a برگردونده میشه.  حالا این که ما چجوری از خروجی این تابع استفاده کنیم باز هم برمیگرده به قوانین برنامه نویسی. یه قانون داریم به نام معرفی متغیر. اگه لینک رو مطالعه کردید میدونید که ما به هر متغیر میتونیم یه مقدار انتساب بدیم. مثلا من متغیرم رو از نوع char در نظر میگیرم. اسمشم میزارم data. حالاباید بهش مقدار بدم. مقدار این متغیر رو خروجی دستور Serial.read (یعنی همون یه کاراکتر) در نظر میگیرم. بنابراین دستور من به فرم زیر در میاد. Untitled الان در حال حاضر در صورتی که داده ای توی بافر سریال وجود داشته باشه توسط دستور Serial.read خونده میشه. خیلی خیلی دقت کنید نوع متغیر رو از نوع char در نظر گرفتیم. در نهایت برای چاپ عدد توی کنسول از دستور ؟؟؟؟؟؟؟؟ استفاده میکنیم. طبق آموزش های جلسه قبل جای علامت سوال ها با دستور Serial.println پر میشه. بنابراین ورژن نهایی کد میشه عکس زیر: Untitled اما کسایی که دقیقن میتونن درک کنن چرا کنار دستور Serial.println یه فلش خورده. جلسه قبل گفتیم فرمت دستور Serial.println اینطوریه که هرچیزی به عنوان آرگومانش بخواد در نظرگرفته بشه باید توی علامت دبل کوتیشن گذاشته بشه (علامت “”) پس چرا الان علامت دبل کوتیشن نذاشتیم ؟ اگه من میخواستم دقیقا عبارت data رو توی کنسول چاپ کنم باید علامت دبل کوتیشن رو رعایت می کردم و کد رو به همون صورت قبل می نوشتم. اما الان قرار نیست همچین کاری بکنم الان data بعنوان یه متغیر تعریف شده و من میخوام مقداری که توی متغیر data هست رو چاپ کنم. طبق قانون دستور Serial.println برای چاپ عبارت داخل یه متغیر (مثل متغیر data) علامت دبل کوتیشن نباید گذاشته بشه. خب کد رو اپلود کنید و کنسول سریال رو باز کنید. الان قسمت بالای کنسول عدد 5 رو تایپ کنید و دکمه send رو بزنید (یا enter کنید).
Untitled
وقتی اینتر کنید باید توی کنسول سریالتون عدد 5 تایپ بشه مثل شکل زیر:
Untitled
یه نکته توی عکسه باید بهش دقت کنید. baud rate روی 115200 باید تنظیم باشه. اگه به اشتباه baude rate رو روی 9600 گذاشته باشید هر چقدر 5 تایپ کنید و enter بزنید فقط یه سری داده پرت و پلا دریافت می کنید بنابراین دقت کنید که baude rate ای که تو دستور Serial.begin انتخاب می کنید با baude rate ای که توی کنسول انتخاب می کنید مساوی باشه.
به همون صورت قبل حرف a رو تو قسمت ورودی کنسول تایپ کنید و اینتر بزنید همون موقع حرف a برای شما تایپ میشه.
حالا قسمت جالب انگیز ماجرا:
بیاید قسمت ورودی کنسول تایپ کنید aftab و اینتر بزنید. وقتی بخواد تو کنسول چاپ کنه با شکل زیر مواجه میشید.
Untitled

خیلی به این قضیه اصرار دارم. ببنید کل کلمه aftab پشت سر هم تایپ نشده بلکه هر کاراکتر تو یه خط چاپ شده. این قضیه خیلی مهمه. دلیل این اتفاقی که افتاده اینه که دستور Serial.read تنها و تنها یک کاراکتر رو بر میگردونه. بنابراین هر باری که وارد شرط if میشه یک کارکتر از کاراکترهای عبارت aftab چاپ میشه.

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

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

پایان جلسه هفتم

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

سلام رسیدیم به جلسه 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 و تکرار روند.

پایان جلسه

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

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

ArduinoUno_R3_Front (1)

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

1
USB connector(قسمت زرد رنگ):
با این پورت آردوینو با کابل USB به کامپیوتر وصل می شه. حالا چه احتیاجی به این کابل USB وجود داره؟
1. تامین ولتاژ مصرفی آردوینو، به زبان ساده تر یعنی روشن کردن آردوینو.
2.پروگرام کردن آردوینو با همین کابل انجام میشه یعنی فقط کافیه کد رو داشته باشیم کابل USB رو وصل می کنیم و آپلود می کنیم.
3.ارتباط سریال بین کامپیوتر و آردوینو (این قسمت مربوط به بخش برنامه نویسی است که در جلسات آینده مورد بحث قرار می گیرد.)

سوکت آداپتور (قسمت صورتی رنگ) :
هروسیله ای برای روشن شدن به ولتاژ یا به اصلاح عامیانه تر برق احتیاج داره. آردوینو هم از این قاعده جدا نیست. برای روشن کردن آردوینو چند تا راه داریم. اولین راه همون کابل USB بود. حالا فرض کنید یه مدار با آردوینو بستیم که قراره توی یه مطب یا توی بانک ازش استفاده بشه. اگه قرار باشه تنها راه روشن کرد آردوینو کابل USB باشه، باید همه جا دنبال خودمون لپتاپ هم ببریم که منطقی نیست. حالا اومدن توی بردهای آردوینو یه سوکت قرار دادن که میشه به اون سوئیچ آداپتور وصل کرد و با همون ولتاژ مصرفی آردوینو فراهم میشه.
آداپتور-مودم-12-ولت-2-آمپر-شارژر-منبع-تغذیه-12v-2a-آداپتور-مودم-آدپتور-سوئیچ-هاب-آداپتور-هارد-آداپتور-12-اداپتور آداپتور ها ولتاژها وجریان های متفاوتی دارن. حواستون باشه اینطوریا هم نیست که هر ولتاژی دوست داشته باشیم به آردوینو بدیم. معمولا آداپتورهای 5 ولت یا 9 ولت به آردوینو وصل کنید. شدیدا پیشنهاد میکنیم که 12 ولت به آردوینو وصل نکنید چون در طولانی مدت مجبور می شید باهاش خداحافظی کنید.
حالا اومدیم یه بنده خدایی پیدا شد می خواست مدارشو برداره ببره وسط صحرا باهاش کار کنه و لپتاپ هم نتونه ببره. وسط صحرا ؟ پریز برق واسه آداپتور ؟راه حل: پایه vin (در مورد این پایه بعدا توضیح داده میشه).

منبع تغذیه (قسمت نارنجی رنگ):

Untitled
برای توضیح پین های این قسمت با مثال میریم جلو. فرض کنید دو تا سنسور داریم یکی دما یکی فشار. سنسور دما 5 ولت و سنسور فشار 3.3 ولت برای روشن شدن احتیاج دارن(همون VCC). از کجا ولتاژ بیاریم؟
اگه با avr کار کنیم باید دوتا رگولاتور 5 ولت و3.3 ولت بزاریم تا از خروجی این رگولاتورها به سنسورها ولتاژ بدیم ( اگه ولتاژ بیشتر از حد تحملشون بهشون داده بشه می سوزن).

حالا اگه با آردوینو کار کنیم این دوتا رگولاتوری که ازشون حرف زدیم به صورت پیش فرض روی خود برد قرار گرفته و خروجی 5 ولت و 3.3 ولت آماده و حاضر وجود دارن. یعنی اگه شما با یکی از راه های قبلی (کابل USB یا آداپتور) خود آردینو رو روشن کرده باشین روی این دو تا پایه ولتاژهای 5 ولت و 3.3 ولت آماده استفاده هستن (شک دارید ولتمتر بزارید).
علاوه بر این، دو تا پایه زمین (GND) هم داره. برای روشن شدن سنسور علاوه بر ولتاژ دادن باید پایه گراند هم متصل باشه در غیر این صورت با وجود وصل بودن vcc سنسور روشن نمیشه.

تا الان تکلیف 4 تا پایه روشن شد حالا میریم سراغ پایه Vin. تو قسمت سوکت آداپتور یه اشاره کوچیکی کردیم. فرض کنید یه پروژه داریم که باید دمای هوای صحرا در طول یک روز اندازه گیری بشه و به ایستگاهی در فاصله یک کیلومتری فرستاده بشه. پس باید به مدت یک روز آردوینو و سنسور دما و فرستنده بی سیم توی صحرا کار گذاشته بشن. وسط صحرا نمی تونیم با آداپتور آردوینو رو روشن کنیم (پریز برق نداریم خب) میریم سراغ کابل USB. برای استفاده از کابل باید لپتاپ ما بتونه به مدت یک روز شارژ نگه داره! عملا با دو روش قبلی کاری از پیش نمیبریم.
یعنی پروژه کنسل ؟ خیر میریم سراغ پایه Vin. میشه با باتری هم آردوینو رو روشن کرد . باتری دو تا خروجی داره : ولتاژ و زمین. کافیه خروجی ولتاژ باتری به پایه Vin و گراندش به گراند آردوینو وصل بشه. البته مثل آداپتور اینجا هم مجاز نیستیم هر ولتاژی بهش بدیم. سایت سازنده خودش پیشنهاد کرده ماکزیمم 12 ولت بهش بدید ( زیر 5 ولت هم قاعدتا نباید بهش ولتاژ داد).
البته پایه Vin یه کاربرد دیگه هم داره. وقتی ولتاژ آردوینو با آداپتور فراهم بشه روی این پایه همون ولتاژ آداپتور میوفته یعنی اگه آداپتور 9 ولت وصل کرده باشید روی این پایه ولتاژی حدود 9 ولت میوفته. زمانی هم که آردوینو با کابل USB روشن بشه روی پایه Vin تقریبا 5 ولت میوفته.

و اما پایه IOREF. سطح منطقی ای که برد باهاش کار میکنه روی این پایه میفته. مثلا آردوینو UNO روی پین های ورودی خروجیش با سطح منطقی 5 ولت کار میکنه ولی آردوینو DUE با ولتاژ 3.3 ولت کار می کنه.

در مورد پایه ریست پایان همین جلسه در قسمت کلید ریست توضیح میدیم.

ورودی و خروجی های دیجیتال (قسمت سبز رنگ):

Untitled
قبل از این که وارد موضوع اصلی بشیم شاید یه عده معنی دیجیتال و آنالوگ رو ندونن .اون دوستان برن اینجا یه دوری بزنن و بیان.
آردوینو 14 تا پین دیجیتال داره از D0 تا D13. این پین ها هم به عنوان ورودی هم به عنوان خروجی تعریف میشن. یه موقع دنبال این هستیم که رله خاموش روشن کنیم پس پین به عنوان خروجی در نظر گرفته میشه. بعضی موقع ها یه سنسور دیجیتال داریم (مثل سنسور تشخیص حرکت) در این شرایط پین به عنوان ورودی تعریف میشه.
یه نکته ظریفی این وسط وجود داره. درسته موتورها هم با پایه های دیجیتال کار میکنن ولی هر پایه آردوینو فقط 40 میلی آمپر جریان داره پس عملا موتور راه انداختن با آردوینو به تنهایی کار جالبی نیست و باعث سوختنش می شه.نه تنها موتور، هر سنسوری که جریانی بیشتر از تحمل آردوینو بکشه باعث سوختنش میشه. روی هر پین آردوینو هم PULL UP داخلی وجود داره که اگه پایه به عنوان ورودی در نظر گرفته بشه با برنامه نویسی میتونیم ازش استفاده کنیم.
بعضی از این 14 تا پین آردوینو علاوه بر دیجیتال بودن ویژه گی های دیگه ای هم دارن که توضیحشون همینجاست و جلسه های بعدی روی هر کدوم ازاونها پروژه انجام میدیم.
1- پایه های سریال (Rx & Tx) : پایه های D0 و D1 آردوینو به صورت پیش فرض به عنوان پایه های ارتباط سریال در نظر گرفته شدن. پروگرام کردن آردوینو از طریق کامپیوتر هم از طریق همین 2 تا پین صورت میگیره. طوری که وقتی آردوینو در حال پروگرام شدنه این دو تا پایه که به دو تا led وصل هستن شروع به چشمک زدن می کنن. خیلی کم پیش میاد از این دو تا پایه به عنوان پین های دیجیتال در حین انجام پروژه استفاده بشه. مثلا فرض کنید بیایم به پایه های D0و D1 رله وصل کنیم و با کد نویسی اون ها رو خاموش و روشن کنیم، در حین مسیر آپلود کردن کد تو نرم افزار آردوینو یه ارور میده چرا که پین هایی که برای پروگرام کردن لازم داره ما بهشون رله وصل کردیم و استفاده شدن. بنابراین اول رله ها رو جدا می کنیم بعد پروگرام می کینم و دوباره رله ها رو وصل می کنیم. خب چه کاریه؟ از اول به دو تا پین دیگه وصل می کردیم تا این مکافات کندن و وصل کردن رو نداشته باشیم.
حالا اومدیم و مجبور شدیم با ماژولی(مثل بلوتوث) کار کنیم که ار تباطش با آردوینو از نوع TTL بود، یعنی مجبور بودیم از پایه های Rx و Txاستفاه کینم. واقعا باید برای هر بار کد آپلود کردن دائم سیم جدا کنیم و وصل کنیم؟ جواب منفیه
شما میتونید به صورت نرم افزاری پین های ارتباط سریال رو اضافه کنید. البته نمیتونید از هر پین دلخواهی هم استفاده کنید. بسته به اینکه روی کدوم نوع آردوینو کار می کنید این پین ها متفاوت هستن. به این ترفند SoftwareSerial میگن که در آینده نزدیک روش مانور خواهیم داد.

2- اینتراپت (وقفه):
اول بخونید ببینید اینتراپت چیه.
در مورد کیس خاص ما یعنی آردوینو UNO دو تا وقفه خارجی روی پین های D2و D3 وجود داره که میشه با برنامه نویسی ازاونها استفاده کرد. روال کلی وقفه اینطوریه که وقتی روی پین D2 سیگنال بیفته (به عبارتی trigger بشه) میکرو دست از اجرای هر کاری بکشه و بره یه عملیات مخصوص وقفه انجام بده(اصطلاحا میگن تابع  وقفه رو انجام بده). برای مثال فرض کنید کد اصلی روی میکرو شمارش اعداد باشه، حالا ما یه وقفه تعریف کنیم که اگه پایه D2 توسط یه رله خارجی تحریک شد پیغام “Relay ” رو چاپ کنه روی lcd. برنامه رو استارت می کنیم. میکرو شروع میکنه به شمارش 1 ، 2 ،3 و همینطوری میره جلو روی عدد 8 رله را روشن میکنیم بنابراین در اون لحظه پایه D2 تحریک شده وتابع مربوط به وقفه باید انجام باشه بنابراین در عدد 8 متوقف میشه میره پیغام “Relay ” رو روی lcd نشون میده و بر میگرده در ادامه شروع میکنه 9 ،10 ،11 و….
شکل کلی یک پالس به صورت زیره:

clk
همونطور که از شکل معلومه هر پالس لبه بالارونده و لبه پایین رونده داره. وقتی از وقفه صحبت می کنیم می تونیم تعیین کنیم پالسی که به پایه D2 داده میشه روی کدوم لبه حساس باشه. یعنی اگه به لبه بالارونده پالس رسید زیر برنامه وقفه اجرا بشه یا روی لبه پایین رونده. حتی میشه تعیین کرد به ازای هر تغییری که در سطح منطقی بوجود میاد زیر برنامه اجرا بشه.

3- 6 تا پین از 14 پین دیجیتال آردوینو UNO به صورت PWM هم کار میکنن. پین های 3، 5، 6، 9، 10 و 11. وقتی از PWM صحبت می کنیم یاد راه اندازی موتورهای DC می افتیم. ما میتونیم با استفاده از مد کاری PWM به موتورهای DC سرعت چرخش متفاوتی بدیم. با نحوه عملکرد این مد توجلسات آینده با جزئیات بیشتر و دقیق تر آشنا میشیم.

4- هر سنسوری برای برقراری ارتباط با پردازنده از یه پروتکل استفاده میکنه. بعضی ها از SPI و بعضی ها از I2C استفاده می کنن (البته یه سری از سنسورها هم ساده تر ازاین حرفا راه اندازی میشن که بعدا می بینیم). روی برد آردوینو برای هر کدوم از این دوتا پروتکل ارتباطی، پین های مشخصی در نظر گرفته شده.
اول در مورد ارتباط I2C حرف میزنیم. کلا اگه بخواهیم تشخیص بدیم سنسوری که قراره باهاش کار کنیم I2C هست یا نه کافیه به پین هاش نگاه کنیم اگه SCL و SDA داشت زدیم وسط خال. قدم بعد از تشخیص پروتکل ارتباطی سنسور، اینه که وصلش کنیم به آردوینو. برای آردوینو UNO از پین های آنالوگ A4 و A5(تو همین جلسه میگیم کجاس) استفاده میکنیم ولی بقیه مدل های آردوینو دقیقا پین هایی به اسم های SCL و SDA دارن. در آینده نزدیک با راه اندازی یه سنسور I2C کامل متوجه میشید داستان از چه قراره.

میایم سراغ SPI .برای تشخیص سنسور SPI دنبال دو تا پین تابلو برگردین: MOSI و MISO. روی برد آردوینو پین های دیجیتال 10 و 11 و 12 و 13 مخصوص پروتکل SPI هستن. ما گفتیم دنبال دوتا پین بگردین الان 4 تا پین باید وصل کنیم چی شد؟ MOSI و MISO پین هایی بود که با دیدنشوم مطمئن می شدیم سنسور از نوع SPI هست ولی در حقیقت این روش ارتباطی با 4 تا سیم داده رد و بدل میکنه به خاطر همین ما هم 4 تا پین معرفی کردیم.

5- پین دیجیتال شماره 13. این پین تو آردوینو خاصه چرا که یه led بهش وصله. گهگاهی توی پروژه هایی که داریم انجام میدیم لازمه برای آلارم یا حتی چک کردن یه LED رو روشن خاموش کنیم. مثلا فرض کنید یا سنسور تشخیص حرکت داریم و هدف اینه که به محض تشخیص هر نوع حرکتی یه آلارم به ما بده. میتونیم از این led داخلی استفاده کنیم تا به محض تشخیص جا به جایی این led روشن بشه.

پین AREF در قسمت آنالوگ توضیح داده خواهد شد.

• ورودی آنالوگ (قسمت آبی رنگ):
Untitled
6 پین بالا ورودیهای آنالوگ برد آردوینو است که با نام های A0 تا A5 مشخص شده اند. بعضی سنسورها مثل فوتوسل انالوگ هستن یعنی داده هاشون به صورت پیوسته تغییر میکنه. بدون شک نمیشه داده این سنسورها رو با پایه دیجیتال خوند پس میایم سراغ پایه آنالوگ.  خروجی سنسور وارد یه مبدل آنالوگ به دیجیتال (ADC) ده بیتی میشه و عددی بین 0 تا 1023 به عنوان داده سنسور مورد استفاده قرار می گیره. این در شرایطی هست که سنسور با ولتاژ 5 ولت کار کنه ( یعنی ماکزیم ولتاژ قابل تحمل اون 5 ولت باشه). وقتی ولتاژ قابل تحمل سنسور پایین تر باشه(مثلا 3.3 ولت) لازمه اون ولتاژ به پایه AREF هم داده بشه تا ولتاژ ورودی مرجع آنالوگ به 3.3 ولت تبدیل بشه. با اینکار رزولوشن تبدیل آنالوگ به دیجیتال بالاتر میره.

حالا یه بنده خدایی پیدا شده توی پروژش اصلا سنسور آنالوگ نداره ولی 15 تا سنسور دیجیتال باید راه بندازه. بالاتر گفتیم که کلا 14تا پین دیجیتال داریم که پین 0 و 1 هم عملا قابل استفاده نیست. بنابراین فقط 12 تا پین دیجیتال باقی میمونه در حالی که ما 15 تا سنسور داریم. یا باید بریم سراغ یه آردوینو دیگه که تعداد پایه هاش بیشتر باشه یا از یه تریک جدید استفاده کنیم . تریک جدید اینه که اون 6 تا پایه آنالوگ میتونن به عنوان دیجیتال هم استفاده بشن. یعنی چی؟
یعنی ما میتونیم به پایه A0 بگیم پایه شماره 14 دیجیتال و تا آخر به A5 بگیم پایه دیجیتال 19. با این کار دقیقا 20 تا پایه دیجیتال داریم که با کم کردن پایه 0 و 1 (به خاطر آپلود کردن کد) عملا 18 تا پایه دیجیتال داریم (هورا شدیم).

کلید ریست (قسمت آبی رنگ):

Untitled

گاهی اوقات در روند اجرای یه پروژه لازم میشه برنامه از اول اجرا بشه. مثلا فرض کنید پروژه شمارش تعداد نفراتی باشه که روزانه وارد یه محیط اداری میشن. اگه قرار باشه برنامه ریست نشه هر روز به تعداد نفرات شمارش شده اضافه میشه و داده دقیقی در دسترس نیست بنابراین لازمه روزانه مدار ریست بشه. حالا یا میتونیم یه صورت سخت افزاری ریست کنیم یعنی کلید ریست رو فشار بدیم یا میتونیم از پین ریست (RESET) استفاده کنیم. پین ریست که توی قسمت منبع تغذیه قرار داره به محض دریافت سطح منطقی 0 مدار رو ریست میکنه و برنامه از اول شروع میکنه به انجام شدن. از هر روشی که استفاده کنیم برنامه از اول اجرا میشه.