استخدام مولد أرقام عشوائي في Arduino: وظائف Random وRandomSeed. دورة اردوينو - الوقت والعشوائية اردوينو توليد تسلسل بت عشوائي

عند برمجة Arduino، هناك أوقات تحتاج فيها إلى الحصول على رقم لن يكون معروفًا مسبقًا سواء للمبرمج الذي يكتب الرسم أو للمستخدم الذي سيستخدم Arduino مع مثل هذا البرنامج. في هذه الحالة، يأتي مولد الأرقام العشوائي (أو بالأحرى شبه العشوائي) للإنقاذ.



لتنشيط هذا المولد، ما عليك سوى استخدام الدالتين Random() أو RandomSeed(). ستوضح لك هذه المادة كيفية التعامل مع هذه الوظائف، بالإضافة إلى كيفية التخلص من العشوائية الزائفة عند توليد الأرقام.


بشكل عام، يحاكي مولد الأرقام العشوائية المظهر الفوضوي أو العشوائي للأرقام، ولكن في الواقع، إذا قمت بتحليل سلسلة من هذه الأرقام على مدى فترة طويلة بما فيه الكفاية، يمكنك ملاحظة نمط معين.


لذلك، يمكن أن تحتوي الدالة العشوائية لتوليد أرقام شبه عشوائية على ما يصل إلى معلمتين ويتم كتابتها كـ عشوائي (max) أو عشوائي (min، max). هنا المعلمة القصوى، وهو أمر إلزامي، يحدد الحد الأعلى للنطاق لتوليد أرقام عشوائية زائفة. باستخدام معلمة إضافيةدقيقة يمكنك تعيين الحد الأدنى للنطاق. ونتيجة لذلك، ستعيد الدالة بعض الأرقام العشوائية الزائفة في النطاق من min إلى max-1.


من المهم أن نفهم أنه عند استخدام الدالة Random()، سيتم إنشاء نفس قائمة الأرقام العشوائية الزائفة في كل مرة. على سبيل المثال، إذا قمت بإنشاء ماكينة قمار وفي المرة الأولى التي تضغط فيها على المقبض، تظهر مجموعة فائزة، فيمكنك التأكد من أنه إذا قمت بإعادة ضبط Arduino والضغط على المقبض مرة أخرى، فإن ماكينة القمار هذه ستظهر نفس المجموعة الفائزة . في الواقع، ليس من السهل تنفيذ آلة ألعاب بتوليد أرقام عشوائية تمامًا على Arduino، كما هو الحال، على سبيل المثال، مطبق في آلات الألعاب www.igrovye-apparati-vulcan.com/، ولكن يمكنك حل المشكلة جزئيًا باستخدام RandomSeed () وظيفة.


تأخذ هذه الدالة قيمة (مثل عدد صحيح)، وتستخدم الرقم لتعديل القائمة العشوائية التي تم إنشاؤها بواسطة الدالة عشوائي () يمكنك وضع RandSeed () في وظيفة الإعداد، واستخدام الدالة عشوائي () في عدد لا نهائي حلقة. لكن حتى في هذه الحالة، المشكلة هي أنه على الرغم من أن تسلسل الأرقام العشوائي سيكون مختلفًا عند استخدام الدالة 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 أوليًا نسبيًا،
- أ-1يجب أن تكون متعددة صلجميع العوامل الأولية صأعداد م,
- لو مهو مضاعف للعدد 4 (وفي حالتنا سيكون مضاعفًا)، إذًا أ-1يجب أن يكون من مضاعفات 4.
هناك دقة أخرى: يجب أن تؤخذ فقط البتات الأكثر أهمية من متغير الحالة X كنتيجة، حيث أن المعلمات الإحصائية للعشوائية تكون أسوأ بكثير بالنسبة للبتات الأقل. يتم تطبيق خوارزمية التطابق الخطي بشكل شائع كمعيار rand() في العديد من المكتبات.

الايجابيات:

  • أقصى فترة ممكنة لحجم معين لمتغير الحالة؛
  • سريع كفاية؛
  • غالبًا ما يتم تنفيذه بالفعل في مكتبة المترجم.
السلبيات:
  • مطلوب عملية الضرب.
  • ليست كل البتات عشوائية بنفس القدر.
