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

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

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

سلام

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

این جلسه می خوایم در مورد فتوسل حرف بزنیم.
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 هست فرمان میده با سر فاصله های یک ثانیه این روند تکرار بشه.

پایان.

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

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

جلسه اول : آشنایی با میکروکنترلر

میکروکنترلر چیست؟
قطعه ای که این روزها دارد جای خود را در خیلی از وسایل الکتریکی باز میکند .از تلفن گرفته تا موبایل از ماوس لیزری که الان دستتان روی آن است و دارین باهاش کامپیوتر رو کنترل میکنید تا هر وسیله ای که بتوان پیچیدگی رو در اون دید میتونید یک میکروکنترلر رو ببینید .
کلمه میکروکنترلراز دو کلمه میکرو و کنترلر تشکیل شده است.
میکرو : میدونین که این یک واحد یونانی است و برابر با 10 به توان منفی 6 متر است. یعنی یک ملیونیوم متر….
کنترلر : یعنی کنترل کننده به تعبیری یعنی “مغز ” البته بدون تفکر فقط دستوراتی که به اون داده میشه به نحو احسن انجام میده.
کلمه میکرو به دو منظور استفاده شده منظور اول و مهم ،سرعت عمل میکروکنترلر است که میتواند تا یک ملیونیوم ثانیه باشد یعنی میتواند در یک ثاینه یک میلیون عملیات رو انجام بده به همین خاطر واژه میکرو رو به اون اختصاص دادن . معنی دوم آن شاید کوچیکی این قطعه باشد که تا یک ملیونیوم متر کوچیک شده شاید باور کردنی نباشه ولی در یک تراشه ممکنه بیش از یک میلیون تراتزیستور به کار رفته باشه. این کلمه وقتی اهمیتش کامل میشه که با واژه کنترلر عجین بشه تا معنیش کامل بشود .

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

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

