كيفية التحدث مع متحكم من JS

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

هناك فكرة خاطئة مفادها أنه لإنشاء الغدد الخاصة بك تحتاج إلى معرفة المجمع ، C / C ++ ، تكون قادرة على إدارة الذاكرة وفهم الكهرباء بعمق. بمجرد أن كانت ، ولكن التكنولوجيا تتطور والآن للتنفيذ الكامل لمشروعها ، فقط JS يكفي!



حسنًا ، نحن نعرف JavaScript ، ولكن كيف يمكن توصيله بالأجهزة؟ ما نوع الحديد الموجود وما الذي يمكنه فعله؟ كيفية تكوين النظام بأكمله؟ في نسخة التقرير ، سيتعلم فيكتور ناكورياكوفا من FrontendConf: كيف ، باستخدام JS فقط ، للسيطرة على الماكينات ، وكيفية الجمع الفعلي بين النظام وجهاز الكمبيوتر ، وخيارات الاتصال للتطبيق على JS. سنناقش حزم المنفذ التسلسلي و Firmata ، المنفذ التسلسلي مع البرامج الثابتة المكتوبة ذاتيًا في C ++ و Espruino وبرمجة وحدة التحكم مباشرةً على JS و Raspberry Pi و HTTP على الشبكة المحلية و HTTP و MQTT عبر السحابة.



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

أين تكتب JavaScript


لدى Espruino متحكم مستقل مع JavaScript. تتيح لك منصة Espruino أن تكتب JS مباشرة إلى المتحكم الدقيق. هذا شيء مستقل بذاته: متصل بجهاز كمبيوتر ، ومضات ، ثم يعمل بشكل مستقل.

Raspberry Pi هو كمبيوتر صغير مع GPIO.

في تطبيق ويب ، إلى الواجهة الأمامية أو الخلفية.

سأعرض تشغيل النظام باستخدام مثال الضفدع. انتقل إلى toad.amperka.ru من هاتفك - ستظهر واجهة ويب بسيطة.



يتحكم العمود الأيسر في العين اليسرى ، اليمين - اليمين. المبدأ بسيط - لقد ضغطت على الزر ، محرك سيرفو يدير العين.



فيديو مظاهرة من موقف مع الضفدع خلال التقرير.

كيف يعمل الضفدع


عندما تفتح toad.amperka.ru ، تحصل على صفحة ويب ثابتة مع JS ثابتة ، والتي تستخدم مكتبة MQTT.js. تتصل هذه المكتبة بوسيط MQTT في السحابة.



إذا كنت تعرف Redis أو Publish / اشترك أو RabbitMQ أو قوائم انتظار الرسائل الأخرى ، فأنت على الفور تفهم ما كانت عليه. MQTT هو وسيط رسالة من آلة إلى آلة . خفيفة الوزن وبسيطة حتى الغدد الضعيفة يمكن استخدامها.

يتطلب MQTT وسيط على الخادم. لكن ليس عليك حتى رفعه - تأجيره. لبضعة دولارات في الشهر ، سيكون لديك وسيط MQTT الخاص بك. لا الخلفية اللازمة.

من ناحية أخرى ، هناك وحدة تحكم من وسيط MQTT. هناك العديد من الأجهزة المختلفة مع هذا الدور ، على سبيل المثال ، فتحة Wi-Fi . هذه وحدة تحكم يمكنها الاتصال بالإنترنت.



وهو يعمل على أساس رقاقة ESP8266 الشعبية. إضافة القدرة على التشغيل عبر micro-USB وتوصيل الأجهزة الطرفية الخارجية عبر جهات الاتصال الثلاثية للاتصال بالأجهزة الأخرى.

كيفية برمجة الأجهزة في JS


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

digitalRead - قراءات رقمية . هذا سؤال لوحدة التحكم: "هل هناك ثلاث فولتات على الرقم السري 4؟" إذا كان هناك جهد ، فسيتم إرجاع TRUE ؛ وإذا لم يكن الأمر كذلك ، FALSE. هذا ينفذ قراءة مجسات ثنائية بسيطة: الأزرار ، ومفاتيح ، وأقفال القصب وأجهزة استشعار الحركة بالأشعة تحت الحمراء.