ملخص:خوارزمية سريعة وبسيطة للتطبيقات التي لا تتطلب الكثير من المتطلبات.
طريقة فيبوناتشي مع التأخر
تستخدم هذه الخوارزمية العلاقة
X i = X i-a - X i-b ,
أين هو متغير الحالة X- عدد صحيح غير موقعة. تأخير القيم أو بلا يتم أخذ أي منها فحسب، بل يتم تحديدها بدقة، لتحقيق أقصى قدر من الجودة، يوصى بالأزواج (17.5) أو (55.24) أو (97.33). كلما زاد التأخير، زادت الفترة وتحسنت الخصائص الطيفية للتسلسل. من ناحية أخرى، لكي يعمل المولد، من الضروري تخزين الحد الأقصى (a,b) من الأرقام السابقة، وهو أمر غير مقبول دائمًا. أيضًا، لتشغيل المولد، تحتاج إلى أرقام max(a,b)، والتي يتم الحصول عليها عادةً باستخدام PRNG أبسط.

الايجابيات:

  • لا يتطلب عمليات الضرب.
  • جميع بتات الرقم العشوائي متكافئة في الخصائص الإحصائية.
السلبيات:
  • يتطلب كمية كبيرة من الذاكرة.
  • يتطلب مجموعة كبيرة من الأرقام للتشغيل.
ملخص:خوارزمية عالية الجودة ولكنها كثيفة الاستخدام للموارد.
سجل إزاحة التغذية المرتدة الخطية


يتم تخزين متغير الحالة في سجل بطول N. يتضمن إنشاء الحالة التالية خطوتين:
  1. يتم حساب قيمة البت C = X i1 xor X i2 xor… X ik، أين i1، i2... إيك- تسجيل أرقام البت، ودعا الانحناءات.
  2. يتم إزاحة السجل بمقدار 1 بت إلى اليمين، ويأخذ البت الموجود في أقصى اليسار القيمة مع.
إخراج المولد هو أقصى اليمين (أو أقصى اليسار، أو أي شيء آخر) من السجل، أي أن التسلسل العشوائي الزائف يتم إنشاؤه بت واحد لكل تكرار. مع أرقام النقر المحددة بشكل صحيح، ستكون فترة المولد 2 N - 1. "ناقص واحد"، نظرًا لوجود حالة صفر محظورة في السجل. أرقام الفروع ل نيمكن العثور على الأرقام من 3 إلى 168 في هذه الوثيقة.
بالإضافة إلى التكوين الموصوف أعلاه، والذي، بالمناسبة، يسمى تكوين فيبوناتشي (يجب عدم الخلط بينه وبين طريقة PRNG التي تحمل الاسم نفسه!) ، هناك ما يسمى. تكوين جالوا.


بدلاً من استخدام مجموع البتات في تسلسل النقر لإنشاء بتة جديدة في أقصى اليسار، فإنه يقوم XORs بكل بت في تسلسل النقر باستخدام البت الموجود في أقصى اليمين، ثم يقوم بتدوير السجل بأكمله إلى اليمين. يعد هذا المخطط أكثر صعوبة في الفهم، ولكنه أسهل في التنفيذ، حيث يمكن تنفيذ جميع عمليات XOR في وقت واحد. من حيث طول الفترة وجودة الأرقام العشوائية الزائفة، فإن مخططات فيبوناتشي وجالوا متكافئة.

الايجابيات:

  • التنفيذ بسيط جدًا، ولا يتطلب حتى عمليات حسابية، بل يتطلب فقط عمليات وتحولات صغيرة؛
  • خوارزمية سريعة جدًا (خاصة مخطط جالوا)؛
  • خصائص إحصائية جيدة.
السلبيات:
  • تحتاج إلى التحقق من القيمة الأولية لعدم المساواة إلى الصفر.
