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

ثبت اطلاعات آردوینو در یک فایل کامپیوتر + ارسال داده به بیش از یک دستگاه سریال | قسمت بیست و یکم آردوینو

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

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

ثبت اطلاعات آردوینو در یک فایل کامپیوتر

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

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

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

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

نام پیش‌فرض فایل لاگ با استفاده از تابع DateFormat در Processing ایجاد می‌شود.

برای ایجاد نام کامل فایل، از کدی استفاده می‌شود که مسیر ذخیره‌سازی فایل و پسوند آن را به نام فایل اضافه می‌کند.

برای ایجاد فایل و خروج از اسکچ، می‌توانید درحالی‌که پنجره اصلی اسکچ پروسسینگ (Processing) فعال است، هر کلیدی را فشار دهید. اما کلید Escape را فشار ندهید؛ زیرا این کار باعث می‌شود اسکچ بدون ذخیره‌سازی فایل به طور کامل بسته شود. فایل در همان دایرکتوری که اسکچ پروسسینگ در آن ذخیره شده است، ایجاد خواهد شد (اسکچ باید حداقل یک‌بار ذخیره شده باشد تا اطمینان حاصل شود که دایرکتوری وجود دارد). برای پیداکردن این دایرکتوری، از منوی Sketch گزینه Show Sketch Folder را انتخاب کنید.

createWriter تابع پروسسینگ (Processing) است که فایل را باز می‌کند؛ این تابع یک آبجکت (واحدی از قابلیت‌های زمان اجرا (runtime)) به نام output ایجاد می‌کند که وظیفه مدیریت خروجی واقعی فایل را برعهده دارد. شما می‌توانید محتویات فایل را با استفاده از قابلیت‌های استاندارد مدیریت رشته در پروسسینگ به‌صورت دلخواه تغییر دهید. برای مثال، نسخه زیر از تابع draw یک فایل جداشده با کاما تولید می‌کند که می‌تواند توسط یک صفحه‌گسترده (spreadsheet) یا دیتابیس (database) خوانده شود. باقی اسکچ پروسسینگ نیز می‌تواند همانند قبل باشد، اگرچه ممکن است بخواهید پسوند را از .txt به .csv تغییر دهید:

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

https://processing.org/reference/createWriter_.html

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

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

به‌عنوان‌مثال، اگر شما بخواهید داده‌ها را به یک دستگاه سریال مثل  serial LCDارسال کنید، اما از پورت سریال به USB داخلی برای ارتباط با کامپیوتر خود استفاده می‌کنید.

روی بردی که بیش از یک پورت سریال دارد، این موضوع مشکلی نخواهد داشت. ابتدا شما باید برد خود را طبق شکل 1 به دستگاه سریال متصل کنید. سپس می‌توانید دو پورت سریال را مقداردهی اولیه کنید و از Serial برای اتصال به کامپیوتر خود استفاده کنید:

اتصال یک دستگاه سریال به پین ارسال یک پورت سریال داخلی (built-in serial)

شکل 1: اتصال یک دستگاه سریال به پین ارسال یک پورت سریال داخلی (built-in serial)

✅نکته

اگر از یک برد آردوینو یا بردهای سازگار با آردوینو که با ولتاژ 3.3 ولت کار می‌کنند مانند بردهای مبتنی بر تراشه های SAMD استفاده می‌کنید، می‌توانید به‌طور ایمن به دستگاه‌ی که از 5 ولت استفاده می‌کند، داده ارسال کنید. اما اگر از بردی که با 5 ولت کار می‌کند،اصلاعات دریافت کنید، در نهایت به دستگاه آسیب خواهید رساند، مگر اینکه یک تقسیم‌کننده ولتاژ را به مدار اضافه کنید تا ولتاژ را کاهش دهد.

در یک برد آردوینو مبتنی بر ATmega328، مانند آردوینو Uno که تنها یک پورت سریال سخت‌افزاری دارد، اگر نیاز به استفاده از پورت سریال دیگری داشته باشید، باید یک پورت سریال مجازی ایجاد کنید. برای این کار می‌توانید از کتابخانه‌ی SoftwareSerial استفاده کنید.

دو پین دیجیتال آزاد را انتخاب کنید، یکی برای ارسال و دیگری برای دریافت و دستگاه سریال خود را به آنها متصل کنید طوری که پین ارسال (TX)  به پین دریافت (RX) دستگاه مقابل متصل شود و برعکس. برای سناریوهایی که فقط در حال ارسال داده هستید، مانند زمانی که کاراکترها را روی یک نمایشگر LCD سریال نمایش می‌دهید، فقط کافی‌ست پین ارسال (TX) را به پین دریافت (RX) دستگاه متصل کنید، همانطور که در شکل 2 نشان داده شده است که در آن پین 3 به عنوان پین ارسال انتخاب شده است.

ثبت اطلاعات آردوینو در یک فایل کامپیوتر + ارسال داده به بیش از یک دستگاه سریال | قسمت بیست و یکم آردوینو

شکل 2: اتصال یک دستگاه سریال به یک پورت سریال “soft”

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

برای استفاده از اسکچ با یک پورت سریال سخت‌افزاری داخلی، پین‌ها را همان‌طور که در شکل 1 نشان داده شده است، متصل کنید، سپس این خطوط را از کد حذف کنید:

در نهایت، این خط را به‌جای خطوط حذف شده اضافه کنید:

(در صورت استفاده از یک پورت دیگر، به‌جای Serial1 آن را تغییر دهید).

✅نکته

