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

سلام
تو جلسه های قبلی در مورد راه اندزای موتور DC مفصل صحبت کردیم یادتونه ؟ جلسه دهم .
این جلسه قصد دارم در مورد سروو موتورها صحبت کنم .
مثل روند بقیه جلسه ها اول از خود سروو موتور می گیم. سروو موتور در حقیقت همون موتور DC هست که تو ساختمان داخلیش یه فیدبک اضافه شده . فیدبکی که به ما کمک می کنه بتونیم موقعیت ( یا قشنگ تر بگم زاویه ) سروو رو دقیق تعیین کنیم. مثلا بهش بگیم برو تو زاویه 45 درجه وایسا ! حالا این که چجوری میفهه کجا وایسه رو اینجا به صورت دقیق آموزش داده .

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

*** یکی ازمهم ترین خاصیت موتورهای سروو این هست که جریان مورد نیازشون در مقایسه با خود موتور های DC کمتره و همین یعنی یه امتیاز مثبت.

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

***********************************************************
سروو موتورها دو دسته بندی اساسی دارن .
دسته بندی اول سروو 180 و سروو 360 هست.
سرووهای 180 تنها زاویه ای بین 0 تا 180 (در عمل حدود 175 ) رو قبول می کنن و خارج از این نیم دایره نمی چرخن .
سروو 360 چی ؟ لابد فکر می کنید این سروو زاویه بین 0 تا 360 رو میگیره نه ؟ باید بگم که نخیر . اینجوریا نیست . سروو 360 اصلا زاویه نمی گیره . بلکه فقط دور می زنه . یعنی چی ؟
تو کدی که در آینده می زنیم خواهید دید که یه جا میگیم : (myservo.write(45 . این برای سروو های 180 یعنی سروو جان برو تو زاویه 45 درجه وایسا . اگر همین خط کد رو بدیم به یه سرو 360 این سروو 45 بار دور خودش می چرخه . یعنی هر عددی که در آرگومان این دستور نوشته بشه تعیین کننده تعداد دور هست.

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

***********************************************************

خب این جا معرفی اولیه سرووها تموم شد . حالا قصد داریم با استفاده از آردوینو راه اندازیش کنیم . این جا دو تا حالت مختلف بوجود میاد :
یکی این که سروویی که انتخاب می کنیم آمپر پایین باشه و برای تامین توان مصرفیش خود آردوینو پاسخگو باشه . سرووهایی مثل این سروو :
H512-SG90-500x500 برای راه اندازی این سرووها سیم بندی مثل شکل زیره :
Arduino-Servo-Basic
یعنی GND و VCC از آردوینو تامین میشه و سیم سیگنال سروو (که میشه سیم نارنجی ) وصل میشه به پین PWM شماره 9 . دقت کنید به جای پین شماره 9 هر پین PWM دیگه ای میشه .

حالت دومی که اتفاق می افته اینه که امپر مورد نیاز سروو از آمپری که آردوینو میتونه براش تامین کنه بیشتر بشه در این صورت نمی تونیم پاور موتورمون رو از آردوینو بگیریم . سرووهایی مثل این سروو :
MG995_Metal_Gear_Servo_2-500x500

برای تامین پاور قائدتا باید بریم سراغ منبع تغذیه های با آمپر بالا . پیشنهاد من 5 ولت 1 آمپره . حالا سیم بندیمون رو چجوری انجام بدیم ؟

2016-03-28_10-29-52


اگه به عکس دقت کنید اومده پین سیگنال سروو رو به پین دیجیتال شماره 9 وصل کرده
پاور سروو ( 5 ولت ) رو از منبع خارجی گرفته .
گراند سروو و گراند منبع و گراند آردوینو هر سه به هم وصل شدن .به این کار میگن زمین مشترک کردن. این نکته فوق العاده مهمه که اگه داریم توی پروژه هامون از منبع خارجی استفاده می کنیم گراند منبعمون با گراند آردوینومون یکی بشه . برای این که درک کنید یه مثال می زنم .
فرض کنید قراره دو عدد رو پیدا کنیم که اختلافشون 5 باشه . این دوتا عدد میتونن 0 و 5 باشن، میتونن 0.5 و 5.5 باشن، میتونن 1 و 6 باشن و هزارتا حالت دیگه . درسته ؟ اختلاف همه این عددها یکیه ولی هیچ دو دسته ایشون با هم مساوی نیستن . توی آردوینو هم دقیقا همینه . منطق کاری آردوینو 5 ولته یعنی حداقل ولتاژ 0 و حداکثر ولتاژ 5 ولته . منبعی هم که الان وصل کردیم 5 ولته . یعنی اختلاف حداکثر و حداقل ولتاژش 5 ولته . حالا ما با ایجاد زمین مشترک بین منبع و آردوینو داریم میگیم دامنه تغییر ولتاژ هر دو از 0 تا 5 ولت باشه نه هر دامنه تغییر دلخواهی چرا که تو عالم الکترونیک و میکروکنترلر 5 ولت و 5.5 ولت خیلی اختلاف دارن . بنابراین توی این مساله همیشه گراند مشترک رو رعایت کنید.

***********************************************************

خب سیم بندی که انجام شد میریم سراغ کد:
2016-03-28_10-39-32

قسمت 1 : معرفی کتابخونه سروو . این کتابخونه کتابخونه پیش فرض آردوینو هست و هیچ احتیاجی نداره که بخواین اضافه کنین به کتابخونه های آردوینو.
قسمت 2 : معرفی آبجت myservo از کلاس Servo
قسمت 3 : با این خط کد داریم میگیم پین pwm ای که سیم سیگنال سروو رو بهش وصل کردیم پین شماره 9 هست.
قسمت 4 : با دستور myservo.write داریم به سروو زاویه ای رو که میخوایم بهش برسه میگیم . اول بهش میگیم برو تو زاویه 0 درجه وایسا ، یک ثانیه بهش زمان میدیم ((delay(1000) ، بهش میگیم برو تو زاویه 90 درجه وایسا ، یک ثانیه بهش زمان میدیم ، بهش میگیم برو تو ازویه 180 وایسا ، یک ثانیه بهش زمان میدیم و در آخر بهش میگیم تو زاوه 90 وایسا . اینجا LOOP تموم میشه و دوباره بر میگرده از اول و میره تو موقعیت 0 بعد 90 بعد 180 و الی آخر .

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

خب تو این جلسه قصد دارم براتون در مورد بازر حرف بزنم و بعد بریم سراغ راه اندازی بازر با آردوینو .
خب بازر چیه ؟
به زبون ساده بازر همون بوقه ! بوقی که موقع بوت شدن سیستم عاملتون می شنوید همین صدای بازری هست که تو مدار داخلی سیستمتون استفاده شده. یه نمونه بازر مثل عکس زیر هست :
a-875
اگه می خواین دقیق تر از این که بازر چیه و چطوری کار می کنه اطلاعات داشته باشین به این لینک سر بزنید .
برای خریدن بازر هم به اینجا سربزنید .وقتی لینک رو باز کنید دو نمونه بازر متفاوت می بینید : اکتیو بازر و پسیو بازر .
خب حالا کدوم رو بخریم ؟ اصن فرقشون چیه ؟

اکتیو بازر :
اکتیوبازر بزرگترین حسنش اینه که کد نویسیش در حد کد نویسی راه اندازی یه LED هست. یعنی کافیه پین سیگنالش رو 0 و 1 کنید. دلیل این که راه اندازی این بازر انقدر ساده هست اینه که صدای بیپ تو مدار داخلی خودش ساخته میشه و فقط کافیه بهش بگی بنواز (با یک کردن پین سیگنالش بهش این دستور رو میدیم). بزرگ ترین عیب این بارزها هم اینه که صدایی که می تونید باهاش دربیارید فقط یک تن یا اصطلاحا فرکانس داره و هیچ تن صدای دیگه ای از این بازر خارج نمیشه.
ACTIVE-BUZZER-SQ1 (2)-500x500

همونطور که میبیند 3 تا پین داره :
VCC که بهتره 5ولت آردوینو بهش مصل بشه (3.3 هم می تونید البته ).
GND که به گراند آردوینو وصل میشه .
I / O که وصلش می کنیم به یکی از پین های دیجیتال آردوینو (به پین دیجیتال وصلش می کنیم چون طبق توضیح بالا فقط کافیه 0 و 1 بشه) . من به پین شماره 8 وصل کردم شما می تونید به هر پین دلخواهی وصلش کنید.

مدار سادس .
خب حالا کد زیر رو آپلود کنید :
2016-03-02_11-08-24
می بینید؟ کد دقیقا کد ساده LED چشمک زنه .

اپلود کنید و صدا رو بشنوید . با فاصله های 1 ثانیه داره بیپ بیپ می کنه. اگر می خواین که این فاصله ها تغییر کنه می تونید با عددهای تابع های delay بازی کنید.

                     ——————————————————————————–
پسیو بازر:

داستان پسیو بازر دقیقا بر عکسه . کد نویسی این بازرها به مراتب پیچیده تر از اکتیو هاست در عوض هر فرکانسی که دوست داشته باشیم رو می تونیم تولید کنیم. دلیل این موضوع اینه که این بازرها به دلیل ساختار مدار داخلیشون نمی تونن خودشون صدا تولید کنن و فقط می تونن صدایی که تولید شده رو پخش کنن.این بازرها یه جورایی مثل اسپیکر عمل می کنن با این فرق که اینا اسپیکر های قابل کنترل هستن یعنی میشه با برنامه نویسی بهشون بگی چه زمانی بخونن (البته فرق های دیگه ای هم دارن که لازم نیست زیاد واردشون بشیم ). خب حالا که اینا خودشون نمیتونن صدا تولید کنن و وظیفه تولید صدا افتاد گردن ما ، ما هم هر صدایی با هر فرکانسی که دوست داشته باشیم تولید می کنیم و می دیم به این بازرها که برامون پخش کنن. اما یه سوال پیش میاد . خب حالا چطوری صدا تولید کنیم ؟ ما که ماکزیمم یه آردوینو بیشتر نداریم چجوری صدا تولید کنیم ؟
ما با آردوینومون موج هایی تولید می کنیم که با انتقال اونها به بازر ، صدا تولید بشه. برای این کار از خاصیت سیگنال های PWM استفاده می کنیم. ما سیگنال های مربعی با Duty cycle ها و دامنه های متفاوت تولید می کنیم و اونها رو برای بازر می فرستیم . بازر با دریافت این سیگنال های مربعی و انتقال اونها به پیزو داخلیش ، برای ما می نوازه. بنابراین کل کاری که ما انجام میدیم تولید سیگنال های مربعی هست.
یه کم در مورد خط بالا بیشتر توضیح بدم : تا حالا موج مربعی دیدید دیگه درسته ؟
pwm1
توی موج مربعی یه زمان هایی 0 هستیم و یه زمان هایی 1 هستیم . مثلا فرض کنید دوره تناوب هر موج مربعی که ما می سازیم 10 ثانیه باشه ( یعنی شکل موج مربعی ما هر 10 ثانیه تکرار میشه ) .نسبت اون مدت زمانی رو که موج مربعی در وضعیت 1 قرار داشته به 10 میشه Duty cycle. به شکل بالا نگاه کنید. توشکل پایین پایینی تمام مدت زمان موج در وضعیت 1 قرار داشته بنابراین Duty cycle اش میشه 100 درصد. برعکسش تو موج بالا بالایی همیشه 0 بوده بنابراین Duty cycle اش میشه 0 درصد. هر چی مدت زمانی که شکل موج در وضعیت 1 هست بیشتر باشه Duty cycle هم بیشتر میشه .حالا ما باید بیایم برای راه اندازی بازرمون همچین شکل موج هایی رو با آردوینو تولید کنیم .
خب مدار مطابق حالت قبله فقط با یه تفاوت کوچیک :
VCC که بهتره 5ولت آردوینو بهش مصل بشه (3.3 هم می تونید البته ).
GND که به گراند آردوینو وصل میشه .
I / O که وصلش می کنیم به یکی از پین های PWM دیجیتال آردوینو . دقت کنید الان خیلی مهمه که پینی که استفاده می کنیم PWM باشه مثلا من از پین شماره 9 استفاده می کنم.
2016-03-02_12-08-45

خب قسمت های مختلف کد :
1. معرف پین 9 به عنوان پین متصل به بازر
2. تعریف تابع beep . این تابع 2 تا ورودی داره یکیش فرکانسه ، یکیش زمان delay بر حسب میلی ثانیه .
این تابع میاد مقدار فرکانس رو میگیره و به جای آرگومان analogWrite میزاره با این کار دامنه حداکثر سیگنال مربعی تولید شده مساوی این عدد میشه . یعنی توی شکل موج هامون دامنه ممکنه دیگه حداکثر 1 نباشه و کمتر بشه (بستگی داره به عددی که ما انتخاب می کنیم). بعد به ازای delayms میلی ثانیه صبر می کنه . بعد مقدار analogWrite رو مساوی 0 قرار میده (برای ساخت قسمت 0 شکل موج مربعی ) و دوباره به ازای delayms میلی ثانیه صبر می کنه . دقت کنید الان delayms میلی ثانیه مقدار حداکثر دامنه شکل موج برابر مقدار فرکانسه (freqency )و delayms میلی ثانیه مقداربرابر 0 هست بنابراین در این مدل کد نویسی Duty cycle موج مربعی ما 50 درصده.
3. بعد از کانفیگ پین بازر ، 3 بار تابع بیپ صدا زده میشه و هر بار دامنه (فرکانس صدا ) برابر 20 و زمان توقف بین بیپ ها 50 میلی ثانیه در نظر گرفته میشه. و در آخر هم یه دستور delay گذاشته شده که نشون بده تابع ستاپ تموم میشه.
4.در اینجا تابع بیپ با فرکانس 80 و زمان توقف 5 میلی ثانیه صدا زده شده چون تابع LOOP هستیم این خط تا بینهایت ادامه پیدا می کنه.
با تغییر عدد های فرکانس (که میشه آرگومان اول ورودی تابع بیپ ) از بازه 0 تا 255 می تونید فرکانس های بیپ مختلف رو بوجود بیارید.

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

این کد صرفا یه دمو بود. شما بر حسب این که چه زمانی می خواید آلارم فعال بشه و با چه فرکانس و زمان توقفی ، از تابع beep نوشته شده استفاده می کنید.

پایان جلسه.

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

سلام

دوستان از این جلسه به بعد تصمیم داریم دونه دونه بریم سراغ سنسورها. چه آنالوگ چه دیجیتال. هر جلسه یه سنسور رو آموزش می دیدم که چیه چجوری کار می کنه و کد آردوینو براش می نویسیم.

این جلسه می خوایم در مورد فتوسل حرف بزنیم.
09088-02-L

PHOTOCELL2A

 

به زبون خیلی خیلی ساده بخوایم بگیم فوتوسل یه مقاومته. حالا یه سوال پیش میاد که آیا عین همون مقاومتهای خودمونه که تا الان باهاشون کار می کردیم؟ جواب اینه که هم آره هم نه.
بدون شک تا حالا مقاومت دیدید دیگه درسته ؟
imgres
این مقاومت هایی که تا الان باهاشون کار می کردیم اصطلاحا بهشون میگن مقاومت های ثابت. یعنی وقتی میگیم این مقاومت 10 کیلو اهمه یعنی بالا بری پایین بیای، تو مدار این سر دنیا بزنی تو مدار اون سر دنیا بزنی، هر کاری کنی کنی این مقاومت 10 کیلو اهمه. البته همونطور که میدونید بر حسب رنگ چهارم مقاومت ها که طلایی باشه یا نقره ای یه تلورانسی در حد دهم اهم دارن ولی فارق از این تلورانس ،یک مقاومت ثابت هستن و با هیچ واکنش محیطی و یا واکنش مداری این عدد (مثلا همون ده کیلو ) تغییر نمی کنه .

فتوسل هم یه مقاومته ولی از نوع مقاومت متغیر. یعنی وقتی میزان نور محیطی که این فتوسل توشه تغییر کنه مقاومتی که از دو سر این فتوسل دیده میشه تغییر می کنه. بنابراین هم مقاومته و هم مثل اون مقاومت های معمولی نیست. حالا این که چجوری این انرژی نورانی میاد و کاری می کنه که مقاومت دو سر فتوسل تغییر کنه یه سری فعل و انفعالات داخلیه که من به شخصه علاقه ای بهش ندارم ولی شما می تونید سرچ کنید و با این تکنولوژی آشنا بشید. در کل چیزی که واسه ما مهمه اینه که وقتی شدت نور تابیده شده به این سنسور تغییر می کنه مقاومت دوسرش هم تغییر می کنه. واسه اطلاعات تکمیلی هم بگم که به فوتوسل مقاومت نوری و یا  light-dependent resistor) LDR ) گفته می شه.

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

حالا مطابق عکس زیر مدار رو ببندید :
light_cdspulldowndiag

همونطور که می بینید اومده یه مقاومت 10 کیلو اهمی (ثابت ) رو با فتوسل سری کرده و از پایه مشکترک بینشون به پین آنالوگ آردوینو داده. منطق این کار همون منطق تقسیم ولتاژه.
images

وقتی مقاومت فتوسل (با تغییر نور ) تغییر می کنه طبق قانون تقسیم ولتاژ ، ولتاژی که روی پایه وسط (مشترک بین مقاومت و فتوسل ) می افته هم تغییر می کنه که چون این تغییر به صورت پیوسته هست این پایه وسط رو به پین آنالوگ آردوینو (پین شماره 0 ) وصل می کنیم.

خب مدار رو بستید؟
بریم سراغ کد. برای کد عینا عینا عینا همون کد پتانسیومتر رو آپلود کنید. یعنی این کد :
2016-01-20_13-07-301

خب کد رو آپلود کنید و کنسول سریال رو باز کنید:
2016-01-26_12-26-48

همونطور که می بینید مقدار دیفالت سنسور روی حدود 600 بود . بعد دستم رو گذاشتم روی فتوسل ( روی قسمت بالایی ) و داده نشون داده شده از 600 به حدود 200 افت پیدا کرد. دوباره که دستم رو برداشتم برگشت رو همون حدودای 600 . این یعنی تو محیطی که تست کردم محدوده روشنایی 600 و محدوده تاریکی 200 هست. جایی که شما دارید تست می کنید می تونه اعداد تو رنج های کاملا متفاوتی بده بر حسب نور محیطی تون.

حالا کنسول رو ببندید و سریال پلاتر رو باز کنید و هی دستتون رو بزارید رو فتوسل و بردارید تا براتون شکل موج بکشه ( محض تفریح البته ).
2016-01-26_12-34-38

می تونیم همینجا پروژه رو تموم کنیم اما نمی کنیم. می خوایم سیستم روشنایی اتوماتیک بسازیم. یعنی هر موقع نور کم شد و احتیاج به روشنایی داشتیم لامپ روشن بشه .نه این که هر دقه و هر ثانیه اون لامپ بدبخت کار کنه.
برای این کار به مدار قبلیمون یه LED به صورت زیر اضافه می کنیم:
Photocell_bb
قسمت فتوسل که عینا همونه . اومدیم یه LED رو با یه مقاومت سری کردیم و به پین دیجیتال شماره 2 وصل کردیم. علت وجود مقاومت سری با LED اینه که از سوختن اون جلوگیری بشه. تو همه مدارا این قانون وجود داره که سر راه هر LED باید مقاومت گذاشته بشه.

خب مدار رو بستید تمام ؟
حالا کد زیر رو آپلود کنید تا براتون توضیح بدم:
2016-01-26_13-04-56

تو قسمت هدر برنامه که فقط اومدیم علاوه بر متغیر های کد قبلی متغیر ledPin رو معرفی کردیم به عنوان پین شماره 2 .
تو قسمت کانفیگ دیگه سریال رو برداشتیم چون نیازی بهش نبود و به جاش پین دیجیتال ledPin رو به عنوان خروجی تعریف کردیم.
تو تابع loop خط اول ، داده کانال ADC شماره 0 رو می خونیم و تو متغیر sensorValue می ریزیم ( همون متغیری که تو هدر برنامه تعریف کردیم ).
تو کد قبلی دیدیم که حد روشنایی 600 و حد تاریکی 200 بود.
حالا کد نوشتیم اگه داده ای که خونده از 300 کمتر بود (یعنی رفته باشیم تو تاریکی ) بیا led رو روشن کن. معقوله دیگه وقتی تاریک میشه باید چراغا رو روشن کنیم.
تو خط بعدی هم نوشتیم اگه داده ای که خوندی از 500 بیشتر بود (یعنی تو روشنایی بودیم ) led رو خاموش کن چون هوا روشنه و نیازی به نور اضافه نداریم.

اعداد 300 و 500 رو که من تو کدم قرار دارم بر اساس محیط تستم بود. یعنی همون عدد هایی که با کد قبلی از کنسول در آوردم . شما هر رنج عددی که دارید می تونید در نظر بگیرید و این کد رو متناسب با محیط تست خودتون تغییر بدید.
یعنی مثلا اگه کسی تو تستش تاریکی رو روی عدد 120 داشت (مثلا ) نیازی نداره مثل کد من مرز تاریکی رو 300 بزاره میتونه 200 یا حتی کمتر انتخاب کنه.

و اما نکته آخر :
اگه دقت کنید من وقتی دستورهای if رو نوشتم هیچ آکولادی باز و بسته نکردم در صورتی که قبلا می گفتیم اگه شرط if برقرار بشه دستورهای بین دو آکولادی که باز و بسته شدن اجرا میشه{}. خب الان هیچ آکولادی نیست پس در صورت برقرار بودن شرط if چی اجرا میشه؟
جواب: این یه قانون برنامه نویسیه که اگر بعد از برقرار شدن شرط if تنها یک کار لازم باشه انجام بشه دیگه نیازی به گذاشتن آکولاد نیست. دقیقا مثل شرایط الان ما. در صورتی که نور از مرز تاریکی کمتر بشه فقط لازمه LED روشن بشه (یعنی فقط یک کار ) پس به آکولاد نیازی نیست.

پایان جلسه

جلسه پانزدهم : رسم نمودار ( پلات ) با استفاده از آردوینو

سلام
تو این جلسه قصد دارم بهتون یاد بدم چجوری با استفاده از آردوینو نمودار رسم کنید. چیزی که شاید خیلی از جاها به دردتون بخوره . ورژنای قدیمی نرم افزار آردوینو این امکان رو نداشت که بتونیم باهاش پلات کنیم (نمودار رسم کنیم ) ولی خب تو ورژنای جدید (از 1.6.6 به بالا) شکر خدا عقلشون کار کرده و این آیتم رو گذاشتن. یعنی ما تنها با استفاده از نرم افزار آردوینو و بدون نیاز به نصب هیچ نرم افزاری می تونیم نمودار تغییرات رو ببینیم.

یه توضیح کلی: اول بزارید ببینیم این امکانی که داریم ازش حرف می زنیم کجای نرم افزاره . از منوی Tools وارد Serial plotter میشیم:
2016-01-24_13-07-57
همونطور که می بیند اسم این آیتم سریال پلاتر هست و ما هم از این به بعد به این آیتم پلاتر میگیم. یه نمای کلی هم بخواید ازشکل رسم نمودارش ببینید این شکلیه:
2016-01-24_13-12-32

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

ما هم نمودار دیجیتال رو رسم می کنیم هم نمودار آنالوگ رو.
اول سوئیچ مدار و کد جلسه سیزدهم رو آماده کنید. مدار آخر رو ببندید که با دیبانس نوشتیم. همچین کدی داشتیم اگه یادتون باشه (البته من برای این که کد کوتاه بشه خط های کامنت ها رو پاک کردم)
2016-01-24_13-33-50

ما تو این کد برای این که ارتباط سریال داشته باشیم لازمه یه تغییراتی رو توی کد نویسیمون اعمال کنیم.
2016-01-24_13-39-31
چون لازم داشتیم ارتباط سریال استفاده کنیم خب تو تابع setup کانفیگش کردیم. اگه یادتون باشه گفتیم اساس کار سریال پلاتر ارتباط سریال هست که خدارو شکر تو آردوینو ایجاد ارتباط سریال بین آردوینو و کامپیوتر فقط با یک خط کد انجام میشه یعنی دستور Serial.print. هر آرگومانی که توی این دستور نوشته بشه عینا به صورت سریال (از طریق همون کابل USB که بین آردوینو و کامپیوتر هست ) به کامپیوتر شما ارسال میشه. بنابراین توی این کد هر جا منطق پین دیجیتال شماره 2 صفره ما هم 0 رو سریال پرینت می کنیم هر جا منطق پین یکه ما هم 1 رو سریال پرینت می کنیم.

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


دقت کنید در فیلم جاهایی که یهو یه تغییر دامنه داریم لحظاتی هست که کلید رو فشار دادیم.

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

همونطور که می بینید دقیقا داره متناسب با تغییر ولوم پتانسیومتر (که دست من بود و شما نمی دیدید) نمودار تغییر می کنه.

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

پایان جلسه

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

سلام

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

تو این آموزش قراره یاد بگیریم که چجوری با استفاده از آردوینو داده یک سنسور آنالوگ رو بخونیم. ولی قبل از این درست مثل حالت دیجیتال یه بحث کلی داریم روی ورودی و خروجی بودن پینها. اگه یادتون باشه می گفتیم مثلا وقتی داریم داده یه سوئیچ رو می خونیم از پین دیجیتال آردوینو به عنوان ورودی استفاده می کنیم و وقتی که قراره مثلا یه موتور رو روشن کنیم از پین دیجیتال آردوینو به عنوان خروجی استفاده می کردیم. دقیقا همین قانون در مورد آنالوگ ها هم وجود داره. وقتی یه سنسور آنالوگ داریم که می خوایم داده اون رو بخونیم زمانی که اون سنسور رو به پین آنالوگ آردوینو وصلش می کنیم اون پین رو به عنوان ورودی در نظر می گیریم و زمانی که قراره به یه دستگاه انالوگ فرمان بدیم پین آنالوگ به صورت خروجی تعریف میشه.
اما:
این وسط یه فرق خیلی خیلی بزرگ وجود داره. میکروکنترلر ما که وظیفش پردازش داده هاست دیجیتاله .چه داده از بیرون وارد میکروکنترلر بشه چه خود میکروکنترلر فرمان بده نوع سیگنال های دریافتی و تولیدی باید از جنس دیجیتال باشه ( یعنی 0 و 1 باشه) . هر نوع داده دیگه ای خارج از این تایپ داده برای میکروکنترلر قابل پردازش نیست. تو آموزش های قبلی چه وقتی سوئیچ وصل کردیم به آردوینوچه وقتی موتور یا RGB راه انداختیم جنس داده های رد و بدلی 0 و 1 بود. سوئیچ 0 و 1 داده می داد و به موتور و LED هم 0 و 1 داده می دادیم ( اگه یادتون باشه همیشه سر و کله HIGH و LOW تو کد نویسی مون پیدا می شد.)

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

مبدل سیگنال‌های آنالوگ به دیجیتال :
اصطلاحا به این مبدل ها ADC میگن که مخفف Analog to Digital Converter هست. وکارکردش  به طور خلاصه اینه که یه سیگنال آنالوگ دریافت میکنن و طی یه پروسه ای اون رو به سیگنال دیجیتال تبدیل می کنن:
ADC_Symbol

بنابراین ما اگه یه سنسور آنالوگ داشته باشیم باید خروجی سنسور آنالوگمون رو بدیم به مبدل های ADC و بعد خروجی مبدل رو که از جنس دیجیتاله بدیم به میکروکنترلرمون و پردازشش کنیم. اینجا یه آموزش کامل در مورد ADC ها گذاشته. شما اگه یه کم در مورد ADC ها تحقیق کنید یه پارامتر خیلی مهم در مورد این مبدل ها تعداد بیت خروجی اونهاست. تو عالم داده های دیجیتال وقتی میگن یه داده  مثلا 8 بیتیه (طبق قانون احتمال و به دلیل 0 و 1 بودن داده ها ) از 0 تا 255 می تونه تو این داده قرار بگیره (255 معادل 11111111 باینری هست ). حالا وقتی میگیم یه مبدل ADC مثلا 10 بیتیه یعنی از 0 تا عدد 1024 می تونه به عنوان خروجی این مبدل بوجود بیاد. دقیق تر بگیم یعنی این که سمت ورودی این مبدل یه ولتاژ بین 0 تا 5 ولت اعمال میشه (ولتاژ پیوسته :یعنی می تونه مثلا 4.2 ولت باشه ) بعد تو خروجی ADC محاسبه میشه که این ولتاژ معادل با چه عددی هست در صورتی که ADC ده بیتی باشه میشه یه عدد بین 0 تا 1023، در صورتی که ADC هشت بیتی باشه میشه یه عدد بین 0 تا 255. کاملا واضحه دیگه، هرچی بیت های خروجی ADC بیشتر باشه دقت این تبدیل بالاتر میره .چرا میگم منطقیه ؟ ورودی ADC ما (چه خروجی 8 بیت باشه  چه 10 بیت) 0 تا 5 ولته. در صورتی که 8 بیتی باشیم هر 19.6mV در ورودی 1واحد در خروجی خواهد بود ( 5/255= 19.6mV) اما در صورتی که خروجی ADC ده بیتی باشد هر 4.9mV در ورودی 1واحد در خروجی خواهد بود (5/1024= 4.9mV).

حالا یه ترس بوجود میاد: اگه بخوایم داده سنسورهای آنالوگ رو (که سنسورهای خیلی زیادی در مجموعه سنسورهای آنالوگ قرار میگیرن ) بخونیم باید بین آردوینو و سنسورمون یه ADC طراحی کنیم و بزاریم؟ جواب منفیه.
بحث ما عموما روی UNO می چرخه بنابراین فقط در مورد UNO حرف میزنم. برد آردوینو UNO شش تا پایه آنالوگ ورودی داره (دقت کنید ورودی ). به تعداد همین 6 تا پایه آنالوگ ، 6 تا کانال ADC ده بیتی هم داره. یعنی شما هیچ احتیاجی به طراحی و قرار دادن ADC ندارید خودش همه کارها رو کرده یعنی آماده و حاضره. ادامه بحث رو روی همین موضوع ادامه خواهیم داد.

مبدل سیگنال‌های دیجیتال به آنالوگ :
به این نوع مبدل ها اصطلاحا DAC میگن که مخفف Digital to Analog Convertor هست و به طور ساده بخوام بگم یه سیگنال دیجیتال به عنوان ورودی میگیره و در خروجی یه سیگنال آنالوگ میده. این مبدل در مواردی کاربرد داره که دستگاه محرک ما (دستگاهی که از ما فرمان میگیره تا یه کاری بکنه ) ورودی آنالوگ قبول کنه. در چنین مواردی بعد از این که تو میکروکنترلر پردازش ها انجام شد با یه تبدیل DAC سیگنال رو به آنالوگ تبدیل میکنن و به دستگاه محرک میدن.

ما تو دو پاراگراف قبل گفتیم آردوینو 6 تا پایه آنالوگ داره . خب بیاین درمورد دو تا ایده حرف بزنیم که عین دیجیتال ها باهاشون برخورد کنیم یعنی وقتی خواستیم به سنسور وصل کنیم ورودیشون کنیم و وقتی خواستیم به دستگاه محرک وصل کنیم خروجیشون کنیم. حتی شاید یه عده حرف گروه اول رو با با این استدلال غلط تایید کنن که : اره دیگه تو همون مسیری که سیگنال از آنالوگ به دیجیتال تبدیل میشه برعکس از دیجیتال هم به آنالوگ تبدیل بشه و بنابراین 6 تا پین آنالوگ آردوینو هم ورودی هستن هم خروجی.
اما این دو گروه به شدت اشتباه می کنن. مدار های DAC و ADC کاملا کاملا کاملا با هم متفاوت هستن و تبدیل دو طرفه به حساب نمیان. اون 6 تا پین آنالوگ آردوینو هم که قبلا در موردشون حرف زدیم ADC دارن. بنابراین نمیتونن به عنوان خروجی استفاده بشن و تنها و تنها می تونیم از اونها به عنوان ورودی استفاده کنیم. هیچ کدوم از بردهای آردوینو پین آنالوگ خروجی ندارن به جز آردوینو DUE و M0-PRO . این در صورتیه که تمام آردوینو ها بدون استثنا پین آنالوگ ورودی دارن.

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

موارد لازم:
آردوینو از هر نوعی
پتانسیومتر
سیم برد بوردی نری به مادگی

خب حالا مطابق عکس زیر مدار رو ببندید.
tumblr_mc96ar3Q981qanj9i

دقت کنید به پایه آنالوگ شماره 2 وصلش کردیم.
خب حالا این کدرو آپلود کنید:
2016-01-20_13-07-30
قسمت هدر که معرفی پین انالوگ هست که اگه دقت کنید نوشته شده A2. این A نمایشگر اینه که داریم از پین آنالوگ استفاده می کنیم. تو تابع setup این پین به عنوان ورودی و ارتباط سریال با نرخ 9600 کانفیگ شده.
تو تابع loop خط اول با دستور analogRead مقدار پین آنالوگ خونده میشه. عملا مقداری که توی متغیر sensorValue ریخته میشه خروجی ADC هست. یعنی پین وسط پتانسیومتر که متصل شده به پین آنالوگ شماره 2 آردوینو، طبق قانون مداری تقسیم ولتاژ ، یه ولتاژ بین 0 تا 5 ولت رو روی پین شماره 2 می ندازه. این ولتاژ میشه ورودی ADC متصل به پین شماره 2 آردوینو. از اون طرف خروجی این ADC به صورت یک عدد بین 0 تا 1023 (به علت 10 بیتی بودن ADC ) توی متغیر sensorValue ریخته میشه. با دستور پرینت هم این مقدار توی کنسول سریال چاپ میشه. خط آخر هم که دستور delay هست فرمان میده با سر فاصله های یک ثانیه این روند تکرار بشه.

پایان.

جلسه سیزدهم : استفاده از کتابخانه Bounce2

سلام

اگه یادتون باشه توی آموزش جلسه 11 استفاده از پین دیجیتال آردوینو به عنوان ورودی و تو جلسه 12 نحوه اضافه کردن کتابخونه به محیط آردوینو رو یاد گرفتیم.
این جلسه تلفیقی از 2 جلسه قبله. یعنی قراره داده یه سوئیچ رو بخونیم ولی نه با یه digitarRead معمولی بلکه با استفاده از کتابخونه Bounce2.
مهم ترین سوالی که برتون پیش میاد اینه که خب مگه digitalRead معمولی چشه که بخوایم بریم کتابخونه اضافه کنیم و از لحاظ نرم افزاری کارمون رو یه کم مشکل تر کنیم.

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

خب وقتی سوئیچ رو نگاه کنید می بینید 4 تا پایه داره! داستان چیه؟ داستان اینه که این پایه ها مطابق عکس زیر 2 تا 2 تا به هم وصلن:
BUTT-4_3-500x500

حالا مطابق عکس زیر مدار رو ببندید:
button

یعنی یه پایه رو به 5 ولت و یه پایه رو به پین دیجیتال شماره 2 وصل کنید. دقت کنید که پایه های متصل به هم به صورت عکس زیرهستن و سوئیچ باید درست توی مدار قرار بگیره:
button می دونید که هیچ اصراری به پین شماره 2 نداریم هر پین دیجیتال دلخواهی میشه. دقت کنید بین پایه شماره 2 آردوینو (که به سوئیچ هم وصله )و زمین یه مقاومت قرار داده شده. این مقاومت برای این گذاشته شده که زمانی که کلید فشار داده نشده روی پین شماره 2 دقیقا ولتاژ 0 ولت بیفته و زمانی که کلید فشار داده میشه دقیقا ولتاژ 5 ولت و منطق باینری HIGH بیفته.
یه کم دقیق تر حرف بزنیم:
زمانی که کلید رو فشار ندادیم بین دو قسمت مشخص شده سوئیچ در شکل اول هیچ ارتباطی وجود نداره. یه طرف که  مستقیم به 5 ولت وصله خب تکلیفش معلومه. ولی اون طرف سوئیچ که به پین دیجیتال آردوینو وصله داستان داره. اگه مقاومت نزاریم یعنی پین آردوینو رو مستقیم  به اون سر سوئیچ وصل کنیم پین وضعیت آزاد داره یعنی مختاره روش منطق باینری 0 یا 1 بیفته چون هیچ کس نیست بهش فرمانی دستوری چیزی بده. اونم مختاره هر چی خواست باشه که اصلا پدیده خوشایندی نیست و اگه مدار رو همینطوری ببندید بینهایت پر خطا خواهد بود. بنابراین یه مقاومت بر می داریم و اون پین رو به واسطه این مقاومت زمین می کنیم. با این کار یه مسیر بین این پین و زمین برقرار میشه . این مسیر طبق قوانین مداری باعث میشه روی پین دیجیتال شماره 2 آردوینوهم ولتاژ 0 ولت معادل منطق باینری LOW بیفته و هر چی که خواست نباشه. به این مقاومت ، مقاومت Pull-down گفته میشه . برای دریافت توضیحات بیشتر این لینک رو بخونید.
اما زمانی که کلید رو وصل می کنیم بین دو قسمت نشون داده سوئیچ تو شکل اول یه ارتباط به وجود میاد و دو تا قسمت به هم وصل می شن. بنابراین اون قسمتی که به پین شماره 2 وصل بود الان به خاطر این اتصال ولتاژی معادل 5 ولت و منطق باینری HIGH خواهد داشت.

خب حالا این کد رو آپلود کنید:
2016-01-16_11-53-44

روال این کد به این صورته که به محض فشار داده شدن کلید در کنسول سریال پیغام Pressed نمایش داده میشه. دقت کنید شرط if رو چجوری نوشتم. نوشتم اگه داده پین دیجیتال HIGH بود (که معادل فشار داده شدنه کلیده ) برو رو کنسول سریال چاپ کن.
خب کد رو آپلود کنید و کنسول سریال رو باز کنید و یک بار کلید رو فشار بدید . با این نتیجه دلخراش در کنسول مواجه خواهید شد:
2016-01-16_12-10-01
می بینید شما یک بار کلید رو فشار دادید ولی این طفلک بیشتر از 10 بار اینو چاپ کرده چرا؟
علتش اینه که فرض کنید مدت زمانی که شما کلید رو فشار می دید مثلا 10 میلی ثانیه باشه ( این عددها همش مثاله و دقیق نیست ) . آردوینو هر 1 میلی ثانیه یک بار میاد این پین شماره 2 رو سرکشی می کنه که مقدارش چقدره ( به خاطر دستور digitalRead که خودمون نوشتیم ) . بنابراین اون 10 میلی ثانیه ای که دست شما روی کلیده آردوینو 10 بار اون پین رو خونده و هر 10 بار هم منطق باینری اون رو HIGH دیده ( چون دست روی کلید بوده و طبق مدار ما در زمان اتصال کلید 5 ولت معادل منطق باینری HIGH روی پین افتاده ) . بنابراین طبق دستوری که ما نوشتیم عین 10 بار پیام Pressed نمایش داده میشه. خب این اصلا خوب نیست. ما به نظر خودمون یه بار کلید رو فشار دادیم ولی 10 بار پیام چاپ شده.

حالا باید دنبال راه حل بگردیم تا این مشکل رو حل کنه:
یکی از راه حل ها استفاده از دستور delay هست به صورت زیر:
2016-01-18_11-18-30
این ساده ترین راه حل هست که الان اگر کد رو آپلود کنیم با هر بار فشار دادن کلید فقط 1 بار پیام Pressed چاپ می شه. با دستکاری مقدار آرگومان تابع delay می تونید دقت های متفاوتی رو به دست بیارید .

راه حل دوم استفاده از خطوط کدنویسی پیچیده تر با استفاده از دستور millis و غیره هست که خب چون ما اول کاریم سراغ این مورد نمیریم.

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

خب حالا مطابق تصویر زیر به مثال bounce برید:
2016-01-18_11-25-35

خب مثال رو که باز کنید با قسمت های زیر مواجه میشید. قبلش من یه آلارم بدم بهتون . معمولا کتابخونه های آردوینو رو با کلاس می نویسن. برای این که با نوشتن کد با کلاس آشنا بشید می تونید از این آموزش استفاده کنید. اگه حوصله یاد گرفتن و این داستانا رو هم ندارید صرفا جاهایی که میگم رو می تونید دقت کنید ولی به نطر من حتما بخونیدش تا در آینده به مشکل برخورد نکنید.
2016-01-18_11-28-03
این قسمت بخش هدر برنامه هست که معرفی کتابخونه ، پینها و آبجکت درون اون قرار داده شده.
2016-01-18_11-46-21

قسمت اول پین متصل به سوئیچ به عنوان ورودی پول آپ تعریف شده است. یعنی چی؟ اگه یادتون باشه تو قسمت سخت افزاری این پروژه ما اومدیم اون پایه ای که به پین دیجیتال آردوینو وصل بود رو با یه مقاومت به زمین وصل کردیم (Pull-down کردیم ). حالا اگه لینک آموزش رو خونده باشید در مقابل Pull-down یه Pull-Up داریم. یعنی به جای این که اون سر مقاومت رو زمین کنیم به 5 ولت وصل کنیم .
511568b6ce395f1b40000000
حالا یه نکته جالب وقتی Pull-down کردیم خودمون رفتیم یه مقاومت برداشتیم و به صورت خارجی تو مدار قرار دادیم. شاید این تصور به وجود بیاد که پول آپ هم همینه دیگه یعنی یه مقاومت بر میداریم منتها به جای این که زمین کنیم 5 ولت می کنیم. اما یه اتفاق خوب این وسط وجود داره .وقتی با آردوینو کار می کنیم دیگه نیازی نیست مقاومت پول آپ رو به صورت خارجی بزاریم بلکه تو خود سخت افزار آردوینو یه فکرایی کردن که سر راه پایه های دیجیتال مقاومت داخلی گذاشتن. فقط باید از آردوینو بخوای این مقاومت داخلی رو بیاره تو مدار که با فرمت INPUT_PULLUP موقع کانفیگ پین دیجیتال بهش میگیم این کار رو بکنه. همونطور که می بینید این اسم دو قسمته: اول INPUT که بهش میگیم این پایه دیجیتال ورودیه و بخش دوم PULLUP هست که بهش میگیم سر راه این پایه دیجیتال یه مقاومت بزار. بنابراین در مقوله Pull-Up ( نه Pull-down ) نیازی به مقاومت خارجی نداریم فقط خود کلید رو میزاریم تو مدار و یکی از پایه هاش رو به پین دیجیتال مورد نظرمون وصل می کنیم.
اما اگه از Pull-Up استفاده کردیم باید به یه نکته حواسمون رو جمع کنیم. وقتی پول آپ می کنیم داریم ولتاژ اون پایه ای از سوئیچ رو که به آردوینو وصله (در حالتی که کلید فشار داده نشده ) رو 5 ولت نگه می داریم (یا همون منطق HIGH ) . بنابراین اون یکی سر سوئیچ رو باید گراند کنیم . منطقیه دیگه مگه نه ! اگه قرار بود اون یکی سر سوئیچ هم مثل مدار اول 5 ولت باشه وقتی سوئیچ رو فشار بدیم به خاطر اتصال دو پایه سوئیچ ، 5 ولت رو به پین دیجیتال وصل می کنه. خب با پول آپ کردن که خودش 5 ولت شده بود .بنابراین برای این که با فشار داده شدن کلید اختلاف سطح منطقی روی پین دیجیتال به وجود بیاد باید اون سر سوئیچ رو به زمین وصل کنیم مطابق عکس زیر:
Button_bb

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

دستور debouncer.interval :
این دستور هم یه آرگومان میگیره که زمان اینتروال هست . واحد این آرگومان میلی ثانیه است و مثلا وقتی نوشته 5 یعنی 5 میلی ثانیه زمان نویز نوگیری در نظر گرفته بشه. خب به نظر من که کمه می تونید تا حدود 50 (در اکثر کدها روی 50 تنظیم میشه) افزایشش بدید.

تابع setup هم تموم شد و اما میریم سر وقت تابع loop :
2016-01-19_11-21-33

خب اول دستور debouncer.update :
با این کار وضعیت پین دیبانس که در حال نمونه برداریه به روز می شه بعد از اون با دستور debouncer.read این مقدار خونده میشه. اگه این داده ای که خونده سطح منطقی LOW باشه LED شماره 13 آردوینو رو که همون LED داخلی آردوینو هست روشن میکنه. دقت کنید چون مدارمون رو عوض کردیم وقتی کلید وصل بشه پایه دیجیتال شماره 2 آردوینو به زمین متصل میشه و سطح منطقیش برابر LOW میشه (به همین دلیل این مدلی کد نویسی شده).

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

*************************

کتابخونه دیبانس 2 تا دستور دیگه داره fell و rise که اگه کسی خواست بدونه اینا چیکار می کنن می تونه تو انجمن سوالش رو مطرح کنه.

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

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

راستش قصد داشتم جلسه بعد برم سراغ سروو . ولی یه کم فکر کردم دیدم هنوز پروژه بیس زیاد داریم که بهتره اول اونا رو بگم بعد بریم سراغ سروو و ادامه ماجرا.
یه روند جدید: اول هر کاری که میشه با پین های دیجتال آردوینو کرد رو یاد میگیریم بعد میریم سراغ آنالوگ ها.
تا الان هر پروژه ای که انجام دادیم از پین های دیجیتال آردوینو به صورت خروجی استفاده کردیم. مثلا موقعی که یه 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 استفاده کنید.

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

جلسه نهم : راه اندازی ال ای دی RGB

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

خب اول میریم سراغ معرفی خود این ال ای دی ها. برای این که با تکنولوژی RGB آشنا بشید یه سری به این لینک بزنید و برگردید.

LED-RGB-8CD5kCA

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

ببینید ما یه موقع میخوایم رنگ سفید تولید کنیم. برای تولید این رنگ باید از سه رنگ قرمز، سبز و آبی با درصد های مساوی استفاده کنیم. یه موقع می خوایم رنگ بنفش تولید کنیم. برای رنگ بنفش درصد رنگ سبز با درصد رنگ قرمز صد در صد مساوی نیست (طبق قانون ترکیب رنگ ها ). حالا، گفتیم که پین های ال ای دی به پین های دیجیتال آردوینو وصل میشن. اگه قرار باشه مثل پروژه های قبل با دستور digitalWrite کار کنیم نمی تونیم برای هر رنگ درصد قائل بشیم و رنگ های مختلف ایجاد کنیم علتش اینه که وقتی می نویسیم (digitalWrite(8,HIGH داریم ولتاژ ( دقت کنید ولتاژ ) پین 8 رو 5 ولت می کنیم. وقتی می نویسیم (digitalWrite(8,LOW داریم ولتاژ این پایه رو صفر می کنیم. ما برای تولید رنگ بنفش ولتاژی که به سه تا پایه میدیم نباید مساوی باشه بلکه مثلا یکی باید 5 باشه یکی باید 3 باشه یکی باید 1.5 باشه. خب چاره چیه؟ چجوری ولتاژ متفاوت تولید کنیم؟

راه حل استفاده از PWM هست. اول یه سری به این لینک بزنید و ببینید که PWM چیه؟
با کمک منطق PWM و کد نویسی می تونیم یه کاری بکنیم که روی پایه های دیجیتال ولتاژ های بین 0 و 5 ولت بیفته. دستوری که با کمک اون از PWM استفاده می کنیم دستور analogWrite هست. مثلا (analogWrite(9,255
این دستور دو تا آرگومان داره. آرگومان اول شماره پین دیجیتال مورد نظره. آرگومان دوم یک عدد در بازه 0 تا 255 هست. وقتی صفر میدیم روی پایه دیجیتال شماره 9 ولتاژ 0 ولت می افته وقتی 255 می نویسیم روی پایه دیجیتال 9 ولتاژ 5 ولت می افته. یعنی یک تناسب بین عدد آرگومان دوم ما و ولتاژی که روی پین دیجیتال می افته وجود داره. حالا اگه قرار باشه ولتاژ 2.5 ولت روی پین 9 بیفته به جای 255 عدد 127 رو می نویسیم. یعنی میشه (analogWrite(9,127.
حالا آیا میشه به جای این پین شماره 9 هر پین دیجیتالی رو نوشت؟ جواب منفیه! پین های دیجیتالPWM آردوینو خاص هستن مثلا روی آردوینو UNO پین های PWM پین های شماره 3, 5, 6, 9, 10 و 11 هستن و تنها از این پین ها استفاده میشه. برای این که راحت تر پیداشون کنین روی برد کنار پین های PWM یه علامت مد کشیده شده:
dsku-fidhsfudhsfdsfidhsi00001
تا این جای جلسه منطق حاکم بر پروژه رو گفتیم الان میریم سراغ انجام خود پروژه عملیمون: می خوایم سه رنگ اصلی (قرمز، سبز وآبی ) رو با توالی 1 ثانیه روشن کنیم. مداری که استفاده می کنیم به صورت زیره:
learn_arduino_fritzing

دقت کنید که سه تا مقاومت به صورت سری در مدار قرار گرفته، این یه تکنیک برای افزایش طول عمر ال ای دی هاست.
خب مدار رو بستید؟ حله؟ بریم سراغ کد نویسی:

2015-09-13_11-45-17

اگه دقت کنید این کد به 4 بخش تقسیم شده. بخش اول هدر برنامه هست که متغیر های گلوبال رو توش تعریف کردیم (قبلا هم تاکید کردم حتما یه سری به برنامه نویسی بزنید). الان ما تو هدر برناممون اومدیم شماره پین های PWM مورد نظرمون رو (یعنی 9 و 10 و11) ریختیم توی سه تا متغیر. فایده این کار چیه؟ آخر برنامه میگم 😆

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

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

و اما قسمت چهارم، تابع LOOP. توی این تابع 6 بار تابع RGB صدا زده میشه. دفعه اول (RGB(200,0,0 صدا زده میشه و با این کار نور قرمز روی ال ای دی با قدرت 200 ظاهر میشه (دقت کنید اگه به جای 200، 255 میزاشتیم با توان بیشتری ال ای دی روشن میشد ولی برای جلوگیری از خطر کور شدن میزاریمش 200 حتی شما اگه بزارینش 100 بازم بهتره). بعد تابع delay رو داریم که مدت 1 ثانیه صبر میکنه و تو این یک ثانیه رنگ ال ای دی قرمزه. بعد از delay تابع (RGB(0,0,0 رو داریم. با این دستور داریم ال ای دی رو خاموش می کنیم تا برای مرحله بعد که تولید رنگ سبزه آماده بشه. تا آخر تابع loop همینطوری پیش میره و رنگ ها یکی پس از دیگری نمایش داده میشن.

پروژه ما اینجا تموم شد. اما:
1.اگه خواستید رنگ سفید درست کنید چون باید هر سه رنگ به یک میزان وجود داشته باشن از دستور (RGB(200,200,200 استفاده کنید.
2.اگه یادتون باشه تو هدر برنامه گفتم شماره پین ها رو می ریزیم تو متغیر. فایده این کار چیه ؟ فرض کنید به هر دلیلی پین شماره 10 آردوینو شما سوخت و شما تصمیم گرفتید به جای استفاده از پین PWM شماره 10 از پین PWM شماره 6 استفاده کنید. علاوه بر این که از لحاظ سخت افزاری باید تغییر مورد نظر رو انجام بدید باید توی کدنویسی تون هم این تغییر رو لحاظ کنید. الان که شماره پین تو هدر برنامه تعریف شده شما فقط و فقط همون خط معرفی پین شماره 10 رو به پین شماره 6 تغییر می دید. ولی اگه تو هدر برنامه شماره پین رو تو متغیر نریخته بودیم برای این تغییر لازم بود هم توی دستور pinMode هم توی دستور analogWrite عدد 10 رو به 6 تغییر می دادید. البته ما الان کدمون بیست خط هم نیست ولی وقتی خطوط کد نویسی زیاد بشه این کار خیلی به چشم میاد.

پایان جلسه

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

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

خب میریم وسط داستان. هر برنامه ای که برای آردوینو میخوایم بنویسیم دو قسمت مجزا داره. یکی تابع 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 هست برنامه شروع میکنه به انجام شدن.

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

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