ملخص:خوارزمية سريعة جدًا وعالية الجودة إلى حد ما.
خوارزميات التشفير
للاستخدام في التشفير، تحتوي PRNGs على مطلب أساسي آخر: اللارجعة. جميع الخوارزميات المذكورة أعلاه لا تملك هذه الخاصية: بمعرفة العديد من قيم مخرجات PRNG، يمكنك من خلال حل نظام معادلات بسيط العثور على معلمات الخوارزمية (نفس الثوابت "السحرية" أ، ب، جإلخ). ومعرفة المعلمات، يمكنك إعادة إنتاج التسلسل العشوائي الزائف بأكمله.
يمكن استخدام أي تشفير كتلة قوي بما فيه الكفاية كخوارزمية PRNG قوية من الناحية التشفيرية. من خلال اختيار مفتاح سري، يمكنك الحصول على كتل من الأرقام العشوائية الزائفة من خلال تطبيق الخوارزمية على الأعداد الطبيعية المتسلسلة. بالنسبة للتشفير الكتلي ذو البتات N، لن تزيد الفترة عن 2 N. يعتمد أمان مثل هذا المخطط كليًا على سرية المفتاح.
يتم اختبار جميع خوارزميات التشفير الحديثة لاستخدامها كـ PRNGs، أي أنه باستخدام خوارزمية معتمدة، ليست هناك حاجة إلى الاهتمام بشكل خاص بالخصائص الإحصائية والطيفية لتدفق الإخراج. ما عليك سوى القلق بشأن "الشراهة" الحسابية لخوارزميات التشفير. إذا كنت بحاجة إلى إجراء عدد كبير من عمليات التشفير، فمن المنطقي اختيار وحدة تحكم تحتوي على كتل تشفير للأجهزة. غالبًا ما تحتوي وحدات التحكم هذه أيضًا على أجهزة PRNG جيدة جدًا ومقاومة للتشفير.

مصادر الانتروبيا

كما ذكرنا سابقًا، باستخدام الخوارزميات الحتمية فقط، من المستحيل إنشاء رقم عشوائي حقًا. ولذلك، عادة ما يتم استخدام مزيج من PRNG + خارجي مصدر الانتروبيا. يتم استخدام مصدر الإنتروبيا لتعيين القيمة الأولية لـ PRNG، ومهمة الأخير هي ضمان النقاء الطيفي والإحصائي للتسلسل. ما الذي يمكن استخدامه كمصدر للإنتروبيا؟ نعم، أي شيء تقريبًا.
نشاط المستخدم
إذا كان الجهاز يتفاعل مع المستخدم بأي شكل من الأشكال، تماما قرار جيدسيستخدم المستخدم نفسه كمصدر للإنتروبيا. على سبيل المثال، وقت الضغط على الزر، الذي تم قياسه بدقة ميكروثانية (أو بالأحرى، أرقامه الأقل أهمية)، لا يمكن التنبؤ به على الإطلاق. ومع ذلك، في كثير من الأحيان يجب أن يعمل الجهاز بشكل مستقل، مما يعني أننا محرومون من هذه القناة الرائعة للمعلومات.
محول تناظري رقمي
تحتوي العديد من وحدات التحكم على ADCs مدمجة. وفي العديد من وحدات التحكم تكون ذات جودة متواضعة جدًا، وقد تم تصميمها "لكي تكون فقط". تحتوي البتات ذات الترتيب المنخفض لنتيجة ADC دائمًا على ضوضاء كبيرة، حتى عند قياس جهد التيار المستمر. يمكن استخدام هذا: قم بتوصيل دخل ADC بجهد الإمداد من خلال مقسم، وقم بإجراء بضع عشرات من القياسات، وقم بأخذ البتات الأقل أهمية - هنا لديك رقم عشوائي كبير. إذا كان ADC يحتوي على مكبر صوت مدمج، فقم بتشغيله، فهو صاخب أيضًا.
مولدات غير متزامنة
يمكنك استخدام الفرق في فترات اثنين من مولدات الساعة غير المتزامنة. تحتوي معظم وحدات التحكم، على سبيل المثال، على مؤقت مراقبة. لزيادة الموثوقية، يتم تسجيله من مولد منفصل، وهو غير متصل بأي حال من الأحوال بإشارة الساعة الرئيسية. يكفي حساب عدد دورات إشارة الساعة الرئيسية خلال فترة واحدة من مؤقت الوكالة الدولية للطاقة. إذا اخترت فترات بحيث يفيض العداد عدة مرات أثناء القياس، فيمكنك الحصول على رقم عشوائي إلى حد ما. عيب هذه الطريقة هو أنها تستغرق وقتًا طويلاً يصل إلى عدة ثوانٍ.
ساعة الوقت الحقيقي
إذا كان الرسم البياني لديه ساعة الوقت الحقيقي، يمكنك استخدام قراءاتها الحالية لتهيئة PRNG. على سبيل المثال، من خلال تحويل التاريخ/الوقت الحالي إلى تنسيق وقت Unix، نحصل على الفور على 32 بت، وهو ما أبداًلن يحدث مرة أخرى إلا إذا أخذت قراءات أكثر من مرة في الثانية. إن استخدام الوقت الحقيقي يعطي تفردًا للقيم، لكنه لا يوفر أي عدم القدرة على التنبؤ، لذلك من الأفضل الجمع هذه الطريقةمع الآخرين.
دائرة RC
إذا كان جهاز التحكم لا يوجد لديه الأجهزة الطرفية، بالإضافة إلى منافذ الإدخال / الإخراج، يمكنك القيام بما يلي: يتم توصيل أحد الأرجل من خلال مكثف بالأرض، ومن خلال المقاوم بجهد الإمداد. إذا كانت مدخلات وحدة التحكم تحتوي على مقاومات سحب داخلية، فلن تكون هناك حاجة إلى مقاوم خارجي.

