استفاده از یک مولد اعداد تصادفی در آردوینو: توابع تصادفی و RandomSeed. دوره آردوینو - زمان و تصادفی آردوینو یک دنباله بیت تصادفی را ایجاد می کند

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



برای فعال کردن این ژنراتور، فقط از توابع ()random یا randomSeed() استفاده کنید. این مطالب به شما نحوه کار با این توابع و همچنین نحوه خلاص شدن از شبه تصادفی هنگام تولید اعداد را به شما نشان می دهد.


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


بنابراین، تابع تصادفی برای تولید اعداد شبه تصادفی می تواند تا دو پارامتر داشته باشد و به صورت تصادفی (max) یا تصادفی (min, max) نوشته می شود. اینجا پارامتر حداکثرکه اجباری است، حد بالایی محدوده را برای تولید اعداد شبه تصادفی مشخص می کند. با استفاده از پارامتر اضافیحداقل می توانید حد پایینی محدوده را تعیین کنید. در نتیجه، این تابع مقداری شبه تصادفی را در محدوده حداقل تا حداکثر 1 برمی گرداند.


درک این نکته مهم است که هنگام استفاده از تابع تصادفی () ، هر بار دقیقاً همان لیستی از اعداد شبه تصادفی ایجاد می شود. به عنوان مثال، اگر یک اسلات ماشین بسازید و اولین بار که دستگیره را فشار می دهید، یک ترکیب برنده را نشان می دهد، پس می توانید مطمئن باشید که اگر آردوینو را ریست کنید و دوباره دسته را فشار دهید، آن اسلات همان ترکیب برنده را نشان می دهد. . در واقع، پیاده سازی یک ماشین بازی با تولید اعداد کاملا تصادفی در آردوینو آسان نیست، همانطور که برای مثال در ماشین های بازی www.igrovye-apparati-vulcan.com/ پیاده سازی شده است، اما می توانید تا حدی با استفاده از randomSeed مشکل را حل کنید. () تابع.


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


تنها راه حل در این مورد ممکن است استفاده از لوازم جانبی آنالوگ (ADC) و تابع ()analogRead مربوطه باشد. اگر ورودی آنالوگ به چیزی متصل نباشد، یعنی در هوا "آویزان" بماند، به لطف نویز در این خط می توانید اعداد واقعا تصادفی را دریافت کنید. سپس در تنظیمات تنظیمات می توانید randomSeed(analogRead(A0)) را بنویسید. به شرطی که پورت آنالوگ A0 به جایی متصل نباشد.

در مورد مولدهای اعداد تصادفی مطالب زیادی نوشته شده است، اما تقریباً همیشه وقتی صحبت از پیاده سازی می شود، به طور ضمنی (یا به صراحت بیان می شود) که ما در مورددر مورد x86/x64 و دیگر معماری های "بزرگسال". در همان زمان، انجمن‌هایی که به توسعه دستگاه‌ها در میکروکنترلرها اختصاص داده شده‌اند پر از سؤالات است: «چگونه می‌توانم یک عدد تصادفی در %controllername% ایجاد کنم؟» علاوه بر این، دامنه پاسخ‌ها از «به گوگل/ویکی‌پدیا نگاه کنید» تا «استفاده از تابع استاندارد» را شامل می‌شود. این «عملکرد استاندارد» همیشه وجود ندارد و از همه جهات برای توسعه‌دهنده مناسب است؛ بیشتر اوقات، برعکس است: گاهی اوقات اعداد تصادفی نیستند، گاهی اوقات سرعت عملکرد بسیار پایین است، یا گاهی اوقات کد به دست آمده چنین نیست. اصلاً در حافظه آزاد جای می گیرد.
بیایید سعی کنیم بفهمیم الگوریتم های تولید اعداد تصادفی چیست، چگونه می توان الگوریتم مناسب را انتخاب کرد و مهمتر از همه، ویژگی های پیاده سازی این الگوریتم ها بر روی کنترلرها چیست.

ارزیابی "تصادفی"

