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

به نام خدا

در این جلسه اضافه کردن کتابخونه به آردوینو رو آموزش میدم.
اول داستان: اصن کتابخونه چیه؟ یه بنده خدایی رو تصور کنید که واسه پروژش 700 خط کد نوشته. نحوه کد نویسیش هم طوری بوده که توی این 700 خط کدش 20 تا تابع (یا به قول برنامه نویسا “متد”) تعریف کرده. حالا این آدم می تونه کدش رو همینطوری ول کنه و بره (700 خط) یا این که می تونه تمام تابع هایی رو که نوشته یه جا جمع کنه و به مجوعشون یه اسم بده. تو این مثال ما یعنی بیاد 20 تا تابعی رو که نوشته توی یه مجموعه به نام مثلا mysensors قرار بده.
حالا این مجموعه ای که داریم ازش حرف می زنیم و اسمش رو گذاشتیم mysensors همون کتابخونس! دقیقا همونطوری که یه کتابخونه از کلی کتاب تشکیل میشه یه کتابخونه آردوینو هم از خطوط کد نویسی تشکیل میشه.
بنابراین تا این جا 20 تا تابعمون رو گذاشتیم توی کتابخونه mysensors . وقتی می خوایم تو اسکچ (همون نرم افزار آردوینو) از تابع ها یی که الان تو کتابخونه گذاشتیم استفاده کنیم، فقط و فقط کافیه اون کتابخونه رو به کتابخونه های آردوینو اضافه کنیم(بحث اصلی آموزش این جلسه)، بعد اسم کتابخونه روتو هدر برنامه بنویسیم (موضوع آموزش جلسه بعد) و از تمام 20 تا تابعمون استفاده کنیم. یه عده ممکنه هنوز متوجه نشده باشن.
فرض کنید یه تابع نوشتیم مثل زیر:
2015-12-17_12-19-27

این تابع اسمش showSms هست و 6 خط شده. ما این تابع رو توی کتابخونه mysenors قرار می دیم(کاری نداشته باشید چجوری چون به من و شما ربطی نداره البته فعلا!)
بعد از این که کتابخونه رو درست کردیم و به نرم افزار آردوینو اضافه کردیم هر جا با این تابع کار داشتیم به جای این که کل تابع رو با این شکل استفاده کنیم فقط ()showSms رو صدا می زنیم و بس . بنابراین تعداد خط های کد نویسی توی اسکچ خیلی خیلی خیلی کمتر میشه.

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

روش اول: Library Manager
اصل و اساس این روش اینه که کتابخونه مورد نظرمون رو از اینترنت به صورت مستقیم دانلود کنیم.
مثلا یه کتابخونه وجود داره به نام Bounce2. مطابق عکس زیر وارد Library Manager بشید:
2015-12-17_12-38-05

 

در قسمت مورد نظر تو عکس زیر کلمه Bounce2 رو تایپ کنید، کتابخانه پیدا شده رو انتخاب کنید و کلید install رو بزنید:
2015-12-17_12-40-25

بعد از تموم شدن دانلود مطابق عکس زیر می تونید چک کنید که کتابخونه به درستی اضافه شده یا نه!
2015-12-17_12-44-40

روش دوم:اضافه کردن فایل zip
همونطور که از اسم این روش پیداست برای اضافه کردن کتابخونه به فایل زیپ اون نیاز داریم. مثلا این فایل زیپ رو دانلود کنید.(همون کتابخونه قبلی هست)
خب حالا مطابق عکس زیر به add .zip library برید.
2015-12-17_12-55-23
در صفحه باز شده هر جا فایل زیپ دانلود شدتون رو گذاشتید برید و فایل زیپ رو انتخاب کنید:
2015-12-19_14-11-42
روش تست برای این که ببینید کتابخونه اضافه شد یا نه دقیقا مثل قبله.