نقوم بإخراج إشارة "0" إلى هذا المنفذ - يتم تفريغ المكثف. نقوم بتحويل المنفذ إلى وضع الإدخال - يبدأ المكثف في الشحن. عندما يصل الجهد عبره إلى العتبة، سيتحول الإدخال من الحالة "0" إلى "1". يعتمد وقت الشحن بشدة على العديد من العوامل: جهد الإمداد، وانحراف معلمات دائرة RC، وعدم استقرار العتبة، ودرجة الحرارة، والتسريبات، والتداخل. ومن خلال قياسها بدقة كافية وأخذ البتات الأقل أهمية، يمكنك الحصول على عشوائية جيدة.
مولد ضوضاء الأجهزة
بالنسبة للعديد من التطبيقات الجادة (أبرزها التشفير)، يلزم وجود مصدر أكثر موثوقية للإنتروبيا من تلك المذكورة أعلاه. في مثل هذه الحالات، يستخدمون رقمنة الإشارة من مولد الضوضاء بناءً على التأثيرات الحرارية أو الطلقة أو حتى الكم. عادة ما يكون عنصر الضوضاء عبارة عن صمام ثنائي خاص أو صمام ثنائي زينر، حيث يتم تضخيم الإشارة منه وتغذيتها إلى جهاز مقارنة يقوم بتوليد تدفق بت ثنائي.

للتأكد من أن عتبة استجابة المقارنة لا تؤثر على الخصائص الإحصائية للإشارة المستقبلة، يتم استخدام مولدين للضوضاء يعملان على مقارنة واحدة:

خاتمة

وأخيراً سأحكي لكم قصة واحدة من حياتي. بدأ الأمر بسؤال آخر تم طرحه في المنتدى: "كيف يمكنني إنشاء رقم عشوائي على وحدة التحكم؟" أوضح مؤلف السؤال أنه كمشروع دورة تدريبية يقوم بصنع جهاز يحاكي رمي النرد. بعد عدة محاولات فاشلة لفهم الخوارزميات، شارك صاحب الموضوع حله: قام ببساطة برمي حجر نرد حقيقي 1000 مرة وملء كل الذاكرة الفارغة لوحدة التحكم بالأرقام الناتجة. اجتاز المولد جميع اختبارات "العشوائية" ببراعة، مع الأخذ في الاعتبار أنه استهلك خلال العرض التوضيحي أقل من ثلث "احتياطيه".
لذلك، فإن مثل هذا الحل له الحق في الحياة، خاصة إذا تم فرض متطلبات صارمة للغاية على عشوائية الأرقام، لكنها ليست مطلوبة في كثير من الأحيان. مع انخفاض أسعار الذاكرة، قد يكون من الحكمة تجهيز جهاز "باحتياطي الفوضى" الذي سيستمر طوال عمر الجهاز.
أشكر لك إهتمامك!

التحديث 1:كما تمت الإشارة إليه في التعليقات، إذا كان الهجوم على RNG متوقعًا، وكان لدى المهاجم إمكانية الوصول إلى الجهاز، فيجب استخدام مصادر الإنتروبيا الخارجية بحذر شديد، لأنه ليس من الصعب جدًا استبدال الإشارة من مصدر خارجي. وينبغي استخدام المصادر الداخلية، بالإضافة إلى المصادر الخارجية.
إنها أيضًا فكرة جيدة أن تقوم بتجميع الإنتروبيا في كل شيء وقت فراغواستخدمه عندما تحتاج إلى إنشاء رقم عشوائي آخر. عادة في مثل هذه الحالات ما يسمى تجمع الانتروبيا- مصفوفة يتم من خلالها تنفيذ إحدى وظائف PRNG بشكل دوري، ويتم فيها خلط البيانات من مصادر الإنتروبيا باستمرار.

