آموزش جامع برد Arduino Uno - قسمت چهارم!

توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل می‌شود!تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا می‌کنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم.با کمال تشکرداریوش تصدیقیکلیه اطلاعات تماس: https://DTAT.irنسخه مقاله: ۱.۰ - تاریخ بروزرسانی: ۱۴۰۱/۰۳/۲۳با سلام و احترام خدمت دوستان عزیزم، اول این‌که چرا از قسمت چهارم شروع کردم! چون علاقه خاصی به مجموعه فیلم‌های Star Wars دارم، و اگر در جریان تولید و پخش این مجموعه فیلم‌ها باشید، خواهید فهمید که اولین قسمت این مجموعه با شماره چهار آغاز گردید! و بعدها (سی سال بعد) سه قسمت اول تولید شدند! به هر حال چون راه‌اندازی و اتصالات اولیه این Board به سه جلسه نیاز دارد، نوشتن مقاله در این خصوص را فعلا به بعد موکول کردم (البته نه به سی‌سال دیگر :-) ) و از این جلسه می‌خواهم برنامه‌نویسی بر روی این Board را آموزش دهم.آموزش برنامه‌نویسی بر روی برد Arduino Uno و یا Arduino Nano (قسمت اول)پیش‌نیاز این دورهآشنایی با مفاهیم اولیه برنامه‌نویسی و الگوریتم و فلوچارتدانلود کامپایلر و محیط برنامه‌نویسی Arduino IDEوارد نشانی ذیل شده و آخرین نسخه فایل Setup آن‌را دانلود و نصب می‌کنیم:https://www.arduino.cc/en/softwareنکات جالبنسخه قدیمی این محیط، نسخه ۱.۸.۱۹ بود که با یک انقلابی، متحول شد و نسخه ۲ نسخه پیشنهادی و مناسب می‌باشد.این محیط کاملا سورس‌باز (Open Source) می‌باشد و می‌توانیم سورس‌کد این محیط را از نشانی ذیل دانلود و مشاهده نماییم:https://github.com/arduino/arduino-ideمی‌توانیم به صورت آنلاین، کدنویسی کنیم و در مرحله اول، و خصوصا برای یادگیری، شاید نیازی به دانلود و نصب این محیط نباشد! خصوصا می‌توانیم آموزش‌ها را مطالعه کرده و عملیات شبیه‌سازی Board را با استفاده از محیط‌های قابل برنامه‌نویسی و شبیه‌ساز انجام داده و در صورتی که موضوع برای ما جذاب و هیجان‌انگیز بود، نسبت به خرید Board و دانلود و نصب محیط Arduino IDE اقدام نماییم:https://create.arduino.cc/editorسایت فوق‌العاده دیگری که مشابه این امکانات را به ما می‌دهد:https://www.tinkercad.comوارد برنامه Arduino IDE می‌شویم و پس از اتصال Arduino Uno Board به دستگاه، اقدام به برنامه‌نویسی می‌کینم. در مقاله دیگری، نکاتی که در خصوص اتصال و راه‌اندازی اولیه وجود دارد به شما عزیزان آموزش داده می‌شود.نکاتی که در خصوص این زبان برنامه‌نویسی باید بدانیمزبان برنامه‌نیسی، زبان C یا ++C می‌باشد.این زبان، یک زبان Case Sensitive می‌باشد و حروف بزرگ و کوچک برای آن اهمیت دارد.در انتهای اکثر (نه همه!) دستورات باید یک Semicolon (;) قرار دهیم.در ابتدای کار، با دو تابع مواجه می‌شویم، به نام‌های setup و loop. حضور و وجود این دو تابع بسیار مهم می‌باشد! و ما نمی‌توانیم حتی یکی از آن‌ها را (حتی اگر به آن، نیازی نداریم) حذف کرده و یا نام آن‌ها را تغییر دهیم.تابع Setup برای پیکربندی اولیه می‌باشد، مثلا در داخل این تابع اعلام می‌کنیم که می‌خواهیم پین (PIN) شماره ۴، به عنوان ورودی یا خروجی در نظر گرفته شود.تابع Loop، برای نوشتن اصل فعل و انفعالاتی است که می‌خواهیم به صورت نامحدود انجام شده و تکرار شوند، مثلا می‌خواهیم از لحظه‌ای که دستگاه روشن می‌شود، LED (چراغ) روی Board در فاصله زمانی یک ثانیه یک‌بار روشن و خاموش شود.نکته: هرگاه در حین آموزش با کلمه [الکترونیک] مواجه شدید، این بدان معنا است که باید در آن خصوص، کمی دانش مبانی الکترونیک داشته باشید و سپس اقدام نمایید. در طی این سری مقالات به مرور این موضوعات را نیز به صورت مقالات جداگانه‌ای منتشر خواهم کرد و لینک مورد نظر را به روز رسانی خواهم نمود.نکته: از آنجایی که این دوره (انشاءالله) به صورت یک دوره مجازی و به همراه فیلم آموزشی خواهد بود، شاید توضیحات خیلی مبسوطی در هنگام نوشتن سورس‌کد‌ها گفته نشود و صرفا کد مذکور نوشته شده و نکات آموزشی آن در فیلم‌های آموزشی به طور کامل گفته خواهند شد:سورس‌کد شماره یکvoid setup ( ) { } void loop ( ) { }کد فوق در کمال شلختگی نوشته شده است! لذا باید همیشه عادت کنیم، ضمن این‌که از حداقل اصول نگارش در سورس‌کدها استفاده نماییم، هر از گاهی از دکمه‌های ترکیبی CTRL+T استفاده نماییم تا محیط IDE، سورس‌کد ما را مرتب نماید.نکته: با تجربه ۳۳ ساله در حوزه برنامه‌نویسی و با داشتن بیش از ۱۶ هزار دانش‌پژوه، تجربه به اینجانب ثابت کرده است که شخصی که دراز مدت، به شکل شلخته فوق، برنامه‌نویسی می‌کند، یا به سرانجام نخواهد رسید و یا افراد و شرکت‌هایی که با وی کار خواهند کرد را به شدت دچار چالش می‌کند!سورس‌کد شماره دوvoid setup() { } void loop() { }بر خلاف زبان‌های برنامه‌نویسی، مانند زبان C, C++, C#, Java و غیره، در این محیط، دیسیپلین [تاکتیک] نوشتن کد به گونه‌ای است که توصیه می‌شود که آکولاد باز، در مقابل دستور نوشته شود و نه در ذیل آن:سورس‌کد شماره سهvoid setup() { } void loop() { }نکته:‌ نوشتن دستورات به شکل فوق، مطلقا غلط نمی‌باشد!نکته: در طی این دوره، وقتی از کلمه تاکتیک استفاده می‌کنم، این بدان معنا است که عدم رعایت آن، هیچ‌گونه مشکلی در سورس‌کد برنامه و یا اجرای آن ایجاد نمی‌کند! بلکه اگر رعایت نکنیم و یک شخص باتجربه و حرفه‌ای سورس‌کد ما را ملاحظه کند، ممکن است که توی ذوق وی خورده! و از تجربه و تخصص ما مایوس شود! پس تقاضا می‌کنم که به تاکتیک‌هایی که عنوان می‌شود، برای بالا بردن پرستیژ و پرنسیو تخصصی و شخصی خود دقت نمایید!بر روی Arduino Uno Board یک LED (چراغ) وجود دارد که معمولا در ابتدا می‌خواهیم کنترل روشن و خاموش شدن آن‌را برعهده بگیریم.بر روی Arduino Uno Board یک تعداد مربع‌های سیاه‌رنگ سوراخ‌دار در لبه‌های آن قرار دارند، که به آن‌ها اصطلاحا PIN گفته می‌شود.ما م‌توانیم برای هر PIN ای که می‌خواهیم با آن کار کنیم، اعلام نماییم که می‌خواهیم به آن سیگنال ارسال کنیم (OUTPUT) و یا از آن سیگنال دریافت کنیم (INPUT).مثلا اگر بخواهیم به یک LED دستور بدهیم که روشن شود و یا خاموش شود، در واقع به آن سیگنال ارسال می‌کنیم، پس پایه‌ای (PIN) که به آن LED متصل شده است، باید به عنوان پایه خروجی (OUTPUT) تعریف شود.یا مثلا اگر بخواهیم در مدار خود یک دکمه (Button) قرار داده و زمانی که کاربر بر روی آن فشار می‌دهد، متوجه شده و اقدامی انجام دهیم، در این حالت پایه‌ای که دکمه را به آن متصل کرده‌ایم، به ما سیگنال ورود (INPUT) ارسال می‌کند و باید در قسمت پیکربندی (تابع setup)، آن‌را به عنوان پایه ورودی تعریف نماییم.چراغ (LED) موجود روی Board، به صورت پیش‌فرض، روی پایه ۱۳ نصب شده است. لذا در قسمت پیکربندی، ابتدا این موضوع را به Board اعلام می‌کنیم.سپس سیگنال یک (High) را به این پایه ارسال می‌کنیم، تا اصطلاحا این LED روشن شود:سورس‌کد شماره چهارvoid setup() { pinMode(13, OUTPUT); digitalWrite(13, 1); } void loop() { }یک‌بار بر روی دکمه Verify که به شکل یک تیک می‌باشد (در Toolbar) کلیک می‌کنیم که از سالم بودن سورس‌کد خود اطمینان حاصل کنیم.سپس بر روی دکمه Upload که به شکل یک فلش به سمت راست می‌باشد (در کنار دکمه Verify)، کلیک می‌کنیم، تا دستورات ما به Board، آپلود شده و اجرا شود. پس از اجرای این دستور خواهید دید که LED موجود بر روی Board روشن می‌شود.حال می‌خواهیم این LED را خاموش کنیم، مجددا روال قبل را انجام داده و این‌بار سورس‌کد را به شکل ذیل تغییر می‌دهیم:سورس‌کد شماره پنجvoid setup() { pinMode(13, OUTPUT); digitalWrite(13, 0); } void loop() { }خواهیم دید که این‌بار، پس از اجرای برنامه، چراغ LED، خاموش می‌شود، و البته خاموش می‌ماند.تابع (Function) pinMode دو پارامتر دریافت می‌کند. پارامتر اول، شماره پنن می‌باشد و پارامتر دوم، ورودی یا خروجی بودن آن‌را اعلام می‌کند.تابع digitalWrite نیز دو پارامتر دریافت می‌کند. پارامتر اول، شماره پین بوده و پارامتر دوم ارسال سیگنال صفر و یک (HIGH, LOW) یا به طور خلاصه روشن، خاموش را به پین مذکور ارسال می‌کند.نکته: ما دستوری به نام analogWrite نیز داریم که در جای خود آموزش داده می‌شود.همان‌طور که در دستورات فوق ملاحظه می‌کنید، عدد ۱۳ و اعداد صفر و یک، چندان حس خوبی به ما نمی‌دهد و خوانایی سورس‌کد ما خیلی بالا نیست! و برای شخصی که می‌خواهد این سورس‌کد را ملاحظه کرده و متوجه شود، یا حتی خودمان، آن‌هم وقتی چندین ماه از نوشتن این سورس‌کد گذشته باشد، درک و فهم این سورس‌کد در دراز مدت، چندان کار ساده‌ای نمی‌باشد. برای این منظور می‌توانیم از متغیرهایی (در واقع ثابت‌هایی) استفاده کنیم که به صورت Built In (از پیش تعریف شده) در این محیط تعریف شده‌اند. مثلا به جای عدد ۱۳، می‌توانیم از کلمه LED_BUILTIN استفاده نماییم، و به جای استفاده از صفر (0) و یک (1)، از کلمات LOW و HIGH استفاده نماییم:سورس‌کد شماره ششvoid setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); } void loop() { }همان‌گونه که ملاحظه می‌کنید، سورس‌کد ما دقیقا همان کار قبلی را انجام می‌دهد، ولی سورس‌کد از خوانایی مناسب‌تری برخوردار شده است. این دقیقا همان تاکتیک یا تاکتیک حرفه‌ای‌گری است!تشکر و تقدیربا تشکر از امیر بادامچی عزیز، بابت ویرایش علمی و متنی این مقالهپایان