1

آموزش برنامه نویسی آردوینو

در این مطلب از آموزش برنامه نویسی آردوینو قصد دارم مهم ترین مواردی که برای نوشتن برنامه های آردوینو به زبان C++ با استفاده از Arduino IDE نیاز دارید را توضیح دهم. هدف از نوشتن این مطلب آشنایی کلی با Syntax یا قواعد برنامه نویسی به زبان C++ برای آردوینو و شناخت کاربرد هر یک از توابع، ساختار ها و سایر موارد مهم در برنامه نویسی Arduino است.

اگر شما با زبان C یا مشتقات آن مانند C++ و PHP آشنایی کافی داشته باشید، مسیر یادگیری برنامه نویسی اردوینو برای شما ساده تر خواهد بود. اما با این وجود حتی افرادی که سال ها با استفاده از کامپایلر هایی مانند CodeVision برای میکروکنترلر ها برنامه نوشته اند برای اینکه بتوانند برای آردوینو برنامه نویسی کنند باید با توابع مخصوص زبان برنامه نویسی آردوینو آشنا شوند.

همه برنامه های نوشته شده برای آردوینو شامل ۳ جزء اصلی است که در ادامه به آن خواهیم پرداخت.

  1. توابع (Functions)
  2. متغیر ها و ثابت ها (Variables And Constants)
  3. ساختار ها (Structures)

۱٫ توابع آردوینو

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

توابع زبان برنامه نویسی آردوینو Arduino Functions

به یاد داشته باشید برای عملکرد صحیح برنامه های آردوینو باید حروف استفاده شده برای نام گذاری توابع آردوینو را به درستی بنویسید. زمانی که عنوان یک تابع را در محیط آردوینو IDE به درستی بنویسید اسم تابه به رنگ نارنجی تغییر رنگ می دهد. نام گذاری اکثریت توابع اختصاصی آردوینو بر اساس استاندارد نام گذاری camelCase انجام شده است.

توابع ورودی خروجی (I/O)

توابع ورودی خروجی آردوینو Arduino I/O Functions

در بخش اول توابع مربوط به ورودی خروجی (I/O) های دیجیتال و آنالوگ را مورد بررسی قرار می دهیم.

۱-۱٫ تابع pinMode

تابع pinMode یکی از پر استفاده ترین توابع آردوینو است که تقریبا در ابتدای اکثریت برنامه های آردوینو مشاهده می شود. این تابع در واقع مشخص کننده استفاده ما از هر یک از پین های آردوینو است. با استفاده از این تابع شما می توانید پین های آردوینو را به صورت خروجی، ورودی یا ورودی پول آپ شده تعریف کنید.

۱-۲٫ تابع digitalRead

تابع digitalRead آردوینو به شما این امکان را می دهد تا مقدار دیجیتال پین های ورودی آردوینو را از ورودی ها بخوانید. خروجی این تابع یک مقدار دوگانه است که یا HIGH و یا LOW است. در واقع این تابع ولتاژی که به پین های ورودی می رسد را براساس منطق دیجیتال به ۰ یا ۱ تبدیل می کند و نتیجه را به شما بر میگرداند. HIGH برابر ۱ و LOW متناظر با ۰ است.

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

۱-۳٫ تابع digitalWrite

تابع digitalWrite می تواند مقدار پین های خروجی را به ۰ یا ۱ تغییر وضعیت دهد. در واقع اگر یک پین را به عنوان خروجی تعریف کرده باشید با استفاده از این تابع می توانید وضعیت پین را HIGH یا LOW کنید. در حالت LOW ولتاژ پین مورد نظر شما به ۰ ولت و در حالت HIGH ولتاژ پین مورد نظر شما در برد های ۵ ولتی مانند آردوینو UNO به ۵ ولت و در برد های آردوینو ۳٫۳ ولتی به ۳٫۳ ولت خواهد رسید. در صورتی که پین مورد نظر شما از نوع ورودی تعریف شده باشد اگر با استفاده از تابع digitalWrite پین مورد نظر را HIGH کنید، مقاومت پول آپ پین مورد نظر فعال می شود. البته برای پول آپ کردن پین های ورودی توصیه می شود از تابع pinMode استفاده کنید.

