كيف تجعل الروبوت يتحرك بدقة؟ نظرة عامة وميزات منصة Studuino Robotics

صورة

طُلب من المنظمة التي أعمل فيها أن تعقد ندوة صغيرة على الإنترنت عن الروبوتات لصالون موسكو الدولي للتعليم 2020 ، والتي عقدت بتنسيق عبر الإنترنت. تم ترك موضوع العرض مفتوحًا لي وتم تقديم مجموعة تعليمية حول الروبوتات. لذلك تعرفت على منتجات من شركة ArTeC اليابانية (هذا ليس إعلانًا ولست موظفًا في ArTeC - إنها تجربتي الشخصية فقط من التواصل مع منتجاتها). بعد الندوة عبر الإنترنت ، قررت كتابة هذا المقال ، حيث كانت مجموعات Lego Education في روسيا شائعة جدًا ، وكانت هذه هي المرة الأولى التي صادفت فيها هذا المصمم الياباني.

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

لذا ، إذا كان أي شخص مهتمًا بنوع المجموعة الروبوتية وما يمكن فعله بها ، أطلب قطة. إذن هيا بنا نذهب!

كأساس بناء ، يستخدم المصمم فقط عددًا قليلاً من الأجزاء الأساسية التي يمكنك من خلالها تجميع الهياكل المعقدة تمامًا.

ArTeC مصمم قاعدة كتل
ArTeC مصمم قاعدة كتل كتل

صورة
نماذج من أجزاء المصمم

نظرًا لخصوصية الأجزاء - الترتيب المتدرج للثقوب والمسامير للاتصال ، ليس من السهل دائمًا العثور على المجموعة الصحيحة من الأجزاء لتحقيق النتيجة. من المزايا ، على عكس Lego: جميع الأجزاء كبيرة بما فيه الكفاية ، مما يجعلها أكثر صعوبة. الميزة الثانية هي أنك لست مضطرًا للتفتيش بحثًا عن الجزء الضروري لفترة طويلة ، نظرًا لوجود 5-6 قطع فقط من الأجزاء الأساسية (لا يُحسب الفرق في لون الأجزاء). هناك ناقص - طالما أن الأجزاء جديدة تمامًا ، فإن فصلها يتحول أحيانًا إلى عذاب - لذلك يتمسكون بإحكام ببعضهم البعض. للمساعدة على فكها تأتي أداة خاصة موجودة في المجموعة.

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

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

لملء وحدة التحكم الرئيسية ، صنع اليابانيون نسختهم من لوحة Arduino ، ووضعوا اللمسات الأخيرة عليها ، وأطلقوا عليها Studuino. قاموا بإضافة محرك تحكم في المحرك DC إليه وجلبوا خطًا لموصلات 3-دبوس (معيار BLS-3 ، يتم وضعها على الماكينات). يوجد على كل موصل مثل الطاقة: زائد وناقص ، بالإضافة إلى أحد دبابيس لوحة Arduino. جميع الموصلات موقعة ، لذلك من الصعب ارتكاب خطأ عند الاتصال بها.

منصة Studuino
منصة Studuino

للتوافق مع دروع Arduino القياسية في الأماكن القياسية ، هناك موصلات مشابهة لـ Arduino.

الفرق الرئيسي من لوحة Arduino هو أن جهد وحدة التحكم هو 3.3V. ويفسر ذلك حقيقة أن وحدة التحكم المركزية يتم تزويدها بالطاقة من خلال حجرة البطارية المرفقة لثلاث بطاريات AA (4.5 فولت في المجموع). للأسف ، لم يتم توفير البطارية ، ولا يمكن شراؤها حتى على موقع الشركة المصنعة كخيار إضافي.

يقع اللوح في علبة بلاستيكية ، يمكنك من خلالها إرفاق الأجزاء الأساسية للمصمم والعناصر الأخرى.

وحدة ArTeC المركزية
وحدة ArTeC المركزية

بصفتها مشغلاً ، توفر الشركة المصنعة محركين للتيار المستمر مع علب تروس وما يصل إلى 8 محركات مؤازرة من تصميمها الخاص (يمكن أن يختلف عددها اعتمادًا على تكوين المجموعة). يتم توصيل المحركات من خلال موصلات خاصة موجودة على اللوحة.

محركات DC بالتروس وتوصيلها
محركات التيار المستمر مع علب التروس واتصالها من

الممكن تجميع أبسط بنية بسهولة وبسرعة تتبادر إلى الذهن: آلة روبوت بمحركين ، تحكم يمكنك جعلها تتحرك في الاتجاه الصحيح.

آلة روبوت بسيطة بمحركين DC
آلة روبوت بسيطة بمحركين DC

يتم التحكم في المحركات عن طريق تعيين الحالات المنطقية للمحطات D2 و D4 و D3 للمحرك ، والتي يتم توصيلها بموصلات M1 و D7 و D8 و D5 للمحرك المتصل بموصل M2 على لوحة Studuino. في هذه الاستنتاجات ، قام مطورو لوحة Studuino بالاتصال بالتوازي مع رقاقة سائق محرك. سيفشل استخدام هذه الاستنتاجات من خلال توصيل دائرتك هناك ، وفي نفس الوقت استخدام المحركات في نفس الوقت.

فكر في كيفية التحكم في المحرك المتصل بموصل M1. من خلال تحديد حالة منطقية مختلفة للأطراف D2 و D4 ، من الممكن تحقيق دوران المحرك في الاتجاه المطلوب. على سبيل المثال: مع D2 - 1 و D4 - 0 ، يدور المحرك في اتجاه عقارب الساعة ، وإذا كان D2 - 0 و D4 - 1 ، فإن المحرك يدور عكس اتجاه عقارب الساعة. من الضروري أيضًا ضبط سرعة دوران المحرك عن طريق تعيين قيمة PWM في دبوس D3 - يمكن أن تكون في النطاق من 0 إلى 255. إذا كانت القيمة 0 ، فلن يدور المحرك ، وإذا كانت القيمة 255 ، فسوف نحصل على أقصى سرعة دوران. يسمح محرك المحرك أيضًا بتغيير فوري في اتجاه دوران المحرك ويدعم وضع كبح المحرك. لإبطاء سرعة المحرك ، يجب تعيين نفس الحالة المنطقية التي تساوي 1 في المطرافين D2 و D4.

بالمناسبة ، لا توجد دبابيس D3 و D5 في الموصلات التي تحتوي على 3 دبابيس (GND ، VCC ، SIG) على لوحة Studuino ، ولكنها موجودة على موصل Arduino القياسي ، والذي تركه المطورون للحفاظ على توافق النظام الأساسي.

وبالمثل ، يتم التحكم في المحرك ، والذي يتم توصيله بموصل M2. بالنسبة له ، يتم تحديد اتجاه الدوران من خلال حالة المحطتين D7 و D8 ، وسرعة الدوران بواسطة المحطة D5.

أبسط برنامج كتبته جعل آلة الروبوت تتحرك على النحو التالي:


يمكن توصيل أجهزة الماكينة بالموصلات المميزة باللون الأحمر على اللوحة: D2 و D4 و D7 و D8 و D9 و D10 و D11 و D12.

اتصال مضاعفات
توصيل محركات الأقراص المؤازرة

إن وحدة التحكم الدقيقة AtMega168 لديها في هذه الدبابيس جهاز PWM ، وهو مطلوب للتحكم في محركات أجهزة المؤازرة. إذا قمت بتوصيل الحد الأقصى من عدد الماكينات ، يمكنك الحصول على بعض التصميم المثير للاهتمام. من أجل التظاهر ، جمعت نظيرًا بسيطًا لروبوت مشي وحاولت برمجته قليلاً. يمكن رؤية النتيجة في الفيديو:


الشيء الوحيد الذي يجب تذكره هو أنه إذا كنت تخطط لاستخدام كل من محركات DC والمركبات في نفس الوقت ، فلا يمكنك استخدام محركين DC و 8 أجهزة في نفس الوقت ، نظرًا لأن لديهم مخرجات مشتركة يتحكم فيها المتحكم الدقيق. يمكنك إجراء التكوينات التالية: 2 محرك DC + 4 أجهزة ، 1 محرك DC + 6 أجهزة أو استخدام 8 أجهزة فقط.

في أي مجموعة روبوتية ، بالإضافة إلى المحركات ، يجب أن يكون هناك أجهزة استشعار هي "عيون" و "آذان" أي روبوت. هم أيضا هنا. في مجموعتي ، كانت هناك المستشعرات التالية: مستشعر الضوء ، ومستشعر الصوت ، ومستشعر التسارع ، ومستشعران للأشعة تحت الحمراء ، ومستشعر اللمس ، بالإضافة إلى مصابيح LED (الأخضر والأحمر والأزرق والأبيض) و piezodynamic.

أجهزة الاستشعار في مجموعة
أجهزة الاستشعار في مجموعة

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

هذه هي الطريقة التي يعمل بها مستشعر اللمس:


وهذه هي الطريقة التي يعمل بها مستشعر الضوء:


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

ميزات التوظيف المحسنة
الاتصال المحسّن

النقطة المهمة التالية لأي مجموعة روبوتية هي توفر بيئة برمجة ملائمة. هنا ، تقدم الشركة المصنعة ثلاثة خيارات برمجة مختلفة.

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

برمجة الرموز
برمجة الرموز

هنا يمكنك سحب الرسوم التوضيحية مع الإجراءات الأساسية في البرنامج (المضي قدمًا ، وتحويل ، وتشغيل LED ، وما إلى ذلك) وتكوين معلماتها الأساسية.

عندما يتم إتقان هذا المستوى أو تصبح قدراته غير كافية لحل المهام ، يمكنك الانتقال إلى الخطوة التالية والبدء في استخدام بيئة برمجة Scratch لمنصة Studuino.

برمجة الصفر ل Studuino
برمجة Scratch لـ Studuino

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

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

كاملة مع برنامج البرمجة ، تعطي الشركة المصنعة مجموعة من التعليمات لتجميع النماذج المختلفة وبرمجتها. البرنامج نفسه متاح مجانًا على موقع الشركة المصنعة.

الآن دعنا نحاول حل مشكلة عملية صغيرة باستخدام هذه المجموعة.

تخيل أن لدينا روبوتًا يجب أن يتحرك إلى الأمام والخلف في المستودع ونحتاج إلى إيقافه في الأماكن المحددة. إذا لم يتم التحكم في الروبوت ، سيحدث حادث. يتم عرض مثال لمثل هذا الحادث هنا:


يمكن تحريك الروبوت إلى الأمام والخلف باستخدام محركات DC أو باستخدام أجهزة. محركات الأقراص المؤازرة تحل مشكلة كيفية إيقاف الروبوت في المكان الصحيح (يمكنك ضبط زاوية دوران المؤازرة بدقة). يحتوي هذا الحل على قيود (سنستخدم مضاعفات من مجموعة مثبت عليها عجلة) - لا يمكن للمؤازرات الدوران بزاوية تزيد عن 180 درجة ، وبالتالي ستقتصر حركة الروبوت على نصف طول ثورة العجلة على المؤازرة ، ولكن عادةً ما تريد المزيد.

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

أبسط خيار يمكنك استخدامه هو إنسان آلي ، يمرر النقطة المطلوبة ، يلمس مستشعر اللمس ، والذي سيكون إشارة توقف في المكان الصحيح.

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


يُظهر الفيديو أن الروبوت يصل إلى نهاية "المستودع" ويلمس "الجدار" بجهاز الاستشعار ، ثم يعود إلى "الجدار" المعاكس للمستودع وهناك يلامس أيضًا. بعد ذلك ، يتم تكرار العملية. وبالتالي ، هناك نقطتان "يعرفها" الروبوت بالتأكيد - هذه هي النقاط عند تشغيل مستشعر اللمس.

برنامج لمس الصفر لـ Studuino
برنامج مزود بأجهزة استشعار تعمل باللمس بلغة Scratch لـ Studuino

أحيانًا يكون هذا كافيًا لحل المهمة. لكننا نريد المزيد!

لقد أجريت تغييرات على تصميم وبرنامج الروبوت وهذا ما حصلت عليه:


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

روبوت الأشعة تحت الحمراء
روبوت مزود بمستشعر للأشعة تحت الحمراء

رسم تخطيطي كلاسيكي لجهاز لأحد محاور طابعة ثلاثية الأبعاد أو آلة CNC. عند تشغيلها ، لا تعرف الطابعة مكانها وتنتقل إلى جانب واحد (حتى يتم لمسها بواسطة مفتاح الحد) ، وبعد ذلك تعتبر هذه النقطة إلى الصفر وتبدأ في حساب موقعها على هذا المحور منه.

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

برنامج الصفر روبوت IR ل Studuino
برنامج الصفر روبوت IR ل Studuino

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

يتم تحويل الإشارة التناظرية خطيًا إلى رقم ، من أجل Scratch لـ Studuino - في النطاق من 0 إلى 100. ويتم ذلك لتبسيط العمل معهم للمستخدمين النهائيين (تم تطوير بيئة البرمجة هذه لأول مرة لتعليم الأطفال). في Arduino IDE ، يتم إصدار مجموعة "صادقة" من القيم من 0 إلى 1023 ، والتي تتوافق مع محول ADC 10 بت الموجود في وحدة تحكم Atmega168. إذا نظرت إلى الاختلافات في الرسوم البيانية بين الإشارة الرقمية والإشارة التناظرية ، يصبح من الواضح لماذا تعد الإشارة التناظرية مجموعة من القيم.

إشارة تناظرية (يسار) ورقمية (يمين)
إشارة تناظرية (يسار) ورقمية (يمين) يعمل

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

مستشعر الأشعة تحت الحمراء
مستشعر الأشعة تحت الحمراء

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

يتم اختيار الأرقام 40 و 50 تجريبيا. في حالتي ، أظهر المستشعر ، أنه فوق سطح أبيض ، قيم حوالي 65-75. فوق السطح الأسود ، أعاد المستشعر القيم في نطاق 18-25. الرقم 40 هو اللحظة التي يبدأ فيها المستشعر في التحول من سطح أبيض إلى أسود ، والرقم 50 هو لحظة الانتقال من سطح أسود إلى أبيض. يتم أخذ هذه الأرقام بهامش صغير من أجل منع الخطأ في قياس المستشعر. عند تطوير تصميم حقيقي ، من الضروري مراعاة الظروف التي سيأخذ فيها المستشعر قراءات (الإضاءة الخارجية ، موقع المستشعر ، إلخ) ، لأن جميع هذه العوامل ستؤثر على قراءات المستشعر. قد تضطر إلى تطوير خوارزمية لتعديل هذه القيم باستمرار اعتمادًا على الظروف الخارجية.

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

تحتوي المجموعة على محركات DC مع ترس ، ولكن ليس لديهم جهاز تشفير. جاءت الفكرة في ذهني: ربما يمكنني محاولة إنشاء برنامج تشفير بسيط من أجزاء المصمم ، خاصة وأن التروس من المجموعة تحتوي على وحدة كبيرة إلى حد ما (حجم الأسنان)؟

العناصر الرئيسية لبرنامج التشفير
العناصر الرئيسية لبرنامج التشفير

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

نموذج اختبار التشفير
نموذج اختبار التشفير

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

تم تطوير برنامج العمل مع برنامج التشفير في Arduino IDE. لاختبار كفاءة فكرتي ، كتبت برنامجًا بسيطًا يشغل المحرك للتدوير بسرعة ثابتة وإخراج القيم باستمرار من مستشعر الأشعة تحت الحمراء إلى وحدة التحكم في التصحيح.

نص البرنامج
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

void setup() {
  Serial.begin(9600);       //      
  pinMode(M1_A, OUTPUT);    //       " "
  pinMode(M1_B, OUTPUT);    
  analogWrite(M1_PWM, 100); //    
  digitalWrite(M1_A, HIGH); //    
  for (int i=0; i < 2000; i++) {    //   2000    -
    Serial.println(analogRead(SENSOR_PIN));   //      
  }
  digitalWrite(M1_A, LOW);  //   
}

void loop() {
}


وفقًا للبيانات التي عرضها البرنامج على وحدة التحكم ، حصلت على الرسم البياني التالي:

رسم بياني لقيم مستشعر الأشعة تحت الحمراء أثناء دوران التروس
رسم بياني للتغيرات في قيم مستشعر الأشعة تحت الحمراء أثناء دوران الترس

تشبه طبيعة الرسم البياني شكل أسنان الترس ، مما يوحي بأنه في الواقع يمكن استخدام هذه البيانات للتحكم في دوران المحرك باستخدام الترس من مجموعة المصمم كقرص تشفير. للقضاء على التباطؤ "ترتد" ، والتي يتم تنفيذها على النحو التالي (الرموز على الرسم البياني): MIDDLE هو متوسط ​​القيمة بين القيم القصوى والدنيا لقراءات مستشعر الأشعة تحت الحمراء ، WIDTH هو الانحراف من MIDDLE إلى قيمة أكبر أو أقل لإنشاء "نطاق خطأ" معين »قياسات الإشارة (العرض الكلي لهذا النطاق هو 2 * عرض). سيتم استخدام MIDDLE و WIDTH في خوارزمية التحكم في دوران المحرك. يمكن تمثيل خوارزمية عد الأسنان في الترس أثناء دوران المحرك على النحو التالي:

خوارزمية لعد الأسنان في الترس أثناء دوران المحرك
خوارزمية لعد الأسنان في الترس أثناء دوران المحرك ،

تستخدم الخوارزمية الرموز التالية:

  • prev_state - حالة الترس السابقة ؛
  • cur_state - الحالة الحالية للتروس ؛
  • العد - عدد أسنان التروس المحسوبة ؛
  • tmp - قراءات مستشعر الأشعة تحت الحمراء.

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

يتم عرض برنامج يستخدم هذه الخوارزمية أدناه. في ذلك ، وصفت روتين فرعي ينتظر حتى يدور المحرك الترس بعدد محدد مسبقًا من الأسنان وبعد ذلك ينقل التحكم إلى البرنامج الرئيسي.

نص البرنامج
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

#define MIDDLE      550     //         
                            // ""
#define WIDTH       50      //      ,   
      //    -     
      // 

int enc_tooth = 0;          // ,    
int cur_state = 0;          //   :  (1)  "" (0)
int prev_state = 0;         //   
int tmp;                    //      

void init_enc() {
  enc_tooth = 0;
  cur_state = 0;
  prev_state = 0;

  //         cur_state
  //    ,   = 1,    ""      
  //   0      
  if (analogRead(SENSOR_PIN)>MIDDLE) {
    prev_state = 1;
    cur_state = 1;
    enc_tooth++;
  }  
}

void wait_by_count(int count) {
  //       count,       IR 
  //           ""
  while (enc_tooth <= count) {
    //    IR-    
    tmp = analogRead(SENSOR_PIN);

    //       +  ,    
    if ((tmp + WIDTH) > MIDDLE) {
      cur_state = 1;
    } else {
    //       -  ,    ""
      if ((tmp - WIDTH) < MIDDLE) {
        cur_state = 0;
      }
    }

    //       ,      
    // ,     ""   -  ""  
    if (cur_state != prev_state) {
    //   ,   0  - ,     
    // 
      enc_tooth += cur_state;
    
    //        
      prev_state = cur_state;
    }
  }
}

void setup() {
  //        
  Serial.begin(115200);

  //        ""
  pinMode(M1_A, OUTPUT);
  pinMode(M1_B, OUTPUT);

  //   
  init_enc();

  //    
  analogWrite(M1_PWM, 100);
 
  //    ,      1 (    
  //  0)
  digitalWrite(M1_A, 1);

  // ,    30  
  wait_by_count(30);
  
  //   
  digitalWrite(M1_B, 1);

  Serial.print("  = ");
  Serial.println(enc_tooth);

}

void loop() {
}


يقوم البرنامج بتشغيل المحرك وينتظر حتى يدور الترس بمقدار 30 سنًا - مثل هذا العدد من الأسنان في الترس ، وبعد ذلك يوقف المحرك. فيما يلي مقطع فيديو يوضح تشغيل البرنامج:


على قطعة ورق بيضاء ، يتم لصقها على الترس ، يمكنك تتبع دورانها بزاوية 360 درجة.

في هذا أريد إنهاء هذه المقالة. في الختام ، يمكنني القول أنني لم أتوقف عند نموذج التشفير. تم تجميع منصة روبوتية كاملة بمحركين ومشفرين (واحد لكل عجلة) وتم عمل برنامج لمزامنة دوران العجلة وفقًا للمشفرات ، ولكن هذا موضوع لمقال آخر ...

منصة روبوت مع مشفرات تعتمد على مستشعرات الأشعة تحت الحمراء
منصة روبوتية مع مشفرات تعتمد على مستشعرات الأشعة تحت الحمراء

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

All Articles