في تقنية المعالجات الدقيقة ، تسمى المهام التي تعمل بالتوازي الخيوط. هذا مناسب للغاية ، لأنه غالبًا ما يكون من الضروري إجراء عدة عمليات في نفس الوقت. هل من الممكن جعل متحكم Arduino يقوم بالعديد من المهام في وقت واحد ، مثل المعالج الحقيقي؟ دعونا نرى.
انه ضروري
- - اردوينو
- - 1 ليد ؛
- - 1 جرس بيزو.
تعليمات
الخطوة 1
بشكل عام ، لا يدعم Arduino الموازاة الحقيقية أو تعدد مؤشرات الترابط.
ولكن يمكنك إخبار المتحكم الدقيق بالتحقق مما إذا كان الوقت قد حان لتنفيذ بعض المهام الإضافية في الخلفية عند كل تكرار لدورة "loop ()". في هذه الحالة ، سيظهر للمستخدم أنه يتم تنفيذ العديد من المهام في وقت واحد.
على سبيل المثال ، لنومض مصباح LED بتردد معين ، وبالتوازي ، نصدر أصواتًا ترتفع وتنخفض مثل صفارات الإنذار من باعث كهرضغطية.
لقد قمنا بتوصيل كل من LED وباعث بيزو بـ Arduino أكثر من مرة. دعونا نقوم بتجميع الدائرة كما هو موضح في الشكل. إذا كنت تقوم بتوصيل مؤشر LED بمسمار رقمي بخلاف "13" ، فتذكر أن لديك مقاومًا محددًا للتيار يبلغ حوالي 220 أوم.
الخطوة 2
لنكتب رسمًا تخطيطيًا مثل هذا ونقوم بتحميله على Arduino.
بعد تحميل اللوحة ، يمكنك أن ترى أن المخطط لم يتم تنفيذه تمامًا كما نحتاج إليه: حتى يتم تشغيل صفارة الإنذار بالكامل ، لن يومض مؤشر LED ، ونود أن يومض مؤشر LED أثناء سماع صفارات الإنذار. ماهي المشكلة هنا؟
الحقيقة هي أن هذه المشكلة لا يمكن حلها بالطريقة المعتادة. يتم تنفيذ المهام بواسطة متحكم دقيق بشكل متسلسل. يؤخر عامل التشغيل "delay ()" تنفيذ البرنامج لفترة زمنية محددة ، وحتى انتهاء هذا الوقت ، لن يتم تنفيذ أوامر البرنامج التالية. لهذا السبب ، لا يمكننا تعيين مدة تنفيذ مختلفة لكل مهمة في "الحلقة ()" من البرنامج.
لذلك ، تحتاج إلى محاكاة تعدد المهام بطريقة ما.
الخطوه 3
اقترح مطورو Arduino الخيار الذي سيؤدي فيه Arduino المهام في شبه متوازي في المقالة
جوهر الطريقة هو أنه مع كل تكرار للحلقة "loop ()" ، نتحقق مما إذا كان الوقت قد حان لميض LED (لأداء مهمة في الخلفية) أم لا. وإذا حدث ذلك ، فإننا نعكس حالة LED. هذا نوع من تجاوز عامل التشغيل "delay ()".
من العيوب المهمة في هذه الطريقة أن قسم الكود أمام وحدة التحكم LED يجب أن يتم تنفيذه بشكل أسرع من الفاصل الزمني الوامض لمؤشر LED "ledInterval". خلاف ذلك ، سيحدث الوميض بشكل متكرر أقل من اللازم ، ولن نحصل على تأثير التنفيذ المتوازي للمهام. على وجه الخصوص ، في مخططنا ، تبلغ مدة تغيير صوت صفارات الإنذار 200 + 200 + 200 + 200 = 800 مللي ثانية ، وقمنا بتعيين الفاصل الزمني للوميض LED على 200 مللي ثانية. لكن سيومض مؤشر LED لمدة 800 مللي ثانية ، وهو ما يختلف 4 مرات عما حددناه. بشكل عام ، إذا تم استخدام عامل التشغيل "delay ()" في الكود ، فمن الصعب محاكاة التوازي الزائف ، لذلك يُنصح بتجنبه.
في هذه الحالة ، سيكون من الضروري لوحدة التحكم في صوت صفارات الإنذار أيضًا التحقق مما إذا كان الوقت قد حان أم لا ، وعدم استخدام "delay ()". لكن هذا من شأنه أن يزيد من كمية الكود ويزيد من قابلية قراءة البرنامج.
الخطوة 4
لحل هذه المشكلة ، سنستخدم مكتبة ArduinoThread الرائعة ، والتي تتيح لك إنشاء عمليات زائفة متوازية بسهولة. إنه يعمل بطريقة مماثلة ، لكنه يسمح لك بعدم كتابة رمز للتحقق من الوقت - سواء كنت بحاجة إلى تنفيذ المهمة في هذه الحلقة أم لا. هذا يقلل من كمية الكود ويحسن سهولة قراءة الرسم التخطيطي. دعنا نتحقق من عمل المكتبة.
بادئ ذي بدء ، قم بتنزيل أرشيف المكتبة من الموقع الرسمي https://github.com/ivanseidel/ArduinoThread/archive/master.zip وفك ضغطه في دليل "المكتبات" في Arduino IDE. ثم أعد تسمية المجلد "ArduinoThread-master" إلى "ArduinoThread".
الخطوة الخامسة
سيبقى مخطط الاتصال كما هو. فقط رمز البرنامج سوف يتغير. الآن سيكون هو نفسه كما في الشريط الجانبي.
في البرنامج ، نقوم بإنشاء دفقين ، كل منهما يقوم بعمله الخاص: يومض أحدهما بمصباح LED ، والثاني يتحكم في صوت صفارة الإنذار. في كل تكرار للحلقة ، لكل مؤشر ترابط ، نتحقق مما إذا كان الوقت قد حان لتنفيذه أم لا. إذا وصل ، يتم تشغيله للتنفيذ باستخدام طريقة "run ()". الشيء الرئيسي هو عدم استخدام عامل التشغيل "delay ()".
يتم إعطاء تفسيرات أكثر تفصيلاً في الكود.
دعنا نحمل الكود في ذاكرة Arduino ، ونشغلها. الآن كل شيء يعمل تمامًا كما ينبغي!