تابع digitalWrite هم مانند تابع pinMode دارای ۲ پارامتر ورودی اصلی است که پارامتر اول شماره پین و پارامتر دوم مقدار مورد نظر شما (HIGH یا LOW) است.

۱-۴٫ تابع analogRead

همان طور که می دانید برد های آردوینو دارای پین های ویژه ای هستند که برای اندازه گیری ولتاژ های آنالوگ مورد استفاده قرار می گیرند. این پین ها را می توانید بر روی برد آردوینو با نام هایی مانند A0, A1, A2 … An مشاهده کنید. با استفاده از دستور analogRead شما می توانید به سادگی و بدون نیاز به محاسبات ریاضی مقدار ولتاژ آنالوگ را در مقایسه با ولتاژ رفرنس آنالوگ که در حالت پیشفرض در برد های ۵ ولتی برابر ۵ ولت و در برد های ۳٫۳ ولتی برابر ۳٫۳ ولت است در ADC های ۱۰ بیتی ( مانند آردوینو UNO )‌ به صورت عددی بین ۰ تا ۱۰۲۳ و در ADC های ۱۲ بیتی به صورت عددی بین ۰ تا ۴۰۹۶ مشاهده نمایید.

در واقع این تابع ولتاژ اعمال شده به پین مورد نظر شما را با ولتاژ مرجع آنالوگ (Aref) مقایسه می کند و جواب کسر به دست آمده را به عددی بین ۰ تا ۱۰۲۳ یا ۰ تا ۴۰۹۵ تبدیل می کند که ۰ نشان دهنده ولتاژ ۰ ولت و ۱۰۲۳ یا ۴۰۹۵ نشان دهنده ولتاژی برابر ولتاژ Aref است.

به عنوان مثال اگر شما به پین A0 برد آردوینو UNO که از یک ADC 10 بیتی استفاده می کند ( با تنظیمات پیشفرض آردوینو که Aref برابر ۵ ولت است ) یک ولتاژ ۲٫۵ ولتی اعمال کنید با استفاده از تابع analogRead عدد ۵۱۲ برای این پورت به شما برگردانده می شود.

تابع analogRead دارای یک پارامتر ورودی است که در واقع نام پین آنالوگ است. برخلاف تابع digitalRead که شماره پین را در ورودی دریافت می کرد در تابع analogRead باید نام پین را که با حرف A شروع می شود وارد کنید به عنوان مثال A0.

۱-۵٫ تابع analogWrite

این تابع بر خلاف اسم آن هیچ ارتباط مستقیمی به سیگنال های آنالوگ ندارد! بسیاری از افراد فکر می کنند آردوینو دارای خروجی آنالوگ است اما این در حالی است که میکروکنترلر روی برد اکثر برد های رایج آردوینو فاقد DAC هستند و هیچ ماژول DAC بر روی برد قرار داده نشده است. بنابراین برد های آردوینو رایج نمی توانند خروجی آنالوگ داشته باشند و در صورت نیاز به سیگنال های آنالوگ حتما باید از ماژول های DAC استفاده کنید. اما عملکرد واقعی این تابع چیست؟ اگر جلسه اول آموزش آردوینو دیجی نیک را دنبال کرده باشید حتما به طور کلی با مفهوم PWM آشنا شده اید. در واقع این تابع امکان مقدار دهی به خروجی های PWM را برای شما فراهم می کند.

اگر نگاه دقیق تری به برد آردوینو خود بیندازید احتمالا پین هایی را مشاهده می کنید که در کنار شماره آنها علامت تیلدا (~)‌ یا همان مد قرار داده شده است. این پین ها می توانند خروجی های PWM را در اختیار شما قرار دهند. PWM یک تکنیک الکترونیکی است که شما می توانید با استفاده از پالس های دیجیتال ولتاژ میانگین (Average Voltage) را در حد دلخواه خود بین ولتاژ LOW و HIGH دیجیتال تنظیم کنید.