کاربردهای RNG می تواند بسیار متفاوت باشد، از اسباب بازی گرفته تا رمزنگاری جدی. بر این اساس، الزامات برای ژنراتور نیز بسیار متفاوت است. تست های ویژه ای برای ارزیابی کیفیت (سطح "تصادفی") ژنراتور وجود دارد. در اینجا اساسی ترین آنها آمده است:
  • تست فرکانس شامل شمارش تعداد صفرها و یک ها در یک دنباله از بیت ها است. باید تقریباً تعداد یک و صفر برابر باشد.
  • برای دنباله ای از بیت های یکسان تست کنید. ردیف های بیت های یکسان مانند 000...0 یا 111...1 جستجو می شوند. توزیع فرکانس هایی که سری با آنها اتفاق می افتد، بسته به طول آنها، باید با این توزیع برای یک سیگنال واقعا تصادفی مطابقت داشته باشد.
  • تست طیفی یک تبدیل فوریه گسسته به دنباله اصلی اعمال می شود. طیف حاصل نباید پیک های قابل توجهی داشته باشد که نشان دهنده وجود ویژگی های دوره ای توالی باشد.
  • آزمون خود همبستگی. مقدار همبستگی بین نسخه های دنباله ای که نسبت به یکدیگر جابجا شده اند محاسبه می شود. این تست به شما امکان می دهد مناطق تکرار شونده را در یک دنباله پیدا کنید.
کیت های ویژه ای وجود دارد که شامل ده ها آزمایش مشابه است:
NIST - در مسابقه AES برای ارزیابی الگوریتم های رمزگذاری استفاده می شود.
DIEHARD یکی از دقیق ترین مجموعه های موجود است.

الگوریتم های PRNG

هر دنباله ای که طبق یک الگوریتم کاملاً تعریف شده ایجاد شود را نمی توان واقعاً تصادفی در نظر گرفت، بنابراین، هنگام صحبت در مورد ژنراتورهای الگوریتمی، آنها از این اصطلاح استفاده می کنند. شبه تصادفیدنباله هر مولد اعداد شبه تصادفی (PRNG) دیر یا زود وارد حلقه می شود، نکته دیگر این است که این "تأخیر" می تواند در چند میلی ثانیه یا شاید در چند سال آینده بیاید. طول چرخه به اندازه حالت داخلی ژنراتور N بستگی دارد (در واقع این مقدار حافظه مورد نیاز ژنراتور است) و از 2 (N/2) تا 2 N بیت متغیر است.
طیف گسترده ای از الگوریتم های PRNG اختراع شده است، اما همه آنها برای پیاده سازی روی میکروکنترلرها مناسب نیستند. ما از نظر سرعت و حافظه در دسترس به شدت محدود هستیم؛ بسیاری از کنترل‌کننده‌ها از دستورالعمل‌های محاسبه واقعی یا حتی ضرب پشتیبانی نمی‌کنند. با در نظر گرفتن این محدودیت ها، بیایید به برخی از الگوریتم های شناخته شده نگاه کنیم.
روش همگرای خطی
عضو بعدی دنباله با استفاده از فرمول محاسبه می شود
X i+1 = (aX i + c) mod m
عدد مترحداکثر دوره از دنباله، اعداد صحیح را تعریف می کند آو ج- ضرایب "جادو". عدد مترمنطقی است که برابر با توان دو انتخاب شود؛ در این حالت، عملیات تبدیل مدول به دور انداختن مهم ترین بیت ها کاهش می یابد. برای به دست آوردن حداکثر دوره، شرایط زیر باید رعایت شود:
- جو M باید نسبتاً نخست باشد ،
- a-1باید چندگانه باشد پبرای همه عوامل اصلی پشماره متر,
- اگر مترمضرب 4 است (و در مورد ما مضرب خواهد بود)، پس a-1باید مضرب 4 باشد.
یک نکته ظریف دیگر وجود دارد: فقط مهم ترین بیت های متغیر حالت X باید به عنوان نتیجه در نظر گرفته شوند، زیرا برای پایین ترین بیت ها پارامترهای آماری تصادفی بسیار بدتر هستند. الگوریتم همگام خطی معمولاً به صورت استاندارد rand() در بسیاری از کتابخانه ها پیاده سازی می شود.

طرفداران:

  • حداکثر دوره ممکن برای اندازه معینی از متغیر حالت؛
  • به اندازه کافی سریع؛
  • اغلب قبلاً در کتابخانه کامپایلر پیاده سازی شده است.
