مرحباً بالجميع ، يوجد بالفعل العديد من المقالات حول Habré حول أتمتة الألعاب مثل "أسئلة في الواقع" (
واحدة ،
اثنتان ،
ثلاثة ،
أربعة ،
خمسة ...) ، وأود أيضًا أن أشارك تجربتي في المشاركة في مثل هذا المشروع. في عام 2015 ، قرر أصدقائي تنظيم بحث عن غرفة الهروب "Bank Robbery" في
مدينتنا . لقد أدركوا أنني كنت مولعا بأتمتة متعددة منذ فترة طويلة ، بما في ذلك أنظمة مثل "المنزل الذكي" القائمة على حلول مفتوحة المصدر ، لذلك طلبوا المساعدة في تنظيم اللعبة. بدت هذه الفكرة مثيرة للاهتمام بالنسبة لي ووافقت عليها - أردت تطبيق تجربتي وحلولها على شيء أكثر إثارة للاهتمام من وميض المصباح الكهربائي في شقتي.
حاولت المشاركة في الدورة الكاملة للمشروع - من إجراء تغييرات على البرنامج النصي إلى مهام التشغيل التالية ، وتحديد وإصلاح الأخطاء ، والتحسينات اللاحقة. لقد زرت العديد من الألعاب في مدينتنا (في عام 2015 يمكن الاعتماد عليها على أصابع يد واحدة) ، ليس للمعجبين ، ولكن لاكتساب الخبرة والحلول الهندسية العكسية ، وكان ذلك واضحًا من خلال رد فعل المنظمين. لكن بعد المشاركة في اللعبة في موسكو ، فهمت الحجم الحقيقي "للكارثة" وأردت حقًا القيام بعملي ليس أسوأ من الجانب الفني. لذا ، فإن البحث عن "Rob the Bank" في تفير ، للحصول على تفاصيل حول كيفية إنشائه وتطويره على مدار عدة سنوات ، أطلب القط.
وصف الحلول التقنية
بعد أن أوضح لي زملائي على الأصابع ما يريدون مني وكيف يجب أن يعمل كل شيء ، في رأسي حرفيًا في بضع دقائق ،
تبلورت بنية: خادم مركزي
به منصة
ioBroker ، ووحدات تحكم محلية تعتمد على لوحات ووحدات Arduino ، وتبادل البيانات مع الخادم وبين وحدات التحكم باستخدام بروتوكول MQTT. ونتيجة لذلك ، تبين أن العمارة كانت تقريبًا كما يلي:
بالإضافة إلى تفاعل وحدة التحكم في المهمة مع الخادم المركزي ، كان من الضروري تأسيس تفاعل بين وحدات التحكم في مهام البحث المختلفة. لهذا ، في رأيي ، كان بروتوكول MQTT مع وسيط على خادم مركزي مناسب بشكل مثالي. العملاء - تقوم وحدات التحكم بنشر حالاتهم على الخادم ، والاشتراك في الأوامر من الخادم وحالات وحدات التحكم الأخرى. لتنفيذ هذا الحل ، تم استخدام محول
MQTT - كان أيضًا وسيطًا لـ MQTT وسمح لك بإنشاء تسلسل هرمي للموضوعات في شجرة كائنات ioBroker لاستخدام البيانات في التصور والإدارة (لقطة شاشة أسفل الإصدار القديم من "لوحة الإدارة").
بعد ذلك ، لم أشعر بالأسف لأنني اخترت هذا الحل:
- MQTT هو بروتوكول خفيف الوزن ، شغلت المكتبة مساحة صغيرة وكانت أكثر من كافية بالنسبة إلى Arduino UNO مع شريحة ATmega328
- عند إعادة تشغيل أو تشغيل وحدات التحكم لأول مرة ، تلقوا الشروط الأولية لبدء العمل باستخدام MQTT - إنها مريحة للغاية
- تبين أن هذا الحل هو الأكثر موثوقية من أولئك الذين تم اختبارهم وبسيط جدًا للمبتدئين في التنفيذ والدراسة
يتم الحصول على خيارات قليلة فقط من تدفقات البيانات ، أبسطها - يحدث حدث في وحدة التحكم في المهمة رقم 1 (يتم الضغط على زر) ، وينشر حالة الزر في موضوع معين ويتم عرض حالته عن طريق تغيير لون عنصر الرسم في النموذج المرئي للمشغل.
يتمثل الخيار البسيط والعكس في أنك تحتاج إلى تشغيل الترحيل يدويًا من خلال وحدة التحكم في المهمة رقم 1 ، ويتم توفير حدث تحكم من خلال مهايئ VIS ، والذي يغير حالة موضوع وحدة التحكم هذه ، ويطرح السؤال = false. يتلقى محول MQTT تغيير موضوع مع ask = false ، لذلك لم يصل هذا الموضوع من وحدة التحكم ، على التوالي ، يتم نشر التغيير إلى وحدة التحكم ، والذي بدوره ينشر تأكيدًا مع ask = true استجابة.
يحدث تبادل intercontroller على حدث على أحد وحدات التحكم. على سبيل المثال ، أنجز جهاز التحكم الأول مهمته ويجب تشغيل التتابع على وحدة التحكم الثانية - ينشر حالته في الموضوع العام ، ويعرضها الوسيط في الشجرة وفي صفحة التصور ، نظرًا لأن وحدة التحكم الثانية مشتركة في هذا الموضوع ، يقوم الوسيط بنشرها على وحدة التحكم الثانية و هذا الأخير بدوره ينشر استجابة تأكيد.
لا يزال يتعين على المشروع إضافة مهمة التفاعل مع الكمبيوتر. تمت كتابة الواجهة بلغة php ، وكانت الصفحة تدور على خادم WEB مع التشغيل التلقائي في وضع مستعرض ملء الشاشة. تم تنفيذ التكامل مع النظام الرئيسي باستخدام برنامج التشغيل
البسيط api - بعض طلبات php إلى ioBroker ارتطمت ببساطة عبر php. تم إخفاء وحدة النظام نفسها في أحشاء مكتب المكتب ، وتم التحكم في الواجهة باستخدام الماوس ، وكان لدى مرسل البحث لوحة مفاتيح لاسلكية.
تم تطوير التصور للمشغل في برنامج تشغيل
VIS للحصول على دقة واحدة - شاشة المشغل ، ولكن بعد ذلك تمكن طاقم البحث من استخدام الأجهزة اللوحية المحمولة مع نفس الواجهة ، واتضح أنه مناسب لإعادة التعيين استعدادًا لمباراة جديدة ولتشخيص النظام. اتضح أن الواجهة هي Spartan ، بدون لوحات معلومات وأنيقات ryushek ، ولكنها مفهومة وبسيطة وسريعة. ليست هناك حاجة لمنطق خاص وطبقات ورسوم بيانية وأشياء أخرى في الواجهة ، فقط رموز لعرض حالة المعدات وأزرار التحكم وعدة حقول نصية لعرض وضع تشغيل وحدات التحكم وسجل تشغيل النظام.
في وقت تطوير المشروع ، لم تكن هناك خيارات أخرى لتصميم التصور. في وقت لاحق ، ظهرت محولات التصور لكل من الأجهزة المحمولة (يمكنني استخدام
المواد )
وللأجهزة اللوحية / أجهزة الكمبيوتر الثابتة:
habpanel ، و
lovelace ، و
tileboard ، وغيرها.
تم وضع المنطق الرئيسي في رمز وحدات التحكم ، ولكن تم تنفيذ التفاعل العام وتهيئة المعلمات لبدء التشغيل ووظائف الخدمة وما إلى ذلك على الخادم الرئيسي باستخدام محول
javascript . تمت كتابة التعليمات البرمجية في JS باستخدام
وظائف ioBroker
المضمنة ، متبوعة بـ "نقل"
للكتلة (ظهرت هذه الوظيفة في وقت لاحق من بداية العمل في المشروع).
في المجموع ، شاركت العديد من النصوص:
- البرنامج النصي لتهيئة النظام الأولي (التضمين الأول)
- النصي لإعادة تعيين جميع وحدات التحكم قبل المباراة القادمة
- لم "تتحرك" إحدى وحدات التحكم على الفور إلى MQTT ، لذلك لبعض الوقت تم استخدام برنامج نصي للتبادل مع وحدة التحكم عبر طلبات HTTP - GET
- النصي للحفاظ على سجل منفصل من اللعب
تم تجهيز جميع وحدات التحكم المعتمدة على لوحات Arduino UNO (فيما بعد تم تحويل عدة وحدات تحكم إلى لوحات Arduino MEGA - لم تكن هناك ذاكرة كافية) ببطاقة توسيع Ethernet تستند إلى شريحة W5100. تبادل البيانات بين وحدات التحكم والخادم (كما هو مكتوب أعلاه) باستخدام بروتوكول MQTT. تم تنفيذ تطوير الخوارزميات في Arduino IDE باستخدام المكتبات القياسية. على الجانب الحديدي ، لا يوجد شيء خارق للطبيعة - الحد الأقصى لاستخدام الوحدات الجاهزة وبطاقات التوسيع مع الحد الأدنى من لحام ودون تصنيع لوحات مخصصة - كل ذلك على ألواح السبورة. إدارة الحمل من خلال وحدات مع مرحلات الحالة التقليدية والصلبة ، ومفاتيح الترانزستور لمؤشرات LED والأحمال منخفضة الطاقة. على الجزء الميكانيكي ، حاولت استخدام العناصر المنقولة بأقل قدر ممكن: المحولات الميكروية ، دافعات ، أقفال E / M واستخدام وحدات الصمام الثنائي الضوئي الجاهزة (وحدات البصريات المفتوحة) ، مرحلات الحالة الصلبة ، الأقفال المغناطيسية التقليدية ، قارئات بطاقة القرب ، وأجهزة استشعار القصب. بعض الصور أدناه:




تم تشغيل وحدات التحكم في الموقع من خلال محولات POE محلية الصنع - حيث استخدمت الكابلات الملتوية زوج النوى الخاملة لبث 12V DC. التحويل على بطاقات جهاز التحكم من خلال بطاقات DC-DC جاهزة الصنع حتى 5 فولت - والتي تم من خلالها تغذية Arduino + Ethernet بأنفسهم وتحميل الطاقة المنخفضة مع منطق 5V: مصابيح LED منخفضة الحركة ، ومُرحلات ، إلخ. - تم استخدام خطوط كابل منفصلة مع لولب كروي أو سلك PVA. تم إدخال اثنين من مدخلات التيار المتردد بجهد 220 فولت في خزانة التشغيل الآلي الرئيسية وتم توصيل UPS عبر الموصلات الموجودة على الموصلات ، والتي كانت بدورها متصلة عبر الالتفافية ، لسهولة الصيانة. لتشغيل جميع الأتمتة والجهد المنخفض ، تم تثبيت إمدادات طاقة قوية بجهد 2 فولت في الخزانة ، 2 × 12 فولت وواحد ب 5 فولت. من خزانة التشغيل الآلي ، أطلقوا خطوط الكبل 220 فولت لتشغيل أجهزة الكمبيوتر والأجهزة الطرفية المختلفة للسعي: من puff-puff إلى viu-viu))