digitalWrite هو تسجيل رقمي بسيط . نقول digitalWrite TRUE - 3V يذهب مع دبوس. نقول digitalWrite FALSE - 0V. باستخدام هذا المبدأ البسيط ، يمكنك إضاءة / إطفاء شريط LED أو إطلاق صاروخ نووي. نرسل إشارة ضعيفة إلى التتابع ، فإنه يسافر حمولة كبيرة وصار الصاروخ.

هناك أيضا وظائف للعمل مع القيم المتوسطة بين 0 و 3 V:

  • analogRead.
  • analogWrite.
  • setWatch.
  • digitalPulse.

تتيح لك الأوامر استجواب جميع أنواع التقلبات وتوفير وظائف للتسجيل الغامض.

بعد ذلك تأتي الكائنات للعمل مع واجهات مقبولة في عالم متحكم. إذا فهمنا على شبكة الإنترنت HTTP و WebSocket و TCP ونحن على دراية به ، فعندئذ بالنسبة إلى متحكم ، يكون هذا:

  • منفذ تسلسلي
  • حافلة I2C
  • الحافلة SPI
  • حافلة OneWire.

كيفية ركلة مؤازر


على سبيل المثال ، سوف أخبرك بكيفية التحكم في محرك واقٍ تحت الجلد. بروتوكول المحرك بسيط. يتم تطبيق 0V على دبوس التحكم - الحد الأدنى. مرة واحدة كل 20 ،s ، يجب ركلها ، مع إعطاء وحدة ثابتة من 3V ، وبعد فترة - إعادة التعيين إلى 0.



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

كيفية البرنامج


تتم برمجة النظام الأساسي لـ Espruino في IDE الخاص بـ Espruino الذي يحمل نفس الاسم. لوحة متحكم متصل بالكمبيوتر باستخدام كابل micro-USB. الشيء الوحيد هو أنه يجب عليك تثبيت برنامج التشغيل ، والذي يستغرق 1.5 دقيقة. تم تثبيت برنامج التشغيل لنظامي التشغيل Mac و Windows ، ويعمل كل شيء على نظام Linux.

فيما يلي مثال لبرنامج يتم تحميله في البيئة بنقرة واحدة. يومض مصباح LED مرة واحدة في الثانية:

var on = false; setInterval(function() { on = !on; LED1.write(on); },500); 

إلى اليسار في البيئة هو مترجم REPL. أدخل "1 + 1". البرنامج يعطي الجواب "2". معجزة!

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

يتم تنفيذ JavaScript داخل الجهاز.

بالإضافة إلى الترفيه باستخدام الحساب ، يمكنك تدوير المحركات. ستحتاج إلى وظيفة analogWrite التي ترسل موجة مربعة. نتحدث على ما دبوس لنعطيه موجة. على سبيل المثال ، في اللوحة الخاصة بي ، تم توقيعه كـ A7. ثم نشير إلى المدة - على سبيل المثال ، 1300 out من بين 20 000 we سنخدم واحدة. المطلوب أيضًا هو الخيار الذي يحدد تردد هذه الركلة - 50 مرة في الثانية الواحدة ، أي 20 ألف ميكرون.

 >analogWrite(A7, 1300 / 2000, {freq: 50}} =undefined > 

سنتجاوز 1500 - سنجبر على الدوران في الاتجاه الآخر بسرعة أكبر.

 >analogWrite(A7, 2300 / 2000, {freq: 50}} =undefined > 

أو قل توقف.

 >digitalWrite(A7, 0) =undefined > 

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

المكتبات


ليس من المناسب دائمًا تذكر تفاصيل تنفيذ البروتوكول. لذلك ، بالنسبة لجميع أنواع الحديد ، تم إنشاء الكثير من المكتبات ، من الصغيرة إلى العملاقة. أنها تحتوي على جميع الميزات التقنية. تستخدم المكتبات طرقًا مفهومة: قراءة البيانات من علامة nfc ، أو قراءة تركيز ثاني أكسيد الكربون في جزء في المليون ، أو إرسال رسالة إلى Telegram.
  • servo.write.
  • barometer.init.
  • barometer.read.
  • barometer.temperature.
  • nfc.listen.
  • nfc.on ('tag'، ...)؛
  • nfc.readPage.
  • nfc.writePage.
  • relay.turnOn.
  • relay.turnOff.
  • gas.calibrate.
  • gas.read ('CO2') ؛
  • telegram.sendMessage.

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