التحديث 2:في كثير من الحالات، يكون من المفيد حفظ محتويات مجمع Entropy (آسف، لا أعرف الترجمة الروسية العادية) في EEPROM بحيث لا تتراكم مرة أخرى بعد إيقاف تشغيل الجهاز وتشغيله. يتعلق هذا، في المقام الأول، بالحصول على الإنتروبيا باستخدام طريقة المولدات غير المتزامنة: في ظل ظروف مستقرة بما فيه الكفاية، يمكن توليد نفس التسلسل بعد كل تشغيل.
إذا كان الهجوم متوقعًا، فاتخذ الاحتياطات اللازمة ضد العبث بـ EEPROM. إذا سمحت وحدة التحكم بذلك، قم بحظر القراءة/المسح/الكتابة باستخدام بتات القفل، وعند تشغيلها، راقب سلامة EEPROM، على الأقل باستخدام مجاميع اختبارية بسيطة.

العلامات:

  • آر إن جي
  • com.gpsch
  • ميكروكنترولر
  • خوارزميات
اضف اشارة

بذور عشوائية (البذور)

يضبط القيمة، أو البذرة، كنقطة بداية للدالة Random().

RandomSeed(value); // يعين "القيمة" كقيمة عشوائية أولية

نظرًا لأن Arduino لا يمكنه إنشاء أرقام عشوائية حقًا، فإن RandomSeed يسمح لك بوضع متغير أو ثابت أو وظيفة أخرى في الوظيفة العشوائية، مما يساعد في إنشاء المزيد من الأرقام العشوائية.

"أرقام عشوائية. هناك العديد من البذور، أو الوظائف المختلفة، التي يمكن استخدامها في هذه الوظيفة، بما في ذلك millis()، أو حتىanalogRead() لقراءة الضوضاء الكهربائية من خلال دبوس تمثيلي.

عشوائي (الحد الأقصى)

عشوائي (دقيقة، ماكس)

تسمح لك الدالة العشوائية بإرجاع رقم عشوائي زائف ضمن النطاق المحدد بواسطة قيمتي الحد الأدنى والحد الأقصى.

القيمة = عشوائي (100، 200)؛ // يضبط "القيمة" على قيمة عشوائية

// رقم بين 100 و 200

ملحوظة:استخدم هذا بعد استخدام الدالة RandomSeed(). يقوم المثال التالي بإنشاء رقم عشوائي بين 0 و255 وإخراج PWM

إشارة إلى خرج PWM يساوي قيمة عشوائية:

int randNumber; // متغير لتخزين قيمة عشوائية

إنت ليد = 10؛ // LED مع المقاوم على دبوس 10

إعداد باطل () () // الإعداد غير مطلوب

RandomSeed(ملي()); // يضبط millis() بالرقم الأولي

randNumber = عشوائي(255); // رقم عشوائي من 0 إلى 255 كتابة تمثيلية (led، randNumber)؛ // إخراج إشارة PWM

تأخير (500)؛ // توقف لمدة نصف ثانية

المصدر: Gololobov V. – أين تبدأ الروبوتات. حول مشروع اردوينو لأطفال المدارس (وليس فقط) – 2011

المنشورات ذات الصلة

Serial.begin (المعدل) يفتح المنفذ التسلسلي ويضبط سرعة نقل البيانات التسلسلية. معدل الباود النموذجي لاتصالات الكمبيوتر هو 9600، على الرغم من دعم السرعات الأخرى. إعداد باطل () (Serial.begin…….

يجب الإعلان عن جميع المتغيرات قبل استخدامها. الإعلان عن متغير يعني تحديد نوع قيمته: int، long، float، وما إلى ذلك، وتعيين اسم فريد للمتغير، بالإضافة إلى…….

حسنًا، لقد قمنا بتثبيت هذا البرنامج. لقد قمنا بتصحيح "آلية" العمل مع الوحدة. ونظرنا إلى عدة أمثلة. لكني أود أن أصنع شيئًا مفيدًا بنفسي. دعونا نحاول. أولا، دعونا نغلق المشروع السابق. لهذا…….

انتباه! عند العمل مع وحدة Arduino في بيئات تطوير أخرى، يجب أن تكون حذرًا بشأن تكوين المتحكم الدقيق (Fuses). حتى تعرف بالضبط ما قد يؤدي إليه التغيير .......

الوقت والعشوائية. رد فعل

هذه المرة سوف نتعلم ما هي القيم "العشوائية" ونتعلم أيضًا كيفية التعامل مع الوقت.

سنحتاج إلى:

  • زر اللباقة
  • صرير
  • توصيل الأسلاك "ذكر-ذكر"

رد فعل

مهمتنا اليوم هي تجميع رسم تخطيطي يسمح لنا بمعرفة سرعة رد فعلنا.

عندما تنقر على الزر الأيسر، تنطلق الإشارة بعد وقت "عشوائي". وعند الضغط على الزر الأيمن، يتم ملاحظة مقدار الوقت الذي انقضى من الصرير إلى الضغط على الزر الأيمن.

أولئك الذين يتمتعون بالمهارة يجربون ذلك بأنفسهم، وننظر إلى الرسم البياني.

#define BUZ 8 #define START 9 #define STOP 7 int time; // متغير للمزامنة الإعداد الفارغ () (Serial.begin (9600)؛ pinMode (START، INPUT_PULLUP)؛ pinMode (STOP، INPUT_PULLUP)؛ pinMode (BUZ، OUTPUT)؛) حلقة باطلة () (if (digitalRead (START) == 0) // عند الضغط على زر ابدأ.. ( int start_time = millis(); // تذكر وقت الضغط على time = start_time; // اكتبه في متغير عام int Rand = عشوائي(0, 4000) ); // لنقم بإنشاء وقت تأخير "عشوائي" = الوقت + Rand؛ // أضف وقت التأخير تأخير (Rand)؛ // انتظر النغمة (BUZ، 3000، 500)؛ // Beep! ) if(digitalRead( STOP) == 0 && digitalRead( START) == 1) // عندما تضغط على زر STOP... ( int stop_time = millis(); // تذكر وقت التوقف. time = stop_time - time; // احسب وقت التوقف فارق التوقيت Serial.println("Time: "); // أخرج الوقت إلى Serial.Serial.println(time); Delay(1000); ) ) // قبل المحاولة الثانية، اضغط على زر START مرة أخرى.

تفسيرات

كثافة العمليات وقت؛ المتغيرات (ليس كلها)، عند الإشارة إليها، ليس من الضروري أن تعطى أي قيمة. استخدمنا هذا المتغير لربط عبارات if.

في لغة C++، لن يكون من الممكن الوصول إلى المتغيرات المعلنة داخل الحلقة في حلقات أخرى، حيث أن لها تأثيرًا داخل تلك الحلقة فقط. يتم ذلك لمنع أخطاء البرمجة. عندما ينمو رمز البرنامج، سوف تفهم ما أتحدث عنه.

لجعل المتغير متاحًا لعدة عبارات، يجب أن تجعله عالميًا. أولئك. أعلن عن متغير خارج الوظائف.

ملي () ؛إرجاع عدد المللي ثانية التي مرت منذ إطلاق البرنامج.

نحن في حاجة إليها لقياس مقدار الوقت الذي انقضى من الإشارة المعطاة إلى الزر الذي يتم الضغط عليه.

عشوائي(دقيقة,الأعلى)؛هذا هو مولد أرقام عشوائية. يأخذ قيمتين. يقوم بإنشاء رقم في النطاق من الحد الأدنى إلى الحد الأقصى.

أرقام "عشوائية" لأنها عبارة عن تسلسل محدد من القيم. طويلة جدا، ولكن نفس الشيء. من أجل الحصول على تسلسلات مختلفة، يجب عليك استخدام عشوائيبذرة()؛

تقوم هذه الوظيفة بتهيئة المولد. وإذا قمنا بتعيين المعلمة على عشوائي، فسنحصل على التسلسلات التي نحتاجها. سيكون التسلسل هو نفسه إذا تم إصلاح المعلمة.

خاتمة

يمكنك الآن تدريب رد فعلك باستخدام جهاز صنعته بنفسك. أو يمكنك مواصلة الدراسة أكثر.

قائمة العناصر الراديوية

تعيين يكتب فئة كمية ملحوظةمحلمفكرة بلدي
لوحة اردوينو

اردوينو أونو

1 إلى المفكرة
لوح الخبزنصف اللوح1 إلى المفكرة
باعث بيزوسلبي1 إلى المفكرة
زر اللباقةبدون قفل2 إلى المفكرة
توصيل الأسلاك"بابا بابا"1



قمة