معایب:
  • یک عملیات ضرب مورد نیاز است.
  • همه بیت ها به یک اندازه تصادفی نیستند.
خلاصه:یک الگوریتم سریع و ساده برای برنامه های نه چندان سخت.
روش فیبوناچی با تاخیر
این الگوریتم از رابطه استفاده می کند
x i = x i-a-x i-b ،
متغیر حالت کجاست ایکس- عدد صحیح بدون امضا. مقادیر تأخیر آو بنه هر یک، بلکه به طور دقیق تعریف شده است؛ برای دستیابی به حداکثر کیفیت، جفت (17.5)، (55.24) یا (97.33) توصیه می شود. هر چه تأخیر بیشتر باشد، دوره طولانی تر و خواص طیفی دنباله بهتر است. از طرف دیگر، برای کارکرد ژنراتور، ذخیره max(a,b) اعداد قبلی ضروری است که همیشه قابل قبول نیست. همچنین برای اجرای ژنراتور به اعداد max(a,b) نیاز دارید که معمولاً با استفاده از یک PRNG ساده تر به دست می آیند.

طرفداران:

  • به عملیات ضرب نیاز ندارد.
  • همه بیت های یک عدد تصادفی از نظر ویژگی های آماری معادل هستند.
معایب:
  • به مقدار زیادی حافظه نیاز دارد؛
  • برای اجرا به آرایه بزرگی از اعداد نیاز دارد.
خلاصه:یک الگوریتم بسیار با کیفیت، اما منابع فشرده.
ثبت تغییر بازخورد خطی


متغیر حالت در یک ثبات با طول N ذخیره می شود. ایجاد حالت بعدی شامل دو مرحله است:
  1. مقدار بیت محاسبه می شود C = X i1 xor X i2 xor… X ik، که در آن i1 ، i2… ik- شماره بیت را ثبت کنید ، به نام خم می شود.
  2. رجیستر 1 بیت به راست جابه جا می شود، چپ ترین بیت مقدار را می گیرد با.
خروجی مولد سمت راست ترین (یا چپ ترین یا هر چیز دیگری) بیت رجیستر است، یعنی دنباله شبه تصادفی یک بیت در هر تکرار تولید می شود. با اعداد ضربه ای که به درستی انتخاب شده اند، دوره تولید کننده 2 N - 1 خواهد بود. "منهای یک"، زیرا حالت صفر ممنوعه ثبت وجود دارد. شماره شاخه برای ناز 3 تا 168 را می توان در این سند یافت.
علاوه بر پیکربندی که در بالا توضیح داده شد، که اتفاقاً، پیکربندی فیبوناچی نامیده می شود (با روش PRNG به همین نام اشتباه نشود!)، به اصطلاح وجود دارد. پیکربندی Galois.


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

طرفداران:

  • پیاده سازی بسیار ساده، حتی نیازی به محاسبات ندارد، فقط عملیات بیت و شیفت نیاز دارد.
  • الگوریتم بسیار سریع (به خصوص طرح Galois)؛
  • ویژگی های آماری خوب
معایب:
  • شما باید مقدار اولیه را برای نابرابری به صفر بررسی کنید.
خلاصه:الگوریتم بسیار سریع و نسبتاً با کیفیت.
الگوریتم های رمزنگاری
برای استفاده در رمزنگاری، PRNG ها یک نیاز ضروری دیگر دارند: برگشت ناپذیری. همه الگوریتم های ذکر شده در بالا این ویژگی را ندارند: با دانستن چندین مقدار خروجی PRNG، می توانید با حل یک سیستم معادلات ساده، پارامترهای الگوریتم را بیابید (همان ثابت های "جادویی" الف، ب، جو غیره). و با دانستن پارامترها، می توانید کل دنباله شبه تصادفی را بازتولید کنید.
هر رمز بلوکی به اندازه کافی قوی می تواند به عنوان یک الگوریتم PRNG رمزنگاری قوی استفاده شود. با انتخاب یک کلید مخفی، می توانید بلوک هایی از اعداد شبه تصادفی را با اعمال الگوریتم بر روی اعداد طبیعی متوالی بدست آورید. برای رمز بلوکی N بیتی، دوره بیش از 2 نیوتن نخواهد بود. امنیت چنین طرحی کاملاً به محرمانه بودن کلید بستگی دارد.
تمام الگوریتم‌های رمزنگاری مدرن برای استفاده به عنوان PRNG آزمایش می‌شوند، یعنی با استفاده از یک الگوریتم تایید شده، نیازی به مراقبت ویژه در مورد ویژگی‌های آماری و طیفی جریان خروجی نیست. شما فقط باید نگران «پرخوری» محاسباتی الگوریتم‌های رمزنگاری باشید. اگر نیاز به انجام تعداد زیادی عملیات رمزگذاری دارید، منطقی است که یک کنترلر با بلوک های رمزنگاری سخت افزاری انتخاب کنید. اغلب چنین کنترل‌کننده‌هایی دارای یک سخت‌افزار مقاوم در برابر رمزنگاری PRNG هستند.

