صنع إكليل مع طفل

الصورة

مستوى الصعوبة: للمبتدئين.

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

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


منصة الأجهزة


الترانزستورات

بناءً على لوحة ESP8266 مع NodeMCU ( مثل هذا ) ، تمت إضافة زوج من الترانزستورات والمقاومات إليها. تحتوي الوحدات المختارة على منظم جهد من 3-20 فولت ، مما يسمح بتشغيله من نفس مصدر الشريط. تعطي مخرجات esp جهد 3 فولت مع حد تيار 12mA ، لذلك استخدمت الترانزستورات ثنائية القطب التقليدية للتحكم في الشريط.

الصورة

حتى لا يخرج الدخان الأبيض من وحدة التحكم الدقيقة ، أضع مقاومًا 220 أوم بين الإخراج والقاعدة. إسبانيا لديها برنامج pwm ، بعض الدبابيس لها غرض خاص ، لقد اخترت تجريبيًا.

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


قبل الاستخدام ، يحتاج esp8266 إلى وميض ، وأنا أستخدم NodeMCU مع lua ، على الرغم من أنه يحتوي على ميزات أقل قليلاً من Arduino مع C ++. لذا ، فإن أسهل طريقة للبدء هي باستخدام البرامج الثابتة الجاهزة من nodemcu-build.com . بالنسبة لمشروعنا ، سنحتاج إلى إضافة وحدة pwm. بعد فترة ، سينخفض ​​رابط الصورة إلى البريد. عليك أن تأخذ واحدة مع تعويم.

يمكنك وميضه مع أي مبرمج من هنا ، وأنا استخدم NodeMCU Flasher.

يحتوي NodeMCU على نظام ملفات ، يبدأ التنفيذ بوحدة init.lua ، أستخدم برنامج ESPlorer للتنزيل.

الصمام الثنائي الوامض


في اللحظة التالية ضللتني. يستخدم الترقيم الداخلي (GPIO0-16) فقط في البرامج الأصلية (Arduino / C ++). من لوا ، يتم استخدام تدوين من اللوحة. على سبيل المثال ، لاستخدام GPIO16 / D0 (LED مدمج). من Lua ، تحتاج إلى كتابة gpio.write (0 ، gpio.HIGH). يمكنك وميض الصمام الثنائي مباشرة من وحدة تحكم ESPlorer.

الصورة

على عكس Arduino ، لا يمكن لـ nodemcu استخدام التأخير وحلقة الانشغال ، تستخدم وحدة التحكم و wifi نفس المعالج للعمل. يتم أيضًا إنشاء جهاز رقابة في اللوحة ، والذي سيعيد تشغيله إذا كان كودك يعمل أكثر من 500 مللي ثانية. يوصى بعدم شغل المعالج أكثر من 2 مللي ثانية. لحل المشكلة ، هناك وظائف node.task.post و tmr

اختيار بيئة التطوير


في البداية كنت أرغب في استخدام سكراتش ، لكنه لا يناسبني ، لأنه لا يسمح لي بالعمل دون اتصال بالإنترنت - يعمل البرنامج على جهاز كمبيوتر في بيئة خدش ، وتعمل جميع لوحاته بشكل سلبي. بعد تفشي الإنترنت ، تعرفت على Google Blockly . اتضح أن هذا هو ما تحتاجه بالضبط: فهو يدعم إنشاء التعليمات البرمجية في lua ، وإنشاء الكتل الخاصة به. بعد التجربة ، قررت أن أجعل مشروعي القائم على الويب ، واخترت nodejs كخادم ، و Blockly كواجهة أمامية. كان من الضروري للغاية إنشاء كتلتين - تحديد اللون والتأخير. يحتوي Blockly على وظائف مضمنة للعمل مع الألوان بالتنسيق #ffffff ، ولم يكن إنشاء وظيفة لتعيين اللون يمثل مشكلة.

عنوان المفسد
Blockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; }; 


وبالتالي ، تم إغلاق 2 من أصل 3 متطلبات.

وظيفة النوم ()


هنا كان علي أن أفكر على وجه التحديد في كيفية الجمع بين العملية الموثوقة لـ OTA وتنفيذ التعليمات البرمجية المخصصة. لحسن الحظ ، لدى لوا مكتبة كوروتين

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

أيضًا ، لحماية اللوحة من حلقة لا نهائية ، قمت بتصحيح الكود بعد المولد عن طريق إدخال العائد (0) في بداية كل تكرار لكل حلقة

 function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); } 

تنزيل OTA


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

النتيجة


github.com/farafonoff/BlocklyESP8266


يمكنك إضافة الكثير ، على سبيل المثال ، نوع من خيار التفويض للعمل من خلال الشبكات العامة ، ومكوِّن سهل الاستخدام في وضع hostap ، وتحسين وحدات نمط init.lua ودعم تحديث OTA (يتم الآن تحديث الوحدة النمطية مع البرنامج المحمل فقط).

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


All Articles