آردوینو, توصیه شده

دریافت داده‌های باینری از آردوینو + ارسال مقادیر باینری از Processing به آردوینو + ارسال مقادیر چندین پین | قسمت بیستم آموزش آردوینو

قسمت بیستم آردوینو

در قسمت نوزدهم از آموزش آردوینو به بررسی دریافت چندین فیلد متنی در یک پیام و همچنین، ارسال داده‌های باینری از آردوینو، پرداختیم. در این قسمت قصد داریم درباره دریافت داده‌های باینری از آردوینو در کامپیوتر، ارسال مقادیر باینری از Processing به آردوینو و همچنین، ارسال مقادیر چندین پین آردوینو صحبت کنیم.

دریافت داده‌های باینری از آردوینو در کامپیوتر

در ادامه درباره چگونگی پاسخ‌دادن به داده‌های باینری ارسال شده از آردوینو در یک زبان برنامه‌نویسی مانند Processing توضیح داده می‌شود.

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

در اینجا دو کد از Processing برای خواندن یک بایت آورده شده است که از مثال SimpleRead در Processing گرفته شده است:

کد زیر یک اسکچ (sketch) در Processing است که اندازه‌ی یک مستطیل را به‌صورت متناسب با مقادیر عدد صحیح دریافت‌شده از کد آردوینو تنظیم می‌کند:

✅نکته

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

زبان برنامه‌نویسی Processing و آردوینو مشابه هستند. تابع setup در Processing برای انجام تنظیمات اولیه یک‌باره استفاده می‌شود، درست مانند آردوینو. در Processing یک پنجره نمایش وجود دارد و تابع setup اندازه آن را با فراخوانی size(600,600) به 600 × 600 پیکسل تنظیم می‌کند.

کد String portName = Serial.list()[portIndex]; پورت سریال را انتخاب می‌کند. در Processing، تمام پورت‌های سریال در آبجکت Serial.list قرار دارند و این مثال از مقدار یک متغیر به نام  portIndex استفاده می‌کند. println((Object[]) Serial.list()) تمام پورت‌های موجود را چاپ می‌کند و کد myPort = new Serial(this, portName, 9600);  پورتی را که به‌عنوان portName انتخاب شده است، باز می‌کند. اطمینان حاصل کنید که مقدار portIndex (در خط دهم) را به پورت سریالی که آردوینو به آن متصل است، تنظیم کنید.

آردوینو معمولاً اولین پورت در مک است؛ اما در کامپیوترهای شخصی (PC)، اگر دستگاه دارای پورت فیزیکی RS-232 باشد، معمولاً آردوینو آخرین پورت است، در غیر این صورت، ممکن است اولین پورت باشد. همچنین، می‌توانید به لیست پورت‌ها در IDE آردوینو نگاه کنید که ممکن است پورت‌های سریال را به همان ترتیب که Processing آن‌ها را شماره‌گذاری می‌کند، نمایش دهد.

تابع draw در Processing مانند تابع loop در آردوینو عمل می‌کند؛ این تابع به‌صورت مکرر فراخوانی می‌شود. کد موجود در draw بررسی می‌کند که آیا داده‌ای در پورت سریال موجود است یا خیر؛ اگر داده‌ای وجود داشته باشد، بایت‌ها خوانده شده و به مقدار عدد صحیحی که توسط بایت‌ها نمایش داده می‌شود، تبدیل می‌شوند. سپس یک مستطیل بر اساس مقادیر عدد صحیح دریافت‌شده رسم می‌شود.

ارسال مقادیر باینری از Processing به آردوینو

در ادامه درباره چگونگی ارسال بایت‌های باینری، اعداد صحیح یا مقادیر طولانی (long) از Processing به آردوینو صحبت می‌شود. به‌عنوان‌مثال، چگونگی ارسال پیامی که شامل یک شناسه پیام ‘tag’ و دو مقدار 16 بیتی باشد.

برای این کار از کد زیر استفاده کنید:

هنگامی که روی پنجره Processing کلیک می‌شود، تابع sendMessage با برچسب 8 بیتی که نشان می‌دهد این پیام مربوط به ماوس است و دو مختصات 16 بیتی ماوس در محورهای x و y فراخوانی می‌شود. تابع sendMessage مقادیر x و y ۱۶بیتی را به‌صورت دو بایت ارسال می‌کند، به‌طوری‌که بایت با بیش ترین مقدار اول ارسال می‌شود.

در اینجا کد آردوینو برای دریافت این پیام‌ها و ارسال نتایج به Processing آورده شده است:

برچسب (tag) یک بررسی اضافی برای اعتبار پیام (message validity) فراهم می‌آورد و این امکان را می‌دهد که انواع دیگری از پیام‌ها که ممکن است بخواهید ارسال کنید به‌طور جداگانه مدیریت شوند. در این مثال، تابع با سه پارامتر فراخوانی می‌شود: یک برچسب و مختصات ماوس x و y به‌صورت 16 بیتی.

کد آردوینو بررسی می‌کند که حداقل تعداد بایت‌های MESSAGE_BYTES دریافت شده باشد تا اطمینان حاصل شود که پیام تا زمانی که تمام داده‌های موردنیاز در دسترس نباشد، پردازش نشود. پس از بررسی هدر و تگ، مقادیر 16 بیتی به‌صورت دو بایت خوانده می‌شود، به‌طوری‌که بایت اول در 256 ضرب می‌شود تا بایت با بیشترین مقدار به مقدار اصلی خود بازگردانده شود.

