آموزش مفاهیم پایه آردوینو

دستورات پایه دستوراتی هستند که تقریبا در تمام کد های آردوینو استفاده می‌شوند.

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: // کد های اصلی خود را اینجا بنویسید تا مکرر اجرا شوند }

در آردوینو، انواع مختلفی از متغیرها وجود دارد که هریک برای ذخیره‌سازی یک نوع مقدار خاص به کار می‌روند. درکل متغیرها برای ذخیره‌سازی مقدارهای زیر به‌کار می‌روند :

  • int myVariable = 10; // عدد صحیح
  • float myVariable = 5.67; // عدد اعشاری
  • double myVariable = 1.2345678; // عدد اعشاری با اعشار بالا
  • char myVariable = 'A'; // یک حرف انگلیسی
  • const int myVariable = 15; // ذخیره سازی یک عدد صحیح ثابت و غیرقابل تغییر
  • bool myVariable = true; // true یا false ذخیره سازی بولین
  • int: برای ذخیره‌سازی اعداد صحیح به‌کار می‌رود
  • float: برای ذخیره سازی اعداد اعشاری به‌کار می‌رود
  • double: برای ذخیره سازی اعداد اعشاری با اعشار بیشتر به کار می‌رود
  • char: برای ذخیره سازی فقط یک حرف استفاده می‌شود
  • const: از این دستور فقط برای ذخیره‌سازی یک مقدار استفاده می‌شود و قابل تغییر نیست
  • bool: استفاده می‌شود (true و false) فقط برای ذخیره‌سازی بولین‌ها

متغیر‌ها معمولا بالاتر از کدهای اصلی معرفی می‌شوند و در طول کد از آنها استفاده می‌شود. ساختار متغیرها به شکل زیر است:

;مقدار اولیه متغیر = اسم متغیر نوع متغیر

;int myVariable = 10
;()pinMode

از این دستور همراه با INPUT / OUTPUT استفاده می‌شود و تعیین کننده نوع خروجی یا ورودی پین مورد نظر است.

مثال:

;pinMode(13, OUTPUT)

در این کد، نوع دیجیتال 13 برابر با خروجی قرارداده شده. یعنی می‌توان از دیجیتال 13 برای روشن و خاموش کردن LED یا هرچیز دیگر استفاده کرد.

;pinMode(13, INPUT)

و در این کد، نوع دیجیتال 13 برابر با ورودی قرارداده شده. یعنی می‌توان از دیجیتال 13 برای گرفتن ورودی از کلید پوش باتن و ... استفاده کرد.

توضیحات و نکات بیشتر

از این دستور در بخش ()setup استفاده می‌شود. وقتی میخواهیم نوع پایه مورد نظر ورودی باشد، از ;(INPUT ,پایه مورد نظر)pinMode استفاده می‌کنیم. و بلعکس، وقتی می‌خواهیم پایه مورد نظر خروجی باشد، از کد ;(OUTPUT ,پایه مورد نظر)pinMode استفاده می‌کنیم.

;()digitalWrite

از این دستور برای فعال(روشن یا 1) یا غیرفعال(خاموش یا 0) کردن یک پین استفاده می‌شود. می‌توان برای فعال کردن از HIGH یا 1 استفاده کرد.

مثال:

;digitalWrite(13, HIGH)

یا:

;digitalWrite(13, 1)

هردوی این کدها به معنای روشن شدن پین دیجیتال 13 هستند. این کدها درصورتی کار می‌کنند که از قبل در بخش ()setup، نوع ()pinMode آنها را مشخص کرده باشید. همچنین باید کلمات HIGH و LOW را با حروف بزرگ بنویسید.

;digitalWrite(13, LOW)

یا:

;digitalWrite(13, 0)

هردوی این کدها به معنای خاموش شدن پین دیجیتال 13 هستند. این کدها درصورتی کار می‌کنند که از قبل در بخش ()setup، نوع ()pinMode آنها را مشخص کرده باشید. همچنین باید کلمات HIGH و LOW را با حروف بزرگ بنویسید.

توضیحات و نکات بیشتر:

برای روشن یا فعال کردن یک پین می‌توان از HIGH یا 1 استفاده کرد و برای خاموش یا غیرفعال کردن هم می‌توان از LOW یا 0 استفاده کرد، ولی معمولا برای خوانایی بهتر کد از HIGH یا LOW استفاده می‌شود.

;()digitalRead

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

مثال:

;digitalRead(13)

کد بالا وضعیت روشن یا خاموش بودن پایه دیجیتال 13را برمی‌گرداند. نیازی نیست که حتما ()pinMode پایه موردنظر INPUT باشد، در حالت OUTPUT نیز مقدار صحیحی برمی‌گرداند.

