Espruino: جافا سكريبت في متحكم

الصورة

"لماذا؟" ، "ما هذا الهراء؟" ، "الانحراف!" ، "فو فو فو" - هذه بعض العبارات العديدة التي سمعناها عندما أطلقنا لوحة Iskra JS على قلب إسبروينو .

لماذا


عندما يسمع المهندس الإلكتروني الصحيح أن شيئًا ما تم فعله على Arduino ، ترتفع درجة حرارة جسمه بنحو نصف درجة: "أخذوا متحكمًا مناسبًا وبدلاً من figak figak ويسجلون كل العصائر منه ، كل شيء مبتذل ... لا توجد كلمات ، واحدة الكراهية ".

ولكن يمكنك الذهاب إلى أبعد من ذلك. خذ متحكم Cortex M4 ، وهو أغنى عشر مرات مما هو موجود على نفس Arduino Uno ، وادفع مترجم JavaScript هناك وافعل مشروعات JavaScript!

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



في هواية الإلكترونيات بالنسبة للغالبية العظمى من المشاريع ، فإن Arduino Uno يكفي للعيون. ولا يهم حتى إذا كانت تعمل على التردد القياسي 16 ميجاهرتز أو 4 ميجاهرتز: لا يهم ما إذا كانت أضواء السرير تعمل أو المضخة في المنزل الريفي في 1 مللي ثانية أو 10 مللي ثانية.

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

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

لقد شاهدت عملية مماثلة لسنوات عديدة أثناء العمل في تطوير اللعبة. في عام 2003 ، كان من المستحيل تخيل أنه يمكن كتابة اللعبة على أي شيء آخر غير C / C ++. ثم ظهر النص المدمج للجهاز في المحركات. ثم أصبح إنشاء منتج كامل ممكنًا بدون خط واحد في C. فقط Java و C # و Ruby و Python و JavaScript. هذا أمر منطقي ، لأن المكواة بدأت في سحب "اللغات البطيئة" ، وبسبب التطور السريع للأوقات والمزيد من المبرمجين المتاحين ، أصبح من الممكن إنفاق المزيد من الموارد على إثارة اللعبة ، وليس على العثور على تسريبات للذاكرة.

كيف تبدو برمجة متحكم جافا سكريبت


البرمجة مثل ... جافا سكريبت. للتطوير للمتصفح أو Node.js. هنا مثال:

// SMS
var sim = require('@amperka/Sim900r').connect();
sim.powerOn();
sim.on('sms', function(sms) {
    var rgb = sms.text.split(' ');
    var r = +rgb[0];
    var g = +rgb[1];
    var b = +rgb[2];
    if (isNaN(r + g + b)) return;
    fadeTo(r, g, b);
});

// 
SPI2.setup({baud:3200000, mosi:B15});
var LED_COUNT = 150;
var colors = new Uint8ClampedArray(LED_COUNT * 3);

function fadeTo(r, g, b) {
  var n = 0;
  var ivalID = setInterval(function() {
    colors[n*3 + 0] = b;
    colors[n*3 + 1] = r;
    colors[n*3 + 2] = g;
    SPI2.send4bit(colors, 0b0001, 0b0011);
    if (n++ >= LED_COUNT) {
      clearInterval(ivalID);
    }
  }, 50);
}


يلتزم هذا البرنامج بتلقي SMS'ki ويتوقف على لون شريط RGB المتصل اعتمادًا على نصه مع ضوء جار. لقد فعلنا مثل هذا المشروع لشجرة العام الجديد لدينا ، ولكن على Arduino الكلاسيكي. كان الرمز 4 مرات أكثر.

Espruino Kernel


لذلك ، يحتوي الكمبيوتر على محركات V8 و SpiderMonkey لجافا سكريبت. ولديها وحدات تحكم دقيقة محرك Espruino.