منابع آنتروپی

همانطور که قبلاً گفته شد، تنها با استفاده از الگوریتم های قطعی، تولید یک عدد واقعا تصادفی غیرممکن است. بنابراین معمولاً از ترکیب PRNG + خارجی استفاده می شود منبع آنتروپی. منبع آنتروپی برای تنظیم مقدار اولیه برای PRNG استفاده می شود و وظیفه دوم اطمینان از خلوص طیفی و آماری دنباله است. چه چیزی می تواند به عنوان منبع آنتروپی استفاده شود؟ بله، تقریباً هر چیزی.
فعالیت کاربر
اگر دستگاه به هر نحوی با کاربر تعامل داشته باشد، کاملاً تصمیم خوباز خود کاربر به عنوان منبع آنتروپی استفاده خواهد کرد. به عنوان مثال، زمان فشار دادن یک دکمه، که با دقت میکروثانیه (یا بهتر است بگوییم، کمترین ارقام آن) اندازه گیری شود، کاملاً غیرقابل پیش بینی است. با این حال، اغلب دستگاه باید به طور مستقل کار کند، به این معنی که ما از این کانال شگفت انگیز اطلاعات محروم هستیم.
مبدل آنالوگ به دیجیتال
بسیاری از کنترل کننده ها دارای ADC های داخلی هستند. و در بسیاری از کنترلرها کیفیت بسیار متوسطی دارند و فقط برای بودن ساخته شده اند. بیت های مرتبه پایین نتیجه ADC تقریباً همیشه حاوی نویز قابل توجهی هستند، حتی هنگام اندازه گیری ولتاژ DC. این می تواند مورد استفاده قرار گیرد: ورودی ADC را از طریق یک تقسیم کننده به ولتاژ تغذیه وصل کنید، چند ده اندازه گیری کنید، کمترین بیت های مهم را بردارید - در اینجا یک عدد تصادفی عالی دارید. اگر ADC دارای یک پری امپ داخلی است، آن را روشن کنید، همچنین نویز دارد.
ژنراتورهای ناهمزمان
می توانید از تفاوت در دوره های دو ژنراتور ساعت غیرهمگام استفاده کنید. بیشتر کنترلرها برای مثال دارای یک تایمر نگهبان هستند. برای افزایش قابلیت اطمینان، از یک ژنراتور جداگانه کلاک می شود که به هیچ وجه به سیگنال ساعت اصلی متصل نیست. کافی است تعداد سیکل های سیگنال ساعت اصلی را در یک دوره تایمر نگهبان بشمارید. اگر دوره‌هایی را طوری انتخاب کنید که شمارنده بارها در طول اندازه‌گیری سرریز شود، می‌توانید یک عدد نسبتاً تصادفی به دست آورید. عیب این روش این است که زمان زیادی می برد، تا چند ثانیه.
ساعت واقعی
اگر نمودار داشته باشد ساعت واقعی، می توانید از قرائت های فعلی آنها برای مقداردهی اولیه PRNG استفاده کنید. به عنوان مثال، با تبدیل تاریخ/زمان فعلی به فرمت زمان یونیکس، بلافاصله 32 بیت دریافت می کنیم که هرگزدوباره تکرار نمی شود مگر اینکه بیش از یک بار در ثانیه مطالعه کنید. استفاده از زمان واقعی ارزش ها را منحصر به فرد می کند، اما هیچ گونه غیرقابل پیش بینی ایجاد نمی کند، بنابراین بهتر است ترکیب شود. این روشبا دیگران.
مدار RC
اگر کنترل کننده ندارد دستگاه های جانبیعلاوه بر پورت های ورودی/خروجی، می توانید کارهای زیر را انجام دهید: یکی از پایه ها از طریق خازن به زمین و از طریق یک مقاومت به ولتاژ تغذیه متصل می شود. اگر ورودی های کنترلر دارای مقاومت کششی داخلی باشند، به مقاومت خارجی نیازی نیست.

