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

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

آموزش آردوینو قسمت هجدهم

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

دریافت سریال دیتا

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

این اسکچ یک رقم (تک کاراکتری از 0 تا 9) دریافت می کند و سپس سرعت چشمک زدن LED، متناسب با این رقم دریافتی تغییر می کند.

ابتدا اسکچ را جایگذاری و آپلود کنید و سپس با استفاده از سریال مانیتور پیام ارسال کنید. سریال مانیتور را با کلیک‌کردن روی نماد مانیتور (بالا سمت راست)، باز کنید و یک رقم را در کادر متنی بالای پنجره نمایشگر سریال تایپ کنید. با کلیک بر روی دکمه ارسال، کاراکتر تایپ شده در کادر متن، ارسال می‌شود. اگر رقمی را تایپ کنید، نرخ چشمک‌زدن (blink rate) را باید مشاهده کنید.

تابع Serial.read مقدار int را برمی‌گرداند؛ بنابراین برای مقایسه‌های بعدی باید آن را به یک char ارسال کنید. روش تبدیل به کارکتر به صورت زیر است.

حال نیاز است که مقادیر ASCII به عداد تبدیل شود اگر با روشی که ASCII، کاراکترها را نشان می‌دهد آشنا نباشید، احتمالاً تبدیل کاراکترهای ASCII به مقادیر عددی برای شما کمی مشکل به نظر برسد. کد زیر کاراکتر ch را به مقدار عددی آن تبدیل می‌کند:

کاراکترهای ”0 تا ‘9’  ASCII دارای مقدار 48 تا 57 هستند. تبدیل ‘1’ به مقدار عددی 1 با تفریق ‘0’ انجام می شود؛ زیرا ‘1’ دارای مقدار ASCII، 49 است؛ بنابراین باید مقدار 48 (ASCII ‘0’) از آن کم شود تا این عدد به عدد 1 تبدیل شود. برای مثال، اگر ch نشان دهنده کاراکتر 1 است، مقدار ASCII آن 49 می باشد. عبارت ‘0’ -49 همان 48 – 49 است. این مقدار برابر با 1 است که مقدار عددی کاراکتر 1 می‌باشد.

  • به‌عبارت‌دیگر، عبارت (ch -‘0’) همان (ch- 48) است. این مقدار ASCII متغیر ch را به یک مقدار عددی تبدیل می‌کند.
  • شما با استفاده از روش‌های parseInt و parse Float که استخراج مقادیر عددی از سریال را ساده می‌کنند، می‌توانید اعدادی با بیش از یک رقم دریافت کنید. (همچنین، با استفاده از Ethernet و سایر آبجکت‌های کلاس Stream نیز این کار امکان‌پذیر است.)
  • ()Serial.parseInt و ()Serial.parseFloat کاراکترهای سریال را می‌خوانند و نمایش عددی آن‌ها را برمی‌گردانند. کاراکترهای غیرعددی قبل از عدد نادیده گرفته می‌شوند و عدد با اولین کاراکتر که رقم عددی نیست (یا “.” در صورت استفاده از parseFloat) به پایان می‌رسد.

اگر هیچ کاراکتر عددی در ورودی وجود نداشته باشد، توابع 0 را برمی‌گردانند؛ بنابراین باید مقادیر صفر را بررسی و به درستی مدیریت کنید.

اگر سریال مانیتور (Serial Monitor) را طوری کانفینگ کرده‌اید که وقتی روی گزینه Send کلیک می‌کنید، یک کاراکتر جدید یا یک کاراکتر CR (Carriage Return) یا هر دو را ارسال می کند (همان منوی کشویی کنار نرخ ارتباط (baud rate))، parseInt یا parseFloat، این کاراکتر جدید یا کاراکتر CR را به عنوان یک عدد تفسیر می کند و در نتیجه، صفر برمی‌گرداند. این کار باعث می شود که blinkDe lay بلافاصله پس از تنظیم مقدار موردنظر خود روی صفر تنظیم شود که منجر به چشمک نزدن LED می شود:

روش دیگری برای تبدیل رشته (string) های متنی که اعداد را نشان می‌دهند، استفاده از تابع تبدیل زبان C به نام atoi (برای متغیرهای int) یا atol (برای متغیرهای long) می‌باشد. این توابع با نام نامشخص یک رشته را به اعداد صحیح یا اعداد صحیح long تبدیل می‌کنند. برای استفاده از این توابع، قبل از اینکه تابع تبدیل را فراخوانی کنید، باید کل رشته (string) را در یک آرایه کاراکتری دریافت و ذخیره کنید.

این کد، ارقام ورودی را در هر کاراکتری که یک رقم نیست (یا هنگامی که بافر پر است) پایان می‌دهد:

strValue یک رشته عددی است که از کاراکترهای دریافت شده از پورت سریال ساخته شده است.

atoi (مخفف ASCII to integer) تابعی است که رشته کاراکتری را به عدد صحیح تبدیل می‌کند (atol به عدد صحیح long تبدیل می‌شود).

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

برای کسب اطلاعات بیشتر درباره “atoi” و “atol” به لینک زیر مراجعه کنید:

https://oreil.ly/8kQqp

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

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

یک راه آسان برای انجام این کار، ارسال یک رشته متنی است که در آن تمام فیلدها با یک کاراکتر جداکننده (separating) مانند کاما از هم جدا شده‌اند.

در اینجا کد پایتون پردازش برای برد رزبری پای آورده شده است؛ این کد دیتا را از پورت سریال می‌خواند:

در اینجا کد آردوینو، رشته متنی زیر را به پورت سریال می‌فرستد (r\ نشان‌دهنده کاراکتر  CR یا همان Carriage Return و n\ نشان‌دهنده کاراکتر LF همان Line Feed می‌باشد):

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

هر زمان که آردوینو با استفاده از تابع ()println پرینت می‌کند، کاراکترهای CR (Carriage Return) و LF (Line Feed) ارسال می‌شوند که این کار به ‌طرف گیرنده (receiving side) کمک می‌کند تا بفهمد که آیا رشته پیام (message string) کامل دریافت شده است یا خیر.

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

✅نکته

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

خواندن پردازش برای نمایش مقادیر سنسور می‌تواند به شما در تجسم دیتاها کمک کند و در نتیجه، باعث صرفه جویی در زمان دیباگ شود. اگرچه CSV یک فرمت رایج و مفید است، اما JSON (Java Script Object Notation) گویاتر و برای انسان قابل خواندن است. JSON یک فرمت رایج تبادل داده است که برای تبادل پیام در یک شبکه استفاده می‌شود.

اسکچ زیر شتاب‌سنج را از Arduino WiFi Rev 2 یا Arduino Nano 33 BLE Sense می‌خواند و آن را با استفاده از JSON به پورت سریال می‌فرستد (به‌عنوان‌مثال: {‘x’: 0.66, ‘y’: 0.59, ‘z’: -0.49, }):

 برنامه پردازش برد رزبری پای زیر، نمایش بصری real-time تا مقدار 12 از آردوینو را اضافه می کند. این اسکچ، مقادیر ممیز شناور (floating-point) را در محدوده 5- تا 5+ نمایش می دهد:

شکل 1 نشان می دهد که چگونه مقادیر شتاب سنج (x، y، z) نمایش داده می شوند. هنگامی که دستگاه را تکان دهید، نوارها ظاهر می شوند.

صفحه پردازشی که دیتاهای سنسور را نشان می دهد.

شکل 1: صفحه پردازشی که دیتاهای سنسور را نشان می دهد.

در صورت نیاز، می‌توان محدوده مقادیر و مبدأ نمودار را به‌راحتی تغییر داد. به‌عنوان‌مثال، برای نمایش نوارهایی از محور چپ با مقادیر 0 تا 1024، می توانید از موارد زیر استفاده کنید:

اگر شتاب‌سنج ندارید، می‌توانید با اسکچ ساده زیر مقادیری ایجاد کنید که مقادیر ورودی آنالوگ را نمایش ‌دهد و اگر هیچ سنسوری برای اتصال ندارید، با زدن انگشتان خود در پایین پین‌های آنالوگ سطوحی ایجاد می‌شود که در اسکچ پردازش قابل‌مشاهده هستند. این مقادیر از 0 تا 1023 متغیر است؛ بنابراین می‌توانید مبدأ و مقادیر حداقل و حداکثر را در اسکچ پردازش تغییر دهید، همان‌طور که در پاراگراف قبلی توضیح داده شد:

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

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

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

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