روش آخر:کپی کردن در دایرکتوری کتابخانه ها
این روش یه روش کلیه و اصلا مهم نیست ورژن نرم افزار آردوینویی که استفاده می کنید جدیده یا قدیمی.
اول فایل زیپی رو که قبلا دانلود کردید اکسترکت کنید. بعد اونو کات کنید .
2015-12-19_14-21-30
برید اونجایی که نرم افزار آردوینو رو نصب کردید. وارد فولدر Arduino بشید بعد از اون وارد فولدر libraries بشید و فولدری که کات کرده بودید رو paste کنید همونجا.
2015-12-19_14-23-35
2015-12-19_14-24-28
کار اینجا تمام نیست. الان اسم فولدر ما Bounce2-master هست دیگه درسته؟ این اسم باید تغییر کنه حالا چجوری؟
اگه نرم افزارتون بازه ببندیدش و دوباره باز کنید(این کار حتما لازمه چون نرم افزار باید یه دور ریست بشه تا کتابخونه بهش اضافه بشه. روش های قبلی به این کار احتیاجی نداشتن)
خب حالا مطابق عکس زیر یه مثال از این کتابخونه رو بیارید:
2015-12-19_14-33-292015-12-19_14-34-20
همونطوری که توعکس نوشتم اسم کتابخونه رو یعنی Bounce2 (بدون h.) بردارید و به جای اسم فولدر کتابخونه یعنیpaste , Bounce2-master کنید. بنابراین در پایان کار باید اسم کتابخونه و اسم فولدر کتابخونه دقیقا یکی باشه. برای تست موفقیت در تغییر اسم بعد از این که این کار رو انجام دادید کد رو یک بار کامپایل کنید اگر ارور داد یعنی یه جای این روند رو اشتباه کردید.

و این هم اتمام جلسه اگر سوالی داشتید در فروم حی و حاضرم تشریف بیارید.

جلسه یازدهم : میکروسوئیچ

به نام خدا
سلام به دوستان

راستش قصد داشتم جلسه بعد برم سراغ سروو . ولی یه کم فکر کردم دیدم هنوز پروژه بیس زیاد داریم که بهتره اول اونا رو بگم بعد بریم سراغ سروو و ادامه ماجرا.
یه روند جدید: اول هر کاری که میشه با پین های دیجتال آردوینو کرد رو یاد میگیریم بعد میریم سراغ آنالوگ ها.
تا الان هر پروژه ای که انجام دادیم از پین های دیجیتال آردوینو به صورت خروجی استفاده کردیم. مثلا موقعی که یه LED ساده روشن کردیم، یا موقعی که RGB LED روشن کردیم و یا تو پروژه آخر یعنی موتور DC. همه جا پین دیجیتال خروجی بود یعنی ما ( آردوینو ) به فلان پایه دستور می دادیم 0 شو، یا 1 شو یا در مواقع pwm عدد متغیر می دادیم( انشاءالله که یادتونه).

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

حالا تو این جلسه به جای این که از سنسور به عنوان تولید کننده پالس دیجیتال استفاده کنیم از سوئیچ استفاده می کنیم. سوئیچ ها خیلی متنوع هستن چند نمونش رو ببینید:
tact-switch-500x500push-switches-250x250

ولی ما از هیچ کدوم اینا استفاده نمی کنیم. از این ماژول استفاده می کنیم.
5-Way_Tactile_Switch-500x5005-Way_Tactile_Switch_2-500x500

سوئیچ های معمولی فقط بهت میگن فشار داده شدن یا نه ولی این سوئیچ علاوه بر اون قابلیت بهت میگه در کدوم جهت فشار داد شده. اگه به عکس پشت ماژول نگاه کنین علاوه بر پایه VCC (پایه ولتاژ) و GND (زمین) 5 تا پایه دیگه هم بیرون کشیده شده که به این صورتن:
Right (راست)، Down (پایین)، Left (چپ)، Center (مرکز) و Up (بالا).
حالا اگه کلید به سمت بالا فشار داده بشه پایه منطق پایه Up یک میشه ( از نظر ولتاژی یعنی ولتاژ این پایه ماژول 5 ولت میشه ) ، اگه کلید به سمت چپ فشار داده بشه پایه منطق پایه Left یک میشه و الی آخر.

برای اتصال این ماژول به آردوینو باید علاوه بر اتصال VCC و GND ، بقیه پین ها رو به 5 تا پین دیجیتال وصل کنیم.
اگه یادتون باشه (آیا؟) جلسه های قبل برای اتصال LED و موتور با یه سوال بزرگ مواجه می شدیم و سوال این بود که آیا به هر پین دیجیتالی می تونیم وصل کنیم؟ اونجا متناسب با پروژه جواب فرق داشت یا آره بود یا نه بود. اما تو مقوله استفاده از پین دیجیتال به عنوان ورودی هیچ استثنایی وجود نداره و از هر پین دیجیتالی میشه استفاده کرد بنابراین راحت باشید.

بنابراین اتصال ماژول به آردوینو به صورت زیر خواهد بود:
tactile

5 تا پین دیجیتال استفاده شده در این مدار می تونن هر 5 پین دیجیتال دلخواهی باشن.
مدار رو بستید؟
تمام؟
خب میریم سراغ کد نویسی
نرم افزار آردوینو رو باز کنید تا شروع کنیم.
پروژه ما اینه: هر جهتی که سوئیچ فشار داده شد تو کنسول آردوینو اون جهت نوشته بشه، مثلا اگه کلید به سمت پایین فشار داده شد تو کنسول نوشته بشه Down.
قدم اول نوشتن هدر برنامه هست:
ببینید تو هدر برنامه صرفا معرفی می کنیم، حالا این معرفی میتونه پین های مورد استفاده باشه، می تونه کتابخونه های مورد استفاده باشه و یا متغیرهایی که در طول برنامه قراره روشون کار کنیم. تو این پروژه ما از هیچ کتابخونه خاصی استفاده نمی کنیم بنابراین فقط پین هایی رو که استفاده کردیم براشون اسم انتخاب می کنیم(همون معرفی)
مثلا شماره پینی که به پین راست ماژول سوئیچ وصل شده پین شماره 6 آردوینو هست. تو هدر برنامه اسم این پین رو right_pin گذاشتیم. با این کار تا آخر برنامه هر بار با این پین کار داشته باشیم از اسم right_pin استفاده می کنیم. در مورد 4 پین دیجیتال دیگه هم همین قانون حاکمه.

2015-12-16_13-38-43

مرحله بعد تابع setup هست. قرارمون این بود که هر چی کانفیگ داریم رو بزاریم تو این تابع. الان چند تا کانفیگ داریم یا به زبون دیگه چیا رو باید کانفیگ کنیم؟
چون قراره خروجی کار رو تو کنسول ببینیم یکی از کانفیگ ها تنظیم نرخ داده (Baude Rate) هست که روی 9600 تنظیمش می کنیم.
از طرف دیگه داریم 5 تا پین دیجیتال رو استفاده می کنیم که طبق قوانین مطرح شده تو جلسات قبل لازمه ورودی بودنشون تو تابع setup بیان بشه.
بنابراین دو تا کانفیگ لازم داریم که به صورت زیر کد نویسی می کنیم:
2015-12-16_13-42-48

و اما تابع loop:
خب روند کار تو این تابع اینطوری هست که اول مقدار پایه دیجیتال رو می خونیم و توی یه متغیر نگهش می داریم .اگه مقدار 1 بود ( که یعنی کلید فشار داده شده) کامند مناسب اون رو تو کنسول چاپ می کنیم. من کد برای یه پین رو می نویسم که به صورت زیر میشه:
2015-12-16_13-53-21
کد رو با 4 قسمت مختلف از هم جدا کردم که تک به تک میریم جلو:

1.هر خطی که با دو تا اسلش شروع بشه (//) جزء دستور و خط برنامه به حساب نمیاد و اصطلاحا بهش میگن کامنت (بعدا خودمون هم کامنت میزاریم)
2.روند رو یادتونه؟ گفتم اول پایه دیجیتال آردوینو رو می خونیم. تو این خط برنامه دقیقا داریم همین کار رو می کنیم. به کمک دستور digitalRead مقدار پین دیجیتال رو می خونیم. همونطور که میبیند این دستور یه ورودی داره که همون پین دیجتالی هست که قراره خونده بشه. الان تو ورودی تابع right_pin نوشته شده که اسم دیگه همون پین دیجیتال شماره 6 هست. مقدار خونده شده توسط دستور digitalRead (که یا 0 هست یا 1) درون متغیر right_value ریخته شده.
3.قدم بعد باید چک کنیم داده خونده شده از پین دیجیتال 1 بوده یا نه؟ هر جا شرطی ایجاد میشه یعنی تابع if : الان تو تابع if گفتیم اگه مقدار متغیر right_value ( که همون داده پین دیجیتال رو داره) مساوی با 1 بود (یعنی کلید به سمت راست فشار داده شده بود) بیا کل دستورهای بین دو آکولاد رو اجرا کن.
2015-12-16_14-06-23
4.در صورتی که کلید به سمت راست فشار داده شده باشه بنابراین برنامه وارد این تابع if میشه و با دستور Serial.println ما کلمه Right رو توی کنسول چاپ می کنیم و تمام.

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

جلسه دهم: راه اندازی موتور DC

سلام به همه دوستان
این جلسه قصد دارم در ادامه رسالت PWM یک موتور DC رو با هم راه اندازی کنیم. بین این جلسه و جلسه قبل تفاوت های سخت افزاری وجود داره وگرنه منطق کار عینا مثل روشن کردن ال ای دی RGB هست.

خب شروع می کنیم. قدم اول موتور DC چیه اصن؟
برای درک موتور DC و این که توش چه خبره یه سرچ کوچیک بزنید دنیای اطلاعات رو خواهید دید ولی علی الحساب این لینک یه توضیح جمع و جور و مناسب برای طرز کار این موتورها نوشته.

حالا قراره این موتورها رو با آردوینو کنترل کنیم. منطق کنترل موتورهای DC استفاده از PWM هست. یه کم موضوع رو باز کنیم.
ببینید ما با موتور مثل یک مقاومت یا هر المان دیگه ای رفتار می کنیم. اگه قرار باشه از یه مقاومت جریانی عبور کنه طبق قوانین مداری باید دو سر المان اختلاف ولتاژ وجود داشته باشه مثل شکل زیر:
Untitled

موتور هم عین مقاومت ، برای این که جریان ازش عبور کنه (اصطلاحا موتور کار کنه) باید دو سر اون اختلاف ولتاژ بوجود بیاریم. خب موتور DC دو تا ورودی داره که باید بهشون ولتاژ بدیم تا موتور راه بیفته:
url
خب مسلمه که این ولتاژ باید از آردوینو تامین بشه. حالا به نظر شما کدوم پایه های آردوینو ؟ دیجیتال یا آنالوگ؟
جواب این سوال کاملا مشخصه: دیجیتال!
حالا سوالی که پیش میاد این هستش که آیا به هر پایه دیجیتالی یا پایه های PWM؟
در واقع به هر دوتاش میتونید وصل کنید فقط به این بستگی داره که از موتور چی بخواید. یه موقع براتون مهمه موتور با تمام توان روشن بشه و کار کنه، یه موقع براتون مهمه بتونید سرعت چرخش موتور رو کنترل کنید و هرجا که لازم بود تغییر بدید. برای مورد اول میتونید از هر 2 پایه دیجیتال دلخواه آردوینو می تونید استفاده کنید ولی در مورد دوم تنها و تنها استفاده از پین های دیجیتال PWM جوابگو خواهد بود.

🙄 پس تا این جا یه جمع بندی کوچیک:
1.برای راه انداختن موتورDC باید دو سر آن اختلاف ولتاژ ایجاد بشه.
2.برای ولتاژ دادن به موتور DC از 2 پین دیجیتال آردوینو استفاده میشه.

حالا سوالی جدیدی که پیش میاد اینه که چطوری با آردوینو این اختلاف ولتاژ رو بوجود بیاریم؟ 🙄
خیلی خیلی خیلی سادست. بیاین فرض کنیم میخوایم موتور رو با نصف توان روشن کنیم ( یعنی کار دومی که نسبتا سخت تره ). طبق حرفی که پاراگراف قبل زدیم برای این کار نمی تونیم از هر پایه دیجیتالی استفاده کنیم و باید بریم سراغ پایه های PWM. طبق آموزش های جلسه قبل پین های دیجیتال PWM آردوینو uno عبارت بودن از: ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟(برید جلسه قبل مرور کنید).دستوری که باهاش به پین های PWM مقدار می دادیم چی بود؟؟ analogWrite.
حالا برای ایجاد اختلاف ولتاژی که احتیاج داریم از دو تا دستور زیر استفاده می کنیم:

;(9,127)analogWrite

;(10,0)analogWrite

طبق توضیحات جلسه قبل با این کار ولتاژ(دقت کنید ولتاژ) پایه شماره 10 برابر با 0 ولت و ولتاژ پایه شماره 9 حدود 2.5 ولت خواهد بود بنابراین تونستیم بین دو سر موتور اختلاف ولتاژ ایجاد کنیم. اگه خط اول دستور به جای عدد 127 عدد 255 رو می نوشتیم ولتاژ پایه 9 به 5 ولت می رسید و موتور با حداکثر توان کار می کرد.

خخخخخب حالا دو تا سوال اساسی دیگه پیش میاد:
1. آیا پین های دیجیتال شماره 9 و 10 آردوینو رو مستقیم به موتور وصل کنیم؟؟
2.کدوم پایه رو به کدام ورودی موتور بزنیم ؟ اصن فرق داره؟؟؟؟

اول جواب سوال دوم:ببینید موتور DC چپ گرد و راست گرد داره. یعنی هم میتونه موافق جهت عقربه های ساعت و هم میتونه مخالف جهت عقربه های ساعت بچرخه. اگه ترتیب پین ها در اتصال به موتور عوض بشه هیچ اتفاقی نمی افته فقط جهت چرخش موتور تغییر می کنه.

حالا جواب سوال اول:اکیدا خیر! ازجمله مهم تریم مشخصه های عملکرد هر قطعه الکترونیکی جریان کاری اون هست. یا به عبارت دیگه
ولتاژ x جریان = توان کار قطعه.
هر پایه آردوینو ماکزیمم ولتاژ 5 ولت و جریان 40 میلی آمپر تامین خواهد کرد که میشه 200 میلی وات. حالا فکر کنید یک موتور نه چندان قوی مثلا10 وات داشته باشیم و بخوایم با آردوینو کنترلش کنیم. اگه مستقیم پین های آردوینو رو به ورودی های موتور بزنیم، موتور 10 وات میخواد تا درست کار کنه در حالی که آردوینو خودشو بکشه 0.2 وات زور داره بنابراین نمیتونه موتور رو راه بندازه و تحت فشار قرار می گیره همین عاملی برای سوختن برد آردوینو میشه. خب پس چیکار کنیم ؟ اینجاست که نقش درایور موتور پررنگ میشه.
این درایور بنده خدا کاری که میکنه این هستش که توانی که آردوینو برای راه اندازی موتور کم داره رو براش جبران می کنه و اینطوری هم موتور تغذیه میشه هم آردوینو سالم و سلامت به زندگیش ادامه میده.
حالا یه نکته وجود داره. اگه درایور موتور DC رو سرچ کنید صدها مدل درایور پیدا می کنید. خب کدومش مناسب کار ماست؟ برای جواب دادن به این سوال باید بریم سراغ موتورمون و ببینیم که مشخصات الکترونیکیش چیه؟ (ولتاژ و جریان و توان نامیش) بعد بر اساس این مشخصات درایورمون رو انتخاب کنیم.
مثلا تو همین مثال قبلی موتور ما 10 وات بود بهتره برای این موتور درایوری در حدود 12 الی 15 وات انتخاب کنیم تا اگه یه موقع موتور در شرایط نا مساعدی قرار گرفت که بیشتر از توان نامیش ازش کشیده شد مشکلی پیش نیاد.
بنابراین شماتیک کلی اتصالات ما این شکلی میشه:
Untitled

درایوری که من برای این پروژه انتخاب کردم این هست:
L9110S_Dual_Hbridge_DC_Stepper_Motor_Driver_4-500x500

همونطور که معلومه این امکان رو داره که 2 تا موتور رو درایور کنه : MOTOR A و MOTOR B . شش تا هم پین هدر داره دوتا مربوط به کنترل موتور A، دوتا مربوط به کنترل موتور B و پایه ولتاژ و زمین. اگه توضیحات محصول رو بخونید (لینک فروشگاه) می بینید نوشته هر کانال فقط 800 میلی آمپر جریان خروجی داره (البته نسبت به آردوینو 40 میلی آمپر شاهی می کنه ها) بنابراین در انتخاب موتور دقت فراوانی کنید. تو این پروژه من از این موتور استفاده کردم:
Gear-Motor-Set2 (5)-500x500

شکل زیر نحوه اتصال درایور به آردوینو رو نشون میده:
L9110S-schematic-1024x727
این شکل چند تا نکته اساسی داره :
اول :اینکه وقتی موتور به ترمینال های MOTOR B وصل میشه باید پین هدرهای کنترلی B به آردوینو متصل بشن.
دوم:برای تامین ولتاژ درایور از یه منبع تغذیه بردبوردی استفاده شده که می تونه به جای آن هر منبع ولتاژی بین 5 تا 12 ولت قرار بگیره.
سوم:یه نکته مداری هست که حتما باید رعایت بشه و اون چیزی نیست به جز زمین مشترک. حتما باید بین منبع تغذیه و آردوینو پایه گراند مشترک باشه و گرنه مدار به درستی عمل نخواهد کرد.

خب خسته که نشدید؟
مدار رو بستید؟
الان سخت افزار پروژمون تموم شد و اما کد:
Untitled
دوستان دقت کنید من تعمدا از کد عکس می زارم تا مجبور بشید کد رو بنویسید 😆

در هدر برنامه پین هایی رو که به پین های کنترلی موتور درایور وصل کردیم معرفی شده.
در تابع setup اون پین ها به عنوان خروجی تعریف شدن چرا که ما ( آردوینو) قراره برای موتور دستور بفرستیم.
در تابع loop مقدار پین 10 برابر با 0 و مقدار پین 11 برابر با 150 در نظر گرفته شده با این کد نویسی موتور در یک جهت خاص (یا ساعت گرد یا پاد ساعت گرد) شروع می کنه به چرخیدن .
اگه بخواید موتور در جهت مخالف بچرخه کافیه ترتیب 0 و 150 رو در کد نویسی تغییر بدید یعنی پایه 10 مقدار 150 و پایه 11 مقدار 0.
اگه بخواید موتور نچرخه هم خب هر دوتاشو 0 می دید.
و در انتها اگه بخواید موتور با حداکثر توانش کار کنه می تونید به 2 طریق عمل کنید:
1.به جای 150 از 255 استفاده کنید
2.به جای استفاده از دستور analogWrite و دادن مقدار 255 مستقیم از دستور digitalWrite استفاده کنید.

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