نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

توضیحات زبان آردوینو همراه با نظرات. توضیحات Arduino IDE

پس از آشنایی با عناصر اصلی آردوینو و همچنین نوشتن یک برنامه ” سلام دنیا! وقت آن است که با یک زبان برنامه نویسی آشنا شوید.

ساختار زبان اساساً بر پایه C/C++ است، بنابراین کسانی که قبلاً به این زبان برنامه‌نویسی کرده‌اند در یادگیری مشکلی نخواهند داشت. برنامه نویسی آردوینو. دیگران باید اطلاعات اولیه در مورد دستورات کنترل، انواع داده ها و توابع را بیاموزند.

بسیاری از اطلاعات موجود در اینجا با در نظر گرفتن تفاوت در انواع داده ها و همچنین چند دستورالعمل خاص در مورد برنامه نویسی پورت I/O با هر دوره C/C++ سازگار خواهد بود.

مبانی

چند چیز رسمی، یعنی چیزهایی که همه می دانند اما گاهی فراموش می کنند...

که در آردوینو IDEمانند C/C++، باید از موارد کاراکتر آگاه باشید. کلید واژه هامانند if, for همیشه در نوشته می شود حروف کوچک. هر دستورالعمل با ";" به پایان می رسد. نقطه ویرگول به کامپایلر می گوید که کدام قسمت را به عنوان یک دستورالعمل تفسیر کند.

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

افزودن نظرات به محتوای برنامه تمرین خوبی است، این امر درک کد را آسان می کند. نظرات تک خطی با شروع می شود // (میزان دو برابر). نظرات چند خطی با شروع می شود /* و به پایان برسد */

اگر بخواهیم هر کتابخانه ای را در برنامه خود قرار دهیم، از دستور include استفاده می کنیم. در اینجا نمونه هایی از اتصال کتابخانه ها وجود دارد:

#عبارتند از // کتابخانه استاندارد #include “svoya_biblioteka.h” // کتابخانه در فهرست پروژه

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

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

یک دوره برنامه نویسی استاندارد حاوی اطلاعاتی در مورد توابع است که در مقالات بعدی ارائه خواهد شد. در مورد آردوینو، توابع در ابتدا مورد بحث قرار خواهند گرفت زیرا حتی ساده ترین برنامهباید دوتا داشته باشه توابع ویژه. این قبلاً در مقالات قبلی ذکر شده است، اما در اینجا ما این اطلاعات را سیستماتیک می کنیم.

اعلامیه عملکرد

نمودار اعلان تابع به شکل زیر است:

تابع_name(پارامتر) را تایپ کنید ( // دستورالعمل‌های اجرا (بدنه تابع) بازگشت (/* مقدار بازگشتی*/)؛ )

نوعنام هر کسی است نوع موجودداده ها در زبان داده شدهبرنامه نويسي. ما لیستی از انواع موجود در هنگام برنامه نویسی آردوینو را در مقاله ای جداگانه ارائه خواهیم کرد.

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

function_nameاجازه می دهد تا به طور منحصر به فرد شناسایی شود. برای فراخوانی (اجرا) یک تابع، نامی به آن می دهیم.

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

در داخل براکت ها "(...)" بدنه واقعی تابع یا دستورالعملی است که می خواهیم اجرا کنیم. ما در مقاله ای جداگانه توضیحاتی در مورد دستورالعمل های خاص ارائه خواهیم داد.

تمام توابعی که مقداری را برمی گرداند با یک عبارت بازگشتی و سپس مقدار بازگشتی به پایان می رسد. فقط توابع اعلام شده با اشاره گر تهی ("void") حاوی دستور بازگشت نیستند. باید بدانید که عبارت return بدون توجه به مکان، عملکرد را خاتمه می دهد.

در زیر چند نمونه از اعلان تابع آورده شده است.

Void f1() (//بدنه تابع) —————————————— int minus() (//function body return (0); ) ——————————— ——— int plus(int a, int b) ( return (a+b)؛ )

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

اکیداً توصیه می کنیم که هنگام نوشتن از توابع یاد بگیرید و از آنها استفاده کنید برنامه های خود. با گذشت زمان، هر برنامه نویس کتابخانه ای از توابع خود را "برای همه موارد" جمع آوری می کند، که نوشتن برنامه های جدید را آسان تر و سریع تر می کند.

اکنون که می دانیم چگونه تابع خود را بنویسیم، باید نحوه استفاده از آن را یاد بگیریم.

فراخوانی یک تابع

همه توابع را در یک فایل/برنامه می نویسیم. البته راه حل ظریف تری وجود دارد، اما دفعه بعد سعی خواهیم کرد آن را شرح دهیم.

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

F1(); به علاوه (2،2); y=plus(1.5);

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

اگر تابع f1() بدون پارامتر اعلان شود، در هنگام فراخوانی هیچ پارامتری نمی توان تعیین کرد، یعنی. فراخوانی f1(0) نادرست خواهد بود.

تابع plus(int a, int b) دقیقاً به دو پارامتر نیاز دارد، بنابراین فراخوانی با یک یا سه پارامتر امکان پذیر نیست.

فراخوانی y=plus(1,5) تابع "plus" را با پارامترهای "1" و "5" اجرا می کند و مقدار بازگشتی را در متغیر "y" ذخیره می کند.

توابع setup() و loop().

با دانش در مورد اعلان و فراخوانی توابع، می توانیم به سیستم برویم توابع آردوینو: برپایی()و حلقه (). Arduino IDE برای اعلام این دو تابع مورد نیاز است.

setup() تابعی است که با روشن شدن برق یا فشار دادن دکمه RESET به طور خودکار فراخوانی می شود.

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

تنظیم خالی () ( // بدنه تابع - مقداردهی اولیه سیستم)

loop() تابعی است که in فراخوانی می شود حلقه بی پایان. این تابعهمچنین مقداری بر نمی گرداند و با پارامترها فراخوانی نمی شود. اعلان تابع loop() صحیح در زیر نشان داده شده است:

حلقه خالی () ( // بدنه تابع - کد برنامه )

همانطور که می بینید، اعلان تابع ()loop با اعلان تابع setup() یکسان است. تفاوت در انجام این عملکردها توسط میکروکنترلر نهفته است.

اکنون شبه کد زیر را تحلیل خواهیم کرد:

تنظیم خالی () ( on_led1 (); //روشن کردن led1 off_led1 (); //خاموش کردن led1) حلقه خالی () ( on_led2 ()

دو دستورالعمل در تابع setup() وجود دارد: اولی led1 متصل به برد را روشن می کند (مثلا پین 13) و دومی led1 را خاموش می کند.

تابع loop() دستورالعمل های یکسانی برای روشن و خاموش کردن LED2 متصل به برد دارد (به عنوان مثال پین 12).

در نتیجه اجرای برنامه، led1 یک بار چشمک می زند، در حالی که led2 تا زمانی که آردوینو روشن باشد روشن می شود و خاموش می شود.

فشار دادن دکمه RESET باعث می شود که led1 یک بار دیگر چشمک بزند و led2 دوباره چشمک بزند.

خلاصه کردن:

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

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

تکرار می کنم که این اطلاعات حداقلی است. شرح اشاره گرها، کلاس ها، متغیرهای رشته و غیره. در درس های بعدی ارائه خواهد شد. اگر چیزی نامشخص است، نگران نباشید. در درس های آینده مثال ها و توضیحات زیادی ارائه خواهد شد.

ساختار برنامه آردوینو

ساختار برنامه آردوینو بسیار ساده است و در شکل حداقلی خود از دو بخش setup() و loop() تشکیل شده است.

void setup() (

حلقه خالی() (

تابع setup() یکبار اجرا می شود، زمانی که کنترلر روشن یا تنظیم مجدد شود. معمولا این اتفاق می افتد تنظیمات اولیهمتغیرها، رجیسترها تابع باید در برنامه وجود داشته باشد، حتی اگر چیزی در آن وجود نداشته باشد.

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

قوانین اصلی نحو زبان C.

; نقطه ویرگولعبارات می توانند به تعداد دلخواه دارای فاصله و خط شکاف باشند. انتهای یک عبارت با علامت نقطه ویرگول نشان داده می شود.

z = x + y;
z=x
+ y;

( ) آکولادبلوکی از توابع یا عبارات را تعریف کنید. به عنوان مثال، در توابع setup() و loop().

/* … */ بلوک نظرات، حتما ببندید

/* این یک بلوک نظر است */

// نظر یک خطی، بدون نیاز به بستن، تا پایان خط اعتبار دارد.

// این یک خط نظر است

متغیرها و انواع داده ها

متغیر یک سلول است حافظه دسترسی تصادفی، که اطلاعات در آن ذخیره می شود. این برنامه از متغیرها برای ذخیره داده های محاسباتی میانی استفاده می کند. داده ها را می توان برای محاسبات استفاده کرد فرمت های مختلف، با عمق بیت های مختلف، بنابراین متغیرها در زبان C دارای انواع زیر هستند.

نوع داده عمق، بیت محدوده اعداد
بولی 8 درست غلط
کاراکتر 8 -128 … 127
کاراکتر بدون امضا 8 0 … 255
بایت 8 0 … 255
بین المللی 16 -32768 … 32767
بدون امضا 16 0 … 65535
کلمه 16 0 … 65535
طولانی 32 -2147483648 … 2147483647
طولانی بدون امضا 32 0 … 4294967295
کوتاه 16 -32768 … 32767
شناور 32 -3.4028235+38 … 3.4028235+38
دو برابر 32 -3.4028235+38 … 3.4028235+38

انواع داده ها بر اساس دقت محاسباتی مورد نیاز، فرمت داده ها و غیره انتخاب می شوند. به عنوان مثال، برای شمارنده ای که تا 100 شمارش می کند، نباید انتخاب کنید نوع بلند. کار خواهد کرد، اما عملیات طول می کشد حافظه بیشترداده ها و برنامه ها به زمان بیشتری نیاز دارند.

اعلام متغیرها

نوع داده مشخص شده و به دنبال آن نام متغیر آمده است.

int x; // اعلان متغیری به نام x از نوع int
float widthBox; // اعلان متغیری به نام widthBox از نوع float

همه متغیرها باید قبل از استفاده اعلان شوند.

یک متغیر را می توان در هر جایی از یک برنامه اعلان کرد، اما این تعیین می کند که کدام بلوک های برنامه می توانند از آن استفاده کنند. آن ها متغیرها دارای دامنه هستند.

  • متغیرهای اعلام شده در ابتدای برنامه، قبل از تابع ()void setup، سراسری در نظر گرفته می شوند و در هر نقطه از برنامه در دسترس هستند.
  • متغیرهای محلی در داخل توابع یا بلوک‌هایی مانند حلقه for اعلام می‌شوند و فقط می‌توانند در بلوک‌های اعلام‌شده استفاده شوند. ممکن است چندین متغیر با نام یکسان اما دامنه های متفاوت داشته باشید.

حالت int; // متغیر برای همه توابع موجود است

void setup() (
// بلوک خالی، بدون نیاز به تنظیمات اولیه
}

حلقه خالی() (

شمارش طولانی؛ // متغیر count فقط در تابع loop() موجود است

برای (int i=0; i< 10;) // переменная i доступна только внутри цикла
{
i++;
}
}

هنگام اعلان یک متغیر، می توانید آن را تنظیم کنید مقدار اولیه(آغاز کردن).

int x = 0; // متغیر x با مقدار اولیه 0 اعلام می شود
char d = 'a'; // متغیر d با مقدار اولیه برابر با کد کاراکتر "a" اعلام می شود.

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

int x; // متغیر int
char y; // متغیر char
int z; // متغیر int

z = x + (int)y; // متغیر y به صراحت به int تبدیل می شود

عملیات حسابی

عملیات رابطه

عملیات منطقی

عملیات روی اشاره گرها

عملیات بیت

& و
| یا
^ انحصاری یا
~ وارونگی
<< SHIFT LEFT
>> SHIFT RIGHT

عملیات انتساب مختلط

انتخاب گزینه ها، مدیریت برنامه.

اپراتور IFشرایط داخل پرانتز را بررسی می کند و عبارت بعدی یا بلوک in را اجرا می کند آکولاد، اگر شرط درست باشد.

اگر (x == 5) // اگر x=5، آنگاه z=0 اجرا می شود
z=0;

if (x > 5) // if x >
(z=0؛ y=8؛ )

اگر دیگریبه شما امکان می دهد بین دو گزینه یکی را انتخاب کنید.

اگر (x > 5) // اگر x > 5، بلوک اجرا می شود z=0، y=8.
{
z=0;
y=8;
}

{
z=0;
y=0;
}

ELSE IF- به شما امکان می دهد چندین انتخاب انجام دهید

اگر (x > 5) // اگر x > 5، بلوک اجرا می شود z=0، y=8.
{
z=0;
y=8;
}

در غیر این صورت اگر (x > 20) // اگر x > 20 باشد، این بلوک اجرا می شود
{
}

else // در غیر این صورت این بلوک اجرا می شود
{
z=0;
y=0;
}

کیس سوئیچ- چند گزینه ای. به شما امکان می دهد یک متغیر (در مثال x است) با چندین ثابت (در مثال 5 و 10) مقایسه کنید و بلوکی را اجرا کنید که در آن متغیر برابر با ثابت است.

سوئیچ (x) (

مورد 5:
کد // اگر x = 5 اجرا می شود
زنگ تفريح؛

مورد 10:
کد // اگر x = 10 اجرا می شود
زنگ تفريح؛

پیش فرض:
// اگر کدی مطابقت نداشته باشد اجرا می شود مقدار قبلی
زنگ تفريح؛
}

برای حلقه. طراحی به شما امکان می دهد حلقه ها را با تعداد معینی از تکرار سازماندهی کنید. نحو به این صورت است:

برای (اقدام قبل از شروع حلقه؛
شرط ادامه حلقه؛
عمل در پایان هر تکرار) (

// کد بدنه حلقه

مثالی از یک حلقه 100 تکراری.

برای (i=0; i< 100; i++) // начальное значение 0, конечное 99, шаг 1

{
مجموع = جمع + I;
}

حلقه WHILE. اپراتور به شما امکان می دهد حلقه ها را با ساختار سازماندهی کنید:

در حالی که (بیان)
{
// کد بدنه حلقه
}

حلقه تا زمانی اجرا می شود که عبارت داخل پرانتز درست باشد. نمونه ای از یک حلقه برای 10 تکرار.

x = 0;
در حالی که (x< 10)
{
// کد بدنه حلقه
x++;
}

انجام در حالی که- یک حلقه با یک شرط در خروجی.

انجام دادن
{
// کد بدنه حلقه
) while (بیان);

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

x = 0;
در حالی که (x< 10)
{
اگر (z > 20) شکسته شود. // اگر z > 20 باشد، از حلقه خارج شوید
// کد بدنه حلقه
x++;
}

رفتن به- عملگر انتقال بدون قید و شرط

gotometka1; // به metka1 بروید
………………
متکا1:

ادامه هید- پرش از عبارات تا پایان بدنه حلقه.

x = 0;
در حالی که (x< 10)
{
// کد بدنه حلقه
اگر (z > 20) ادامه یابد. // اگر z > 20 باشد، به ابتدای بدنه حلقه برگردید
// کد بدنه حلقه
x++;
}

آرایه ها

آرایه یک ناحیه حافظه است که در آن چندین متغیر به صورت متوالی ذخیره می شوند.

یک آرایه به این صورت اعلام می شود:

بین سنین // آرایه 10 متغیرها را تایپ کنیدبین المللی

وزن شناور // آرایه ای از 100 متغیر شناور

وقتی اعلان شد، آرایه ها را می توان مقدار دهی اولیه کرد:

بین سنین = ( 23، 54، 34، 24، 45، 56، 23، 23، 27، 28)؛

دسترسی به متغیرهای آرایه به صورت زیر است:

x = سن // x مقداری از عنصر پنجم آرایه به آن اختصاص داده شده است.
سن = 32; // عنصر نهم آرایه روی 32 تنظیم شده است

شماره گذاری عناصر آرایه همیشه از صفر است.

کارکرد.

توابع به شما این امکان را می دهند که اقدامات مشابهی را با داده های مختلف انجام دهید. تابع دارای:

  • نامی که او را با آن صدا می کنند؛
  • آرگومان ها - داده هایی که تابع برای محاسبه استفاده می کند.
  • نوع داده ای که توسط تابع برگردانده می شود.

یک تابع تعریف شده توسط کاربر خارج از توابع setup() و loop() را توصیف می کند.

void setup() (
کد // یک بار با شروع برنامه اجرا می شود
}

حلقه خالی() (
// کد اصلی، در یک حلقه اجرا می شود
}

// اعلامیه عملکرد سفارشیبا نام functionName
تابع نام را تایپ کنید (تایپ argument1، نوع argument1، ...، نوع آرگومان)
{
// بدن عملکرد
برگشت()؛
}

مثالی از تابعی که مجموع مربع های دو آرگومان را محاسبه می کند.

int sumQwadr(int x, int y)
{
بازگشت (x* x + y*y)؛
}

فراخوانی تابع به این صورت است:

d= 2; b= 3;
z= sumQwadr(d, b); // z مجموع مربع های متغیرهای d و b خواهد بود

توابع می توانند داخلی، سفارشی یا پلاگین باشند.

بسیار کوتاه است، اما این داده ها باید برای شروع نوشتن برنامه های C برای سیستم های آردوینو کافی باشد.

آخرین چیزی که می خواهم در این درس به شما بگویم این است که چگونه مرسوم است که برنامه ها را به زبان C فرمت کنید. فکر می کنم اگر برای اولین بار است که این درس را می خوانید، باید از این بخش صرف نظر کنید و بعداً زمانی که دارید به آن بازگردید. چیزی برای قالب بندی

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

نام ها در زبان C

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

سیگنال، شمارش زمان

متغیرها باید با حروف مختلط و با حرف اول کوچک (کوچک) نوشته شوند.

آردوینو یک برد توسعه آماده و یک زبان برنامه نویسی بسیار ساده است که شروع به کار با میکروکنترلرها را با هزینه اندازه و سرعت برنامه آسان می کند. اخیرا Atmel پشتیبانی از بوت لودر آردوینو را اضافه کرده است AVR Studio، یعنی می توانید برنامه های نوشته شده در C، C++ یا Assembler را بدون برنامه نویس بنویسید و بارگذاری کنید. علاوه بر این، می توانید در AVR Studio کد را به زبان پردازش/سیم کشی بنویسید.
توصیه می کنم خواندن مقاله را با به روز رسانی در پایان شروع کنید!
در این مقاله پیشنهاد می کنیم دستورالعمل های گام به گامنصب نرم افزار برنامه نویسی آردوینو با استفاده از AVR Studio. ما به عنوان یک بررسی از برنامه های افزودنی AVR Studio از سایت easyelectronics.ru استفاده کردیم. ما همه نمونه ها را روی تابلوی خود اجرا خواهیم کرد.

نصب آردوینو IDE

ما از آردوینو نسخه 1.5.2 استفاده می کنیم. می توانید آن را در وب سایت رسمی دانلود کنید. آخرین نسخه(1.6.2-r2 در زمان نگارش) به دلایلی با میکروکنترلر Atmega8 کار نمی کند.
شما یک آرشیو فشرده با محیطی که قبلاً مستقر شده است دانلود خواهید کرد. تنها چیزی که باقی می ماند این است که آن را در فهرست برنامه باز کنید.

نصب Atmel Studio

UPD

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

  1. مستقیماً در Arduino IDE در C بنویسید. باید بدانید که Processing/Wiring یک زبان نیست، بلکه صرفاً مجموعه ای از ماکروها و کتابخانه ها است. وقتی در آن می نویسید، در هدرهای آن نگاه می کند، کد قابل خواندن توسط انسان شما را به C تبدیل می کند و سپس با کامپایلر استاندارد AVR GCC کامپایل می کند. اگر کدی را به زبان C بنویسید، آنوقت به lib های آن دسترسی نخواهد داشت و بلافاصله همه چیز را همانطور که باید کامپایل می کند، BUT!... در عین حال، لینک دهنده هر آنچه را که بخواهد به پروژه شما اضافه می کند. مزیت این است که شما به چیزی غیر از Arduino IDE نیاز ندارید. نقطه ضعف جادویی است که از توسعه دهنده پنهان است. این روش اغلب در مواردی استفاده می شود که نیاز به پیاده سازی تابعی است که دوستان ایتالیایی ما در زبان خود ارائه نکرده اند.
  2. روش ارائه شده در این مقاله (در واقع عجیب ترین است، زیرا تمام کاستی ها را با هم ترکیب می کند). از نظر ایدئولوژیکی، این افزونه برای برنامه‌نویسی در پردازش/سیم‌کشی و استفاده از Atmel Studio به عنوان رابط مورد نیاز است. همچنین یک عملکرد پولی وجود دارد که به شما امکان می دهد کد را اشکال زدایی کنید، اما من آن را امتحان نکرده ام. بنابراین، اساسا، هنگام برنامه نویسی، همان چیزی که در گزینه اول رخ می دهد، اتفاق می افتد، اما شما در یک IDE متفاوت کار می کنید. در عین حال، از نقطه نظر نتیجه، شما همان چیزی را دریافت می کنید. اگر آردوینو را برنامه‌نویسی کرده‌اید و تصمیم گرفته‌اید آن را در C انجام دهید، راحت باشید که مستقیماً در Arduino IDE بنویسید. اگر رابط کاربری را دوست ندارید، می توانید از یک ویرایشگر معمولی استفاده کنید (من Sublime Text را توصیه می کنم). اگر در Atnel Studio کار می کنید و می خواهید برد خود را مستقیماً از رابط آن فلش کنید یا در آن بنویسید Processing/Wiring (به طور ناگهانی!)، پس این افزونه برای شما مناسب است. ضمنا استودیو فقط تحت ویندوز کار میکنه یعنی روش برای همه نیست. من این مقاله را فقط به این دلیل نوشتم که روش جدیدی برای خودم پیدا کردم، اما آن را دوست ندارم.
  3. روش سوم، به نظر من، بهترین روش برای یک کاربر پیشرفته است. در ابتدا، همه چیز طبق معمول اتفاق می افتد - شما کد را می نویسید، آن را کامپایل می کنید و یک فایل هگز دریافت می کنید. سپس، به یاد داشته باشید که یک برد اشکال زدایی معمولی با یک بوت لودر در دست دارید، ابزاری را دانلود کنید که می تواند به این بوت لودر دسترسی داشته باشد و کد شما را به حافظه منتقل کند. ما قبلاً دستورالعمل های گام به گام را ارسال کرده ایم. در این مورد، توسعه دهنده حداکثر کنترل را بر روی همه عملکردها دریافت می کند، اما ممکن است به دلیل استفاده از یک بوت لودر شخص ثالث، مشکلاتی ایجاد شود.

من می خواهم یک چیز دیگر را که در آردوینو اتفاق می افتد فاش کنم. هر کاری که انجام دهید، Arduino IDE قطعا خود لوازم جانبی را روشن می کند. به عنوان مثال، تایمرها را شروع می کند. و اگر بخواهید با آنها در C کار کنید، ممکن است متوجه شوید که آنطور که انتظار داشتید کار نمی کنند. و این می تواند تبدیل شود مشکل واقعی. و نمونه های زیادی از این دست وجود دارد، یعنی تعداد زیادی چنگک، عصا و حشرات بالقوه وجود دارد.
اگر به سادگی یک فایل هگز را آپلود کنید، مشکلات فقط به دلیل بوت لودر ممکن است ایجاد شود. تا کنون فقط یک مورد پیدا کرده ام - پس از تکمیل بوت لودر، UART فعال باقی می ماند. اگر از طریق Arduino IDE بنویسید، آنگاه برای غیرفعال کردن آن در کد شما وارد می شود و چه کسی می داند چه چیز دیگری. اگر فقط می خواهید هگز خود را اجرا کنید، کنترل روی پاهای UART را نخواهید داشت. شما باید به صورت دستی یک غیرفعال کردن UART را به پروژه خود اضافه کنید. این مصنوع و نمونه کد به تفصیل در توضیح داده شده است.
خب در جمع بندی اکثر بردهای سازگار با آردوینو یک کانکتور برای برنامه نویس ISP دارند. اگر این برنامه نویس را از چینی ها به قیمت 3-4 دلار خریداری کنید، به سرعت تمام این مشکلات را فراموش خواهید کرد.

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

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

برای برنامه نویسی به زبان C به AVR GCC Toolchain نیاز داریم.

همچنین به Arduino IDE نصب شده نیاز داریم، زیرا... این شامل ابزار avrdude است که برای دانلود سیستم عامل در کنترلر مورد نیاز است. کراس پک نیز حاوی avrdude است، اما نسخه ای که همراه آن است با آردوینو کار نمی کند.

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

#کنترل بر روی برد نصب شده است. ممکن است متفاوت باشد، برای مثال atmega328 DEVICE = atmega168 #فرکانس ساعت 16 مگاهرتز CLOCK = 16000000 #دستور راه اندازی Avrdude. باید از Arduino IDE کپی شود. AVRDUDE = /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.con. -carduino -P/dev/tty.usbserial-A600dAAQ -b19200 -D -p atmega168 OBJECTS = main.o COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) همه: اصلی .hex .c.o: $(COMPILE) -c $< -o $@ .S.o: $(COMPILE) -x assembler-with-cpp -c $< -o $@ .c.s: $(COMPILE) -S $< -o $@ flash: all $(AVRDUDE) -U flash:w:main.hex:i clean: rm -f main.hex main.elf $(OBJECTS) main.elf: $(OBJECTS) $(COMPILE) -o main.elf $(OBJECTS) main.hex: main.elf rm -f main.hex avr-objcopy -j .text -j .data -O ihex main.elf main.hex avr-size --format=avr --mcu=$(DEVICE) main.elf

در این فایل باید دستور خود را برای راه اندازی avrdude وارد کنیم. بر سیستم های مختلفمتفاوت به نظر خواهد رسید برای پیدا کردن گزینه خود، Arduino IDE را راه اندازی کنید و کادر "نمایش خروجی کامل هنگام آپلود" را در تنظیمات علامت بزنید.

حالا ما در بارگذاری می کنیم آردوینو هرپیام های نمایش داده شده در پایین پنجره را ترسیم کنید و به آنها نگاه کنید. ما فراخوانی avrdude را در آنجا پیدا می کنیم، همه چیز را به جز پارامتر -Uflash کپی می کنیم و آن را بعد از "AVRDUDE =" در Makefile قرار می دهیم.


یک نکته سریع: تمام تورفتگی در Makefile با کاراکترهای تب (کلید Tab) انجام می شود. اگر شما ویرایشگر متناین کاراکترها را با فاصله ها جایگزین می کند، دستور make از ساخت پروژه امتناع می کند.

حالا بیایید یک فایل بسازیم main.c- متن واقعی برنامه ما، که در آن به طور سنتی LED را چشمک می زنیم.

#عبارتند از #عبارتند از #define LED_PIN 5 int main() (DDRB |= 1<< LED_PIN; while(1) { PORTB |= 1 << LED_PIN; _delay_ms(1000); PORTB &= ~(1 << LED_PIN); _delay_ms(1000); } return 0; }

پروژه ما آماده است. بیایید کنسول را در دایرکتوری پروژه خود باز کنیم و دستور "make" را وارد کنیم:


همانطور که می بینید، اندازه سیستم عامل به دست آمده تنها 180 بایت است. یک طرح مشابه آردوینو 1116 بایت در حافظه کنترلر اشغال می کند.

حالا بیایید به کنسول برگردیم و "make flash" را وارد کنیم تا فایل کامپایل شده در کنترلر بارگذاری شود:


اگر دانلود بدون خطا انجام شود، LED متصل به پایه 13 برد با خوشحالی چشمک می زند. گاهی اوقات avrdude نمی تواند برد را پیدا کند یا به دلیل وقفه زمانی می افتد - در این مورد، پیچاندن کابل USB می تواند کمک کند. همچنین، برای جلوگیری از تداخل دسترسی به برد، فراموش نکنید که Arduino IDE را قبل از دستور make flash ببندید.

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

در تسلط بر میکروکنترلرها موفق باشید!

این شبیه ساز در مرورگر کروم بهترین عملکرد را دارد
بیایید نگاهی دقیق تر به آردوینو بیندازیم.

آردوینو کامپیوتر بزرگی نیست که بتوان آن را به مدارهای خارجی متصل کرد. Arduino Uno از Atmega 328P استفاده می کند
این بزرگترین تراشه روی برد است. این تراشه برنامه هایی را اجرا می کند که در حافظه آن ذخیره شده اند. می توانید برنامه را از طریق usb با استفاده از Arduino IDE دانلود کنید. پورت USB نیز برق آردوینو را تامین می کند.

یک کانکتور برق جداگانه وجود دارد. این برد دارای دو پایه با برچسب 5 ولت و 3.3 ولت است که برای تغذیه دستگاه های مختلف مورد نیاز است. همچنین پین هایی با علامت GND پیدا خواهید کرد، این پین های زمین هستند (زمین 0 ولت است). پلتفرم آردوینو همچنین دارای 14 پین دیجیتال با برچسب 0 تا 13 است که به گره های خارجی متصل می شوند و دارای دو حالت بالا یا پایین (روشن یا خاموش) هستند. این مخاطبین می توانند به عنوان خروجی یا ورودی کار کنند، یعنی. آنها می توانند برخی از داده ها را انتقال دهند و دستگاه های خارجی را کنترل کنند یا داده ها را از دستگاه ها دریافت کنند. پین های بعدی روی برد دارای برچسب A0-A5 هستند. اینها ورودی های آنالوگ هستند که می توانند داده ها را از سنسورهای مختلف دریافت کنند. این به ویژه هنگامی که شما نیاز به اندازه گیری محدوده خاصی مانند دما دارید راحت است. ورودی های آنالوگ دارای عملکردهای اضافی هستند که می توانند به طور جداگانه فعال شوند.

نحوه استفاده از برد توسعه

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

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

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








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


اولین چیزی که به میکروکنترلر خود وصل می کنیم یک LED است. نمودار اتصال برق در تصویر نشان داده شده است.

چرا در مدار به مقاومت نیاز است؟ در این حالت، جریان عبوری از LED را محدود می کند. هر LED برای جریان خاصی طراحی شده است و اگر این جریان بیشتر باشد، LED از کار می افتد. با استفاده از قانون اهم می توانید مقدار مقاومت را دریابید. برای کسانی که نمی دانند یا فراموش کرده اند، قانون اهم می گوید که یک رابطه خطی بین جریان و ولتاژ وجود دارد. یعنی هر چه ولتاژ بیشتری به مقاومت وارد کنیم جریان بیشتری از آن عبور می کند.
V=I*R
جایی که V- ولتاژ در مقاومت
من- جریان از طریق مقاومت
آر- مقاومتی که باید پیدا شود.
ابتدا باید ولتاژ مقاومت را دریابیم. اکثر ال ای دی های 3 یا 5 میلی متری که استفاده می کنید دارای ولتاژ کاری 3 ولت هستند. این بدان معنی است که ما باید 5-3 = 2 ولت را در مقاومت خاموش کنیم.

سپس جریان عبوری از مقاومت را محاسبه می کنیم.
اکثر ال ای دی های 3 و 5 میلی متری با روشنایی کامل در 20 میلی آمپر می درخشند. جریانی بیشتر از این می‌تواند آن‌ها را غیرفعال کند، در حالی که جریانی با شدت کمتر، روشنایی آن‌ها را بدون ایجاد آسیب کاهش می‌دهد.

بنابراین، ما می خواهیم LED را به مدار 5 ولت وصل کنیم تا جریان 20 میلی آمپر را حمل کند. از آنجایی که تمام قطعات در یک مدار قرار دارند، جریان مقاومت 20 میلی آمپر نیز خواهد بود.
ما گرفتیم
2 ولت = 20 میلی آمپر * R
2V = 0.02A * R
R = 100 اهم

100 اهم حداقل مقاومت است، بهتر است کمی بیشتر از آن استفاده کنید، زیرا LED ها دارای تغییراتی در ویژگی ها هستند.
در این مثال از یک مقاومت 220 اهم استفاده شده است. فقط به این دلیل که نویسنده تعدادشان زیاد است: wink: .

ال ای دی را در سوراخ های وسط برد قرار دهید تا سیم بلند آن به یکی از سیم های مقاومت متصل شود. انتهای دوم مقاومت را به 5 ولت وصل کنید و سیم دوم LED را به GND وصل کنید. LED باید روشن شود.

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

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

آناتومی طرح آردوینو.

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

LED چشمک زن آردوینو



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

این تابع در برپایی()بخشی از برنامه است و برای مقداردهی اولیه پین ​​هایی که به عنوان ورودی استفاده خواهید کرد، خدمت می کند (ورودی)یا خروج (خروجی). تا زمانی که آن را به ترتیب روی پین تنظیم نکنید، قادر به خواندن یا نوشتن اطلاعات از پین نخواهید بود pinMode. این تابع دو آرگومان دارد: شماره پینشماره پینی است که از آن استفاده خواهید کرد.

حالت-تنظیم می کند که پین ​​چگونه کار کند. در ورودی (ورودی)یا خروج (خروجی). برای روشن شدن LED باید سیگنال بدهیم از جانبآردوینو. برای این کار پین خروجی را پیکربندی می کنیم.
- این تابع برای تنظیم وضعیت استفاده می شود (حالت)پینا (شماره پین). دو حالت اصلی وجود دارد (در واقع 3 تای آنها)، یکی این است بالا، 5 ولت روی پین وجود خواهد داشت، این چیز دیگری است کمو پین 0 ولت خواهد بود. این بدان معناست که برای روشن کردن LED باید پین متصل به LED را در سطح بالایی قرار دهیم بالا.

تاخیر انداختن. برای به تاخیر انداختن عملکرد برنامه برای یک دوره مشخص شده در msec عمل می کند.
در زیر کدی وجود دارد که باعث چشمک زدن LED می شود.
//LED Blink int ledPin = 7;//Pin Arduino که LED به آن متصل است void setup() (pinMode(ledPin, OUTPUT);// تنظیم پین به عنوان OUTPUT) void loop() ( digitalWrite(ledPin, HIGH) ;// تأخیر LED را روشن کنید (1000)؛// تأخیر 1000 میلی‌ثانیه (1 ثانیه) DigitalWrite (ledPin, LOW);//تأخیر LED را خاموش کنید (1000)؛//1 ثانیه صبر کنید)

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

ledPinیک متغیر است. از متغیرها در برنامه ها برای ذخیره مقادیر استفاده می شود. در این مثال، متغیر ledPinمقدار به 7 اختصاص داده شده است، این شماره پین ​​آردوینو است. زمانی که برنامه آردوینو با خطی با متغیر مواجه می شود ledPin، از مقداری که قبلاً تعیین کردیم استفاده می کند.
پس ثبت کن pinMode (ledPin، OUTPUT)شبیه ضبط pinMode (7، OUTPUT).
اما در حالت اول فقط باید متغیر را تغییر دهید و در هر خطی که از آن استفاده می شود تغییر می کند و در حالت دوم برای تغییر متغیر باید در هر دستور به صورت دستی تغییراتی ایجاد کنید.

خط اول نوع متغیر را نشان می دهد. هنگام برنامه نویسی آردوینو، مهم است که همیشه نوع متغیرها را اعلام کنید. در حال حاضر برای شما کافی است که این را بدانید INTاعداد منفی و مثبت را اعلام می کند.
در زیر یک شبیه سازی از طرح ارائه شده است. برای مشاهده عملکرد مدار روی start کلیک کنید.

همانطور که انتظار می رفت، LED خاموش می شود و پس از یک ثانیه روشن می شود. سعی کنید تاخیر را تغییر دهید تا ببینید چگونه کار می کند.

کنترل چندین LED

در این مثال، نحوه کنترل چندین LED را یاد خواهید گرفت. برای این کار 3 ال ای دی دیگر روی برد نصب کرده و مطابق شکل زیر به مقاومت ها و پین های آردوینو متصل کنید.

برای روشن و خاموش کردن تک تک LED ها باید برنامه ای شبیه به این بنویسید:
//چند LED چشمک زدن int led1Pin = 4; int led2Pin = 5; int led3Pin = 6; int led4Pin = 7; void setup() (//تنظیم پین ها به صورت OUTPUT pinMode(led1Pin, OUTPUT)؛ pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); pinMode(led4Pin, OUTPUT); ) void loop() ( digitalWrite(led1Pin, HIGH );//تاخیر LED را روشن کنید(1000);//تأخیر 1 ثانیه دیجیتالنوشتن(led1Pin, LOW);//تاخیر LED را خاموش کنید(1000);//تاخیر 1 ثانیه //همین کار را برای 3 ثانیه دیگر انجام دهید LEDها DigitalWrite(led2Pin , HIGH);//روشن کردن تاخیر LED(1000);//تاخیر 1 ثانیه دیجیتالنوشتن(led2Pin, LOW);//خاموش کردن تاخیر LED(1000);//تاخیر 1 ثانیه DigitalWrite(led3Pin, HIGH )//روشن کردن تاخیر LED(1000)؛// تاخیر 1 ثانیه دیجیتالنوشتن(led3Pin, LOW);//خاموش تاخیر LED(1000)؛//تاخیر 1 ثانیه DigitalWrite(led4Pin, HIGH);//روشن تأخیر LED (1000);// تأخیر 1 ثانیه دیجیتالنوشتن (led4Pin، LOW);//خاموش کردن تأخیر LED (1000);//تأخیر 1 ثانیه)

این برنامه عالی کار خواهد کرد، اما منطقی ترین راه حل نیست. کد باید تغییر کند. برای اینکه برنامه بارها و بارها کار کند، از ساختاری به نام استفاده می کنیم.
حلقه ها زمانی مفید هستند که نیاز دارید یک عمل را چندین بار تکرار کنید. در کد بالا خطوط را تکرار می کنیم

DigitalWrite (led4Pin، HIGH)؛ تاخیر (1000); digitalWrite (led4Pin، LOW)؛ تاخیر (1000);
کد طرح کامل در پیوست (دانلود: 1187)

تنظیم روشنایی LED

گاهی اوقات باید روشنایی LED های برنامه را تغییر دهید. این را می توان با استفاده از دستور انجام داد analogWrite() . این دستور LED را آنقدر سریع روشن و خاموش می کند که چشم نمی تواند سوسو زدن را ببیند. اگر LED نیمی از زمان روشن و نیمی از زمان خاموش شود، از نظر بصری به نظر می رسد که با نیمی از روشنایی خود می درخشد. به این مدولاسیون عرض پالس (به انگلیسی PWM یا PWM) گفته می شود. Shim اغلب استفاده می شود، زیرا می توان از آن برای کنترل یک جزء "آنالوگ" با استفاده از یک کد دیجیتال استفاده کرد. همه پین ​​های آردوینو برای این اهداف مناسب نیستند. فقط آن دسته از نتایجی که چنین تعیینی نزدیک به آنها انجام می شود " ~ ". آن را در کنار پین های 3،5،6،9،10،11 خواهید دید.
یکی از LED های خود را به یکی از پایه های PWM وصل کنید (برای نویسنده این پایه 9 است). اکنون طرح LED چشمک زن را اجرا کنید، اما ابتدا دستور را تغییر دهید digitalWrite()بر analogWrite(). analogWrite()دارای دو آرگومان است: اولی عدد پین و دومی مقدار PWM (0-255)، در رابطه با LED ها این روشنایی آنها خواهد بود و برای موتورهای الکتریکی سرعت چرخش. در زیر یک کد نمونه برای روشنایی های مختلف LED آورده شده است.
//تغییر روشنایی LED int ledPin = 9;//یک LED به این پین void setup() متصل است ( pinMode(ledPin, OUTPUT);// مقداردهی اولیه پین ​​به خروجی ) void loop() ( analogWrite( ledPin، 255);// روشنایی کامل (255/255 = 1) تأخیر(1000);//مکث 1 ثانیه دیجیتالWrite(ledPin، LOW);//تخفیف LED تأخیر(1000);//مکث 1 ثانیه analogWrite( ledPin، 191);//روشنایی با 3/4 (191/255 ~= 0.75) تأخیر (1000);//مکث 1 ثانیه دیجیتال نوشتن (ledPin، LOW);//خاموش کردن تأخیر LED (1000)؛// مکث 1 ثانیه آنالوگWrite(ledPin، 127)؛ //نصف روشنایی (127/255 ~= 0.5) تأخیر (1000);//مکث 1 ثانیه DigitalWrite (ledPin، LOW);//خاموش کردن تأخیر LED (1000);/ /مکث 1 ثانیه آنالوگWrite(ledPin، 63)؛ //یک چهارم روشنایی (63/255 ~= 0.25) تأخیر (1000);//مکث 1 ثانیه دیجیتالنوشتن (ledPin، LOW);//تاخیر LED را خاموش کنید (1000) ;//مکث 1 ثانیه)

مقدار PWM را در دستور تغییر دهید analogWrite()تا ببینید که چگونه این روی روشنایی تاثیر می گذارد.
در مرحله بعد، یاد خواهید گرفت که چگونه روشنایی را به آرامی از کامل به صفر تنظیم کنید. البته می توانید یک کد را 255 بار کپی کنید
analogWrite (ledPin، روشنایی)؛ تاخیر(5);// روشنایی تاخیر کوتاه = روشنایی + 1;
اما، می دانید، این عملی نخواهد بود. بهترین راه برای انجام این کار استفاده از حلقه FOR است که قبلا استفاده کردیم.
که در مثال زیردو چرخه استفاده می شود، یکی برای کاهش روشنایی از 255 به 0
برای (int brightness=0;brightness=0;brightness--)( analogWrite(ledPin,brightness); delay(5); )
تاخیر (5)برای کاهش سرعت محو شدن روشنایی استفاده می شود 5*256=1280ms=1.28s)
خط اول از " روشنایی-" برای اینکه مقدار روشنایی هر بار که حلقه تکرار می شود 1 کاهش یابد. توجه داشته باشید که حلقه تا زمانی اجرا می شود که روشنایی >=0.تعویض علامت > روی علامت >= ما 0 را در محدوده روشنایی قرار دادیم. این طرح در زیر مدل شده است. //به آرامی روشنایی را تغییر دهید ledPin = 9;//یک LED به این پین void setup() متصل است (pinMode(ledPin, OUTPUT);// مقدار دهی اولیه پین ​​خروجی) void loop() ( //به آرامی افزایش روشنایی (0 تا 255) برای (int brightness=0;brightness=0;brightness--)( analogWrite(ledPin,brightness); delay(5); ) delay(1000);//1 ثانیه صبر کنید //به آرامی روشنایی را کاهش دهید (255 تا 0) برای (int brightness=255;brightness>=0;brightness--)( analogWrite(ledPin,brightness); delay(5); ) delay(1000);//1 ثانیه صبر کنید)
خیلی قابل مشاهده نیست، اما ایده واضح است.

RGB LED و آردوینو

یک LED RGB در واقع سه LED رنگی مختلف در یک بسته است.

با گنجاندن LED های مختلف با روشنایی متفاوت، می توانید ترکیب و بدست آورید رنگهای متفاوت. برای آردوینو که تعداد سطوح روشنایی آن 256 است، 256^3=16581375 رنگ ممکن را دریافت خواهید کرد. در واقعیت، البته، تعداد آنها کمتر خواهد بود.
LED مورد استفاده ما کاتد رایج است. آن ها هر سه LED از نظر ساختاری توسط کاتد به یک ترمینال متصل می شوند. این پایه را به پایه GND وصل می کنیم. پایه های باقیمانده، از طریق مقاومت های محدود کننده، باید به پایه های PWM متصل شوند. نویسنده از پین های 9-11 استفاده کرده است.به این ترتیب امکان کنترل هر LED به صورت جداگانه وجود خواهد داشت. اولین طرح نحوه روشن کردن هر LED را به صورت جداگانه نشان می دهد.



//RGB LED - تست //پین اتصالات int red = 9; int green = 10; int blue = 11; void setup())( pinMode(قرمز، OUTPUT)؛ pinMode(آبی، OUTPUT)؛ pinMode(سبز، OUTPUT)؛ ) void loop())( //روشن/خاموش LED قرمز دیجیتالWrite(قرمز، HIGH); تأخیر (500)؛ دیجیتالنوشتن (قرمز، کم)، تأخیر (500)؛ //روشن/خاموش کردن LED سبز DigitalWrite(سبز، HIGH)؛ تأخیر (500)؛ DigitalWrite (سبز، LOW)؛ تأخیر (500)؛ // روشن/خاموش LED آبی DigitalWrite(آبی، HIGH)؛ تاخیر(500)؛ digitalWrite(آبی، LOW)؛ تاخیر(500)؛ )

مثال زیر از دستورات استفاده می کند analogWrite()و برای دریافت مقادیر مختلف روشنایی تصادفی برای LED ها. تغییر رنگ های مختلف را مشاهده خواهید کرد به صورت تصادفی.
//RGB LED - رنگ های تصادفی //پین اتصالات int red = 9; int green = 10; int blue = 11; void setup())( pinMode(قرمز، OUTPUT)؛ pinMode(آبی، OUTPUT)؛ pinMode(سبز، OUTPUT)؛ ) void loop())( //انتخاب یک آنالوگ رنگ تصادفیWrite(قرمز، تصادفی(256)); analogWrite(آبی، تصادفی(256))؛ analogWrite(سبز، تصادفی(256))، تاخیر(1000)؛//یک ثانیه صبر کنید)

تصادفی (256)-برمی گرداند عدد تصادفیدر محدوده 0 تا 255
ضمیمه طرحی است که نشان می دهد انتقال های صافرنگ ها از قرمز به سبز، سپس به آبی، قرمز، سبز و غیره. (دانلود: 326)
طرح مثال کار می کند، اما تعداد زیادی کد تکراری وجود دارد. با نوشتن کد خود می توانید کد را ساده کنید عملکرد کمکی، که به آرامی از یک رنگ به رنگ دیگر تغییر می کند.
در اینجا به چه شکل خواهد بود: (دانلود: 365)
بیایید به تعریف تابع تکه تکه نگاه کنیم. تابع فراخوانی می شود محو کنندهو دو استدلال دارد. هر آرگومان با کاما از هم جدا می شود و دارای یک نوع اعلام شده در خط اول تعریف تابع است: خالی کننده خالی (int color1، int color2). می بینید که هر دو آرگومان به صورت اعلام شده اند بین المللی، و به آنها اسامی داده می شود رنگ 1و رنگ2به عنوان متغیرهای شرط برای تعریف یک تابع. خالیبه این معنی که تابع هیچ مقداری را بر نمی گرداند، فقط دستورات را اجرا می کند. اگر بخواهید تابعی بنویسید که حاصل ضرب را برمی گرداند، به شکل زیر خواهد بود:
ضرب‌کننده بین‌المللی (int number1، int number2) (محصول int = عدد1*شماره2؛ محصول برگشتی؛ )
توجه کنید که چگونه Type را اعلام کردیم بین المللیبه عنوان یک نوع بازگشتی در عوض
خالی.
در داخل تابع دستوراتی وجود دارد که قبلاً در طرح قبلی استفاده کرده اید، فقط شماره پین ​​ها با آنها جایگزین شده اند. رنگ 1و رنگ2. تابع فراخوانی می شود محو کننده، آرگومان های آن به صورت محاسبه می شود رنگ 1 = قرمزو رنگ 2 = سبز. آرشیو شامل یک طرح کامل با استفاده از توابع است (دانلود: 272)

دکمه

طرح بعدی از دکمه‌ای استفاده می‌کند که مخاطبین معمولاً باز هستند، بدون قفل.


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


//تعیین زمان فشار دادن دکمه int buttonPin = 7; void setup())(pinMode(buttonPin, INPUT);//آغاز کردن پین به ورودی Serial.begin(9600);//initialize درگاه سریال) void loop())( if (digitalRead(buttonPin)==HIGH)(//اگر دکمه فشار داده شود Serial.println("pressed"); // print "pressed" ) else (Serial.println("unpressed" // در غیر این صورت "فشرده نشده") )
چندین دستور جدید در این طرح وجود دارد.
-این دستور مقدار High ( سطح بالا) و کم (سطح پایین)، خروجی که در حال بررسی هستیم. این خروجی ابتدا باید به عنوان ورودی در setup() پیکربندی شود.
; //where buttonPin شماره پینی است که دکمه در آن متصل است.
پورت سریال به آردوینو این امکان را می دهد که در زمانی که خود کنترلر برنامه را اجرا می کند، به رایانه پیام ارسال کند. این برای اشکال زدایی یک برنامه، ارسال پیام به دستگاه ها یا برنامه های دیگر مفید است. برای فعال کردن انتقال داده از طریق یک پورت سریال (همچنین UART یا USART نامیده می شود)، باید آن را در setup () مقداردهی اولیه کنید.

Serial.begin()تنها یک آرگومان دارد - این سرعت انتقال داده بین آردوینو و کامپیوتر است.
طرح از دستوری برای نمایش یک پیام بر روی صفحه در Arduino IDE (ابزارها >> مانیتور سریال) استفاده می کند.
- طراحی به شما اجازه می دهد تا با ترکیب چندین چک در یک مکان، پیشرفت اجرای برنامه را کنترل کنید.
اگر digitalRead HIGH برگرداند، کلمه "pressed" روی مانیتور نمایش داده می شود. در غیر این صورت (در غیر این صورت) کلمه "رها شده" روی مانیتور نمایش داده می شود. اکنون می توانید با فشار دادن یک دکمه LED را روشن و خاموش کنید.
// تشخیص فشار دادن دکمه با خروجی LED دکمه intPin = 7; int ledPin = 8; void setup())( pinMode(buttonPin, INPUT);//این بار پین دکمه را به صورت INPUT pinMode(ledPin, OUTPUT) تنظیم می کنیم؛ Serial.begin(9600); ) void loop())( if (digitalRead(buttonPin )= =HIGH)(digitalWrite(ledPin,HIGH)؛ Serial.println("فشرده شده")؛ ) else (digitalWrite(ledPin,LOW); Serial.println("فشرده نشده")؛ )

ورودی آنالوگ.

آنالوگ خواندنبه شما امکان می دهد داده ها را از یکی از پین های آنالوگ آردوینو بخوانید و مقداری را در محدوده 0 (0 ولت) تا 1023 (5 ولت) نمایش می دهد. اگر ولتاژ ورودی آنالوگ 2.5 ولت باشد، 2.5 / 5 * 1023 = 512 چاپ می شود.
آنالوگ خواندنفقط یک آرگومان دارد - این عدد است ورودی آنالوگ(A0-A5). طرح زیر کد خواندن ولتاژ از پتانسیومتر را نشان می دهد. برای انجام این کار، متصل شوید مقاومت متغیر، خارجی ترین پایه ها به پایه های 5 ولت و GND می روند و پایه میانی به ورودی A0 می رود.

کد زیر را اجرا کنید و در مانیتور سریال ببینید که چگونه مقادیر بسته به چرخش دستگیره مقاومت تغییر می کند.
//ورودی آنالوگ int potPin = A0;//پایه مرکزی پتانسیومتر به این پین void setup()) وصل شده است( //پین آنالوگ به طور پیش فرض به عنوان ورودی گنجانده شده است، بنابراین نیازی به مقداردهی اولیه نیست Serial.begin(9600 ) ) void loop())( int potVal = analogRead(potPin);//potVal عددی بین 0 تا 1023 است Serial.println(potVal); )
طرح زیر طرح کلیک دکمه و طرح کنترل روشنایی LED را ترکیب می کند. LED از روی دکمه روشن می شود و روشنایی توسط یک پتانسیومتر کنترل می شود.
//تشخیص فشار دکمه با خروجی LED و شدت متغیر int buttonPin = 7; int ledPin = 9; int potPin = A0; void setup())( pinMode(buttonPin, INPUT)؛ pinMode(ledPin, OUTPUT)؛ Serial.begin(9600)؛ ) void loop())( if (digitalRead(buttonPin)==HIGH)(//اگر دکمه فشار داده شود int analogVal = analogRead(potPin)؛ int scaledVal = map(analogVal, 0, 1023, 0, 255); analogWrite(ledPin, scaledVal);// روشن کردن led با شدت تنظیم شده توسط pot Serial.println("pressed"); ) else (digitalWrite(ledPin، LOW);//اگر دکمه فشار داده نشد خاموش شود. Serial.println("فشرده نشده")؛ )

بهترین مقالات در این زمینه