الحلول المتبقية هي المعيار جميلة لمثل هذه المشاريع. نظام المراقبة بالفيديو على كاميرات IP السلكية ، دائمًا مع إضاءة الأشعة تحت الحمراء والميكروفونات المدمجة. يتم استخدام دفق الفيديو في إحدى مهام البحث ، وتتم معالجته بشكل إضافي على جهاز الكمبيوتر الخاص بمدير Quest ، ويتم استخدام برنامج مفتوح المصدر (ZoneMinder). تم فصل الشبكة المحلية لوحدات التحكم في Arduino عن باقي الشبكات حتى لا يقوم الدفق من الكاميرات بتحميل شرائح W5100 الضعيفة بالفعل من لوحات الإيثرنت.
الجهاز غير اليدوي مع المشاركين في اللعبة باستخدام مكبر صوت سوفيتي تقليدي ومكبرات صوت مدمجة في السقف.
في النهاية أردت أن أصف الخادم المركزي الصغير. يتم نشر منصة ioBroker على اللوحة المنفصلة BananaPi ARM ، التي اتضح أن قوتها كافية لجميع المهام. البيئة هي نظام التشغيل Armbian ، وهما نصوص باش للعمل مع GPIO ولإنشاء نسخ احتياطية إلى السحابة على Yandex.Disk. يتم استخدام العديد من GPIOs للإشارة إلى حالة تشغيل الوحدات الفردية والمحولات (LEDs) وزر لإيقاف تشغيل النظام بشكل صحيح. في صورة الخزانة مقاس 19 بوصة أعلاه ، يمكن ملاحظة أن السبورة في علبة زجاجية رخيصة قياسية ؛ وتم تثبيتها لاحقًا في علبة ذات وحدة واحدة مزودة بمصدر طاقة عادي وملحقات أخرى.
البق ، المزالق ، الصعوبات
لقد فكرت أنا وزملائي في البنية الأساسية مقدمًا (فعلت المشروع) وتم تجميع العديد من العقد واختبارها "على الطاولة" ، لذلك لم تكن هناك تغييرات جوهرية. تم إصلاح "الخشونة" الثانوية على الفور. المشاكل الرئيسية التي استغرقت بعض الوقت لحلها هي:
- نقص ذاكرة Arduino على شريحة 328 ، والانتقال إلى لوحة Arduino MEGA. تقع بشكل متوقع على بعض وحدات التحكم في ذاكرة الشريحة. قضى معظم الوقت في إعادة صياغة بطاقات التوسع.
- تم حل مواطن الخلل في العمل مع برنامج التشغيل MQTT بسرعة من قبل مؤلف مشروع ioBroker.
- العملية الطويلة والصعبة لاختيار مستعرض للتصور العادي في برنامج تشغيل VIS. اتضح أنه من الصعب العمل مع هذا المحول. ونتيجة لذلك ، تم إجراء التحرير في متصفح Chrome ، وأطلق مشغل وقت التشغيل إصدارًا محددًا من خلال متصفح Dragon. نظرًا لإصلاح الأخطاء ، فقد تم نقلها تمامًا إلى أحدث متصفح Chrome.
- إنشاء تدريجي للحلول المضادة للتخريب - السحوبات الدقيقة المهجورة ، الأزرار الميكانيكية والدوافع ، لوحات مفاتيح الأفلام ، إلخ.
- تبين أن الأقفال الكهروميكانيكية الخاصة بشركة شريف منخفضة الجودة للغاية ؛ وكان يتعين استبدالها محليًا بأقفال كهرومغناطيسية عادية.
- التشغيل غير المستقر لوحدات التحكم في Arduino عند العمل مع كاميرات IP ، ونتيجة لذلك ، تم تقسيم الشبكات وعمل كل شيء كما ينبغي.
استنتاج
استغرق المشروع بأكمله ، من الدراسة والموافقة على السيناريو إلى إطلاق مجموعات الاختبار الأولى ، حوالي ستة أشهر - كثير ، لكنه كان أول تجربة ، علاوة على ذلك ، لقد واصلت العمل الرئيسي في بناء / تجديد المبنى. بالإضافة إلى ذلك ، كان هناك الكثير من العمل "على الطاولة" - بشكل أساسي عند استخدام وحدات Arduino المنفصلة ، لأنها لا تعمل تمامًا كما كنت أتوقع. عند تنفيذ المشروع ، حاولنا قدر الإمكان الالتزام بالمبادئ التالية:
- يتضمن المشروع صيانة وإصلاحات طفيفة من قبل أي مهندس كان يحمل مرة واحدة على الأقل مكواة لحام في يديه ، ويعرف ماهية اردوينو وسيتمكن من "وميض" مؤشر LED الملحوم على السبورة.
- التطوير في Arduino IDE باستخدام المكتبات القياسية لتحقيق أقصى قدر من البساطة.
- تعظيم استخدام الوحدات النمطية الشائعة في المشروع لسهولة الصيانة والاستبدال
- استخدم البروتوكولات وشبكات البيانات القياسية
- تقليل عدد الأجزاء الميكانيكية لقوة التحمل ومكافحة التخريب.
ونتيجة لذلك ، تبيّن أنه في الأسبوعين الأولين تخلص من جميع العيوب الطفيفة والآن يعمل النظام منذ ما يقرب من 4 سنوات في البيئة الأولية تقريبًا.