ما سیگنال "0" را به این پورت خروجی می دهیم - خازن تخلیه می شود. پورت را به حالت ورودی تغییر می دهیم - خازن شروع به شارژ می کند. هنگامی که ولتاژ دو طرف آن به آستانه رسید، ورودی از حالت "0" به "1" تغییر می کند. زمان شارژ به شدت به عوامل زیادی بستگی دارد: ولتاژ تغذیه، رانش پارامترهای مدار RC، ناپایداری آستانه، دما، نشت، تداخل. با اندازه گیری آن با دقت کافی و گرفتن کم اهمیت ترین بیت ها، می توانید تصادفی خوبی به دست آورید.
مولد نویز سخت افزاری
برای بسیاری از کاربردهای جدی (به ویژه رمزنگاری)، منبع قابل اعتمادتری از آنتروپی نسبت به موارد ذکر شده در بالا مورد نیاز است. در چنین مواردی، آنها از دیجیتالی کردن سیگنال از یک مولد نویز بر اساس اثرات حرارتی، شات یا حتی کوانتومی استفاده می کنند. عنصر نویز معمولاً یک دیود ویژه یا دیود زنر است که سیگنال از آن تقویت می شود و به مقایسه کننده ای که یک جریان بیت باینری تولید می کند تغذیه می شود.

برای اطمینان از اینکه آستانه پاسخ مقایسه کننده بر ویژگی های آماری سیگنال دریافتی تأثیر نمی گذارد، از دو مولد نویز استفاده می شود که روی یک مقایسه کننده کار می کنند:

نتیجه

در نهایت یک داستان از زندگی ام را برای شما تعریف می کنم. با سوال دیگری که در انجمن پرسیده شد شروع شد: "چگونه می توانم یک عدد تصادفی روی کنترلر ایجاد کنم؟" نویسنده سوال توضیح داد که به عنوان یک پروژه درسی در حال ساخت دستگاهی است که پرتاب تاس را تقلید می کند. پس از چندین تلاش ناموفق برای درک الگوریتم ها، شروع کننده موضوع راه حل خود را به اشتراک گذاشت: او به سادگی یک قالب واقعی را 1000 بار چرخاند و تمام حافظه آزاد کنترلر را با اعداد به دست آمده پر کرد. ژنراتور با توجه به اینکه در طول نمایش کمتر از یک سوم "ذخیره" خود را مصرف می کرد، تمام تست های "تصادفی" را به خوبی گذراند.
بنابراین، چنین راه حلی نیز حق حیات دارد، به خصوص اگر الزامات بسیار سختگیرانه ای برای تصادفی بودن اعداد اعمال شود، اما آنها اغلب مورد نیاز نیستند. با کاهش شدید قیمت حافظه، ممکن است عاقلانه باشد که دستگاهی را به "ذخیره آشوب" مجهز کنید که تمام عمر دستگاه را دوام می آورد.
از توجه شما متشکرم

upd1:همانطور که در نظرات به درستی ذکر شد، اگر حمله به RNG مورد انتظار باشد و مهاجم به دستگاه دسترسی سخت افزاری داشته باشد، باید از منابع خارجی آنتروپی با احتیاط فراوان استفاده کرد، زیرا جایگزین کردن سیگنال از آن چندان دشوار نیست. منبع خارجی. علاوه بر منابع خارجی باید از منابع داخلی نیز استفاده کرد.
همچنین ایده خوبی است که همه چیز را آنتروپی جمع کنید وقت آزادو زمانی که نیاز به تولید یک عدد تصادفی دیگر دارید از آن استفاده کنید. معمولا در چنین مواردی به اصطلاح استخر آنتروپی- آرایه ای که بر روی آن یکی از توابع PRNG به صورت دوره ای انجام می شود و داده های منابع آنتروپی دائماً در آن مخلوط می شوند.

