دستورات پایه دستوراتی هستند که تقریبا در تمام کد های آردوینو استفاده میشوند.
void setup() { // put your setup code here, to run once: // کد های ستاپ خود را اینجا بنویسید تا فقط یکبار اجرا شوند } void loop() { // put your main code here, to run repeatedly: // کد های اصلی خود را اینجا بنویسید تا مکرر اجرا شوند }
کد بالا یک کد پایه است که در بدو باز کردن نرمافزار آردوینو با آن مواجه میشوید. اگر با این کد مواجه نشدید، با کلیدهای ترکیبی ctrl + N میتوانید یک پروژه جدید با این کدهای پایه ایجاد کنید. در خط اول، شروع بخش ()setup را میبینیم ؛ کدهایی که در بخش ()setup نوشته میشوند فقط یکبار اجرا میشوند. در خط های بعدی، شروع بخش ()loop را میبینیم. ()loop به معنای حلقه است و هر کدی که در آن نوشته شود، برای همیشه تکرار میشود. به متن های خاکستری رنگ که در بخش ()setup و ()loop نوشته شدهاند، کامنت (comment) گفته میشود. کامنت ها هیچ تاثیری در کد ایجاد نمیکنند و برای یادداشتگذاری استفاده میشوند و حذف آنها هیچ مشکلی در کد ایجاد نمیکند. تمامی کد هایی که میخواهیم در بخش ()setup یا ()loop بنویسیم، باید بین { } نوشته شوند تا به درستی کار کنند.
int myVariable = 10; void setup() { // put your setup code here, to run once: // کد های ستاپ خود را اینجا بنویسید تا فقط یکبار اجرا شوند } void loop() { // put your main code here, to run repeatedly: // کد های اصلی خود را اینجا بنویسید تا مکرر اجرا شوند }
در آردوینو، انواع مختلفی از متغیرها وجود دارد که هریک برای ذخیرهسازی یک نوع مقدار خاص به کار میروند. درکل متغیرها برای ذخیرهسازی مقدارهای زیر بهکار میروند :
متغیرها معمولا بالاتر از کدهای اصلی معرفی میشوند و در طول کد از آنها استفاده میشود. ساختار متغیرها به شکل زیر است:
از این دستور همراه با INPUT / OUTPUT استفاده میشود و تعیین کننده نوع خروجی یا ورودی پین مورد نظر است.
در این کد، نوع دیجیتال 13 برابر با خروجی قرارداده شده. یعنی میتوان از دیجیتال 13 برای روشن و خاموش کردن LED یا هرچیز دیگر استفاده کرد.
و در این کد، نوع دیجیتال 13 برابر با ورودی قرارداده شده. یعنی میتوان از دیجیتال 13 برای گرفتن ورودی از کلید پوش باتن و ... استفاده کرد.
از این دستور در بخش ()setup استفاده میشود. وقتی میخواهیم نوع پایه مورد نظر ورودی باشد، از ;(INPUT ,پایه مورد نظر)pinMode استفاده میکنیم. و بلعکس، وقتی میخواهیم پایه مورد نظر خروجی باشد، از کد ;(OUTPUT ,پایه مورد نظر)pinMode استفاده میکنیم.
از این دستور برای فعال(روشن یا 1) یا غیرفعال(خاموش یا 0) کردن یک پین استفاده میشود. میتوان برای فعال کردن از HIGH یا 1 استفاده کرد.
هردوی این کدها به معنای روشن شدن پین دیجیتال 13 هستند. این کدها درصورتی کار میکنند که از قبل در بخش ()setup، نوع ()pinMode آنها را مشخص کرده باشید. همچنین باید کلمات HIGH و LOW را با حروف بزرگ بنویسید.
هردوی این کدها به معنای خاموش شدن پین دیجیتال 13 هستند. این کدها درصورتی کار میکنند که از قبل در بخش ()setup، نوع ()pinMode آنها را مشخص کرده باشید. همچنین باید کلمات HIGH و LOW را با حروف بزرگ بنویسید.
برای روشن یا فعال کردن یک پین میتوان از HIGH یا 1 استفاده کرد و برای خاموش یا غیرفعال کردن هم میتوان از LOW یا 0 استفاده کرد، ولی معمولا برای خوانایی بهتر کد از HIGH یا LOW استفاده میشود.
از این دستور برای خواندن وضعیت روشن یا خاموش بودن یک پایه دیجیتال استفاده میشود.
کد بالا وضعیت روشن یا خاموش بودن پایه دیجیتال 13را برمیگرداند. نیازی نیست که حتما ()pinMode پایه موردنظر INPUT باشد، در حالت OUTPUT نیز مقدار صحیحی برمیگرداند.
از این کد میتوان برای پایه های INPUT و OUTPUT استفاده کرد و لزومی بر اینکه پایه فقط INPUT باشد نیست. این کدها در دستورات شرطی کاربرد بسیاری دارند؛ مثلا اگر دیجیتال 13 فعال بود، دیجیتال 12 غیرفعال باشد، این شرط را میتوان با دستورات شرطی و ()digitalRead نوشت.
از این دستور برای تعیین مقدار یک پایه PWM استفاده میشود.
کد بالا مقدار PWM پین دیجیتال 6 (دیجیتال 6 یک پین دارای PWM است) را برابر با 150 قرار میدهد. از این دستور برای دیجیتال های دارای PWM استفاده میشود و ربطی به پین های آنالوگ ندارد.
از این دستورها فقط برای پایه های دارای PWM میتوان استفاده کرد. پایه های PWM در کنار پین ها با علامت ~ مشخص شدهاند. مقدار آنها را نیز میتوان بین 0 تا 255 تنظیم کرد. همانطور که گفته شد، این دستورات ربطی به پین های آنالوگ ندارند و برای پین های PWM کاربرد دارند.
پین های دارای PWM در آردوینو UNO (در برد های NANO و Pro mini و Mega328 نیز مشابه است) بدین ترتیب است↓↓
از این دستور برای خواندن مقدار ورودی یک پایه آنالوگ استفاده میشود.
کد بالا مقدار آنالوگ 0 را برمیگرداند.
مقدار آنالوگ میتواند بین 0 تا 1023 متغیر باشد. یعنی اگر ولتاژ ورودی آنالوگ 0 ولت باشد، مقدار آنالوگ 0 است و اگر 5 ولت باشد، مقدار آنالوگ 1023 است. برخلاف پایه های دیجیتال، پایه های آنالوگ نیاز به معرفی به صورت ()pinMode ندارند.
از این دستور برای ایجاد تأخیر بر حسب میلیثانیه استفاده میشود.
کد بالا، 500 میلیثانیه یا 0.5 ثأنیه تاخیر در کد ایجاد میکند.
در زمان تأخیر، تمام کدها متوقف میشوند و تا پایان تأخیر، هیچ کدی اجرا نمیشود. دستور دیگری به نام milis وجود دارد که بدون توقف کدها تأخیر ایجاد میکند که آن را در ادامه میآموزیم
از این دستور برای تعیین نرخ تبادل اطلاعات در سریال مانیتور استفاده میشود.
کد بالا تعیین میکند که نرخ تبادل اطلاعات سریال مانیتور 9600 باشد.
از این دستور در بخش ()void setup استفاده میشود. حرف S در Serial.begin حرف بزرگ است و در صورت استفاده از s کوچک، کد به درستی کار نمیکند. این دستور برای تبادل اطلاعات بین آردوینو و سریال مانیتور استفاده میشود. برای ارتباط ساده در محیط های پرنویز، 9600 گزینه مناسب است. به طور کلی سریع ترین نرخ قابل اعتماد، 115200 است و برای اکثر برنامه ها توصیه میشود، مگر اینکه محدودیت سختافزاری وجود داشته باشد. با در نظر گرفتن نویز و محدودیت سختافزاری و ...، قابل اعتماد ترین و بهترین گزینه 9600bps است.
نرخ های تبادل اطلاعات در آردوینو به ترتیب زیر هستند:
از این دستور برای نمایش اطلاعات و نوشته مورد نظر در سریال مانیتور استفاده میشود. اگر چند متن بنویسیم، همگی پشت سر هم چاپ میشوند.
کد بالا متن Hello World را در سریال مانیتور نمایش میدهد.
از این دستور پس از معرفی نرخ تبادل اطلاعات در setup میتوان استفاده کرد. حرف S در املای ()Serial.print حرف بزرگ است و در صورت استفاده از s کوچک، کد به درستی کار نمیکند. برای نوشتن متن، متن مورد نظر را بین کوتیشن(' ') یا دابلکوتیشن(" ") قرار میدهیم و برای نوشتن مقدار یک متغیر، فقط اسم متغیر را بدون کوتیشن یا دابلکوتیشن مینویسیم.
از این دستور برای نمایش اطلاعات و نوشته مورد نظر در سریال مانیتور، در یک خط جدید استفاده میشود.
کد بالا متن Hello World را در سریال مانیتور، در یک خط جدا نمایش میدهد. یعنی اگر چند متن بنویسیم، هرکدام در یک خط جدا چاپ میشود.
از این دستور پس از معرفی نرخ تبادل اطلاعات در setup میتوان استفاده کرد. حرف S در املای ()Serial.println حرف بزرگ است و در صورت استفاده از s کوچک، کد به درستی کار نمیکند. برای نوشتن متن، متن مورد نظر را بین کوتیشن(' ') یا دابلکوتیشن(" ") قرار میدهیم و برای نوشتن مقدار یک متغیر، فقط اسم متغیر را بدون کوتیشن یا دابلکوتیشن مینویسیم.
دستورات شرطی دستوراتی هستند که در صورت برقرار بودن یک شرط، کد داخلشان را اجرا میکنند. در این بخش به ساختار آنها میپردازیم.
if (شرط برقرار بود) { دستوراتی که باید اجرا شوند }
در صورتی که شرط داخل پرانتز برقرار بود، کدهای داخل if اجرا میشوند.
void setup() { pinMode(13, OUTPUT); } void loop() { if (5 - 4 == 1) { digitalWrite(13, HIGH); } }
در کد بالا از دستور شرطی if استفاده شده. شرط تعریف شده این است که آیا 4 - 5 مساوی با 1 میشود یا خیر؛ چون شرط صحیح(true) است، کد داخل if اجرا میشود و دیجیتال 13 فعال(روشن) میشود. همچنین در بخش setup، نوع پایه دیجیتال 13 روی OUTPUT(خروجی) تنظیم شده است.
if (شرط برقرار بود) { دستوراتی که باید اجرا شوند } else { در غیر این صورت دستورات دیگری که باید اجرا شوند }
در صورتی که شرط داخل پرانتز برقرار بود، کدهای داخل if اجرا میشوند و در غیر این صورت، دستورات داخل else اجرا میشوند.
void setup() { pinMode(13, OUTPUT); } void loop() { if (2 * 2 == 5) { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } }
در کد بالا از دستور شرطی else و if استفاده شده. شرط تعریف شده این است که آیا 2 * 2 مساوی با 5 میشود یا خیر؛ چون شرط نادرست(false) است، کد داخل if اجرا نمیشود و کد داخل else اجرا میشود. کد داخل else، دیجیتال 13 را فعال(روشن) میکند. در بخش setup نیز نوع پایه دیجیتال 13 برابر با OUTPUT(خروجی) قرارداده شده.
if (شرط برقرار بود) { دستوراتی که باید اجرا شوند }else if (شرط دوم برقرار بود) { دستورات دیگری که باید اجرا شوند }else { در غیر این صورت دستورات دیگری که باید اجرا شوند }
در صورتی که شرط اول برقرار بود، کدهای داخل if اول اجرا میشوند. اگر شرط اول برقرار نبود، شرط دوم بررسی میشود و اگر شرط دوم برقرار بود، کدهای داخل if دوم اجرا میشوند و اگر هیچکدام از شرط ها درست(true) نبودند، شرط های بخش else اجرا میشود. از این دستورات میتوان بدون else استفاده کرد. همچنین میتوان این رشته شرایط را بیشتر ادامه داد و محدودیتی وجود ندارد.
void setup() { pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); } void loop() { if (2 * 2 == 5) { digitalWrite(13, HIGH); }else if (2 * 2 == 6) { digitalWrite(12, HIGH); }else if (2 * 2 == 4) digitalWrite(11, HIGH); }
در کد بالا از شرط های رشتهای استفاده شده. شرط اول بررسی میکند که آیا 2 * 2 مساوی با 5 میشود یا خیر، چون شرط نادرست(false) است، کدهای داخل if اول اجرا نمیشوند و شرط دوم بررسی میشود. شرط دوم بررسی میکند ک آیا 2 * 2 مساوی با 6 میشود یا خیر؛ چون شرط نادرست(false) است، کدهای داخل if دوم نیز اجرا نمیشود و شرط سوم بررسی میشود. شرط سوم بررسی میکند که آیا 2 * 2 مساوی با 4 میشود یا خیر، چون شرط درست(true) است، کدهای داخل if اجرا میشوند و پین دیجیتال 11 روشن میشود. در این شرط های رشته ای از else استفاده نشده است
for (int i; i < 5; i++) { دستوراتی که باید 5 بار اجرا شوند }
ساختار for :
for (مقدار افزایش در هر اجرا ;شرط ;معرفی متغیر اولیه;) { دستوراتی که باید 5 بار اجرا شوند }
void setup() { pinMode(13, OUTPUT); } void loop() { for (int i = 0; i < 5; i++) { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); } }
در کد بالا، یک حلقه for وجود دارد که کد داخلش را 5 بار تکرار میکند. در پرانتز for، یک متغیر به نام i معرفی شده که مقدار اولیه آن 0 است. سپس تعریف شده که این حلقه تا زمانی تکرار شود که متغیر i کمتر از 5 است، یعنی 5 بار؛ و بعد هم نوشته شده که در هر اجرا، یک واحد به متغیر i اضافه شود(++i). کد داخل for، دیجیتال 13 را روشن میکند، نیم ثانیه(500 میلیثانیه) صبر میکند و سپس دیجیتال 13 را خاموش میکند و دوباره نیم ثانیه صبر میکند. در مجموع وقتی این کدها اجرا شوند، دیجیتال 13، 5 بار خاموش و روشن میشود.
void setup() { Serial.begin(9600); } void loop() { for (int i = 0; i < 10; i++) { Serial.println(i); } }
در کد بالا در بخش setup، نرخ تبادل اطلاعات بین آردوینو و سریال مانیتور، روی 9600 تنظیم شده. در بخش loop، یک حلقه for وجود دارد که کد داخلش را 10 بار تکرار میکند. کد داخل for، هربار که اجرا میشود مقدار متغیر i را در یک خط جدید چاپ میکند. بنابراین اعداد 0 تا 10 در سریال مانیتور چاپ میشوند.
while (تا وقتی که شرط برقرار است) { دستوراتی که باید اجرا شوند }
تا وقتی که شرط برقرار و true است، کدهای داخل while همواره اجرا میشوند.
void setup() { pinMode(13, OUTPUT); pinMode(12, INPUT); } void loop() { while (digitalRead(12) == HIGH) { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); } }
کد بالا، تا وقتی که دیجیتال 12 روشن و فعال است، دیجیتال 13 را فعال میکند. دیجیتال 12 ورودی است و میتواند به قطعهای مثل کلید پوش باتن متصل شود و وقتی که کلید را بفشاریم، دیجیتال 13 فعال و روشن میشود.
در این بخش ، شما به تعدادی از پروژههای ساده و آموزشی به همراه شماتیک و کد دسترسی دارید. در این پروژهها از دستورات پرکاربرد و پراستفاده در زبان ++C استفاده شده و تمرینهای بسیار خوبی برای تثبیت یادگیری آردوینو هستند.
این پروژه الایدی چشمکزن است ، پروژه ای که %90 برنامهنویسان از اینجا آغاز کردهاند! این پروژه درعین سادگی ، بسیار لذتبخش است ، چون احتمالا اولین پروژه شما نیز هست!
در این پروژه ، ما میتوانیم یک الایدی را با کلید پوشباتن خاموش یا روشن کنیم. در این پروژه ما از دستورات شرطی و دیجیتال های ورودی و خروجی استفاده میکنیم.
در این پروژه ، ما یک رقص نور با 5 الایدی میسازیم که الایدی ها پشتسرهم روشن میشوند.
در این پروژه ، ما یک رقص نور پلیسی با 4 الایدی میسازیم که الایدی ها به صورت پلیسی روشن و خاموش میشوند.
در این پروژه ، یک چراغ راهنمایی ساده با 3 الایدی میسازیم.
در این پروژه ، با بازر 5 ولت ، یک دستگاه موزیکال میسازیم که میتوانیم با خلاقیت خود و تنظیم تُن های مختلف ، آهنگ های محتلف و متنوع بسازیم.
کتابخانههای آردوینو، مجموعههایی از توابع از پیش نوشته شده هستند که برای ساده شدن توسعه برنامههای آردوینو طراحی شدهاند. این کتابخانهها، کدهای تکراری را حذف کرده و امکان دسترسی به سختافزارها و انجام وظایف خاص را بدون نیاز به نوشتن کد پیچیده فراهم میکنند. استفاده از کتابخانهها، سرعت توسعه را افزایش داده، خوانایی کد را بهبود بخشیده و از بروز خطا جلوگیری میکند. کتابخانهها معمولاً برای کنترل سنسورها، نمایشگرها، موتورها و سایر قطعات جانبی به کار میروند و به عنوان یک منبع ارزشمند برای برنامهنویسان آردوینو محسوب میشوند.
برای دانلود کتابخانه مورد نظر روی آن کلیک کنید.
LiquidCrystal
السیدی کاراکتری یک نوع نمایشگر از نوع السیدی است. از این نمایشگرها برای نمایش متن ها و کاراکترهای مختلف استفاده میشود.
تعداد کتابخانهها: یک عددAdafruit-GFX --- Adafruit-SSD1306 --- SPI --- Wire
نمایشگر oled یک نوع نمایشگر الایدی در سایز های مختلف است. از این نمایشگر برای نمایش متن ، کاراکتر و عکس بیتمپ استفاده میشود.
تعداد کتابخانهها: چهار عددNewPing
ماژول التراسونیک یک ماژول برای اندازهگیری فاصله است. معمولا برای ربات های تشخیص مانع فاصلهسنج استفاده میشود.
تعداد کتابخانهها: یک عددServo
سروو موتورها نوعی موتور الکتریکی هستند که میتوانند به طور دقیق به یک زاویه خاص بچرخند و در آن موقعیت ثابت بمانند. این ویژگی آنها را برای کاربردهایی مانند رباتیک، هواپیماهای کنترلی و سیستمهای کنترلی بسیار مناسب میکند.
تعداد کتابخانهها: یک عددkeypad
کیپد یک صفحه کلید است که برای وارد کردن اطلاعات عددی یا کاراکترها به رباتها یا دستگاههای صنعتی استفاده میشود.
تعداد کتابخانهها: یک عددMFRC522
RFID یک فناوری است که از امواج رادیویی برای شناسایی و ردیابی برچسبها یا کارتهای RFID استفاده میکند. به عبارت ساده، به جای اسکن بارکد، یک تگ RFID اطلاعات را به صورت بیسیم به یک گیرنده ارسال میکند.
تعداد کتابخانهها: یک عددابتدا از بالای صفحه، گزینه sketch را انتخاب کنید.
سپس از بخش Include Library ، گزینه ...Add .ZIP Library را انتخاب کنید.
سپس فایل دانلود شده خود با پسوند ZIP. را انتخاب کنید.
روی open کلیک کنید و منتظر بمانید تا کتابخانه نصب شود.
التراسونیک یک ماژول بسیار کاربردی در رباتیک است که برای سنجش فاصله استفاده میشود. از پرژههایی که از التراسونیک استفاده میکنند میتوان به: متر دیجیتال ، ربات تشخیصمانع و رادار اشاره کرد. در در این بخش به برخی مثالها از کتابخانه NewPing میپردازیم. کتابخانه NewPing در آردوینو برای کار با سنسورهای فاصلهسنج التراسونیک (مانند HC-SR04) طراحی شده است. این کتابخانه نسبت به روش استاندارد pulseIn() کاراتر و دقیقتر است، زیرا:
سروو موتور (Servo Motor) یک قطعه الکترومکانیکی است که برخلاف موتورهای معمولی، به شما اجازه میدهد محور آن را با دقت بسیار بالا در زاویه یا موقعیت مشخصی قرار دهید و همانجا نگه دارید. سروو موتورها شامل یک موتور DC، یک چرخدنده برای افزایش گشتاور و یک مدار کنترل داخلی هستند. یک «پتانسیومتر» داخلی هم وظیفه دارد موقعیت فعلی محور را به مدار کنترل گزارش کند تا اگر فشار خارجی باعث جابهجایی آن شد، مدار بلافاصله آن را به موقعیت اصلی بازگرداند. در آردوینو (و پلتفرمهای مشابه)، برای کنترل سادهی این موتورها از کتابخانهای به نام Servo.h استفاده میشود.