كود العميل


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



 <button class="toad__eye__control" data-queue="left" data-payload="1300"> -1 </button> 

1300 هي مدة النبض. من أين يأتي اليسار و 1300؟ لقد أضفتهم للتو إلى HTML كسمات بيانات.

في JS ، نكتب رمز بسيط.

 import mqtt from 'mqtt'; const client = mqtt.connect(`ws://${location.hostname}:9001`); function onEyeControlClick() { const { queue, payload } = this.dataset; client.publish(`toad/eye/${queue}`, payload); } document.querySelectorAll(".toad__eye__control") .forEach(e => e.addEventListener('click', onEyeControlClick)); 

دعنا نحلل الكود في الأجزاء. في البداية ، نحن const client = mqtt.connect(`ws://${location.hostname}:9001`); بالوسيط الذي يعمل افتراضيًا على المنفذ 9001: const client = mqtt.connect(`ws://${location.hostname}:9001`); .

عند النقر فوق أي من الأزرار ، ننشر رسالة جديدة مع حمولة ، والتي حصلنا عليها من سمة البيانات: client.publish(`toad/eye/${queue}`, payload); .

بعد ذلك ، ننشر حول هذا الموضوع ، والذي يتم تشكيله أيضًا على أساس سمة البيانات. هذا هو كل رمز JS لدينا في المتصفح.

رمز المجلس


عندما تبدأ فتحة Wi-fi ، فإنها تشترك في الموضوعات التي تهمها وتستقبل البيانات. عندما يصلون ، تستجيب الفتحة وتجعل المحركات تعمل.



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

 const ssid = "Droidxx"; const password = "****"; const brokerHostname = "toad.amperka.ru"; const leftEye = require("@amperka/servo").connect(A5); const rightEye = require("@amperka/servo").connect(A7). 

يمكن للجميع إنشاء ونشر مكتباتهم الخاصة. لقد حققنا عدة عشرات لوحداتنا الخاصة وغيرها من الوحدات الشعبية. جميع المصادر المفتوحة - تعال واستخدمها .

ثم نحتاج إلى مكتبات للعمل مع وسطاء Wi-Fi و MQTT .

 const wifi = require("Wifi"); const mqtt = require("tinyMQTT").create(brokerHostname); 

لا يوجد نظام تشغيل ، لذلك حتى الاتصال بشبكة Wi-Fi يعد تشغيلًا يدويًا. رعاية الاتصال هي ملكك ، ولكنها ليست صعبة للغاية. للاتصال بالشبكة ، ندعو ببساطة إلى طريقة "connect" ، والتي إذا نجحت أو لم تنجح ، فسوف تسمى "callback" والإبلاغ عن نتائج العملية.

 wifi.connect(ssid, { password: password }, function(e) { if (e) { console.log("Error connecting:", e); wifi.disconnect(); } else { console.log("Wi-Fi OK, connecting to broker ..."); mqtt.connect(); } }); 

إذا كان كل شيء على ما يرام ، اتصل بالوسيط MQTT.

عند الاتصال بنجاح ، نحن نشترك في مواضيع مثيرة للاهتمام ، أي كل شيء يبدأ بـ الضفدع / العين.

 mqtt.on("connected", function() { mqtt.subscribe("toad/eye/*"); console.log("Connected to broker", brokerHostname); }); 

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

 mqtt.on("message", function(msg) { const eye = (msg.topic === "toad/eye/left") ? leftEye : (msg.topic === "toad/eye/right") ? rightEye : null; if (eye) { eye.write(Number(msg.message), "us"); } }); 

هذا هو كل سحر الضفدع.

اسبرينو JS القيود


ذهبنا على منصة Espruino. التواء الضفادع ليس خيارها الوحيد. لكن المنصة لها مياه ضحلة ، والتي تجعلنا نفكر في خيارات أخرى.