اگر بخواهید خروجی سریال آردوینو را به دستگاه دیگری، مانند یک نمایشگر کاراکتری LCD سریال، ارسال کنید، می‌توانید از پورت SoftwareSerial یا یکی از پورت‌های سریال اضافی برد خود استفاده کنید. شما باید پورت سریال را در تابع setup راه‌اندازی کنید و تمام دستورات Serial.write و Serial.print/println را تغییر دهید تا از آن پورت سریال استفاده کنند. به‌عنوان‌مثال، تغییرات زیر داده‌های سریال را به پین TX1 از پورت Serial1 در آردوینو WiFi Rev 2 ،Leonardo و بیشتر بردهای سازگار با ARM ارسال می‌کند. ابتدا باید این کد را به تابع setup اضافه کنید:

 و کدهای print/println/write را در انتهای تابع loop به‌صورت زیر تغییر دهید:

و:

✅نکته

فرستنده و گیرنده باید از یک اندازه پیام (message size) یکسان برای پیام‌های باینری استفاده کنند تا این پیام‌ها به‌درستی پردازش شوند. اگر می‌خواهید تعداد بایت‌های ارسالی را افزایش یا کاهش دهید، مقدار TOTAL_BYTES را در کد آردوینو تغییر دهید تا با آن مطابقت داشته باشد.

ارسال مقادیر چندین پین آردوینو

در ادامه این قسمت، چگونگی ارسال گروه‌هایی از بایت‌های باینری، اعداد صحیح یا مقادیر طولانی (long) از آردوینو بررسی می‌شود. به‌عنوان‌مثال، طریقه ارسال مقادیر پین‌های دیجیتال و آنالوگ از آردوینو به Processing.

در اینجا، ابتدا یک هدر ارسال می‌شود و سپس یک عدد صحیح (integer) که شامل مقادیر بیتی پین‌های دیجیتال 2 تا 13 است. پس از آن، شش عدد صحیح ارسال می‌شود که مقادیر پین‌های آنالوگ 0 تا 5 را شامل می‌شود. قسمت های قبل شامل مثال های زیادی هستند که مقادیر پین‌های آنالوگ و دیجیتال را تنظیم می‌کنند و شما می‌توانید از آن‌ها برای آزمایش این کد استفاده کنید.

کد ابتدا یک هدر (کاراکتر H) ارسال می‌کند و سپس یک عدد صحیح (integer) که مقادیر پین‌های دیجیتال را در خود نگه می‌دارد. از تابع bitRead برای تنظیم یک بیت در این عدد صحیح استفاده می‌شود تا با مقدار پین مربوطه مطابقت داشته باشد. سپس شش عدد صحیح ارسال می‌شود که شامل مقادیر خوانده‌شده از شش پورت آنالوگ است. تمام مقادیر عدد صحیح با استفاده از تابع sendBinary ارسال می‌شوند. این پیام 15 بایت طول دارد؛ همچنین، دارای یک بایت برای هدر، دو بایت برای مقادیر پین‌های دیجیتال و 12 بایت برای شش عدد صحیح آنالوگ می‌باشد. کد مربوط به ورودی‌های دیجیتال و آنالوگ است.

با فرض اینکه پین‌های آنالوگ مقادیر:

f 0 on pin 0, 100 on pin 1, and 200 on pin 2 through 500 on pin 5 و پین‌های دیجیتال 2 تا 7 در حالت High و پین‌های 8 تا 13 در حالت Low باشند، این مقادیر اعشاری (decimal) هر بایت ارسال‌شده است:

این کد Processing پیام را می‌خواند و مقادیر را در کنسول Processing چاپ می‌کند:

کد Processing منتظر می‌ماند تا 15 کاراکتر دریافت شود. اگر اولین کاراکتر هدر باشد، سپس تابعی به نام readArduinoInt را فراخوانی می‌کند تا دو بایت را خوانده و آن‌ها را به عدد صحیح تبدیل کند، با انجام عملیاتی ریاضی که آردوینو برای به‌دست‌آوردن بیت‌های جداگانه نمایانگر پین‌های دیجیتال انجام داده است. سپس شش عدد صحیح به مقادیر آنالوگ تبدیل می‌شوند.

📍توجه

توجه داشته باشید که پین‌های دیجیتال به‌طور پیش‌فرض همه روی 1 (HIGH) تنظیم می‌شوند. این موضوع به‌این‌علت است که مقاومت‌های داخل (pull-ups) روی آن‌ها با استفاده از INPUT_PULLUP فعال شده‌اند. این بدین معنی است که اگر دکمه‌ای به آن‌ها متصل باشد، مقدار 1 نشان‌دهنده این است که دکمه فشار داده نشده است، درحالی‌که مقدار 0 نشان‌دهنده این است که دکمه فشار داده شده است.

سخن ‌پایانی

شما می‌توانید برای ارسال مقادیر آردوینو به کامپیوتر یا کنترل پین‌ها از کامپیوتر (without making decisions on the board) از Firmata استفاده کنید. کتابخانه Firmata و نمونه‌های کد (File→Examples→Firmata)  در توزیع نرم‌افزار آردوینو گنجانده شده است و کتابخانه‌ای برای استفاده در Processing نیز در دسترس است. دراین‌خصوص، شما باید کد Firmata را روی آردوینو بارگذاری و کنترل ‌کنید که پین‌ها ورودی یا خروجی باشند و سپس آن‌ها را تنظیم ‌کنید.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *