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

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

اما بریم سراغ معرفی قسمت های مختلف یه رله که باهشون کار داریم. شما می تونید انواع ماژول های رله رو از اینجا ببینید. مدلی که من امروز باهاش کار می کنم این هست:
KEEPONIC_Relay_5v_2-500x500 همونطور که می بینید این رله 3 قسمت مهم داره که دونه به دونه معرفیشون می کنم :
1 (1)
خب ما توسط این قسمت به رله میگیم خاموش بشه یا روشن بشه. یعنی همون بخش تحریکش در واقع. برای این کنترل یا بازهم می تونیم مثل مثال باتری بریم سیم برداریم و هر موقع خواستیم وصل کنیم و هر موقع نخواستیم قطع کنیم (یعنی به صورت دستی و فیزیکی )، یا این که می تونیم این قسمت رو به یه میکروکنترلر مثل آردوینو وصل کنیم و از طریق دستورهای کدنویسی این کار رو انجام بدیم. اگر دقت کنید این قسمت سه تا پایه داره . یکی DC+ که در واقع همون پایه VCC هست و باید بهش 5 ولت اردوینو رو وصل کنیم. پایه دیگه DC- هست که نقش گراند (GND) رو داره که به پین زمین آردوینو وصلش می کنیم. یه پایه دیگه داره به اسم IN. از طریق این پایه روشن یا خاموش بودن رله کنترل میشه. یعنی کل کاری که ما در کنترل یک رله انجام میدیم اینه که با ولتاژ این پین رله بازی کنیم . چون این بازی کردن یه وضعیت دوحالته هست یعنی خاموش و روشن (معادل 0 و 1 ) ، این پین رله رو به یکی از پین های دیجیتال دلخواه آردوینو وصل می کنیم. شماره پین مهم نیست چون فقط قصد داریم 0 و 1 کنیم و نم یخوایم PWM بدیم. حالا سوالی که پیش میاد اینه که باید به پین رله رو 0 کنیم تا رله روشن شه یا 1 کنیم تا روشن شه ؟ جواب این سوالتون رو تو بخش سوم همین توضیحات خواهم داد.

1 (3)
این قسمت از رله رو باید به وسیله ای وصل کنیم که قصد داریم تحت کنترلش بگیریم. مثلا به یه موتور با LED توان بالا. خب اگه به عکس دقت کنید میبینید که این قسمت از رله سه تا ترمینال داره که به صورت زیر نام گذاری می شن:
1 (3)
پایه normally close پایه ای هست که در حالت عادی که رله خاموشه به پایه common (یعنی پایه کناریش) وصله . این اتصال رو می تونید از طریق یک مولتی متر هم چک کنید. پایه normally open پایه ای هست که وقتی رله روشن میشه به پایه common وصل میشه در این حالت پایه common از پایه normally close جدا میشه که باز هم می تونید از طریق مولتی متر تست بگیرید. در همین حد برای ما کافیه که از این قسمت بگیم و لی اگه سوال دارید که اصلا پایه normally close چیه و چرا در حالت خاموش رله می چسبه به common این لینک رو مطالعه کنید.

1 (2)
این قسمت تعیین میکنیم که سطح تحریکمون high باشه یا low باشه. یعنی چی ؟
یادتونه تو معرفی قسمت یک همین جلسه گفتم حالا برای روشن کردن رله باید به پایه IN صفر بدیم یا یک بدیم؟ توی این قسمت رله داریم همین رو تعیین می کنیم. اگه وضعیت جامپر زرد رنگ به همین صورت الانش باشه (یعنی روی H باشه ) برای روشن کردن رله باید به پایه IN منطق HIGH وصل کنیم اگه وضعیت جامپر رله بر عکس باشه یعنی روی L باشه باید برای روشن کردن رله بهش LOW بدیم. اصطلاحا به حالت اول میگن رله 1 فعاله و به حالت دوم میگن 0 فعاله.

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

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