تمام میکروکنترلرها جزء این 4 قسمت هستنند:
8051(1
Pic(2
Avr(3
Arm(4
خوشبختانه همه میکروکنترلر هایی که جزء هر کدام از 4 نوع بالا باشند از یک برنامه پیروی میکنند. بدین معنا که اگر شما کار با یکی از مدل های آن میکرو را یاد گرفته باشید مثل اینکه کار با تمام میکروکنترلرهای آن نوع را یاد گرفته اید.مثلا شما اگر با یکی از مدل های میکروکنترلر avr مثلا atmega8 را یاد گرفته باشید دیگر با صد ها مدل دیگر میکروکنترلر avr مشکلی ندارید وتقریبا بدون هیچ مشکلی میتوانید با دیگر مدل های این میکرو کار کنید.
اما یه مشکل که در میکروکنترلر ها وجود دارد این است که این4 نوع از لحاظ برنامه نویسی به هیچ وجه با هم دیگر سازگاری ندارند . به طور مثال اگر شما میکروکنترلر های avr و 8051 را کامل یاد گرفته باشید حتی ساده ترین برنامه رو روی یک میکروکنترلر pic نمیتوانید اجرا کنید. واین یکی از بزرگترین عیب و مشکل برای یاد گیری میکرو است .بنابراین از همون اول باید یک انتخاب درست داشته باشید و میکروکنترلر مناسب را برگزینید تا با یادگیری آن میکروکنترلر بتوانید بعدا به سادگی پروژه های خود را اجرا کنید .

8051 :
اولین میکروکنترلری بود که به دست بشر ساخته شد . ابتدا این میکروکنترلر توسط شرکت بزرگ intel ساخته شد .اما بعدا intel این امکان را به دیگر شرکت ها داد که این میکروکنترلر را تولید کنند و شرکت هایی مانند ATMEL , PHILIPS , SIEMENS , DALLAS و… به تولید این میکروکنترلر پرداختنند. یکی از شرکت هایی که به صورت گسترده به تولید این تراشه پرداخت ATMEL بود. اما اگربخواهیم به صورت کلی سیر پیشرفت این نوع میکروکنترلر رو در نظر بگیریم اولین میکروکنترلر هایی که ساخته شد با جدیدترین میکروکنترلرهای 8051 که الان تولید میشود با توجه به این پیشرفت شگفت در تمام زمینه ها که صنایع دیگر در دنیا دارند پیشرفت زیادی ندارد به طور مثال AT89S5X که میکروکنترلر 8051 جدید ساخت ATMEL است نسبت به مدل های اولیه 8051 پیشرفت آنچنانی ندارد . امکانات این میکرو نسبت به AVR و PIC قابل مقایسه نیست . به صورتی که که همین مدل جدید 8051 تقریبا حافظه ای برابر یک صدم (0.01 ) میکروکنترلر های AVR را دارد و سرعتش 4 برابر کمتر از میکروکنترلر های PIC و 12 بار کمتر از میکروکنترلر های AVR است . از لحاظ امکانات دیگر هم چنین ضعفی احساس میشود. اما برای کارهای ساده تر که پیچیدگی زیادی در آن نباشد به خاطر قیمت بسیار پایینی که این میکروکنترلر دارد بسیار مناسب است . قیمت همین مدل جدید AT89S5X حول و حوش 1000 تومان است که قیمت بسیار مناسبی است.
این میکرو کنترلر از زبان اسمبلی و C پشتیبانی میکند که زبان برنامه نویسی اصلی آن اسمبلی است که واقعا نوشتن با این زبان برنامه نویسی نسبت به زبان های برنامه نویسی دیگر هم مشکل تر و هم طولانی تر است. در کل این میکروکنترلر امروزه دیگر توانای رقابت با AVR و PIC رو ندارد و امروزه رقابت اصلی بین این دو میکروکنترلر است.

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

AVR :
به میکروکنترلر AVR میرسیم .اول از همه سرعت این میکروکنترلر بسیار بالاست و به قولی دستوراتی که بهش داده میشه در یک سیکل کلاک انجام میده. AVR از زبان های برنامه نویسی سطح بالا یا به اصطلاح (HIGH LEVEL LANGUAGE) HLL پشتیبانی میکند که باعث تولید کدهای بیشتری میشود که در کل برنامه نوشته شده نسبت به برنامه هایی که برای 8051 و PIC نوشته میشود کوتاهتر است. امکانات جانبی این میکروکنترلر بسیار مناسب است و شما را از خرید بعضی لوازم جانبی مانند چیپ های آنالوگ به دیجیتال (ADC) , مقایسه گر آنالوگ و… راحت میکند .در ضمن AVR از بسیاری از استاندارد های ارتباطی مانند SPI,UART,12C,JTAG پشتیبانی میکند که به راحتی میتوان این میکروکنترلر را با میکروکنترلر دیگر یا و سایل دیگر وصل کرد و با وسایل دیگر به راحتی ارتباط برقرار کند. قیمت این میکروکنترلر هم به نسبت امکانات فراوانی که داره بسیار پایین است به طوری که یک میکروکنترلر AVR تقریبا پیشرفته رو با قیمت حول و حوش 3 تا 4 هزار تومان خرید .
AVRها به پنج گروه تقسیم شده اند:
tinyAVR (1
megaAVR (2
AVR (3 XMEGA
AVR32 UC3 (4
AVR32 AP7 (5

ARM :
ARM یک میکرو کنترلر قدرتمند با کاربردهای متنوع است. ARM ها بیشتر در جاهایی که ظاهر زیبای کار مورد توجه است استفاده می شوند چرا که این میکروکنترلرها می توانند سیستم عامل های لینوکس و ویندوز رو راه اندازی کنند.
پروگرام میکروکنترلر :
شاید تا حالا به نظرتون رسیده باشه که این میکروکنترلر رو چگونه میشه برنامه ریزی کرد تا کار مورد نظرمان را انجام بده در صورتی که یک میکروکنترلر برنامه ریزی نشده هیچ کاری رو نمیتونه انجام بده و هیچ کاربردی نداره در واقع برنامه هر میکرو روح وجانی است که در اون دمیده میشه و اون رو زنده میکنه.
برای برنامه ریزی میکروکنترلر نیاز به دستگاه یا بردی هست به نام پروگرامر که یه پل ارتباطیه بین کامپیوتر و میکروکنترلر . پروگرامر را هم میشه از بازار تهیه کرد و هم میشه اون رو ساخت.
البته پروگرامرهای مختلفی در بازار هستنند که متانسب با کاربردشان قیمت های مختلفی دارند بعضی ها فقط چند مدل رو پروگرام میکنند بعضی از پروگرامر ها همه فن حریفند و تمام میکروکنترلر های 8051AVR ,ARM, PIC , رو برنامه ریزی میکنند به طبع قیمت زیادتری دارند.

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