در مقاله قبل با انواع میکروکنترلر های مطرح آردوینو و مشخصات آنها آشنا شدید. همچنین سعی کردیم محیط توسعه Arduino IDE رو بصورت کامل معرفی کنیم. در این مقاله با انجام مثال های ابتدایی میتونید درک بهتری از روش کدنویسی این بورد داشته باشید. همچنین در این بخش به خصوصیات محیط توسعه Arduino IDE و ورودی ها و خروجی های این بورد محبوب می پردازیم .
Serial Monitor
سریال مانیتور این امکان رو برای کامپیوتر شما فراهم میکنه تا به صورت سریالی به میکروکنترلر آردوینو وصل بشه. این مسئله خیلی مهمه چون سریال مانیتور دادههایی که Arduino از سنسورها و باقی دستگاهها دریافت میکنه میگیره و بلافاصله در کامپیوتر نشون میده. این قابلیت برای دیباگ کردن کد و دانستن اینکه تراشه چه مقادیری دریافت میکنه خیلی اهمیت داره.
برای مثال، sweep مرکزی (پین میانی) پتانسیلسنج رو به A0 و پین router رو به 5v و پین زمین وصل کنین. در مرحله بعد، sketch زیر رو بارگذاری کنین:
File –> Examples –> 1.Basics –> AnalogReadSerial
روی دکمه کلیک کنین تا سریال مانیتور که شبیه ذرهبین هست بهکار بیفته. به دنبال اون، پین آنالوگ شروع میکنه به خواندن اعداد در سریال مانیتور. وقتی کلید رو میچرخونین اعداد کاهش و افزایش پیدا میکنن.
اعداد بین 0 و 1023 خواهند بود. دلیلش هم اینه که پین آنالوگ ولتاژ بین 0 و 5v رو به یک عدد صحیح تبدیل میکنه.
ورودی دیجیتال (Digital In)
میکروکنترلر آردوینو دو نوع پین ورودی داره:
-
دیجیتال
-
آنالوگ
ابتدا نگاهی میاندازیم به پینهای دیجیتال.
پینهای ورودی دیجیتال فقط دو حالت دارن، یا خاموش هستن یا روشن. این دو حالت روشن و خاموش با نامهای زیر هم شناخته میشن:
- High یا LOW
- 1 یا 0
- 5V یا 0V
این ورودی برای فهمیدن وجود ولتاژ (زمانیکه کلیدی باز و بسته میشه) استفاده میشه.
ورودیهای دیجیتال رو هم میشه به عنوان مبنایی برای پروتکلهای ارتباطی استفاده کرد. با ایجاد یک پالس 5v یا 0v، میشه یک سیگنال باینری ایجاد کرد که مبنای تمام امور رایانشی هست. این مورد برای برقراری ارتباط با سنسورهای دیجیتال مثل سنسور آلتراسونیک PING یا ارتباط با دستگاههای دیگه سودمنده.
به عنوان یک نمونه ساده استفاده از ورودی دیجیتال، یک کلید از پین دیجیتال 2 رو به 5v، مقاومت 10k پین دیجیتال 2 رو به زمین وصل کنین و کد زیر رو اجرا کنین:
File –> Examples –> 2.Digital –> Button
مقاومت 10K مقاومت pull-down هم نامیده میشه چون وقتی که کلید رو نزده باشین، پین دیجیتال رو به پین زمین وصل میکنه. وقتی که کلید رو بزنین، اتصالات الکتریکی درون کلید مقاومت کمتری نسبت به قطعه دارن و الکتریسیته دیگه به زمین وصل نمیشه. در عوض، الکتریسیته بین پین دیجیتال و 5v جریان پیدا میکنه. دلیلش هم اینه که جریان همیشه مسیری با کمترین مقاومت رو پیدا میکنه. برای کسب اطلاعات بیشتر در این مورد، به صفحه Digital Pins رجوع کنین.
ورودی آنالوگ (Analog In)
میکروکنترلر آردوینو علاوه بر پینهای ورودی دیجیتال، چند تا پین ورودی آنالوگ هم داره.
پینهای ورودی آنالوگ یک سیگنال آنالوگ رو دریافت میکنه و یه تبدیل 10 بیتی آنالوگ به دیجیتال (ADC) انجام میده تا اون رو به عددی بین 0 و 1023 تبدیل کنه (4.9mV).
این نوع ورودی برای خواندن سنسورهای مقاومتی (resistive) مناسبه. منظور از سنسور مقاومتی سنسوری هست که مقاومت رو به مدار میرسونه. در ضمن، این سنسورها برای خواندن سیگنالهای متغیر ولتاژ بین 0 و 5v مناسب هستن. این مورد در هنگام تعامل با انواع مختلف مدار آنالوگ سودمنده.
اگر طبق مراحل گام هفتم برای راهاندازی سریال مانیتور عمل کرده باشین، از یک پین ورودی آنالوگ استفاده کردین.
خروجی دیجیتال (Digital Out)
پین خروجی دیجیتال رو میشه روشن (5v) یا خاموش (0v) کرد. اینجوری میتونین وسایل رو روشن یا خاموش کنین.
علاوه بر خاموش و روشن کردن وسایل ( و LED چشمکزن)، این نوع خروجی برای یک تعدادی از کاربردها رایجه.
مهمتر از همه، ارتباط دیجیتال رو برای شما میسر میکنه. با روشن و خاموش کردن سریع پین، حالت باینری (صفر و یک) ایجاد میکنین که دستگاههای دیجیتال زیادی اونو به عنوان سیگنال باینری میشناسن. با تکیه بر این متد میتونین با استفاده از پروتکلهای دیگهای ارتباط برقرار کنین.
ارتباط دیجیتال حوزه پیشرفتهای هست، اما برای آشنایی بیشتر با اون به صفحه Interfacing With Hardware رجوع کنین.
اگر طبق مراحل گام 6 عمل کرده باشین (LED چشمکزن)، پس از پین خروجی دیجیتال استفاده کردین.
خروجی آنالوگ (Analog Out)
همونجوری که قبلاً هم گفتیم، میکروکنترلر آردوینو تعدادی تابع خاص داخلی داره. یکی از این توابع pulse width modulation هست و Arduino با تکیه بر اون خروجی آنالوگ ایجاد میکنه.
کارکرد Pulse with modulation یا همون PWM به این شکله که برای شبیهسازی سیگنال آنالوگ پین PWM رو روشن (5v) و خاموش (0v) میکنه. برای مثال، اگر بخواید یک LED رو با سرعت مناسبی خاموش و روشن کنین ( هر پنج میلیثانیه یک بار)، نیمی روشنایی خواهد بود و فقط نیمی از برق رو دریافت میکنه. در عوض، اگر 1 میلیثانیه روشن باشه و 9 میلیثانیه خاموش باشه، LED 10/1 روشن خواهد بود و فقط 10/1 ولتاژ رو دریافت میکنه.
PWM برای برخی کارها مثل ایجاد صدا، کنترل روشنایی چراغها و کنترل سرعت موتورها ضروری هست.
برای اینکه PWM رو امتحان کنین، LED و مقاومت 220 اهم رو به پین دیجیتال 9 و به صورت سری به زمین وصل کنین. سپس، نمونه کد زیر رو اجرا کنین:
File –> Examples –> 3.Analog –> Fading
کدنویسی
برای کدنویسی لازمه که کمی با زبان برنامهنویسی آشنایی داشته باشین. به عبارت دیگه، باید بدونین چجوری میشه به درستی کد رو برای برنامهنویس بنویسین که اونو متوجه شه. این کدنویسی رو میتونین نوعی دستور زبان و علائم نگارشی در نظر بگیرین. شما میتونین بدون رعایت دستور زبان و علائم نگارشی یک کتاب بنویسین، اما مطمئناً هیچکس متوجه مطالب اون کتاب نمیشه!
در زمان کدنویسی باید به این موارد توجه کنین:
- برنامههای آردوینو sketch نامیده میشن.
- کل کد موجود در Arduino sketch از بالا به پایین پردازش میشه.
Sketch های بورد Arduino معمولاً به پنج بخش تقسیم میشن:
- Sketch معمولاً با یک هدر (header) شروع میشه که کارکرد اون و کسی که اونو نوشته نشون میده.
- Sketch معمولاً متغیرهای جهانی رو تعریف میکنه. گاهی اوقات، در این قسمت نامهای ثابت برای پینهای مختلف Arduino مشخص میشه.
- پس از تعیین متغیرهای اولیه، Arduino راهاندازی روزانه رو شروع میکنه. در تابع setup، در هنگام ضرورت، شروط متغیرها رو تعیین میکنیم و کدهای اولیهای که میخوایم فقط یک بار اجرا بشن رو اجرا میکنیم. در این بخش هست که ارتباط سریالی شروع میشه. ارتباط سریالی برای اجرای سریال مانیتور لازمه.
- از تابع setup، به حلقه میریم. حلقه اصلیترین قسمت sketch هست. علاوه بر اینکه کدها به حلقه میرن، بارها اجرا میشن تا زمانیکه sketch به اجرا شدن ادامه بده.
- در قسمت پایانی loop، فهرستی از توابع دیگه وجود داره. این توابع رو کاربران تعریف کردن و فقط زمانی فعال میشن که در setup یا حلقه فراخونی بشن. زمانیکه این توابع فراخوانی بشن، Arduino کل کد موجود در تابع رو از بالا به پایین پردازش میکنه و سپس به خط بعدی sketch میره که در زمان فراخونی غیرفعال بوده. اهمیت توابع رو نباید نادیده گرفت چون این امکان رو برای شما فراهم میکنن تا استانداردهای روزانه رو اجرا کنن بدون اینکه لازم باشه بارها همون خطوط کد رو نوشت. به راحتی میشه چندین بار یک تابع رو فراخوانی کرد و همین کار حافظه تراشه رو خالی میکنه چون تابع روزانه فقط یکبار نوشته میشه. البته این کار خواندن کد رو هم آسونتر میکنه. برای اینکه بدونین چجوری میشه تابع تعریف کرد به این لینک رجوع کنین.
فقط دو بخش از sketch اجباری هستن: Setup و روتینهای حلقه.
- کد باید به زبان Arduino نوشته بشه؛ این زبان تا حدی زیادی مبتنی بر C هست.
- تقریباً تمامی statement هایی که به زبان Arduino نوشته میشن باید به a ختم بشن.
- جملات شرطی ( مثل if statement ها برای حلقههای for) لازم نیست به a ختم بشن.
- جملات شرطی قوانین خودشون رو دارن و از صفحه زبان Arduino از بخش Control Structures میتونین به اونا دسترسی پیدا کنین.
- اعداد در متغیرها ذخیره میشن. شما میتونین مقداری به متغیر بدین یا مقدارش رو بگیرین. قبل از استفاده از متغیرها باید اونا رو تعریف کرد و علاوه بر این باید نوع دادهشون مرتبط با خودشون باشن.
فرض کنین میخوایم کدی بنویسیم که فوتوسلی که به پین A0 متصل هست رو بخونه و با استفاده از اطلاعات فوتوسل میزان روشنایی LED که به پین D9 وصل هست رو کنترل کنه.
در قدم اول، BareMinimum Sketch رو باز میکنیم، برای دسترسی به این Sketch طبق مراحل زیر عمل کنین:
File –> Examples –> 1.Basic –> BareMinimum
BareMinimum sketch این شکلیه:
<pre>void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
در قدم بعدی، یک header برای کد میگذاریم تا دیگران بدونن ما چی میخوایم درست کنیم و چرا و تحت چرا شرایطی:
<pre>/* LED Dimmer by Genius Arduino Programmer 2012 Controls the brightness of an LED on pin D9 based on the reading of a photocell on pin A0 This code is in the Public Domain */ void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
در مرحله بعدی، نام پینها متغیرها رو مشخص میکنیم:
<pre>/* LED Dimmer by Genius Arduino Programmer 2012 Controls the brightness of an LED on pin D9 based on the reading of a photocell on pin A0 This code is in the Public Domain */ // name analog pin 0 a constant name const int analogInPin = A0; // name digital pin 9 a constant name const int LEDPin = 9; //variable for reading a photocell int photocell; void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
پس از تعیین نام پینها و متغیرها، شروع به کدنویسی میکنیم:
<pre>/* LED Dimmer by Genius Arduino Programmer 2012 Controls the brightness of an LED on pin D9 based on the reading of a photocell on pin A0 This code is in the Public Domain */ // name analog pin 0 a constant name const int analogInPin = A0; // name digital pin 9 a constant name const int LEDPin = 9; //variable for reading a photocell int photocell; void setup() { //nothing here right now } void loop() { //read the analog in pin and set the reading to the photocell variable photocell = analogRead(analogInPin); //control the LED pin using the value read by the photocell analogWrite(LEDPin, photocell); //pause the code for 1/10 second //1 second = 1000 delay(100); }
اگر میخواهید بدونین پین آنالوگ چه اعدادی رو از فوتوسل میخونه، باید از سریال مانیتور استفاده کنین. حالا باید سریال پورت رو فعال کنیم و اون اعداد رو خروجی بدیم:
<pre>/* LED Dimmer by Genius Arduino Programmer 2012 Controls the brightness of an LED on pin D9 based on the reading of a photocell on pin A0 This code is in the Public Domain */ // name analog pin 0 a constant name const int analogInPin = A0; // name digital pin 9 a constant name const int LEDPin = 9; //variable for reading a photocell int photocell; void setup() { Serial.begin(9600); } void loop() { //read the analog in pin and set the reading to the photocell variable photocell = analogRead(analogInPin); //print the photocell value into the serial monitor Serial.print("Photocell = " ); Serial.println(photocell); //control the LED pin using the value read by the photocell analogWrite(LEDPin, photocell); //pause the code for 1/10 second //1 second = 1000 delay(100); }
برای آشنایی بیشتر در مورد نحوه نوشتن این کد، صفحه Foundations رو بررسی کنین.
معرفی شیلدها
شیلدها بوردهای توسعه آداپتور هستن که به قسمت بالای Arduino Uno وصل میشه و کاربردهای خاصی داره.
با توجه به اینکه میکروکنترلر آردوینو یک سختافزار آزاد هست، همه میتونن برای هر کاری که دارن شیلد Arduino درست کنن. برای تأئیدش هم کافیه که بدونین تعداد بیشماری شیلد Arduino وجود داره.
ساخت مدار خارجی
هرچه پروژهتون پیچیدهتر میشه، بدون شک میخواین خودتون مدارهایی بسازین که با Arduino تعامل برقرار کنه.
جمع بندی
از اینجا به بعد تنها کاری که لازمه انجام بدین، ایجاد پروژه هست. مقالات آموزشی و پروژه های کاربردی زیادی درباره میکروکنترلر آردوینو وجود داره که در آینده نزدیک تعدادی از اون پروژه های جذاب و امکانات بیشمار این بورد پر کاربرد رو با هم انجام خواهیم داد پس همچنان با ما همراه باشین.