upd2:در بسیاری از موارد، ذخیره محتویات استخر Entropy (با عرض پوزش، ترجمه روسی معمولی آن را نمی دانم) در EEPROM مفید است تا پس از خاموش و روشن کردن دستگاه دوباره جمع نشود. این اول از همه به بدست آوردن آنتروپی با استفاده از روش ژنراتورهای ناهمزمان مربوط می شود: تحت شرایط به اندازه کافی پایدار، می توان پس از هر روشن شدن، همان دنباله را ایجاد کرد.
در صورت انتظار حمله ، اقدامات احتیاطی را در برابر دستکاری EEPROM انجام دهید. اگر کنترل‌کننده اجازه می‌دهد، خواندن/پاک کردن/نوشتن را با استفاده از بیت‌های قفل مسدود کنید، و هنگام روشن کردن آن، یکپارچگی EEPROM را حداقل با استفاده از چک‌سام‌های ساده کنترل کنید.

برچسب ها:

  • RNG
  • gpsch
  • میکروکنترلرها
  • الگوریتم ها
افزودن برچسب

دانه تصادفی (دانه)

مقدار یا بذر را به عنوان نقطه شروع عملکرد تصادفی () تنظیم می کند.

randomSeed(value); // مقدار را به عنوان مقدار تصادفی اولیه تنظیم می کند

از آنجایی که آردوینو نمی تواند اعداد تصادفی واقعی تولید کند، randomSeed به شما امکان می دهد یک متغیر، ثابت یا تابع دیگر را در تابع تصادفی قرار دهید، که به تولید اعداد تصادفی بیشتر کمک می کند.

اعداد "تصادفی" دانه ها یا توابع مختلفی وجود دارد که می توانند در این تابع استفاده شوند، از جمله millis()، یا حتی analogRead() برای خواندن نویز الکتریکی از طریق یک پین آنالوگ.

تصادفی (حداکثر)

تصادفی (حداقل، حداکثر)

عملکرد تصادفی به شما امکان می دهد یک عدد شبه تصادفی را در محدوده مشخص شده توسط مقادیر حداقل و حداکثر برگردانید.

مقدار = تصادفی (100، 200); // مقدار را به صورت تصادفی تنظیم می کند

// عددی بین 100 تا 200

توجه داشته باشید:پس از استفاده از تابع randomSeed() از این استفاده کنید. مثال زیر یک عدد تصادفی بین 0 تا 255 ایجاد می کند و PWM را خروجی می کند

سیگنال به خروجی PWM برابر با یک مقدار تصادفی:

int randNumber; // متغیر برای ذخیره یک مقدار تصادفی

int led = 10; // LED با مقاومت روی پایه 10

void setup() () // نیازی به نصب نیست

randomSeed(millis()); // millis() را با عدد اولیه تنظیم می کند

randNumber = تصادفی (255); // شماره تصادفی از 0 - 255 آنالوگ نویس (LED ، RandNumber) ؛ // خروجی سیگنال PWM

تاخیر (500); // نیم ثانیه مکث کنید

منبع: Gololobov V. – روبات ها از کجا شروع می شوند. درباره پروژه Arduino برای دانش آموزان مدرسه (و نه تنها) - 2011

پست های مرتبط

