آلة مكعب روبيك القائمة على FAC

منذ وقت ليس ببعيد ، أنهينا مع Wilbert Swinkels العمل على آلة تجمع مكعب Rubik. لقد كتبوا عنا على مدونة Raspberry Pi الرسمية وتلقينا الكثير من التعليقات الهائلة. ومع ذلك ، في الجزء الروسي من الشبكة ، ذهب المشروع دون أن يلاحظه أحد. لذلك قررت تصحيح هذا الإغفال من خلال نشر نسخة مترجمة ومعززة من المنشور الأصلي هنا .



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


TL ؛ د


للصبر ، بعض الروابط:


المقدمة


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

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

لم يكن لدي أي خبرة في البرمجة لـ Raspberry Pi و Arduino ، ولكن على العموم كانت المهمة بسيطة جدًا بالنسبة لي. بالطبع كنت مخطئا :)

المعدات


تم بناء الآلة نفسها باستخدام نظام FAC معياري . هذا شيء يشبه المصمم السوفيتي ، لكنه تم إنشاؤه لنموذج آليات خطيرة ومعقدة. في النصف الثاني من القرن الماضي ، تم استخدامه بشكل نشط للغاية في مختبرات Philips والشركات والجامعات الأخرى.

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

متحكم


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

صورة

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

الإصدار الأول من الماسح الضوئي


صورة

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

كانت المشكلة الأولى التي واجهناها هي عدم تطابق الجهد. كما تعلمون ، الوحدة المنطقية على دبابيس Arduino هي 5V ، في حين أن Raspberry Pi هي 3.3V. لحسن الحظ ، استمرت أجهزة التحكم في محرك السائر التي استخدمناها في العمل على الرغم من تغيير سعة النبضات.

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

صورة

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



الإصدار الثاني (الأخير) من الماسح الضوئي


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

صورة

تبين أن تكوين أصدقاء Arduino مع Raspberry Pi أمر بسيط للغاية: سلكان ، محول جهد بينهما ، وفويلا - لدينا واجهة تسلسلية. وإذا قمت بتثبيت بروتوكول Min بسيط ، فستكون برمجة هذا العمل متعة.

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

بناء الخوارزمية


إن تجميع مكعب روبيك من وجهة نظر رياضية هو مهمة شاقة إلى حد ما . بالطبع نحن نتحدث عن إيجاد الحل الأمثل وليس "البعض". لقد فوجئت عندما اكتشفت أن عدد الله (الحد الأدنى الدقيق لعدد التحركات اللازمة لحل مكعب عشوائي) تم العثور عليه فقط في عام 2010 .

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

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

تحت pypyمع تمكين JIT ، استغرق الحل ثانية واحدة على الكمبيوتر المحمول ، ولكن على Raspberry Pi ، استغرق الأمر حوالي دقيقة. بعد عدة محاولات لتسريع عمل برنامج Python (numpy، multrocessing) ، قررت إعادة كتابة الخوارزمية إلى C. ومع ذلك ، يستغرق الحل الآن 1-2 ثانية ، حتى Raspberry.

لقد نشرت كل من تطبيقات الخوارزمية على GitHub .

التحكم في الماكينة


كانت الخطوة التالية هي كتابة برنامج يتحكم في الجزء الميكانيكي: تحريك المحركات ، مع مراعاة نسب التروس وحدود الآلية (على سبيل المثال ، لا يمكن تدوير الحوامل الجانبية إلا عندما يكون الجزء السفلي في وضع معين ، وإلا فسوف يتداخل).

صورة

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

المسح والتعرف على الألوان


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

مؤشرات المقاومة الضوئية


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



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

بصريا ، يمكن رؤية خطأ الماسح الضوئي على المكثفات في الرسم البياني التالي (بشكل عام ، هناك نسخة تفاعلية هنا ):



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

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



معايرة وتجميع القراءات


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

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

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

كلتا المقاربتين لها إيجابياتها وسلبياتها ، ونتيجة لذلك استخدمنا شيئًا بينهما:
  1. بادئ ذي بدء ، نقوم بمعايرة اصطناعية لقراءات الماسح الضوئي لتطبيع القيم. يتم الحصول على المعاملات تجريبيا.
  2. تحويل قيم RGB الناتجة إلى HSV
  3. , S ()
  4. , .



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

صورة

استنتاج


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

صورة

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

Source: https://habr.com/ru/post/ar384503/


All Articles