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

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

قسمت پانزدهم آردوینو

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

گرد کردن اعداد ممیزی

تابع floor(x) بزرگ‌ترین عدد صحیح را که بزرگ‌تر از مقدار x نیست و تابع ceil(x) کوچک‌ترین عدد صحیح را که کوچک‌تر از مقدار x نیست، محاسبه می‌کند.

این توابع برای گرد کردن اعداد ممیزی استفاده می‌شوند. شما می‌توانید از تابع floor(x) برای محاسبه بزرگ‌ترین عدد صحیح (که بزرگ‌تر از x نیست)، استفاده کنید. همچنین، می‌توانید از تابع ceil برای محاسبه کوچک‌ترین مقدار عدد صحیح ممکن (که بزرگ‌تر از x نیست)،‌ استفاده نمایید.

در اینجا چند مثال از تابع floor آورده شده است:

همچنین، در اینجا چند مثال از تابع ceil آورده شده است:

از طریق کد زیر می‌توانید یک عدد ممیزی را به نزدیک‌ترین عدد صحیح ممکن، گرد کنید:

✅نکته

اگر برای تبدیل یک عدد اعشاری به عدد صحیح از تبدیل نوع (casting) به int استفاده کنید، ممکن است عدد به‌درستی گرد نشود. برای مثال، اعداد منفی مانند 1.9– باید به 2 – گرد شوند، اما وقتی به int تبدیل می‌شوند، به مقدار بیش تر یعنی 1– گرد می‌شوند. همین مشکل برای اعداد مثبت نیز وجود دارد: برای مثال، 1.9 باید به 2 گرد شود، اما وقتی به int تبدیل می‌شود، به عدد 1 گرد می‌شود؛ بنابراین برای به دست آوردن نتایج صحیح و دقیق، بهتر است شما از توابع floor ،ceil و round استفاده کنید.

استفاده از توابع مثلثاتی

در ادامه توضیح خواهیم داد که چگونه شما می‌توانید سینوس، کسینوس یا مماس یک زاویه را به‌صورت رادیان یا درجه به دست آورید.

به‌طورکلی، تابع sin(x) سینوس زاویه x، تابع cos(x) کسینوس زاویه x و تابع tan(x) مماس زاویه x را محاسبه می‌کند. زاویه‌ها بر حسب رادیان هستند و نتیجه یک مقدار ممیزی است. مثال زیر توابع trig را نشان می‌دهد:

این کد، زاویه را به رادیان تبدیل می‌کند و سینوس و کسینوس را پرینت می‌کند.

همچنین، در کد زیر خروجی با توضیحات اضافه شده است:

اسکچ این مقادیر را با دقت بالا به‌صورت مقادیر ممیزی محاسبه می‌کند و توابع Serial.print و Serial.println مقادیر ممیزی را به‌ صورت پیش‌فرض تا دو رقم اعشار نمایش می‌دهند، اما شما می‌توانید دقت نمایش اعداد اعشاری Serial.print و Serial.println را به‌عنوان آرگومان دوم تعیین کنید.

تبدیل از رادیان به درجه و بالعکس، مباحث معمولی در تریگونومتری است. عدد ثابت PI نمایانگر مقدار π (3.14159265…) می‌باشد. همچنین، 180 یک مقدار ثابت است. آردوینو نیز برخی از ثابت‌های پیش محاسبه‌شده را فراهم کرده است که شما می‌توانید از آن‌ها برای انجام تبدیل‌ درجه به رادیان و بالعکس استفاده کنید:

به نظر می‌رسد استفاده از DEG_TO_RAD کارایی بیش‌تری نسبت به deg * PI / 180 دارد، اما در عمل، کامپایلر آردوینو هوشمند است و می‌تواند تشخیص دهد که PI / 180 یک مقدار ثابت است (مقدار آن هرگز تغییر نخواهد کرد)؛ بنابراین نتیجه تقسیم PI بر 180 را جایگزین می‌کند که به صورت اتفاقی مقدار آن با ثابت DEG_TO_RAD (0.017453292519…) یکسان است. شما می توانید از هر روشی که می خواهید استفاده کنید.

برای کسب اطلاعات بیش‌تر درباره مباحث sin، cos و tan در آردوینو به سایت‌های زیر مراجعه کنید:

Sin

Cos

Tan

تولید اعداد تصادفی

در ادامه توضیح خواهیم داد که چگونه می‌توان در آردوینو یک عدد تصادفی تولید کرد.

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

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