به عنوان مثال می توانید نور یک LED را با استفاده از این دستور کم و زیاد کنید یا سرعت یک موتور DC را افزایش و کاهش دهید. حداقل ولتاژ میانگین در این روش می تواند برابر سطح ولتاژ منطق LOW که معمولا برابر ۰ ولت است و حداکثر ولتاژ می تواند برابر سطح ولتاژ یک منطقی یا HIGH که در برخی برد های آردوینو مانند UNO 5 ولت و در برخی ۳٫۳ ولت است برسد.

دقت ولتاژ میانگین خروجی ۰٫۰۰۴ ولتاژ برد آردوینو است به عنوان مثال دقت ولتاژ میانگین خروجی برد آردوینو UNO برابر ۰٫۰۲ ولت است.

تابع analogWrite دارای دو پارامتر ورودی اصلی است که پارامتر اول شماره پین را دریافت می کند و پارامتر دوم مقدار خروجی را به صورت عددی بین ۰ تا ۲۵۵ دریافت می کند که ۰ به معنی ولتاژ ۰ ولت و ۲۵۵ به معنی حداکثر ولتاژ و برابر ولتاژ VCC میکروکنترلر است.

در صورتی که از دستور analogWrite استفاده کنید نیازی به تعریف پین به عنوان خروجی با استفاده از دستور pinMode نخواهید داشت و با استفاده از این دستور به طور خودکار پین مورد نظر شما به صورت خروجی عمل خواهد نمود.

۱-۶٫ تابع analogReference

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

در ADC های ۱۰ بیتی مانند برد آردوینو UNO محاسبه به این شکل است:

نحوه محاسبه مقدار آنالوگ (ADC)‌ در برد آردوینو

در ADC های ۱۲ بیتی محاسبه مقدار ADC به شکل زیر است:

محاسبات ADC در مبدل های آنالوگ به دیجیتال 12 بیتی

در برد های آردوینو ۵ ولتی ولتاژ مرجع آنالوگ (Analog Reference) در حالت پیشفرض برابر ۵ ولت و در برد های ۳٫۳ ولتی برابر ۳٫۳ ولت قرار داده شده است. بنابراین شما می توانید در حالت پیشفرض ولتاژ های ۰ تا ۵ ولت یا ۰ تا ۳٫۳ ولت را اندازه گیری نمایید. اما بسیاری از اوقات خروجی سنسور های آنالوگ در محدوده ی کوچکتری قرار دارد، به عنوان مثال ممکن است خروجی یک سنسور ولتاژ ۱ الی ۱٫۹ ولت باشد. در این حالت به علت اینکه ولتاژ ورودی ما هیچ وقت بیشتر از ۲ ولت نمی شود به منظور افزایش Resolution (وضوح) مبدل آنالوگ به دیجیتال می توانیم با کاهش ولتاژ مرجع آنالوگ به ۱٫۹ ولت دقت اندازه گیری مقدار سنسور را تا حد بسیار قابل توجهی افزایش دهیم. در این مثال با برد اردوینو اونو که یک برد ۵ ولتی با ADC ده بیتی است، در حالت پیشفرض به ازای هر ۰/۰۰۴۸۸۲۸۱۲۵ ولت یک واحد تغییر می کند اما اگر ولتاژ Aref را به ۱٫۹ ولت کاهش دهیم به ازای هر ۰/۰۰۱۸۵۵۴۶۸۷۵ ولت یک ADC یک واحد تغییر می کند. یعنی دقت یا وضوح مبدل ما ۲٫۶ برابر می شود.

تابع analogReference امکان تغییر تنظیمات ADC را برای شما فراهم می کند.

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

توابع زمان Time

توابع زمان آردوینو Arduino Time Functions

در این بخش به بررسی کاربرد توابع مربوط به زمان می پردازیم.

۱-۷٫ تابع delay