خب تو پروژمون قصد داریم فقط رله رو روشن و خاموش کنیم. برای این کار مطابق توضیح زیر مدار رو ببندید:

پایه DC+ رله به پایه 5v آردوینو
پایه DC- رله به پایه GND آردوینو
پایه IN رله به پایه دیجیتال شماره 8 آردوینو (به جای این پین دیجیتال هر پین دیجیتال دلخواه دیگه ای رو هم می تونید استفاده کنید)

سادست دیگه مگه نه ؟
خب حالا میریم سراغ مرحله کد نویسی :
کد زیر رو آپلود کنید تا هر قسمتش رو توضیح بدم :
2016-02-20_15-31-08
قسمت 1 : معرفی پین 8 (پین متصل به رله ) به نام relay_pin
قسمت 2 :کانفیگ ارتباط سریال
قسمت 3 :شرط if . این شرط که در جلسات پیش به تفصیل توضیح داده شده معین می کنه که آیا داده ای در کنسول سریال دریافت شده یا نه.
قسمت 4: :در این خط کد، داده کنسول سریال توسط دستور Serial.read خونده می شه. بعد از آن ،عدد 48 از این داده کم می شه. علت کم شدن عدد 48 چیه ؟
اگه همین کد رو بدون -48 پروگرام کنید و اجرا کنید وقتی تو کنسول عدد 0 تایپ بشه تو خروجی کنسول عدد 48 دیده می شه ( چی شد ؟ من 0 تایپ کردم ولی داره 48 نشون میده ). در صورتی که عدد 9 تایپ بشه در خروجی کنسول عدد 57 دیده می شه. داستان چیه ؟
با کمی جست و جو معلوم می شه که خروجی دستور Serial.read در واقع کد اسکی عدد 0 و 9 هست. یعنی 48 کد اسکی عدد 0 هست و 57 کد اسکی عدد 9 ! یعنی وقتی ما 0 تایپ می کنیم تو ورودی کنسول ، آردوینو میره عدد 48 که معادل کد اسکی 0 هست رو به عنوان خروجی دستور Serial.read تحویل میده.
بنابراین ما برای این که بتونیم از این خروجی اسکی (که مطلوبمون نیست ) به خروجی واقعی خودمون برسیم لازمه از کد اسکی (که الان خروجی دستور Serial.read هست ) عدد 48 رو کم کنیم .به همین سادگی. در نهایت خروجی این خط کد که تو متغیر data ریخته میشه همون عددی هست که ما توی کنسول تایپش کردیم یعنی 0 یا 9 . به نظر من یه بار بدون -48 کد رو تست کنید و ببینید.
قسمت 5 :داده ای که توی کنسول تایپ کردیم تو قسمت خروجی کنسول برامون نشون داده میشه.
قسمت 6 : داده توی متغیر data مستقیما به پین متصل به رله فرستاده میشه.

حالا کد رو تست کنید.
اگه جامپر روی قسمت H باشه وقتی 1 میدید رله روشن میشه و وقتی 0 میدید رله خاموش میشه .
اگه جامپر روی قسمت L باشه وقتی 0 میدید رله روشن میشه و وقتی 1 میدید رله خاموش میشه .

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

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

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

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

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

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

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

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

میکروکنترلر چیست؟
قطعه ای که این روزها دارد جای خود را در خیلی از وسایل الکتریکی باز میکند .از تلفن گرفته تا موبایل از ماوس لیزری که الان دستتان روی آن است و دارین باهاش کامپیوتر رو کنترل میکنید تا هر وسیله ای که بتوان پیچیدگی رو در اون دید میتونید یک میکروکنترلر رو ببینید .
کلمه میکروکنترلراز دو کلمه میکرو و کنترلر تشکیل شده است.
میکرو : میدونین که این یک واحد یونانی است و برابر با 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 , رو برنامه ریزی میکنند به طبع قیمت زیادتری دارند.

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