التحكم في الستارة عبر واجهة RS-485. الجزء 2: إضافة WiFi

أكملنا المهمة الدنيا - اختبرنا كيف يعمل محرك AKKO AM72E عبر واجهة RS485 . يمكننا الآن التحكم في ضوء الشمس عن طريق إرسال الإلكترونات عبر الأسلاك. الخطوة التالية الواضحة هي الانتقال من التحكم بمساعدة الجسيمات الأولية إلى التحكم بمساعدة الاهتزازات ، أي موجات الراديو. تعتمد التعويذات التي سنستخدمها في هذه الحالة على السحر الذي نختاره.
ستكون أي تقنية لاسلكية مناسبة لأغراضنا ، لكنني أردت التحكم في الستائر من هاتفي الذكي. في هذه الحالة ، يُنصح بعدم تثبيت أي برامج إضافية. سأقوم بالاتصال بشبكة WiFi المنزلية الخاصة بي وأدير الستارة الكهربائية باستخدام متصفح. محرك ، من خلال محول RS485-UART سأقوم بالاتصال ESP8266. يمكنك الذهاب بطريقتك الخاصة واستخدام ، على سبيل المثال ، جهاز توجيه WiFi.

ESP-01 اليوم ، هي الوحدة الأكثر ميزانية مع WiFi. يكلف القليل جدًا إذا كنت بحاجة إلى التحكم في العديد من المحركات ، لا يمكننا سحب الأسلاك من محرك إلى آخر ، ولكن ببساطة توصيل كل منها بوحدة خاصة بها. في هذه الحالة ، لن نحتاج إلى إعطاء كل AM72E عنوانه الخاص - يمكنك الاتصال بالعنوان ESP-01. نحن مهتمون بـ ESP8266 ليس فقط بسبب سعره المنخفض وصغر حجمه ، ولكن أيضًا لحقيقة أن هناك القليل جدًا من الموارد عليه وسيستغرق الأمر الكثير من الجهد لاقتحام شيء سيعمل فيه.
لن أصف كيفية توصيل وتحديث البرامج الثابتة ESP8266. يمكن العثور على كيفية القيام بذلك بشكل صحيح هنا .
ضمن Windows ، لبرمجة ESP8266 ، يمكنك استخدام Arduino IDE ، ثم نكتب بلغة C (جيدًا تقريبًا) أو NodeMcu ، ويمكنك الكتابة بلغة Lua. هناك خيارات أخرى أيضًا ، لكنها لا تناسبنا.
لا ، لسنا على عجل لتحميل NodeMcu. يجب تحضير البرامج الثابتة. الموارد الموجودة على ESP-01 ليست كافية حتى نتمكن من نسيانها إذا أردنا رفع خادم ويب. يوجد ذاكرة فلاش على السبورة - مكان حيث سيتم تخزين جميع ملفاتنا - 512 كيلوبايت. هذا بالفعل صغير للغاية ، لكننا لن نستريح على نقص الموارد في الفلاش ، ولكن في ذاكرة الوصول العشوائي. يحتوي ESP8266 SoC على مساحة ذاكرة وصول عشوائي تبلغ 64 كيلوبايت لرمز البرنامج ، و 96 كيلوبايت للبيانات. عند بدء التشغيل ، يتم تحميل البيانات من الفلاش في ذاكرة الوصول العشوائي. إذا قمنا بملء البرنامج الثابت الخاص بمخزون NodeMcu ونظرنا في حجم الذاكرة المتوفرة ، فسوف نرى هذا:
الصورة
21 كيلو بايت! مع هذه الأحجام ، عليك حفظ كل بايت! نرى أيضًا بعض القمامة بعد السطر "لا يمكن اكتشاف البرامج الثابتة تلقائيًا ، لأنه لم يتم تلقي الإجابة الصحيحة". هذه هي معلومات تصحيح الأخطاء الصادرة بسرعة 74،880 ، ثم تتغير السرعة. إليك كيف تبدو بالسرعة المناسبة:

لا شيء مثير للاهتمام.
أولاً ، قم بزيادة مقدار ذاكرة الوصول العشوائي المتاحة. للقيام بذلك بشكل كبير ، يمكنك إعادة بناء البرامج الثابتة بنفسك. تتوفر رموز المصدر ، ولكنك لا تشعر بأنك تجرف المشروع بالكامل فقط من أجل الاختبار. بالإضافة إلى ذلك ، يجب أن يتم ذلك في نظام Linux. ليس الأمر صعبًا للغاية ، ولكن إذا كنا مشتتين ، فلن ننتهي أبدًا. يمكنك تعديل البرامج الثابتة هنا: frightanic.com/nodemcu-custom-build .
لقد قمت بتحويل مربع الاختيار إلى dev096 ووضع علامة اختيار إضافية بجوار 1-وير في نافذة اختيار المكون الإضافي. لقد قمت بتشغيل هذه الوحدة بسبب وظيفة واحدة - حساب CRC16. ها هي:

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

الآن لدينا 35 كيلوبايت من ذاكرة الوصول العشوائي المتاحة.
قبل أن ننتقل إلى البرمجة ، دعنا نعود لفترة وجيزة إلى محول UART-RS485. إلى الجزء المسؤول عن تبديل الإرسال والاستقبال. إلى المقاوم R1. عند التحميل ، يقوم ESP8266 بتعيين جميع دبابيس GPIO على وضع الإدخال ، ثم يحدد البرنامج الوضع الذي ستعمل فيه كل GPIO. اتضح أنه في وقت التحميل ، يجب أن تكون جهة الاتصال TX_UART (U0TXD) على مستوى عالٍ ، وإلا فلن يبدأ البرنامج المسجل في الفلاش. بدون R1 ، عندما يتم استقصاء جهة اتصال TX ، سيتم قراءة مستوى منخفض و "تعليق" ESP8266 حتى يتم إعادة توصيل المحول.
يمكنك رفض نظام تحويل الإرسال والاستقبال بالكامل باستخدام أحد دبابيس GPIO. ولكن هناك عدد قليل من GPIOs المتوفرة على ESP-01 ، وربما سيجدون تطبيقًا آخر في مشروعك. بالإضافة إلى ذلك ، باستخدام نظام التحويل ، يمكن استخدام المحول الذي قمنا بإنشائه ، على سبيل المثال ، مع جهاز توجيه لا يحتوي على GPIO.
يتكون المشروع من ثلاثة ملفات: data و index.html و init.lua. من الأصح اعتبار هذا ليس كمشروع ، ولكن كنموذج أولي. على سبيل المثال ، لا يوجد إذن ، إلا عند الاتصال بجهاز توجيه. ولست متأكدًا على الإطلاق من أن الخادم على ESP8266 قادر على تحمل الهجمات. لا يتحقق الرمز بأي شكل من الأشكال ، إلا عندما يكون متصلاً ، يوجد اتصال بالشبكة أو أنه ذهب. لا يوجد رمز يعيد تلقائيًا تشغيل ESP8266 في حالة توقف البرنامج. يمكن حل المهمتين الأخيرتين بسهولة ، لكن المشروع كان سيصبح أكثر تعقيدًا.
تحتاج إلى تعديل ملف البيانات - أدخل اسم وكلمة مرور شبكة WiFi هناك. من خلال توصيل ESP8266 بالشبكة ، سنتمكن من التحكم في الستائر عبر الإنترنت. بعد الانتهاء من debugging init.lua ، اضبط متغير debug على false ، أو احذفه تمامًا. لذلك سيتم نثر القليل من القمامة في UART. إذا لم يتم ذلك ، فقد لا يعمل محرك الأقراص. بالإضافة إلى ذلك ، لن يتمكن AKKO AM72E حتى الآن من فهم ما تكتب إليه. في هذه الحالة ، يمكن أيضًا حذف وظيفة السجل وجميع الأسطر التي تم ذكرها فيها في init.lua.
دعونا نعود إلى موضوع توفير الموارد. يأخذ ملف البيانات ، مع اسم الشبكة وكلمة المرور الخاصة بي ، 1643 بايت في الذاكرة. إذا لم تكن قد خمنت بعد ، فهذا الملف هو ملف لوا عادي. يمكن ترجمتها. بعد التجميع ، يأخذ الملف نفسه بالفعل 1040 بايت. يمكنك أن تفعل الشيء نفسه مع init.lua. يمكن تقليل حجم الملف بشكل أكبر. من الضروري التخلص من كل شيء غير ضروري منه ، أولاً وقبل كل شيء ، التعليقات والمساحات. يصبح الملف غير قابل للقراءة بشكل سيء ، ولكن إذا احتجنا إلى مساحة أكبر ، فيجب علينا البحث عنه. هذه ممارسة شائعة. في النهاية ، لن يقدر أحد التصميم الجميل والصحيح لشفرتك. حسنًا ، ربما المنافسين عندما تصل إليهم التعليمات البرمجية. لكن الوظيفة المقطوعة ستكون ملحوظة على الفور. خاصة إذا كان هناك أي شيء للمقارنة. عندما تتم برمجة الأجهزة ذات الموارد القليلة ، تتغير الأولويات. هذا هو السبب في البرامج في كثير من الأحيانمكتوبة في C للأنظمة المدمجة لا يمكن قراءتها بشكل سيء. كل شيء معقد بتحويل كل ما هو ممكن إلى المعالج الأولي. إذا بدأت مشروعًا في لغة C وقمت بتأجيله لبضعة أشهر ، فقد تحتاج إلى وقت لائق لمعرفة الرمز الخاص بك. يتم إيلاء اهتمام أقل لصيانة التعليمات البرمجية ، كما في غضون ثلاث إلى خمس سنوات ، يظهر حديد جديد ويجب إعادة كتابة كل شيء مرة أخرى بسبب الهندسة المعمارية المتغيرة.
بعد أن قمت بحذف كل شيء غير ضروري يدويًا من ملف البيانات ، بدأ في احتلال 705 بايت. في الوقت نفسه ، لا يزال من الممكن تقليل الحجم بعشرات البايت ، إذا لم يتم إعطاء المتغيرات أسماء ذات معنى ، ولكن أسماء من حرف واحد (نعم ، نعم ، هذا ليس على الإطلاق ما يتم تدريسه في المدرسة). بعد تجميعه ، يستهلك ملف data.lc 728 بايت في فلاش! حتى يحدث!
لا يوجد الكثير ليقال عن index.htm. أضفت أيضًا صورة بتنسيق svg إليه. يمكنك فعلها ايضا فقط قم بملء الستار. svg في الفلاش بملف آخر.
Init.lua - ملف المشروع الرئيسي. هناك تعليقات في الملف نفسه ، وإذا كان هناك شيء غير واضح ، يمكنك البدء في التنفيذ سطرًا بسطر وتجربة بشكل عام حتى يتم توضيحه بالكامل. بالإضافة إلى UARTA ، لا يزال هناك مصابيح LED مبدلة متصلة بـ GPIO2. تتم قراءة الملفات عند التحميل بواسطة الخادم من الفلاش ويتم نقلها في كتل 512 بايت. هذا يقلل من متطلبات حجم ذاكرة الوصول العشوائي المتاحة.
هذا ليس في الرمز ، ولكن إذا أصبح من الضروري حساب CRC16 ، فسيتم ذلك باستخدام الأمر ow.crc16 (buf ، crc). على سبيل المثال ، إذا قمت بكتابة:
= ow.crc16 ('\ 85 \ 00 \ 00 \ 03 \ 01' ، 0xFFFF) في سطر الأوامر ، نحصل على
:
15593
تحتاج فقط إلى تذكر ، وإرسال بايت منخفض أولاً ، ثم ارتفاع.
إليك ما حدث في النهاية:
يجب أن يكون هناك فيديو)

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


All Articles