مرحبا بالجميع.
في عملية الإصلاح ، نشأت المهمة لإجراء تبديل مرور. بالطبع ، أردت أن أفعل ذلك بأبسط الطرق وأكثرها ملاءمة ، مع إضافة وظائف التحكم الأساسية من الهاتف. اخترت أبسط وأنسب التكنولوجيا لهذا (بالطبع ، في رأيي) - MicroPython ، وبدأت في القيام بذلك. أخذت اللوحة النهائية على esp8266 وخصصت ساعة من وقت الفراغ لهذا الغرض. ولكن ، كما يحدث مع عدم وجود مشاريع شائعة جدًا وليس قيد التشغيل ، فإن المهمة قد استمرت قليلاً.
كما اتضح ، التصميم الذي وجدته أكثر ملاءمة ، كما تبين ، لا يعمل على الإطلاق. اضطررت لقضاء بعض الوقت في تحليل ذلك ، بالإضافة إلى أنني قررت وصف العملية برمتها بتفاصيل كافية. بدأ حجم المقالة في الازدياد بوتيرة سريعة ، لذلك قررت تقسيمها إلى أجزاء وإلقاء جميع التفاصيل غير الضرورية في رأيي.
الجزء الأول يتكون من ثلاثة أجزاء:
- اعتبارات نظرية حول اختيار أبسط وسيلة لتطوير مفتاح مرور ،
- إطلاق عملي للبرامج الثابتة الأساسية المحددة على المعدات المحددة والمزالق ،
- تطوير البرامج الثابتة
اختيار بيئة التطوير الأسهل
بالنسبة للمنزل الذكي مثل "افعل ذلك بنفسك إذا كان لديك دقيقة من وقت الفراغ" ، بالإضافة إلى العناصر الكلاسيكية (على سبيل المثال ، الاستقرار) ، تضيف قائمة متطلبات المعدات الإلزامية أيضًا سهولة التطوير والتركيب والدعم. الأجهزة مطلوبة لتوصيل أجهزة الاستشعار أو أجهزة التحكم اللازمة لهم بسهولة. أن هناك طرقًا مريحة وسهلة للتواصل مع النظام بأكمله. من الضروري التأكد من سهولة كتابة البرامج الثابتة على هذا الجهاز ، مع مراعاة أنه يمكن تحديد موقع الجهاز حيث سيكون من الصعب الوصول إليه. وبالطبع ، تعتبر سهولة التطوير أمرًا بالغ الأهمية بالنسبة للـ DIY ، عندما ، على سبيل المثال ، بعد عامين من العمل دون إخفاقات في النظام بأكمله
فجأة أريد أن أضيف بعض التعديلات على البرامج الثابتة. لإجراء هذه التصحيحات ، يجب أن تتذكر كيف يعمل هذا النظام ، والذي قد يستغرق أحيانًا وقتًا أطول من التعديل نفسه.
ضع في اعتبارك مثالًا عاديًا: تحتاج إلى إجراء تبديل بسيط مع القدرة على التحكم فيه ، بما في ذلك من جهاز كمبيوتر. في الآونة الأخيرة ، كانت هذه المهمة معقدة للغاية ، كان من الضروري اتخاذ نوع من متحكم (الأكثر شعبية كانت avr أو الموافقة المسبقة عن علم) ، وكتابة البرامج الثابتة ، وكقاعدة عامة ، تحتاج إلى قراءة الوثائق اللازمة لذلك. إذا كنت تريد أن تفعل كل شيء خارج الصندوق ، فأنت بحاجة إلى فصل اللوحة ، حيث يمكنك وضع AC / DC وجهاز تحكم متحكم وواجهة اتصال. بعد LUT (أو طلب لوحات الدوائر المطبوعة) ، قم بلحام كل شيء ، وشراء مبرمج ، وفلاش ثابت. ثم بعد 2-3 سنوات ، إذا لزم الأمر ، لإصلاح شيء ما ، ابحث عن جميع المعدات وتعلم كل شيء من نقطة الصفر ...
لتبسيط هذه العملية ، بدأت الحلول الجاهزة تظهر في السوق. الحل الأكثر نجاحا هو اردوينو. يتم توفير هذا الحل بواسطة IDE ، أداة تحميل التشغيل مع وظيفة التحديث ، والتي تتيح لك العمل مع الجهاز حصريًا من خلال الواجهة القياسية دون استخدام المبرمجين. يجعل من الممكن جعل البرامج الثابتة ، وجود فقط
فهم سطحي للغاية لكيفية ترتيب كل شيء هناك. تتيح مجموعة الوحدات الخارجية توصيل الأجهزة دون مكواة لحام. ولكن على أي حال ، لإجراء تعديلات تحتاج إلى تثبيت برنامج Arduino وتخزين البرامج الثابتة في مكان ما.
سيصبح مفتاح المرور الخاص بنا كبيرًا بدرجة كافية ، وسيحتوي على وحدة ترحيل من Arduino + AC / DC +. وإذا كنت بحاجة إلى إجراء تعديلات ، فسيتعين عليك أن تتذكر بشكل مؤلم مكان الكود ، وتثبيت برنامج Arduino مرة أخرى.
لكي تنقذ نفسك الحاجة إلى ترجمة الشفرة المصدرية (أي تثبيت برامج إضافية وتخزينها) ، يبدو أن الحل الأكثر منطقية هو استخدام المترجمين الفوريين أو ترجمة الشفرة مباشرة على المتحكم نفسه. لحسن الحظ ، ظهرت الآن مشاريع تسمح بذلك. على سبيل المثال ، NodeMCU ، مترجم لغة lua للمراقب المتحرك esp8266: يحتوي البرنامج الثابت نفسه على دعم مدمج لنظام الملفات ، والذي يسمح لك بتحميل / قراءة البرامج النصية من / إلى الجهاز. هناك مشروع آخر خطير إلى حد ما وهو Micropython ، وهو نسخة مجردة من الثعبان المصمم خصيصًا للميكروكونترولر. سيتم مناقشته.
MicroPython هو تنفيذ واحدة من أكثر لغات البرمجة بيثون شعبية اليوم. وهو يدعم عددًا كبيرًا من الهياكل و SoC (العارية ، CC3200 ، esp8266 ، esp32 ، nRF ، pic16bit ، stm32). يتطور المشروع بنشاط ويحتوي على عدد كبير من الوحدات الإضافية.
يعد المعالج الدقيق esp8266 مناسبًا جدًا كجزء من الأجهزة ، ويرجع ذلك إلى حقيقة أن وحدات تبديل wifi للميزانية المضمنة في ذلك تُباع في السوق. إنها تحتوي على كل ما نحتاج إليه: AC / DC ، متحكم بواجهة اتصال مدمجة (wifi). متاح تحت اسم العلامة التجارية Sonoff. لا تحتوي المعالجات المصغرة esp8266 على ذاكرة ، وهي ملحومة بشكل منفصل ويمكن أن يكون لها حجم مختلف. بالنسبة لبرنامج Sonoff Basic ، قاموا بوضع وحدات 1 ميجا بايت.
بدء تشغيل البرامج الثابتة الأساسية على esp8266. سونوف بيسك.
في غياب المزالق ، سيكون من الممكن المضي قدمًا فورًا في البرمجة في بيثون. ولكن ، لسوء الحظ ، هناك عدد من المشكلات التي تحتاج إلى حل ، من أجل برمجة البرنامج الثابت وتعديله ، كان الأمر سهلًا وبسيطًا للغاية. بالطبع ، نحن مهتمون بالقيام بذلك عبر wifi ، دون استخدام أي أجهزة إضافية باستثناء الكمبيوتر المحمول.
المشكلة الأولى ، بالطبع ، هي البرامج الثابتة الأساسية المسجلة على لوحتك. إذا اشتريت لوحة تصحيح ، فستجد على الأرجح NodeMCU عليها ، إذا كان Sonoff Basic ، ثم البرامج الثابتة المملوكة. لإعداد هذه اللوحة لنفسك ، تحتاج إلى كتابة البرامج الثابتة اللازمة هناك. في بعض ميكروكنترولر ، من الضروري الشراء
مبرمج خاص ، في حالتنا كنا محظوظين ، كل ما تحتاجه هو الحصول على محول USB <-> UART. إذا كنت تعمل مع ميكروكنترولر ، فستكون في متناول اليد أكثر من مرة ، وعادة ما يكون سعرها في حدود 3 دولارات.
لا يوجد مشط لـ Sonoff Basic يسمح لك بالاتصال عبر UART ، ونحن بحاجة إلى ذلك لبرمجة الجهاز. من أجل برمجة الجهاز ببساطة ، ليس من الضروري أن تأخذ مكواة اللحام في يديك ، بل يكفي أن تميل جهات الاتصال وتدون البرامج الثابتة. بالنظر إلى أن المزيد من العمل سيكون عبر شبكة wifi ، فلن نحتاج إلى هذه الاتصالات بعد الآن. لكننا ننفذ التبديل من خلال المرور ، مما يعني أننا بحاجة إلى ملحوم ،
ما لا يقل عن ثلاثة أرجل.
بالنسبة لبرنامج Sonoff Basic ، يوجد موصل GPIO واحد مجاني وموصلان RX و TX. بالنظر إلى أننا نحتاج إلى RX ، TX أنفسنا مرة واحدة (لتحديث البرنامج الثابت) ، في المستقبل يمكن إعادة برمجتها إلى GPIO ، بفضل esp8266 يمكن القيام بذلك. لكن في هذه الحالة ، نحتاج إلى التخلي عن تصحيح الأخطاء عبر UART ، ولحسن الحظ ، لقد خططنا بالفعل للقيام بذلك ، نظرًا لأن التصحيح عبر wifi ، من وجهة نظر الراحة ، أبسط بكثير.
نظرًا لأن إصدار MicroPython قد يتغير في هذه العملية ، فنحن مهتمون بتصحيح طريقة التحديث عبر wifi. أوتا يأتي إلى الإنقاذ. OTA عبارة عن برنامج ثابت يسمح لك بإعادة برمجة الجهاز. إنه يعمل بكل بساطة. بعد تشغيل الجهاز ، تحدد البرامج الثابتة ما إذا كان يحتاج إلى إعادة برمجة ، إذا لزم الأمر ، يقوم بإطلاق برنامج خاص
محدث wifi ، إن لم يكن ، يطلق البرامج الثابتة للمستخدم. قد يكون التطبيق مختلفًا ، فقد تقوم البرامج الثابتة بالكتابة فوق نفسها أو الكتابة إلى مساحة خالية من الذاكرة. يمكنك أيضًا تحديد ما إذا كنت تريد تشغيل برنامج الدبلجة على الإطلاق بطرق مختلفة. على سبيل المثال ، ضع في اعتبارك cxumma من البرامج الثابتة المخصصة إذا لم تتقارب ،
ثم انتقل بالقوة إلى الوميض. يمكنك قراءة البيانات من GPIO أو كتابة معلومات حول الحاجة إلى بدء التحديث في مكان آخر.
كمحدث ، يشير مشروع MicroPython إلى مشروع yaota8266. تدعي Yaota8266 أنها تومض الجهاز وتوقع كل حزمة. تجدر الإشارة إلى أن المفتاح العمومي مضمن في البرامج الثابتة نفسها ، وهذا هو السبب في أنه لا معنى لتحميل البرامج الثابتة المجمعة بالفعل ، لأنه من الضروري خياطة مفتاحك هناك.
لا توجد وظيفة لتعديل المفتاح الخاص في الصورة المجمعة ، لذلك في حالتنا يكون من السهل تجميع البرامج الثابتة بنفسك. ميزة مثيرة للاهتمام هي أن وظيفة التحقق من التوقيع هي ، ولكن يتم التعليق عليها في التعليمات البرمجية ، أي في الواقع ، نواجه صعوبات دون أي مكاسب أمنية. الإصدار الأساسي من yaota8266 لن ،
لحسن الحظ ، هناك شوكات على جيثب تعمل على حل هذه المشكلة ، بالإضافة إلى أنها تضيف القدرة على تحديد ما إذا كان ينبغي استخدام اللمعان استنادًا إلى الكتابة إلى منطقة RTC ، مما يجعل من الممكن تبديل MicroPython إلى وضع أداة تحميل التشغيل.
حتى بعد تضمين جميع التصحيحات ، ستكتب البرامج الثابتة OTA الخاصة بنا مع وجود أخطاء ، ولكنها ستعمل بنجاح على لوحات تصحيح NodeMCU. هذا بسبب المهلات. عند التحديث من الجهاز المضيف ، يتم إرسال حزم UDP ويتوقع استجابة إذا استغرق التسجيل في الفلاش وقتًا أطول من المعتاد ، وتحدث المهلة ، ويتم إرسال الحزمة مرة أخرى. فائدة سهلة الإصلاح ،
مجرد زيادة المهلات في رمز عميل ota.
تحتوي حزمة OTA + MicroPython على Sonoff على أوجه شذوذ مثيرة للاهتمام. يرتبط أحدها بحقيقة أن الوظائف القياسية للعمل مع SPI Flash في esp-sdk تعمل مع كتل 4 كيلو بايت ، وتم اختيار حجم الكتلة هذا لتطبيق نظام الملفات FAT. بدوره ، نظرًا لحقيقة أن SPI Flash لا يتجاوز 1 ميجا بايت ، منها ~ 300 كيلو بايت من البرامج الثابتة OTA ، ~ 500 كيلو بايت عبارة عن برامج MicroPython الثابتة ، وتبقى أقل من 200 كيلو بايت لنظام الملفات ، أي أقل من 50 كتل. ومع ذلك ، لا يمكن للمكتبة المختارة التي تقوم بتنفيذ برنامج fatfs إنشاء خدمة FS حيث يوجد أقل من 50 مجموعة ، وهناك عدة طرق لحل المشكلة: تقليل حجم الكتلة (تسمح FAT بتعيين 512) وإصلاح مكتبة FatFs واستخدام SPI FS (على أمل عدم وجود مثل هذه الشذوذ). أخذت طريق تقليل الكتلة إلى 512.
تستخدم Microcontrollers SPI Flash - هذه ذاكرة NOR و / أو NAND. اللافت للنظر من هذه الذاكرة هو أنه لا يوجد مفهوم "كتابة أي بيانات". يمكنك فقط إعادة تعيين القيمة (عند 0xff) ، أو ضبط البتات المطلوبة على "0". SPI Flash هي في العادة ذاكرة NOR ، وتتمتع بوظيفة إعادة تعيين أي بايت إلى 0xff ، بينما لا يمكن لـ NAND سوى إعادة التعيين بواسطة الكتل. أي إذا كان الحد الأدنى لحجم كتلة إعادة تعيين هو 4K ، من أجل الكتابة
1 بايت من الذاكرة ، من الضروري قراءة الكتلة بالكامل ، وإعادة تعيينها على 0xFF ، ثم كتابة الكتلة عن طريق تعيين البايت المطلوب على القيمة المطلوبة. لدى الشركات المصنعة لـ SPI Flash نفس مجموعة واجهات برمجة التطبيقات تقريبًا للعمل ، ولكن كما هو مبين في الممارسة ، قد يختلف أمر كتابة بايت واحد من SPI Flash. في مكان ما سيتم إعادة تعيينه تلقائيًا قبل الكتابة إلى 0xFF ، في مكان ما لا.
إذا قمت بتغيير قسم FAT إلى 512 بايت ، فهناك فرصة للحصول على نظام معطل إذا كان SPI Flash معين لا يدعم إعادة تعيين البايت التلقائي عند التسجيل. وكانت مجرد مثل هذه الذاكرة التي صادفتها في Sonoff Basic. تقول الشائعات أنهم استخدموا لتثبيت Winbond 25q80bv هناك ، ولكن الآن PUYA 25q80h ، التي لديها كتلة تنظيف الحد الأدنى من 256 بايت. سوف يبدو الحل
بسيطة ، تحتاج فقط إلى محو صفحتين حيث سيتم كتابتها قبل كتابة كتلة FAT ، ولكن التنفيذ معقد بسبب حقيقة أن sdk-esp يدعم فقط الحذف في كتل 4K. منذ الكتابة إلى FAT ستكون نادرة جدًا للتبديل ،
فقط عند تحديث البرامج النصية للبرامج الثابتة ، يمكنك الانتقال بطريقة سيئة وتحديث كتلة 512 بايت في كتل 4K. تشير الوثائق الخاصة بهذه الذاكرة إلى أن الذاكرة يمكن أن تصمد أمام 100000 دورة من دورات إعادة الكتابة ، أي إن التحايل المشابه للمشكلة سوف يقلل من هذه القيمة بمقدار 4 مرات ، أي ما يصل إلى 25000.
يحتوي MicroPython على وحدة تحكم بشكل افتراضي ، يطلق عليه REPL ويعمل من خلال منفذ COM. نحن لسنا سعداء جدًا بهذا الوضع ، لأننا نريد التواصل مع الجهاز عبر wifi. لحسن الحظ في MicroPython ، يأتي WebRepl أيضًا بشكل قياسي ، لكنه لا يبدأ تلقائيًا. يمكنك تسجيل التشغيل التلقائي في boot.py ، لكنني قررت تشغيله مباشرةً من _boot.py ، ملف النظام ، حيث يتم حياؤه في ملف البرنامج الثابت نفسه.
بعد البداية الأولى ، ستنشئ برامجنا الثابتة نظام ملفات ، وبدء تشغيل webrepl وإنشاء نقطة وصول. يمكنك الاتصال به وتحديد معلمات الاتصال بالشبكة المحلية ، أو كما فعلت ، قم بتكوين الشبكة باستخدام منفذ com ، وبعد ذلك يجب استخدام wifi فقط.
للعمل التجريبي ، يمكنك استخدام عميل webrepl المكتوب بلغة جافا سكريبت. يمكن إطلاق العميل في متصفح على الصفحة المقابلة للمشروع. خيار آخر هو استخدام مشروع mpfshell ، فهو يوفر وظائف أكثر ملاءمة للعمل مع الجهاز.
لذلك ، بعد التغلب على كل هذه العثرات ، يمكنك الانتقال مباشرة إلى برمجة التبديل.
تطوير البرامج الثابتة
لتطوير البرنامج الثابت ، نحتاج إلى فكرة تقريبية عن كيفية عمل GPIO. بشكل عام ، يمكن فهم هذا بشكل حدسي بحت:
- إذا قمنا بتعيين وضع الإخراج (OUT) ، فإن الضلع ينتج إما GND أو Vcc.
- إذا ضبطنا وضع الإدخال (IN) ، فإن الساق "تتدلى في الهواء" ، وفي هذه الحالة يمكن للمراقب المتحكم إعطاء أي شيء
- بحيث لا يتحكم المتحكم في أي شيء ، يمكن سحب الساق إلى القيمة المطلوبة باستخدام متحكم مدمج
مقاومات قابلة للسحب PULL_UP أو PULL_DOWN.
يجب أيضًا أن تكون لديك فكرة عن ماهية المقاطعات: في حالتنا ، هذا هو الرمز الذي يجب تنفيذه في حالة حدوث نوع من الأحداث: تم الضغط على زر / إطلاقه أو ظهرت رسالة من الشبكة المحلية مفادها أنه يجب إيقاف تشغيل / تشغيل الجهاز.
للبدء ، دعنا نكتب برنامج التبديل البسيط (وليس التمريري) في Python.
from machine import Pin class SW: def __init__(self, portin, portout): self.pin = Pin(portin , Pin.PULL_UP)
قمت بتسمية ملف switch.py هذا وطلبت تشغيله في boot.py:
from switch import sw
بعد بدء البرنامج الثابت ، حصلت على كائن sw ، إذا قمت بتنفيذ sw.change () ، فسيحدث تبديل البرنامج
التبديل إلى موقف آخر. عندما يتم اختزال دبوس مجاني إلى VCC في متحكم
يتم تشغيل التتابع أو إيقافه ، على التوالي.
ستكون الخطوة التالية هي إطلاق عميل MQTT والقدرة على تبديل المفتاح من الهاتف.