این تابع همان طور که از نام آن پیداست و مانند بسیاری دیگر از زبان های برنامه نویسی جهت ایجاد تاخیر در روند اجرای برنامه به کار می رود. از آنجا که فرکانس میکروکنترلر ها بیش از ۱۰ مگاهرتز است، اکثر میکروکنترلر ها می توانند میلیون ها دستور را در ثانیه اجرا کنند. بنابراین علی الخصوص زمانی که بر اساس loop در آردوینو برنامه نویسی می کنیم، تابع استفاده از تابع delay بسیار ضروری است.

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

۱-۸٫ تابع delayMicroseconds

تابع delayMicroseconds عملکردی مشابه تابع delay دارد و اجرای ادامه برنامه را برای مدت مشخصی متوقف می کند، اما بر خلاف تابع delay که واحد زمان را بر حسب میلی ثانیه دریافت می کرد، این تابع مدت زمان تاخیر را بر حسب میکروثانیه دریافت می کند! هر یک ثانیه برابر ۱۰۰۰ میلی ثانیه و برابر یک میلیون میکروثانیه است. در واقع هر یک میلی ثانیه برابر ۱۰۰۰ میکروثانیه است. علت استفاده از این تابع ایجاد تاخیر های بسیار کوتاه است. زمانی که می خواهیم دستگاه ما با انسان ها تعامل داشته باشد به عنوان مثال یک پیام را به یک انسان نمایش دهد یا منتظر انتخاب شدن یک گزینه توسط یک انسان بماند باید از تاخیر هایی در حد چند ثانیه یا چند هزار میلی ثانیه استفاده کنیم. اما زمانی که می خواهیم یک پیام را از طریق پروتکل های ارتباطی به یک دستگاه یا ماژول الکترونیکی ارسال کنیم، اگر از تاخیر های میلی ثانیه ای استفاده کنیم ارتباطمان بسیار کند خواهد شد و ممکن است حتی ارتباط از بین برود. بنابراین در این صورت باید از تاخیر های بسیار کمتر و در حد میکروثانیه استفاده کنیم.

تابع delayMicroseconds دارای یک پارامتر ورودی است که در واقع میزان تاخیر مورد نیاز را بر حسب میکروثانیه مشخص می کند.

۱-۹٫ تابع milis

اگر می خواهید بدانید مقدار آپ تایم یا زمان روشن بودن آردوینو بعد از آخرین روشن شدن یا ریست شدن را بدانید تابع milis می تواند این مقدار را برای شما نمایش دهد. این تابع زمانی که از آخرین ریست یا روشن شدن آردوینو می گذرد را بر حسب میلی ثانیه به شما نمایش می دهد. این تابع می تواند تقریبا تا ۵۰ روز زمان را شمارش کند و در صورتی که برد آردوینو شما به مدت ۵۰ روز روشن بماند، مجددا از صفر شروع به شمارش می کند.

این تابع بر خلاف توابع قبلی فاقد پارامتر ورودی است اما دارای خروجی است. خروجی این تابع بر اساس عدد طولانی بدون علامت (unsigned long) است.

دقت داشته باشید با خاموش شدن یا ریست شدن برد آردوینو این مقدار صفر می شود!

۱-۱۰٫ تابع micros

عملکرد این تابع مشابه تابع milis است با این تفاوت که تابع micros زمان روشن بودن آردوینو را بر حسب میکرو ثانیه نمایش می دهد. خروجی این تابع تقریبا هر ۷۰ دقیقه یکبار صفر می شود و شمارش را از ابتدا شروع می کند.

این تابع نیز فاقد پارامتر ورودی است و فقط خروجی دارد. خروجی این تابع بر اساس عدد طولانی بدون علامت (unsigned long) است.

دقت داشته باشید با خاموش شدن یا ریست شدن برد آردوینو این مقدار صفر می شود!

1 نظر
  1. amir می گوید

    با سلام
    در مورد استفاده از اینتراپت ها دستوراتی وجود ندارد؟

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.