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

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

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

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

    مبانی اصول

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

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

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

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

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

    #عبارتند از // کتابخانه استاندارد #شامل "svoya_biblioteka.h" // کتابخانه در فهرست پروژه

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

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

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

    اعلام عملکرد

    طرح اعلان تابع به شکل زیر است:

    function_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() تابعی است که در یک حلقه بی نهایت فراخوانی می شود. این تابع نیز مقداری بر نمی گرداند و با پارامترها فراخوانی نمی شود. در زیر اعلان صحیح تابع loop() است:

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

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

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

    void setup () ( on_led1 (); // روشن کردن led1 off_led1 (); // خاموش کردن led1 ) void loop () ( on_led2 ()

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

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

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

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

    خلاصه کردن:

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

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

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

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

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

    #کنترل بر روی برد نصب شده است. می تواند متفاوت باشد، برای مثال atmega328 DEVICE = atmega168 #Clock فرکانس 16MHz CLOCK = 16000000 #دستور Start 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 اسمبلر-با-cpp -c $< -o [ایمیل محافظت شده].c.s: $(COMPILE) -S $< -o [ایمیل محافظت شده]فلاش: همه $(AVRDUDE) -U فلش:w:main.hex:i پاک: rm -f main.hex main.elf $(OBJECTS) main.elf: $(اشیاء) $(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" را تایپ کنید تا فایل کامپایل شده در کنترلر بارگذاری شود:


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

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

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

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

    به طور کلی، مهم نیست که چه نوع پردازنده ای دارید: آخرین پنتیوم اینتل در لپ تاپ خود یا میکروکنترلر روی برد آردوینو. اصول برنامه نویسی، یعنی برنامه نويسيدر هر دو مورد یکسان هستند. تنها تفاوت در سرعت و دامنه فرصت های کار با دستگاه های دیگر است.

    برنامه چیست و کجا باید آن را نوشت

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

    بایت دستورالعملبرای پردازنده چه معنایی دارد
    00001001 یعنی: بایت بعدی را بردارید و در سلول شماره 1 ذخیره کنید
    00000110 ... این فقط بایت بعدی است که در سلول شماره 1 به خاطر می آوریم: عدد 5
    00011001 یعنی: یک عدد از مقدار سلول 1 کم کنید و نتیجه به روز شده را در آنجا بگذارید
    00101001 یعنی: مقدار سلول شماره 1 را با صفر مقایسه کنید و اگر صفر است - به تعداد بایت هایی که در بایت بعدی نشان داده شده است بپرید.
    00000100 اگر نتیجه صفر بود، می خواهیم 4 بایت به دستور ماقبل آخر پرش کنیم
    10000011
    01000001 ... حرف "الف" فقط با این کد مطابقت دارد
    00101000 به این معنی است که می خواهیم به تعداد بایت های بعدی به عقب پرش کنیم
    00000110 6 بایت به دستورالعمل شماره 3 می پریم
    10000011 یعنی می خواهیم کاراکتری که کد آن در بایت بعدی نوشته شده را نمایش دهیم
    00100001 ... امضا کردن "!" فقط با این کد مطابقت دارد

    در نتیجه اجرای چنین ترتیبی از دستورالعمل ها، عبارت وحشت "AAAA!" روی صفحه نمایش داده می شود.

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

    چرا زبان های برنامه نویسی مورد نیاز است

    برای ساده سازی کار میلیون ها بار، زبان های برنامه نویسی اختراع شدند. تعداد زیادی از آنها وجود دارد، و حتی از آنهایی که دائماً در حال شنیدن هستند، می توانید به سرعت ده ها یا دو مورد را به خاطر بیاورید: Assembler، C، C ++، C #، Java، Python، Ruby، PHP، Scala، JavaScript.

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

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

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

    فایل های باینری قابل خواندن نیستند و به طور کلی فقط برای اجرا توسط پردازنده در نظر گرفته شده اند. بسته به چیزی که دریافت کرده اند می توانند نوع متفاوتی داشته باشند: exe - اینها برنامه هایی برای ویندوز هستند، .hex - برنامه هایی برای اجرا توسط میکروکنترلر آردوینو و غیره.

    چرا این همه زبان برنامه نویسی وجود دارد و تفاوت آنها چیست؟

      چرا؟ زیرا افراد و شرکت‌های زیادی روی زمین وجود دارند و بسیاری معتقد بودند که می‌توانند این کار را بهتر از هر کس دیگری انجام دهند: راحت‌تر، واضح‌تر، سریع‌تر، باریک‌تر.

      تفاوت در چیست: زبان های مختلف تعادل متفاوتی از سرعت نوشتن، خوانایی و سرعت اجرا دارند.

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

    مثلا زبان پرل. به سرعت نوشته شد؛ درک منظور برنامه نویس غیرممکن است. به آرامی اجرا می شود:

    sub b( $n = 99 - @_ - $_ || نه؛ "$n بطری" . "s" x!!-- $n. " آبجو" ) ; $w = "روی دیوار" ; die map (b. "$w, \n". ب "، \n یکی را بردارید، بگذرانید،\n ". b (0). "$w. \n\n"} 0 .. 98

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

    بطری های کلاس (اصلی خلا ثابت عمومی) رشتهارگ ) ( رشته s = "s" ; برای (int beers= 99 ; beers>- 1 ; ) ( سیستم.out .print (آبجو + "بطری" + s + " آبجو روی دیوار، " ); سیستم.out .println (آبجو + "بطری" + s + " آبجو، " ); اگر (آبجو== 0 ) ( سیستم.out .print( "به فروشگاه بروید، مقداری دیگر بخرید") ; سیستم.out .println( "99 بطری آبجو روی دیوار.\n") ; سیستم.exit(0) ; ) دیگری سیستم.out .print( "یکی را بردارید، بگذرانید") ؛ s = (-- آبجو == 1 ) ? "" : "s" ; سیستم.out .println(آبجو + "بطری" + s + "آبجو روی دیوار.\n") ; } } }

    زبان اسمبلی. برای مدت طولانی نوشته شده است؛ خواندن دشوار است؛ خیلی سریع اجرا می شود:

    بخش کد cs : code , ds : code org 100h start : ; حلقه اصلی mov cx , 99 ; بطری هایی برای شروع با loopstart: call printcx ; عدد mov dx، offset line1 را چاپ کنید ; بقیه خط اول را چاپ کنید mov ah , 9 ; روتین رشته چاپ MS-DOS int 21h call printcx ; چاپ شماره mov dx، offset line2_3 ; بقیه خطوط 2 و 3 mov ah , 9 int 21h دسامبر cx ; یک تماس قطع کنید printcx ; چاپ شماره mov dx، offset line4 ; بقیه خط چهارم را چاپ کنید mov ah , 9 int 21h cmp cx , 0 ; آبجو تمام شد؟ jne loopstart ; اگر نه، در 20 ساعت ادامه دهید. به MS-DOS بروید ; زیر روال برای چاپ رجیستر CX به صورت اعشاری printcx: mov di، offset numbufferend ; بافر را از انتها پر کنید mov ax , cx ; عدد را در AX قرار دهید تا بتوانیم آن را تقسیم کنیم printcxloop: mov dx , 0 ; کلمه شمارنده مرتبه بالا - همیشه 0 mov bx , 10 div bx ; DX:AX را بر 10 تقسیم کنید. AX=ضریب، DX=باقیماندهافزودن dl، "0" ; باقی مانده را به یک کاراکتر اسکی تبدیل کنید mov [ds : di] , dl ; آن را در بافر چاپ cmp ax، 0 قرار دهید. آیا رقم دیگری برای محاسبه وجود دارد؟ je printcxend ; اگر نه، پایان دسامبر دی ; رقم بعدی را قبل از رقم فعلی قرار دهید jmp printcxloop ; حلقه printcxend: mov dx , di ; چاپ، از آخرین رقم محاسبه شده شروع می شود mov ah , 9 int 21h ret ; خط داده 1 دسی بل "بطری های آبجو روی دیوار", 13 , 10 , "$" line2_3 db "بطری های آبجو," , 13 , 10 , "یکی را بردارید، بگذرانید", 13 , 10 , "$" line4 db "بطری های آبجو روی دیوار.", 13 , 10 , 13 , 10 , "$" numbuffer db 0 , 0 , 0 , 0 , 0 numbufferend db 0 , "$" کد پایان پایان شروع شروع

    آردوینو چگونه برنامه ریزی می شود؟

    صحبت از آردوینو یا میکروکنترلرهای اتمل شد، به چه زبانی می توان برای آنها برنامه نوشت؟ پاسخ نظری: در مورد هر. اما در عمل، انتخاب به Assembler، C و C++ محدود می شود. این به این دلیل است که در مقایسه با رایانه رومیزی، منابع بسیار محدودی دارند. کیلوبایت حافظه نه گیگابایت. مگاهرتز روی پردازنده نه گیگاهرتز. این قیمت ارزانی و بهره وری انرژی است.

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

    همانطور که دیدید اسمبلر ساده ترین و ظریف ترین نیست و در نتیجه C/C++ زبان پرچمدار آردوینو است.

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

    چرا C و C++ در یک جمله ذکر شده اند؟ C++ یک افزونه برای C است. هر برنامه C یک برنامه C++ معتبر است، اما نه برعکس. می توانید از هر دو استفاده کنید. بیشتر اوقات، هنگام حل مشکل فعلی، حتی به این فکر نمی کنید که از چه چیزی استفاده می کنید.

    برو سر اصل مطلب: برنامه اول

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

    به ترتیب بریم بیایید کد منبع را بنویسیم. می توانید آن را در دفترچه یادداشت یا هر ویرایشگر دیگری بنویسید. با این حال، برای راحت کردن کار، به اصطلاح محیط های توسعه (IDE: Integrated Development Environment) وجود دارد. آنها در قالب یک ابزار واحد یک ویرایشگر متن با برجسته سازی و نکات، یک کامپایلر راه اندازی شده توسط یک دکمه و بسیاری لذت های دیگر را ارائه می دهند. برای آردوینو این محیط Arduino IDE نامیده می شود. برای دانلود رایگان در وب سایت رسمی موجود است.

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

    پس بیایید طرحی بنویسیم که هیچ کاری انجام نمی دهد. یعنی کوچکترین برنامه صحیح C++ که به سادگی زمان را می سوزاند.

    void setup() () void loop() ()

    ما هنوز روی معنای کد نوشته شده تمرکز نخواهیم کرد. بیایید آن را جمع آوری کنیم. برای انجام این کار، در Arduino IDE، دکمه "Verify" در نوار ابزار وجود دارد. روی آن کلیک کنید و در عرض چند ثانیه فایل باینری آماده خواهد شد. این با کتیبه "تدوین انجام شد" در زیر ویرایشگر متن اعلام می شود.

    در نتیجه یک فایل باینری با پسوند hex داریم که توسط میکروکنترلر قابل اجراست.

    اکنون باید آن را در آردوینو قرار دهید. به این فرآیند بوت کردن، فلش کردن یا فلش زدن می گویند. برای انجام آپلود در آردوینو IDE، دکمه «آپلود» در نوار ابزار وجود دارد. آردوینو را از طریق کابل USB به کامپیوتر وصل کنید، روی "آپلود" کلیک کنید تا چند لحظه دیگر برنامه در آردوینو آپلود شود. در این صورت برنامه ای که قبلا آنجا بود پاک می شود.

    سیستم عامل موفق با کتیبه "بارگذاری انجام شد" اعلام می شود.

    اگر هنگام تلاش برای دانلود با خطایی مواجه شدید، مطمئن شوید که:

      در منوی Tools → Board، پورتی که آردوینو واقعاً به آن متصل است انتخاب می شود. می توانید کابل USB را وصل و جدا کنید تا ببینید کدام پورت ظاهر می شود و ناپدید می شود: این آردوینو است.

      شما درایورهای لازم را برای آردوینو نصب کرده اید. این برای ویندوز مورد نیاز است، برای لینوکس مورد نیاز نیست، و فقط برای بردهای قدیمی قبل از Arduino Duemilanove در MacOS مورد نیاز است.

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

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

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

    مونتاژ پیچیده ترین مدارها و اتصال تخته ها را می توان بدون آهن لحیم کاری، اما با کمک جامپرهایی با اتصالات نر و ماده جداشدنی انجام داد. به این ترتیب می توان هر دو ضمیمه و تخته های توسعه را به هم متصل کرد که در فرهنگ لغت آردوینوشیکوف به سادگی "سپر" (سپر) نامیده می شود.

    اولین برد آردوینو که به عنوان مبتدی خریداری می شود چیست؟

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

    در فروشگاه های داخلی برای سال 2017، قیمت آن حدود 4-5 دلار است. در مدل های مدرن قلب آن Atmega328 است.

    تصویر برد آردوینو و رمزگشایی عملکرد هر پین، پین اوت آردوینو UNO

    میکروکنترلر روی این برد یک تراشه بلند در بسته بندی DIP28 می باشد که به این معنی است که دارای 28 پایه می باشد.

    تابلوی محبوب بعدی تقریباً دو برابر ارزانتر از قبلی است - 2-3 دلار. این یک هزینه است. بردهای فعلی بر روی همان Atmega328 ساخته شده اند، آنها از نظر عملکردی مشابه UNO هستند، تفاوت ها در اندازه و راه حل تطبیق USB است، در ادامه بیشتر در مورد آن صحبت خواهیم کرد. تفاوت دیگر این است که فیش هایی به شکل سوزن برای اتصال دستگاه ها به برد در نظر گرفته شده است.

    تعداد پایه‌های این برد یکسان است، اما مشاهده می‌کنید که میکروکنترلر در پکیج فشرده‌تر TQFP32 ساخته شده است، ADC6 و ADC7 به بسته اضافه می‌شوند، دو پایه دیگر «اضافی» گذرگاه برق را کپی می‌کنند. . ابعاد آن کاملاً جمع و جور است - تقریباً به اندازه انگشت شست شما.

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

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

    در قسمت بالایی، نمودار اتصال USB-UART، پین "GRN" به مدار تنظیم مجدد میکروکنترلر متصل شده است، می توان آن را متفاوت نامید، بعداً متوجه خواهید شد که چرا این مورد نیاز است.

    اگر UNO برای نان برد مفید است، Nano و Pro Mini برای نسخه های نهایی پروژه شما مناسب هستند زیرا فضای کمی را اشغال می کنند.

    چگونه آردوینو را به کامپیوتر متصل کنیم؟

    Arduino Uno و Nano از طریق USB به کامپیوتر متصل می شوند. در عین حال، هیچ پشتیبانی سخت افزاری برای پورت USB وجود ندارد؛ یک راه حل مدار تبدیل سطح، که معمولا USB-to-Serial یا USB-UART (rs-232) نامیده می شود، در اینجا استفاده می شود. همزمان بوت لودر مخصوص آردوینو به داخل میکروکنترلر فلش می شود که امکان فلش زدن از طریق این اتوبوس ها را فراهم می کند.

    Arduino Uno این اتصال را روی یک میکروکنترلر با پشتیبانی از USB - ATmega16U2 (AT16U2) پیاده سازی می کند. به نظر می رسد که برای فلش میکروکنترلر اصلی به یک میکروکنترلر اضافی روی برد نیاز است.

    در آردوینو نانو، این کار توسط تراشه FT232R یا همتای CH340 آن اجرا می‌شود. این یک میکروکنترلر نیست - یک مبدل سطح است، این واقعیت ساخت یک آردوینو نانو را از ابتدا با دستان خود آسان می کند.

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

    قبل از آن، من با این مواجه نشدم و فکر می کردم که تمام مبدل های USB-UART بر روی FT232 مونتاژ شده اند، من مجبور شدم درایورها را دانلود کنم، آنها را با درخواست "درایورهای Arduino ch340" بسیار آسان می توان پیدا کرد. پس از یک نصب ساده - همه چیز کار کرد!

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

    اگر USB روی برد من وجود ندارد، چه کاری باید انجام دهم؟

    برد آردوینو پرو مینی کوچکتر است. این با حذف کانکتور USB برای سیستم عامل و همان مبدل USB-UART به دست آمد. بنابراین، باید جداگانه خریداری شود. ساده ترین مبدل در CH340 (ارزان ترین)، CPL2102 و FT232R، به قیمت 1 دلار به فروش می رسد.

    در هنگام خرید توجه کنید که این آداپتور برای چه ولتاژی طراحی شده است. Pro mini در نسخه های 3.3 و 5 ولتی عرضه می شود، اغلب روی مبدل ها یک بلوز برای تغییر ولتاژ تغذیه وجود دارد.

    هنگام فلش Pro Mini، درست قبل از شروع آن، باید RESET را فشار دهید، اما در مبدل های دارای DTR این کار ضروری نیست، نمودار اتصال در شکل زیر است.

    آنها با پایانه های ویژه "مادر-مادر" (زن-زن) متصل می شوند.

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

    چگونه برای آردوینو برنامه بنویسیم؟

    برای کار با طرح ها (نام سیستم عامل به زبان آردوینو)، یک محیط یکپارچه ویژه برای توسعه Arduino IDE وجود دارد، می توانید آن را به صورت رایگان از وب سایت رسمی یا از هر منبع موضوعی دانلود کنید، معمولاً بدون مشکل نصب

    رابط برنامه به این صورت است. شما می توانید برنامه ها را به زبان C AVR ساده شده بنویسید که مخصوص آردوینو توسعه یافته است، در واقع مجموعه ای از کتابخانه ها به نام Wiring و همچنین در C AVR خالص است. که استفاده از آن کد را تسهیل می کند و کار آن را سرعت می بخشد.

    در بالای پنجره یک منوی آشنا وجود دارد که در آن می توانید یک فایل، تنظیمات را باز کنید، بردی را که با آن کار می کنید (Uno، Nano و بسیاری از موارد دیگر) انتخاب کنید و همچنین پروژه ها را با نمونه کدهای آماده باز کنید. در زیر مجموعه ای از دکمه ها برای کار با فریمور قرار داده شده است که در شکل زیر تخصیص کلیدها را مشاهده خواهید کرد.

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

    مبانی برنامه نویسی در آردوینو IDE

    در ابتدای کد، باید متغیرها را اعلام کنید و کتابخانه های اضافی را در صورت وجود متصل کنید، این کار به صورت زیر انجام می شود:

    #include biblioteka.h; // شامل کتابخانه ای به نام "Biblioteka.h"

    #define متغیر 1234; // یک متغیر با مقدار 1234 اعلام کنید

    دستور Define به کامپایلر اجازه می دهد تا نوع متغیر را خود انتخاب کند، اما می توانید آن را به صورت دستی تنظیم کنید، به عنوان مثال، یک عدد صحیح یا یک شناور ممیز شناور.

    int led = 13; // یک متغیر "led" ایجاد کرد و مقدار "13" را به آن اختصاص داد.

    این برنامه می تواند وضعیت پین را 1 یا 0 تعریف کند. 1 یک واحد منطقی است، اگر پایه 13 1 باشد، ولتاژ روی پایه فیزیکی آن برابر با ولتاژ تغذیه میکروکنترلر خواهد بود (برای arduino UNO و Nano - 5 V )

    یک سیگنال دیجیتال با استفاده از دستور digitalWrite(pin, value) نوشته می شود، به عنوان مثال:

    digitalWrite (led، high); //record unit در پین 13 (ما آن را در بالا اعلام کردیم). واحدها

    همانطور که متوجه شدید، جذابیت پورت ها بر اساس شماره گذاری روی برد، شماره مربوطه انجام می شود. در اینجا یک مثال مشابه با کد قبلی آورده شده است:

    digitalWrite (13، بالا); // پایه 13 را به یک تنظیم کنید

    یک تابع تاخیر زمانی که اغلب درخواست می شود با دستور delay() فراخوانی می شود که مقدار آن بر حسب میلی ثانیه داده می شود، میکروثانیه با استفاده از آن به دست می آید.

    delayMicroseconds() Delay(1000); //میکروکنترلر 1000 میلی‌ثانیه (1 ثانیه) صبر می‌کند

    تنظیمات پورت برای ورودی و خروجی در تابع void setup() با دستور زیر تنظیم می شود:

    pinMode (NOMERPORTA، OUTPUT/INPUT)؛ // آرگومان ها - نام متغیر یا شماره پورت، ورودی یا خروجی برای انتخاب

    آشنایی با اولین برنامه Blink

    به عنوان نوعی "Hello, world" برای میکروکنترلرها، برنامه ای برای چشمک زدن LED وجود دارد، بیایید به کد آن نگاه کنیم:

    در ابتدا با دستور pinMode به میکروکنترلر گفتیم که پورت LED را به خروجی اختصاص دهد. قبلاً متوجه شده اید که کد متغیر "LED_BUILTIN" را اعلام نمی کند، واقعیت این است که در بردهای Uno، Nano و سایر بردهای کارخانه، یک LED داخلی به پایه 13 وصل شده و روی برد لحیم می شود. شما می توانید از آن برای نشان دادن در پروژه های خود یا برای آزمایش ساده برنامه های فلاشر خود استفاده کنید.

    سپس پینی که LED به آن لحیم شده است را روی یک (5 ولت) قرار می دهیم، خط بعدی MK را 1 ثانیه منتظر می کند و سپس پایه LED_BUILTIN را صفر می کند، یک ثانیه صبر می کند و برنامه به صورت دایره ای تکرار می شود. وقتی LED_BUILTIN 1 است - LED (و هر بار دیگری که به پورت متصل است) فعال است، وقتی روی 0 تنظیم شود غیرفعال می شود.

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

    میکروکنترلر AVR Atmega328 دارای مبدل 10 بیتی آنالوگ به دیجیتال داخلی است. یک ADC 10 بیتی به شما امکان می دهد مقدار ولتاژ را از 0 تا 5 ولت در مراحل 1/1024 کل دامنه سیگنال (5 ولت) بخوانید.

    برای روشن تر شدن موضوع، وضعیت را در نظر بگیرید، فرض کنید مقدار ولتاژ در ورودی آنالوگ 2.5 ولت است، به این معنی که اگر ولتاژ 0 - "0" باشد، میکروکنترلر مقدار را از پایه "512" می خواند و اگر ولتاژ 5 ولت باشد. - (1023). 1023 - زیرا شمارش از 0 شروع می شود، یعنی. 0، 1، 2، 3 و غیره تا 1023 - 1024 مقدار در کل.

    در اینجا چگونه در کد به نظر می رسد، با استفاده از طرح استاندارد "analogInput" به عنوان مثال.

    int sensorPin = A0;

    int ledPin = 13;

    int sensorValue = 0;

    pinMode (ledPin، OUTPUT)؛

    sensorValue = analogRead(sensorPin);

    digitalWrite (ledPin، HIGH)؛

    تأخیر (sensorValue)؛

    digitalWrite (ledPin، LOW)؛

    تأخیر (sensorValue)؛

    متغیرها را اعلام می کنیم:

      Ledpin - به طور مستقل یک پین با LED داخلی را به خروجی اختصاص دهید و نام فردی را انتخاب کنید.

      sensorPin - ورودی آنالوگ، با توجه به علامت گذاری روی تخته تنظیم شده است: A0، A1، A2 و غیره.

      sensorValue - متغیری برای ذخیره مقدار صحیح خوانده شده و کار بیشتر با آن.

    کد به این صورت عمل می کند: sensorValue مقدار آنالوگ خوانده شده از sensorPin (فرمان analogRead) را ذخیره می کند. - در اینجا کار با سیگنال آنالوگ به پایان می رسد، سپس همه چیز مانند مثال قبلی است.

    ما یک واحد در ledPin می نویسیم، LED روشن می شود و برای مدت زمانی برابر با مقدار sensorValue، یعنی. 0 تا 1023 میلی ثانیه LED را خاموش می کنیم و دوباره برای این مدت زمان صبر می کنیم و پس از آن کد تکرار می شود.

    بنابراین، با موقعیت پتانسیومتر، فرکانس چشمک زدن LED را تنظیم می کنیم.

    تابع نقشه برای آرودینو

    همه عملکردهای محرک ها (من هیچ کدام را نمی شناسم) از "1023" به عنوان آرگومان پشتیبانی نمی کنند، به عنوان مثال، سروو با زاویه چرخش محدود می شود، یعنی برای نیم چرخش (180 درجه) (نیم دور) موتور سروو. حداکثر آرگومان تابع "180" است

    حالا در مورد نحو: map (مقداری که ترجمه می کنیم، حداقل مقدار ورودی، حداکثر مقدار ورودی، حداقل خروجی، حداکثر مقدار خروجی).

    در کد به شکل زیر است:

    (نقشه(analogRead(pot), 0, 1023, 0, 180));

    مقدار را از پتانسیومتر (analogRead (pot)) از 0 تا 1023 می خوانیم و در خروجی اعداد 0 تا 180 را دریافت می کنیم.

    مقادیر نقشه بزرگی:

    در عمل، ما این را روی کد همان سروو اعمال می کنیم، به کدهای آردوینو IDE نگاهی بیندازید، اگر قسمت های قبلی را با دقت بخوانید، پس نیازی به توضیح نیست.

    و یک نمودار سیم کشی

    آردوینو یک ابزار بسیار کاربردی برای یادگیری نحوه کار با میکروکنترلرها است. و اگر از C AVR خالص یا همانطور که گاهی اوقات به آن "C خالص" می گویند - استفاده می کنید - وزن کد را به میزان قابل توجهی کاهش می دهید و بیشتر در حافظه میکروکنترلر جا می شود و در نتیجه یک کارخانه عالی تولید خواهید کرد. برد اشکال زدایی با قابلیت فلش از طریق USB.

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

    برای کسانی که می خواهند با الکترونیک بازی کنند، به عنوان یک طراح پیشرفته، عالی خواهد بود و برای برنامه نویسان با تجربه، به عنوان یک برد که نیاز به مونتاژ ندارد، نیز مفید خواهد بود!

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

    معرفی

    Freeduino/Arduino در یک زبان برنامه نویسی خاص برنامه ریزی شده است - بر اساس C/C++ است و به شما امکان می دهد از هر یک از عملکردهای آن استفاده کنید. به بیان دقیق، هیچ زبان آردوینو جداگانه ای وجود ندارد، همانطور که کامپایلر آردوینو وجود ندارد - برنامه های نوشته شده (با حداقل تغییرات) به یک برنامه C / C ++ تبدیل می شوند و سپس توسط کامپایلر AVR-GCC کامپایل می شوند. بنابراین در واقع، یک نوع C / C ++ تخصصی برای میکروکنترلرهای AVR استفاده می شود.

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

    موافقم، شروع کار با پورت سریال با سرعت 9600 بیت در ثانیه و برقراری تماس در یک خط بسیار راحت است:

    Serial.begin(9600);

    و هنگام استفاده از "لخت" C / C ++، باید با مستندات میکروکنترلر سر و کار داشته باشید و چیزی شبیه به این را صدا کنید:

    UBRR0H = ((F_CPU / 16 + 9600 / 2) / 9600 - 1) >> 8;
    UBRR0L = ((F_CPU / 16 + 9600 / 2) / 9600 - 1);
    sbi (UCSR0B، RXEN0)؛
    sbi (UCSR0B، TXEN0)؛
    sbi (UCSR0B، RXCIE0)؛

    در اینجا نگاهی اجمالی به عملکردها و ویژگی های اصلی برنامه نویسی آردوینو داریم. اگر با نحو زبان‌های C/C++ آشنا نیستید، به شما توصیه می‌کنیم به هر گونه ادبیات در این مورد یا منابع اینترنتی مراجعه کنید.

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

    اسناد کامل تر (به زبان انگلیسی) در وب سایت رسمی پروژه - http://www.arduino.cc در دسترس است. همچنین یک انجمن، پیوندهایی به کتابخانه های اضافی و توضیحات آنها وجود دارد.

    در قیاس با توضیحات در وب سایت رسمی پروژه آردوینو، "پورت" به تماس میکروکنترلر، خروجی به کانکتور زیر شماره مربوطه اشاره دارد. علاوه بر این، یک پورت داده سریال (پورت COM) وجود دارد.

    ساختار برنامه

    در برنامه خود باید دو تابع اصلی را تعریف کنید: setup() و loop().

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

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

    بیایید یک مثال ساده بزنیم:

    void setup() // تنظیمات اولیه
    {
    BeginSerial(9600); // سرعت پورت سریال را روی 9600 bps تنظیم کنید
    pinMode (3، INPUT)؛ // تنظیم پورت سوم برای ورودی داده
    }

    // برنامه پورت سوم را برای وجود سیگنال روی آن بررسی می کند و پاسخی به آن ارسال می کند
    // به عنوان یک پیام متنی به پورت سریال کامپیوتر
    void loop() // بدنه برنامه
    {
    if (digitalRead(3) == HIGH) // شرط برای درگاه نظرسنجی 3
    serialWrite ("H"); // پیامی به شکل حرف H به پورت COM ارسال کنید
    دیگر
    serialWrite ("L"); // پیامی به شکل حرف L به پورت COM ارسال کنید
    تاخیر (1000); // تاخیر 1 ثانیه.
    }

    pinMode (پورت، حالت)؛

    شرح:

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

    گزینه ها:

    پورت - شماره پورتی که می خواهید حالت آن را تنظیم کنید (مقدار صحیح از 0 تا 13).

    حالت - یا INPUT (ورودی) یا OUTPUT (خروجی).

    pinMode (13، OUTPUT)؛ //سیزدهمین پین خروجی خواهد بود
    pinMode (12، INPUT)؛ //و دوازدهمین ورودی است

    توجه داشته باشید:

    ورودی های آنالوگ را می توان به عنوان ورودی/خروجی دیجیتال در صورت دسترسی به اعداد 14 (ورودی آنالوگ 0) تا 19 (ورودی آنالوگ 5) استفاده کرد.

    digitalWrite (پورت، مقدار)؛

    شرح:

    سطح ولتاژ را روی پورت مشخص شده روی بالا (HIGH) یا پایین (LOW) تنظیم می کند.

    گزینه ها:

    پورت: شماره پورت

    مقدار: HIGH یا LOW

    digitalWrite (13، HIGH); // پین 13 را روی حالت "بالا" قرار دهید

    value = digitalRead(port);

    شرح:

    مقداری را در پورت مشخص شده می خواند

    گزینه ها:

    پورت: شماره پورت نظرسنجی شده

    مقدار بازگشتی: مقدار فعلی پورت (HIGH یا LOW) از نوع int را برمی‌گرداند

    مقدار int;
    val = digitalRead(12); // خروجی دوازدهم را نظرسنجی کنید

    توجه داشته باشید:

    اگر چیزی به پورت خواندن متصل نباشد، تابع digitalRead() ممکن است به طور تصادفی HIGH یا LOW را برگرداند.

    سیگنال ورودی/خروجی آنالوگ

    value = analogRead(port);

    شرح:

    مقداری را از پورت آنالوگ مشخص شده می خواند. Freeduino شامل 6 کانال، هر کدام مبدل های 10 بیتی A/D است. این بدان معنی است که ولتاژ ورودی 0 تا 5 ولت به مقدار صحیح 0 تا 1023 تبدیل می شود. وضوح خوانده شده: 5V/1024 مقادیر = 0.004883V/value (4.883mV). خواندن مقدار ورودی آنالوگ تقریباً 100 nS (0.0001 S) طول می‌کشد، بنابراین حداکثر سرعت بازخوانی تقریباً 10000 بار در ثانیه است.

    گزینه ها:

    Return Value: یک int در محدوده 0 تا 1023 را که از پورت مشخص شده خوانده می شود، برمی گرداند.

    مقدار int;
    val = analogRead(0); // خواندن مقدار در ورودی آنالوگ 0

    توجه داشته باشید:

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

    analogWrite (پورت، مقدار)؛

    شرح:

    یک مقدار آنالوگ به پورت خروجی می دهد. این ویژگی روی 3، 5، 6، 9، 10 و 11 پورت دیجیتال Freeduino کار می کند.

    می توان از آن برای تغییر روشنایی LED، کنترل موتور و غیره استفاده کرد. پس از فراخوانی تابع analogWrite، پورت مربوطه در حالت ولتاژ مدوله‌شده با عرض پالس کار می‌کند تا زمانی که تماس بعدی با تابع analogWrite (یا توابع DigitalRead / DigitalWrite در همان پورت) رخ دهد.

    گزینه ها:

    پورت: تعداد ورودی آنالوگ نظرسنجی شده

    مقدار: عدد صحیح بین 0 و 255. مقدار 0 0 ولت در پورت مشخص شده تولید می کند. مقدار 255 +5 ولت در پورت مشخص شده تولید می کند. برای مقادیر بین 0 و 255، پورت به سرعت بین 0 تا 5+ ولت چرخه می‌کند - هر چه مقدار بالاتر باشد، پورت بیشتر HIGH (5V) تولید می‌کند.

    analogWrite(9, 128);// پایه 9 را روی مقداری معادل 2.5 ولت تنظیم کنید

    توجه داشته باشید:

    قبل از فراخوانی تابع analogWrite برای تنظیم پورت برای پین کردن، لازم نیست تابع pinMode را فراخوانی کنید.

    فرکانس تولید سیگنال تقریباً 490 هرتز است.

    time = millis();

    شرح:

    تعداد میلی ثانیه از زمانی که Freeduino برنامه فعلی را اجرا کرده است را برمی گرداند. شمارنده سرریز می شود و پس از تقریباً 9 ساعت به صفر می رسد.

    مقدار بازگشتی: مقداری از نوع بدون علامت long را برمی گرداند

    بدون امضا طولانی مدت؛ // اعلام کردن متغیر زمان از نوع unsigned long
    time = millis(); // عبور از تعداد میلی ثانیه

    تاخیر (time_ms)؛

    شرح:

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

    گزینه ها:

    time_ms – زمان تاخیر برنامه بر حسب میلی ثانیه

    تاخیر (1000); //مکث 1 ثانیه

    تاخیر میکرو ثانیه

    تاخیر میکرو ثانیه (time_μs)؛

    شرح:

    برنامه را برای تعداد مشخص شده میکروثانیه متوقف می کند.

    گزینه ها:

    time_µs – زمان تأخیر برنامه بر حسب میکروثانیه

    تاخیر میکرو ثانیه (500)؛ //مکث 500 میکروثانیه

    pulseIn (پورت، مقدار)؛

    شرح:

    یک پالس (بالا یا کم) را از یک پورت دیجیتال می خواند و مدت زمان پالس را بر حسب میکروثانیه برمی گرداند.

    به عنوان مثال، اگر هنگام فراخوانی تابع، پارامتر "value" روی HIGH تنظیم شود، pulseIn() منتظر می ماند تا پورت سطح سیگنال بالایی را دریافت کند. از لحظه ورود، شمارش معکوس شروع می شود تا پورت سطح سیگنال پایینی را دریافت کند. این تابع طول پالس (سطح بالا) را در میکروثانیه برمی گرداند. با پالس های 10 میکروثانیه تا 3 دقیقه کار می کند. توجه داشته باشید که این تابع تا زمانی که یک پالس تشخیص داده نشود، نتیجه ای را بر نمی گرداند.

    گزینه ها:

    پورت: شماره درگاهی که پالس را از آن می خوانیم

    مقدار: نوع پالس HIGH یا LOW

    مقدار بازگشتی: مدت زمان پالس را بر حسب میکروثانیه برمی گرداند (نوع int)

    مدت زمان بین المللی // اعلان متغیر مدت زمان از نوع int
    duration = pulseIn(pin, HIGH); // اندازه گیری مدت زمان پالس

    ارتباط سریال

    Freeduino دارای یک کنترلر سریال داخلی است که می تواند برای برقراری ارتباط بین دستگاه های Freeduino/Arduino یا با رایانه استفاده شود. در رایانه، اتصال مربوطه با یک پورت USB COM نشان داده می شود.

    ارتباط در پورت های دیجیتال 0 و 1 انجام می شود و بنابراین اگر از عملکردهای داده سریال استفاده می کنید، نمی توانید از آنها برای I/O دیجیتال استفاده کنید.

    Serial.begin (نرخ باد);

    شرح:

    نرخ باود پورت COM را بر حسب بیت در ثانیه برای ارتباط سریال تنظیم می کند. برای برقراری ارتباط با کامپیوتر، از یکی از این سرعت‌های استاندارد استفاده کنید: 300، 1200، 2400، 4800، 9600، 14400، 19200، 28800، 38400، 57600 یا 115200. همچنین می‌توانید با استفاده از پورت‌های میکروکنترل دیگری، یک میکروکنترل دیگر را تعریف کنید. و 1.

    گزینه ها:

    baudrate: نرخ داده بر حسب بیت در ثانیه.

    Serial.begin(9600); //سرعت را روی 9600 bps تنظیم کنید

    serial.available

    count = serial.available();

    شرح:

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

    ارزش برگشتی:

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

    if (Serial.available() > 0) ( // اگر داده ای در بافر وجود دارد
    // در اینجا باید داده ها را دریافت و پردازش کند
    }

    char = Serial.read();

    شرح:

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

    ارزش برگشتی:

    اولین بایت موجود از داده های ورودی از پورت سریال، یا -1 اگر داده ورودی وجود نداشته باشد.

    incomingByte = Serial.read(); // خواندن بایت

    شرح:

    بافر ورودی پورت سریال را پاک می کند. داده‌های بافر از بین می‌روند و تماس‌های بیشتر به Serial.read() یا Serial.available() برای داده‌های دریافت‌شده پس از تماس با Serial.flush () منطقی خواهد بود.

    Serial.flush(); // پاک کردن بافر - شروع به دریافت داده "از ابتدا"

    شرح:

    خروجی داده به پورت سریال

    گزینه ها:

    تابع بسته به نوع و فرمت داده های خروجی چندین فرم تماس دارد.

    Serial.print(b، DEC) یک رشته ASCII، نمایش دهدهی b را چاپ می کند.

    int b = 79;

    Serial.print(b، HEX) یک رشته ASCII، نمایش هگزادسیمال عدد b را چاپ می کند.

    int b = 79;

    Serial.print(b, OCT) یک رشته ASCII را چاپ می کند که نمایش هشتگانه عدد b است.

    int b = 79;
    چاپ سریال (b، oct)؛ // رشته "117" را به پورت خروجی می دهد

    Serial.print(b، BIN) یک رشته ASCII، نمایش باینری عدد b را چاپ می کند.

    int b = 79;
    Serial.print (b، BIN); // رشته "1001111" را به پورت خروجی می دهد

    Serial.print(b، BYTE) بایت کم b را چاپ می کند.

    int b = 79;
    Serial.print (b، BYTE); //عدد 79 (یک بایت) را چاپ می کند. در مانیتور
    //پورت سریال ما شخصیت "O" را دریافت می کنیم - آن
    //کد 79 است

    Serial.print(str) اگر str یک رشته یا آرایه ای از کاراکترها باشد، str را بایت به بایت به پورت COM ارسال می کند.

    بایت کاراکتر = (79، 80، 81); //آرایه 3 بایتی با مقادیر 79،80،81
    Serial.print("در اینجا بایت های ما:"); // رشته "Here our bytes" را چاپ می کند:
    چاپ سریال (بایت)؛ //خروجی 3 کاراکتر با کدهای 79,80,81 -
    //اینها شخصیت های "OPQ" هستند

    Serial.print(b) اگر b از نوع بایت یا char باشد، خود عدد b را در پورت چاپ می کند.

    Charb = 79;
    چاپ سریال (ب)؛ //کاراکتر "O" را به پورت صادر می کند

    Serial.print(b) اگر b یک عدد صحیح باشد، نمایش دهدهی b را در پورت چاپ می کند.

    int b = 79;
    چاپ سریال (ب)؛ // رشته "79" را به پورت خروجی می دهد

    شرح:

    تابع Serial.println مشابه تابع Serial.print است و گزینه های فراخوانی یکسانی دارد. تنها تفاوت این است که دو کاراکتر اضافی پس از داده‌ها خروجی می‌شوند - یک بازگشت بار (ASCII 13، یا "\r") و یک کاراکتر خط جدید (ASCII 10، یا "\n").

    مثال 1 و مثال 2 همان خروجی را به پورت می دهند:

    int b = 79;
    Serial.print(b, DEC); // رشته "79" را به پورت خروجی می دهد
    Serial.print("\r\n"); // کاراکترهای "\r\n" - newline را نمایش می دهد
    Serial.print(b, HEX); // رشته "4F" را به پورت خروجی می دهد
    Serial.print("\r\n");//کاراکترهای "\r\n" را چاپ خواهد کرد - خط جدید

    int b = 79;
    Serial.println(b، DEC); // رشته "79\r\n" را به پورت خروجی خواهد داد
    Serial.println(b، HEX); // رشته "4F\r\n" را به پورت خروجی خواهد داد

    در مانیتور پورت سریال دریافت می کنیم.