بشكل تقريبي ، محرك Espruino هو برنامج ثابت (رسم تخطيطي) لوحدات التحكم الدقيقة ، والتي بدورها يمكنها تنفيذ تعليمات JavaScript البرمجية التي تنقلها إلى اللوحة عبر اتصال تسلسلي ، على سبيل المثال عبر USB.

Espruino هو مشروع مفتوح المصدر برعاية جوردون ويليامز. الشخص الذي نفذ بمفرده معظم النظام البيئي بأكمله وذهب معها بنجاح على KickStarter.

يتكون هذا النظام البيئي من عدة أجزاء رئيسية:

  • Espruino Web IDE - بيئة برمجة ؛
  • Espruino Firmware - آلة جافا سكريبت تعمل على متحكم دقيق ؛
  • الحديد - الألواح نفسها المتوافقة مع Espruino ؛
  • مكتبة قياسية ومكتبات خارجية ؛
  • التوثيق


الأشياء الأولى أولاً.

بيئة البرمجة


يتم كتابة كود JavaScript وتنزيله على السبورة ومراقبة المخرجات في Espruino Web IDE. هذا التطبيق مخصص لـ Google Chrome ، لذلك يتم وضعه بنقرة واحدة ويعمل تحت جميع أنظمة تشغيل سطح المكتب.

بالنسبة للمستخدم ، تحل هذه البيئة محل Arduino IDE.

وفقًا لوظيفة Espruino IDE ، بالطبع ، فهي أبسط بكثير من Eclipse أو Visual Studio الكامل ، ولكنها أكثر تقدمًا من Arduino IDE.

الصورة


إذا نظرت حول نافذة البيئة في لمحة ، فسترى محرر الشفرة (على اليمين) ولوحة وحدة التحكم (على اليسار) وزر تنزيل الرمز على اللوحة.

تعتبر وحدة التحكم مثل Serial Monitor في Arduino IDE ، ولكن بخلاف ذلك ، فهي لا تعرض فقط ، ولكنها تقبل أيضًا: يمكنك استدعاء وظيفة مباشرة ، دون إعادة تعيين وتحميل برنامج جديد ، ومعرفة قيمة المتغير ، ومقاطعة الدورة ، إلخ.

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

بالإضافة إلى ذلك ، مباشرة من IDE ، يمكنك تحديث إصدار Espruino Firmware نفسه إلى الأحدث. تقوم البيئة نفسها بتنزيل أحدث إصدار متاح وتحميله عبر USB.

البرامج الثابتة


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

إذا قمنا بتخطيط تخطيطي لذاكرة فلاش لـ Iskra JS ، نحصل على الصورة التالية:

الصورة

محمل الإقلاع


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

يقوم برنامج bootloader بعمل بسيط للغاية:

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


مترجم


لذلك ، يتبع المحمل مترجم ، يقوم بالعمل الرئيسي.

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

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

تحرير الذاكرة


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

رمز مخصص


هذا هو المكان الذي يتم فيه تخزين برنامج JS الذي ينفذه المترجم. البرنامج موجود في نص عادي ، في قالب واحد ، كما هو.

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

بدلاً من ذلك ، لا يتم تنفيذ جميع الأعمال بواسطة IDE ، ولكن من خلال مكونها المستقل المعتمد على GUI من EspruinoTools ، والذي يحتوي على واجهة سطر أوامر ونقطة دخول للاستخدام كوحدة Node.js. لذلك ، إذا كنت ترغب في ذلك ، يمكنك استخدام Vim أو Atom أو Eclipse أو أي شيء أكثر ملاءمة لك للتطوير.

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

مكتبات


يمكن تقسيم المكتبات إلى 3 أنواع: قياسية ، مدمجة ، خارجية.

مكتبة قياسية


المكتبة القياسية هي وظائف وكائنات يمكن استخدامها. من بينها ، المألوفة والموصوفة في اللغة القياسية `Date` و` JSON` و` Math` و` Object` و` setInterval` و` setTimeout` وغيرها - بالإضافة إلى وظائف خاصة بـ Espruino للعمل مع الدبابيس والواجهات عن طريق الذاكرة.