برخی از بردهایی که از چندین پورت سریال سخت‌افزاری پشتیبانی می‌کنند، مانند Leonardo،Mega و Mega 2560، محدودیت‌هایی در مورد پین‌هایی که می‌توانید برای دریافت (RX) در SoftwareSerial استفاده کنید، دارند. حتی اگر در اینجا از قابلیت دریافت استفاده نمی‌کنیم و حتی اگر به احتمال زیاد از پین‌های سریال سخت‌افزاری برای Serial1 در این بردها استفاده کنید، باید توجه داشته باشید که این بردها از قابلیت RX  روی پین 2 پشتیبانی نمی‌کنند. بنابراین اگر بخواهید از یک اتصال سریال نرم‌افزاری روی یکی از این بردها داده‌ای بخوانید، باید از یک پین پشتیبانی‌شده استفاده کنید.

این اسکچ فرض می‌کند که یک نمایشگر LCD سریال به پین 3 همانطور که در شکل 2 نشان داده شده، متصل شده است و یک کنسول سریال به پورت داخلی متصل شده است. حلقه (loop) به طور مکرر همان پیام را روی هر دو نمایشگر نشان می‌دهد:

میکروکنترلر Arduino حداقل یک پورت سریال سخت‌افزاری داخلی دارد. در Arduino Uno، این پورت به اتصال سریال USB متصل است و همچنین، به پین‌های 0 (دریافت) و 1 (ارسال) متصل شده است که به شما این امکان را می‌دهد که دستگاهی مانند نمایشگر سریال LCD را به Arduino متصل کنید. کاراکترهایی که از طریق آبجکتSerial ارسال می‌کنید روی LCD نمایش داده می شوند.

✅نکته

اگرچه می‌توانید از یک منبع تغذیه جداگانه برای دستگاه سریال استفاده کنید، اما باید پین زمین ground)) آردوینو را به پین دستگاه متصل کنید تا Arduino و دستگاه سریال دارای یک زمین مشترک باشند. در راه‌حل ارائه شده، این کار انجام شده است، اما ما همچنین، از خروجیArduino’s 5V  برای تأمین برق دستگاه استفاده کردیم.

علاوه بر اتصال سریال USB داخلی (onboard )، برخی بردها از یک یا چند اتصال سریال مستقیم پشتیبانی می‌کنند. روی این بردها، پین‌های 0 و 1 معمولاً به آبجکتSerial1 متصل هستند که به شما این امکان را می‌دهد تا همزمان با اینکه با دستگاه متصل به پین‌های 0 و 1 داده مبادله می‌کنید، اتصال سریال USB به کامپیوتر خود را حفظ کنید. برخی بردها از پورت‌های سریال اضافی روی مجموعه‌ای دیگر از پین‌ها پشتیبانی می‌کنند. تمام پین‌هایی که از ورودی و خروجی سریال پشتیبانی می‌کنند، علاوه بر اینکه پین‌های دیجیتال عمومی هستند، توسط (UART) receiver-transmitter universal asynchronous که درون چیپ تعبیه شده است، پشتیبانی می‌شوند. این سخت‌افزار وظیفه تولید دنباله‌ای از پالس‌های زمانی دقیق و همچنین، تفسیر استریم (stream ) مشابهی که در بازگشت دریافت می‌کند را بر عهده دارد.

اگرچه بردهای مبتنی بر ARM SAMD (بردهای M0 وM4 ) از دو پورت سریال سخت‌افزاری پشتیبانی می‌کنند و برد Mega چهار پورت از این نوع دارد، برد Arduino Uno و بیشتر بردهای مشابه مبتنی بر ATmega328 تنها یک پورت سریال دارند. در بردهای آردوینو Uno و بردهای مشابه آن، برای پروژه‌هایی که به اتصال به دو یا چند دستگاه سریال نیاز دارند، باید از یک کتابخانه نرم‌افزاری استفاده کنید که پورت‌های اضافی را شبیه‌سازی کند. یک کتابخانه “سریال نرم‌افزاری” به طور مؤثر یک جفت دلخواه از پین‌های دیجیتال ورودی/خروجی را به یک پورت سریال جدید تبدیل می‌کند.

برای ساخت پورت سریال نرم‌افزاری خود، یک جفت پین را انتخاب می‌کنید که به‌عنوان خطوط ارسال و دریافت پورت عمل خواهند کرد، به همان روشی که یک پورت سریال سخت‌افزاری از پین‌های اختصاص‌یافته خود استفاده می‌کند. در شکل 2، پین‌های 3 و 2 نشان داده شده‌اند، اما می‌توان از هر پین دیجیتال موجود استفاده کرد، با برخی استثنائات برای بردهای خاص. بهتر است از پین‌های 0 و 1 استفاده نکنید، زیرا این پین‌ها قبلاً توسط پورت داخلی (built-in) هدایت می‌شدند.

سینتکس نوشتن داده به پورت نرم‌افزاری مشابه سینتکس نوشتن به پورت سخت‌افزاری است. در برنامه نمونه، داده‌ها به هر دو پورت سخت افزاری و مجازی با استفاده از توابع print() و println() ارسال می‌شود:

✅نکته

اگر متن ترکیبی (“Number: “) و خود عدد از عرض نمایشگر LCD سریال شما طولانی‌تر باشد، خروجی ممکن است برش داده شود یا از روی نمایشگر اسکرول کند. بسیاری از نمایشگرهای کاراکتری LCD دارای دو ردیف و هر ردیف شامل 20 کاراکتر است.

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

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

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

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

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