"المجموع" 1-4 ميغابايت من ذاكرة الوصول العشوائي . هناك قيود على ذاكرة الوصول العشوائي. على الكود والبيانات في نفس الوقت يتم إعطاء عدد قليل من ميغابايت. قد يبدو أنه في عصر تقاس فيه ذاكرة الوصول العشوائي بالعربات ، فإن هذا لا يكفي. لكن بالنسبة لمجموعة من الأجهزة الصغيرة ، هذا يكفي. في 2 ميغابايت يمكنك القيام بأشياء رائعة - بما يكفي للنافورة.

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

مجموعة متنوعة من الحديد. ليس كل قطعة من الأجهزة تسمى منصة تطوير ستسحب Espruino. وفقًا لمعايير عالم المتحكم الدقيق ، فإن Espruino شرسة - فهي تحتاج إلى 500 كيلوبايت من ذاكرة الوصول العشوائي. هذه الذاكرة لن تعطي أي قطعة من الحديد. يحتوي Arduino Uno أو Arduino Nano الكنسي فقط على 2 كيلو بايت من ذاكرة الوصول العشوائي - وبالتالي ، فإنه من المستحيل هناك. من الممكن العمل مع Espruino على الأجهزة ، وهو ما نقوم به على الأجهزة الرسمية من Espruino.



Espruino هي شركة مؤلفة من شخص واحد تعمل غالبًا على Kickstarter مع منتجات جديدة وتجمعها دائمًا بنجاح. إذا كنت ترغب في دعم النظام الأساسي - شراء رسميا.

هناك خيار ثالث - خذ لوحة تحكم قوية بما يكفي ، لكن مع الجهة الخارجية. على سبيل المثال ، شركة ST ، التي تنتج "النووية" و "ديسكفري". الحديد المسمى STM32 من المرجح أن يسحب Espruino.

دعنا نذهب على خيارين بديلين. الأول هو التوت بي.

التوت بي


هذا جهاز كمبيوتر Linux كامل الحجم بحجم بطاقة العمل.




بالإضافة إلى ذلك هناك دبابيس الإدخال / الإخراج. إذا كان لديك Raspberry Pi تحت تصرفك ، فاستخدم طوبولوجيا الجهاز التالية.



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

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

طوبولوجيا ممكن المقبل مع خلفية كاملة.



يرتفع الخادم في السحابة. عميله هو نفس تطبيق الهاتف المحمول الذي يحتفظ بالاتصال من خلال HTTP أو WebSocket. من ناحية أخرى ، يتم الاتصال بالفعل من خلال Raspberry Pi ، باستخدام HTTP أو نفس MQTT.

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

التوت بي القيود


تحميل طويل. Raspberry Pi هو جهاز كمبيوتر كامل ويستغرق وقتًا للبدء. كقرص صلب ، يتم استخدام بطاقة SD. حتى أسرع بطاقة لا يزال يفقد HDD العادية ، ناهيك عن SSD. في الوقت المناسب ، يقترب الحمل من دقيقة واحدة.

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

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



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

اردوينو


يمكنك أن تأخذ المعتاد اردوينو ، الذي سئم منه الجميع. ولكن سيتعين نقل JavaScript إلى مكان يمكنه تشغيل Node JS - وهو كمبيوتر قديم أو نفس Raspberry Pi.



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

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

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

ولكن هذا ليس كل شيء - إذا كنت لا ترغب في الكتابة باللغة C ، فاستخدم أداة Open Source XOD.io.



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

سيعقد مؤتمر FrontendConf التالي في أكتوبر. تعرف عن جافا سكريبت التي لا يعرفها معظم مطوري الواجهة الأمامية ، ويقومون بتطوير واجهات ملائمة للاستخدام أو العثور على مستوى الأداء ومستعدين لمعرفة مكانه ، نحن في انتظار طلبات التقارير.

نقوم بجمع تقارير مثيرة للاهتمام في البرنامج وأخبار المؤتمرات ومقاطع الفيديو والمقالات في النشرة الإخبارية العادية - الاشتراك .

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


All Articles