من بين الوظائف التي ستجدها `pinMode` و` digitalRead` و `digitalWrite` و` analogRead` و `analogWrite` ، المألوفة لـ arduino ، وليس مألوفًا جدًا 'setWatch' لمراقبة دبابيس الإدخال ، و` `digitalPulse '' لتوليد تسلسل دقيق من النبضات الرقمية و العديد من الأشياء المختلفة للعمل مع الأجهزة الطرفية.

بالمناسبة ، على الرغم من وجود وظيفة `pinMode` على النظام الأساسي ، إلا أنها تعمل افتراضيًا من تلقاء نفسها ، خلف الكواليس ، لذلك في معظم السيناريوهات لا يمكنك تذكرها (انفجر آخر مهندس إلكتروني بصوت عالٍ في هذه المرحلة).

ما لن تجده في المكتبة القياسية هو "التأخير". ماما ميا ، كم أنا ممتن لذلك! يكفي إعادة ترتيب التفكير قليلاً ويتضح أن كل شيء يتم حله من خلال `setInterval` ،` setTimeout` دون أي `تأخير '.

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

مكتبات مدمجة


المكتبات المدمجة هي نفس الجزء من المكتبة القياسية بمعنى أنها مضمنة في Espruino Firmware ، ولكن الوصول إلى وظائفها يتطلب ربطها بشكل متزامن باستخدام الوظيفة `` مطلوب 'المألوفة لمبرمجي جافا سكريبت.

من بين هذه المكتبات ، ستجد ، على سبيل المثال ، `fs` للعمل مع أنظمة الملفات الخاصة ببطاقات SD ، و` http` لإنشاء واجهة ويب لجهازك ، و `Waveform` لتسجيل / تشغيل الإشارات الصوتية وغيرها.

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

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

مكتبات خارجية


المكتبات الخارجية هي التي تشكل ثروة النظام البيئي. تم كتابتها في JavaScript من قبل مؤلفي Espruino ، ونكتب ، يكتب مستخدمو Espruino.

يمكن تخزينها على قرص محلي ، في وضع الحماية للمشروع الحالي ، يمكن أن تكون في مستودع الإنترنت ، يمكن أن تكون على GitHub ، يمكن أن تكون على NPM.

المكتبات متصلة تقليديًا باستخدام "تتطلب".

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

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

حديد


لذلك نأتي إلى أكثر المكونات الملموسة في النظام البيئي Espruino. هذه هي اللوحات التي يمكنها تشغيل البرامج الثابتة Espruino.

الصورة


وتشمل هذه لوحة Espruino الأصلية ، Espruino Pico ، بالإضافة إلى Iskra JS الصادر عن Amperka . كل شيء مثبت بالفعل في المصنع على هذه اللوحات ، وهم جاهزون على الفور للعمل.

يمكنك ضرب الدف عدة مرات وتثبيت نواة Espruino بشكل مستقل على STM32 Discovery ، Nucleo ، وفجأة على ESP8266.

التوثيق


لا يوجد شيء أكثر حزنًا من شيء رائع جدًا وقوي ، ولكن بدون وثائق.

Espruino لديها وثائق جيدة. ستجد على www.espruino.com/Reference العديد من المراجع والمقالات التدريبية.

نريد أن نفعل أكثر وأفضل. لذلك ، أنشأنا قسمًا منفصلاً: js.amperka.ru ، تصوير مقاطع فيديو تعليمية. العمل جار ، ولكن تمت تغطية الكثير بالفعل.

تقليديا لأولئك الذين يحبون الحلول المعبأة ، قمنا بإنشاء مجموعة من " Iodo ". يحتوي على Iskra JS ووحدات وكتاب ملون.

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

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


All Articles