Serial.begin (نرخ) پورت سریال را باز می کند و سرعت انتقال داده سریال را تنظیم می کند. نرخ باود معمولی برای ارتباطات رایانه ای 9600 است، اگرچه سرعت های دیگر پشتیبانی می شود. void setup() (Serial.begin…….

همه متغیرها باید قبل از استفاده اعلام شوند. اعلان یک متغیر به معنای تعیین نوع مقدار آن است: int، long، float و غیره، اختصاص یک نام منحصر به فرد به متغیر و علاوه بر آن…….

خوب ، ما این برنامه را نصب کرده ایم. ما "مکانیسم" کار با ماژول را اشکال زدایی کرده ایم. و ما به چندین مثال نگاه کردیم. اما من دوست دارم خودم چیز مفیدی ایجاد کنم. بیایید تلاش کنیم. ابتدا بیایید پروژه قبلی را ببندیم. برای این…….

توجه! هنگام کار با ماژول آردوینو در محیط های توسعه دیگر، باید مراقب پیکربندی میکروکنترلر (فیوزها) باشید. تا زمانی که دقیقاً بدانید این تغییر ممکن است به چه چیزی منجر شود…….

زمان و تصادفی. واکنش

این بار می آموزیم که مقادیر "تصادفی" چیست و همچنین یاد می گیریم که چگونه با زمان کار کنیم.

ما نیاز خواهیم داشت:

  • دکمه تاکت
  • جیغ زدن
  • اتصال سیم "مرد مرد"

واکنش

وظیفه امروز ما جمع آوری نموداری است که به ما امکان می دهد سرعت واکنش خود را دریابیم.

وقتی روی دکمه سمت چپ، سیگنال پس از یک زمان "تصادفی" به نظر می رسد. و وقتی دکمه سمت راست را فشار می دهید، مشخص می شود که از صدای جیر جیر تا فشار دادن دکمه سمت راست چقدر زمان گذشته است.

کسانی که مهارت دارند خودشان آن را امتحان می کنند و ما به نمودار نگاه می کنیم.

#define BUZ 8 #define START 9 #define STOP 7 int time; //متغیر برای همگام سازی void setup() (سریال. begin(9600)؛ pinMode(START، INPUT_PULLUP); pinMode(STOP، INPUT_PULLUP); pinMode(BUZ، OUTPUT)؛ ) void loop() (if(digitalRead(START) == 0) // وقتی دکمه START را فشار می دهید.. (int start_time = millis(); // زمان فشار دادن = start_time را به خاطر بسپارید؛ // آن را در یک متغیر جهانی بنویسید. int Rand = تصادفی (0, 4000) )؛ // بیایید یک زمان تاخیر "تصادفی" = زمان + رند ایجاد کنیم؛ // تأخیر زمان تأخیر را اضافه کنید (رند)؛ // منتظر تن باشید (BUZ, 3000, 500); //بیپ! ) if(digitalRead( STOP) == 0 && digitalRead( START) == 1) // وقتی دکمه STOP را فشار می دهید... ( int stop_time = millis(); // زمان توقف را به خاطر بسپارید. time = stop_time - time; // محاسبه تفاوت زمانی Serial.println("زمان:")؛ // خروجی زمان به سریال. Serial.println(time); delay(1000); ) ) // قبل از تلاش دوم، دوباره دکمه START را فشار دهید.

توضیحات

بین المللی زمان؛ به متغیرها (نه همه)، هنگام نشان دادن آنها، لازم نیست مقداری داده شود. ما از این متغیر برای پیوند دو در صورت بیان استفاده کردیم.

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

برای در دسترس قرار دادن یک متغیر برای چندین عبارت، باید آن را جهانی کنید. آن ها یک متغیر خارج از توابع اعلام کنید.

millis();تعداد میلی‌ثانیه‌هایی که از راه‌اندازی برنامه گذشته است را برمی‌گرداند.

ما به آن نیاز داریم تا مدت زمانی را که از سیگنال داده شده تا فشار دادن دکمه می گذرد را اندازه گیری کنیم.

تصادفی(دقیقه،حداکثر)؛این یک مولد اعداد تصادفی است. دو مقدار می گیرد. عددی در محدوده حداقل تا حداکثر تولید می کند.

اعداد "تصادفی" چون دنباله خاصی از مقادیر هستند. خیلی طولانیه ولی همینطوره برای به دست آوردن دنباله های مختلف، باید استفاده کنید تصادفیSeed();

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

نتیجه

اکنون می توانید واکنش خود را با استفاده از دستگاهی که خودتان ساخته اید آموزش دهید. یا می توانید ادامه تحصیل دهید.

فهرست عناصر رادیویی

تعیین تایپ کنید فرقه تعداد توجه داشته باشیدخرید کنیددفترچه یادداشت من
برد آردوینو

آردوینو اونو

1 به دفترچه یادداشت
تخته نانتخته نان-نیم1 به دفترچه یادداشت
امیتر پیزومنفعل1 به دفترچه یادداشت
دکمه تاکتبدون قفل2 به دفترچه یادداشت
سیم های اتصال"پاپا-پاپا"1



بالا