درست است که اعداد تصادفی که توسط تابع ()random به دست می‌آیند، یک الگوی مشخص ندارند؛ اما این اعداد به طور کاملاً تصادفی هم تولید نمی‌شوند. این موضوع در بسیاری از برنامه‌ها، مهم نیست. اما اگر نیاز دارید که هر بار که برنامه‌تان اجرا می‌شود، دنباله‌ای متفاوت از اعداد تصادفی را دریافت کنید، می‌توانید از تابع randomSeed(seed) با مقادیر مختلف برای seed استفاده کنید. (اگر شما از یک مقدار seed یکسان استفاده کنید، دنباله‌ی مشابهی از اعداد تصادفی دریافت خواهید کرد).

به‌طورکلی، این تابع، تولید اعداد تصادفی را از یک نقطه‌ی تصادفی مبتنی بر مقدار seed مشخص شده آغاز می‌کند:

در اینجا یک مثال آورده شده است که از شکل‌های مختلف تولید اعداد تصادفی موجود در آردوینو استفاده می‌کند: }

این نتایج می‌توانند بسته به معماری مختلف آردوینو و شرایط محیطی متفاوت باشند:

در اینجا خروجی این کد به‌عنوان‌مثال در برد آردوینو Uno آورده شده است (ممکن است شما در ساختارها یا معماری‌های مختلف نتایج متفاوتی دریافت کنید):

وقتی دکمه‌ی ریست (Reset) را روی آردوینو فشار دهید تا برنامه‌ (اسکچ) ‌خود را مجدداً اجرا کنید، سه خط اول اعداد تصادفی تغییر نخواهند کرد. (ممکن است پس از فشار دادن دکمه‌ی ریست، لازم باشد سریال مانیتور را ببندید و دوباره باز کنید.) هر بار که برنامه‌ (اسکچ) ‌شما اجرا می‌شود، فقط خط آخر کد تغییر می‌کند؛ این موضوع به دلیل تنظیم مقدار اولیه برای تولید اعداد تصادفی با استفاده از یک مقدار متفاوت به عنوان نقطه‌ی شروع (seed) اتفاق می‌افتد. این مقدار از یک پورت ورودی آنالوگ که به هیچ چیزی متصل نیست، خوانده می‌شود. اگر از پورت آنالوگ 0 برای مورد دیگری استفاده می‌کنید، می‌توانید آرگومان تابع analogRead را به یک پورت آنالوگ استفاده‌نشده تغییر دهید.

در کل، مثال فوق تنها یکی از گزینه‌های موجود برای تولید اعداد تصادفی در آردوینو بدون استفاده از سخت‌افزار خارجی می‌باشد. ممکن است به نظر برسد که یک پورت ورودی آنالوگ که به هیچ چیزی متصل نیست، روش خوب یا حداقل قابل‌قبولی برای تولید اعداد تصادفی باشد، اما تبدیل آنالوگ به دیجیتال در بیشتر برد‌های آردوینو حداکثر مقدار ۱۰ بیتی را برمی‌گرداند که تنها می‌تواند ۱۰۲۴ مقدار مختلف را نگه دارد. این محدوده‌ی مقادیر، بسیار کوچک‌تر از آن است که بتواند مولد اعداد تصادفی را برای تولید اعداد تصادفی قوی تنظیم کند.

در واقعیت، تولید اعداد تصادفی در آردوینو دشوار خواهد بود، اما مانند بسیاری از کامپیوترها، شما می‌توانید اعداد شبه‌تصادفی (pseudorandom) رمزنگاری یا اعداد تصادفی که برای استفاده در برنامه‌های رمزنگاری مناسب هستند، تولید کنید. برخی از بردهای آردوینو مانند Arduino WiFi Rev2،MKR Vidor 4000 و MKR WiFi 1000/1010 شامل تراشه رمزنگاری Atmel ECC508 یا ECC608 می‌باشند که دارای پشتیبانی سخت‌افزاری برای عملکردهای رمزنگاری، از جمله یک مولد اعداد تصادفی قوی هستند که شما می‌توانید با نصب کتابخانه ArduinoECCX08 با استفاده از بخش منیجر (مدیریت) کتابخانه آردوینو به این چیپ دسترسی داشته باشید.

✅نکته

برای تولید اعداد تصادفی در برد آردوینو، کتابخانه کریپتو Rhys Weatherley، به ویژه RNG class را بررسی کنید.

 

برای کسب اطلاعات بیش‌تر درباره مباحث اعداد تصادفی (random) و randomSeed به سایت‌های زیر مراجعه کنید:

Random

RandomSeed

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

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

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

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