توضیحات و نکات بیشتر:

از این کد می‌توان برای پایه های INPUT و OUTPUT استفاده کرد و لزومی بر اینکه پایه فقط INPUT باشد نیست. این کدها در دستورات شرطی کاربرد بسیاری دارند؛ مثلا اگر دیجیتال 13 فعال بود، دیجیتال 12 غیرفعال باشد، این شرط را می‌توان با دستورات شرطی و ()digitalRead نوشت.

;()analogWrite

از این دستور برای تعیین مقدار یک پایه PWM استفاده می‌شود.

مثال:

;analogWrite(6,150)

کد بالا مقدار PWM پین دیجیتال 6 (دیجیتال 6 یک پین دارای PWM است) را برابر با 150 قرار می‌دهد. از این دستور برای دیجیتال های دارای PWM استفاده می‌شود و ربطی به پین های آنالوگ ندارد.

توضیحات و نکات بیشتر:

از این دستورها فقط برای پایه های دارای PWM می‌توان استفاده کرد. پایه های PWM در کنار پین ها با علامت ~ مشخص شده‌اند. مقدار آنها را نیز می‌توان بین 0 تا 255 تنظیم کرد. همان‌طور که گفته شد، این دستورات ربطی به پین های آنالوگ ندارند و برای پین های PWM کاربرد دارند.

پین های دارای PWM در آردوینو UNO (در برد های NANO و Pro mini و Mega328 نیز مشابه است) بدین ترتیب است↓↓

  • D3
  • D5
  • D6
  • D9
  • D10
  • D11
;()analogRead

از این دستور برای خواندن مقدار ورودی یک پایه آنالوگ استفاده می‌شود.

مثال:

;analogRead(0)

کد بالا مقدار آنالوگ 0 را برمی‌گرداند.

توضیحات و نکات بیشتر:

مقدار آنالوگ می‌تواند بین 0 تا 1023 متغیر باشد. یعنی اگر ولتاژ ورودی آنالوگ 0 ولت باشد، مقدار آنالوگ 0 است و اگر 5 ولت باشد، مقدار آنالوگ 1023 است. برخلاف پایه های دیجیتال، پایه های آنالوگ نیاز به معرفی به صورت ()pinMode ندارند.

;()delay

از این دستور برای ایجاد تأخیر بر حسب میلی‌ثانیه استفاده می‌شود.

مثال:

;delay(500)

کد بالا، 500 میلی‌ثانیه یا 0.5 ثأنیه تاخیر در کد ایجاد می‌کند.

توضیحات و نکات بیشتر:

در زمان تأخیر، تمام کدها متوقف می‌شوند و تا پایان تأخیر، هیچ کدی اجرا نمی‌شود. دستور دیگری به نام milis وجود دارد که بدون توقف کدها تأخیر ایجاد می‌کند که آن را در ادامه می‌آموزیم

;()Serial.begin

از این دستور برای تعیین نرخ تبادل اطلاعات در سریال مانیتور استفاده می‌شود.

مثال:

;Serial.begin(9600)

کد بالا تعیین می‌کند که نرخ تبادل اطلاعات سریال مانیتور 9600 باشد.

توضیحات و نکات بیشتر:

از این دستور در بخش ()void setup استفاده می‌شود. حرف S در Serial.begin حرف بزرگ است و در صورت استفاده از s کوچک، کد به درستی کار نمی‌کند. این دستور برای تبادل اطلاعات بین آردوینو و سریال مانیتور استفاده می‌شود. برای ارتباط ساده در محیط های پرنویز، 9600 گزینه مناسب است. به طور کلی سریع ترین نرخ قابل اعتماد، 115200 است و برای اکثر برنامه ها توصیه می‌شود، مگر اینکه محدودیت سخت‌افزاری وجود داشته باشد. با در نظر گرفتن نویز و محدودیت سخت‌افزاری و ...، قابل اعتماد ترین و بهترین گزینه 9600bps است.

نرخ های تبادل اطلاعات در آردوینو به ترتیب زیر هستند:

  • 300
  • 600
  • 1200
  • 2400
  • 4800
  • 9600
  • 14400
  • 19200
  • 28800
  • 38400
  • 57600
  • 115200
;()Serial.print

از این دستور برای نمایش اطلاعات و نوشته مورد نظر در سریال مانیتور استفاده می‌شود. اگر چند متن بنویسیم، همگی پشت سر هم چاپ می‌شوند.

مثال:

;Serial.print("Hello World")

کد بالا متن Hello World را در سریال مانیتور نمایش می‌دهد.

توضیحات و نکات بیشتر:

از این دستور پس از معرفی نرخ تبادل اطلاعات در setup می‌توان استفاده کرد. حرف S در املای ()Serial.print حرف بزرگ است و در صورت استفاده از s کوچک، کد به درستی کار نمی‌کند. برای نوشتن متن، متن مورد نظر را بین کوتیشن(' ') یا دابل‌کوتیشن(" ") قرار می‌دهیم و برای نوشتن مقدار یک متغیر، فقط اسم متغیر را بدون کوتیشن یا دابل‌کوتیشن می‌نویسیم.

;()Serial.println

از این دستور برای نمایش اطلاعات و نوشته مورد نظر در سریال مانیتور، در یک خط جدید استفاده می‌شود.

مثال:

;Serial.println("Hello World")

کد بالا متن Hello World را در سریال مانیتور، در یک خط جدا نمایش می‌دهد. یعنی اگر چند متن بنویسیم، هرکدام در یک خط جدا چاپ می‌شود.

توضیحات و نکات بیشتر:

از این دستور پس از معرفی نرخ تبادل اطلاعات در setup می‌توان استفاده کرد. حرف S در املای ()Serial.println حرف بزرگ است و در صورت استفاده از s کوچک، کد به درستی کار نمی‌کند. برای نوشتن متن، متن مورد نظر را بین کوتیشن(' ') یا دابل‌کوتیشن(" ") قرار می‌دهیم و برای نوشتن مقدار یک متغیر، فقط اسم متغیر را بدون کوتیشن یا دابل‌کوتیشن می‌نویسیم.

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

if

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 { در غیر این صورت دستورات دیگری که باید اجرا شوند }

در صورتی که شرط داخل پرانتز برقرار بود، کدهای داخل 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(خروجی) قرارداده شده.

else if

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

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

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 استفاده شده و تمرین‌های بسیار خوبی برای تثبیت یادگیری آردوینو هستند.

کتابخانه چیست؟

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

برای دانلود کتابخانه مورد نظر روی آن کلیک کنید.

LiquidCrystal

Character-LCD

ال‌سی‌دی کاراکتری یک نوع نمایشگر از نوع ال‌سی‌دی است. از این نمایشگرها برای نمایش متن ها و کاراکترهای مختلف استفاده می‌شود.

تعداد کتابخانه‌ها: یک عدد
حجم کل بدون فشرده‌سازی: 34 کیلوبایت

Adafruit-GFX --- Adafruit-SSD1306 --- SPI --- Wire

oled display

نمایشگر oled یک نوع نمایشگر ال‌ای‌دی در سایز های مختلف است. از این نمایشگر برای نمایش متن ، کاراکتر و عکس بیتمپ استفاده می‌شود.

تعداد کتابخانه‌ها: چهار عدد
حجم کل بدون فشرده‌سازی: 1.9 مگابایت

NewPing

HC-04 Ultrasonic

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

تعداد کتابخانه‌ها: یک عدد
حجم کل بدون فشرده‌سازی: 47 کیلوبایت

Servo

Servo Motor

سروو موتورها نوعی موتور الکتریکی هستند که می‌توانند به طور دقیق به یک زاویه خاص بچرخند و در آن موقعیت ثابت بمانند. این ویژگی آن‌ها را برای کاربردهایی مانند رباتیک، هواپیماهای کنترلی و سیستم‌های کنترلی بسیار مناسب می‌کند.

تعداد کتابخانه‌ها: یک عدد
حجم کل بدون فشرده‌سازی: 204 کیلوبایت

keypad

Keypad

کیپد یک صفحه کلید است که برای وارد کردن اطلاعات عددی یا کاراکترها به ربات‌ها یا دستگاه‌های صنعتی استفاده می‌شود.

تعداد کتابخانه‌ها: یک عدد
حجم کل بدون فشرده‌سازی: 36 کیلوبایت

MFRC522

rfid

RFID یک فناوری است که از امواج رادیویی برای شناسایی و ردیابی برچسب‌ها یا کارت‌های RFID استفاده می‌کند. به عبارت ساده، به جای اسکن بارکد، یک تگ RFID اطلاعات را به صورت بی‌سیم به یک گیرنده ارسال می‌کند.

تعداد کتابخانه‌ها: یک عدد
حجم کل بدون فشرده‌سازی: 870 کیلوبایت

آموزش نصب کتابخانه ها در آردوینو

ابتدا از بالای صفحه، گزینه sketch را انتخاب کنید.

library-instal-toturial-1

سپس از بخش Include Library ، گزینه ...Add .ZIP Library را انتخاب کنید.

library-instal-toturial-2

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

library-instal-toturial-3

روی open کلیک کنید و منتظر بمانید تا کتابخانه نصب شود.

library-instal-toturial-4