هذه هي المقالة الثانية في سلسلة حول دمج وحدات لوران KernelChip في أنظمة التشغيل الآلي للمنزل ، وسنركز في هذا الجزء على دمج هذه الوحدات مع النظام البيئي Arduino. في الجزء الأول من السلسلة ، تحدثنا عن التكامل مع نظام التشغيل الآلي للمنزل الرائد MajorDoMo ، وفي الجزء الثالث سوف تتعلم كيفية إدارة هذه الوحدات النمطية من الرسومات التخطيطية في لغة برمجة المعالجة ، مباشرة من سطح مكتب جهاز الكمبيوتر الخاص بك.
اردوينو هو كل شيء لدينا
أين بدون اردوينو؟ لن أصف مزايا هذه المنصة لفترة طويلة ، فشعبيتها تتحدث عن نفسها ، لذلك دعونا ننتقل على الفور إلى التفاصيل التقنية للتفاعل بين وحدات Arduino و Laurent. وعلى طول الطريق ، لن ننسى نظام Arduino Mega Server ، باعتباره مشتقًا مثيرًا للاهتمام للغاية لنظام Arduino البيئي.حديد
للتحكم في الوحدات عبر الشبكة ، على سبيل المثال ، تعتبر لوحة Arduino Uno الشائعة أو لوحة Arduino Mega الشائعة بنفس القدر والمتكاملة ببطاقة واجهة شبكة Ethernet Shield المجمعة على أساس شريحة W5100 مناسبة. تم إعطاء جميع الأمثلة في هذه المقالة لمثل هذا المزيج وتم اختبارها عمليًا. كل شيء يعمل بشكل موثوق وبدون أي مشاكل.
Ethernet Shield استنادًا إلى شريحة W5100بمعنى أنه عليك فقط أخذ الرسم وتحميله على لوحة Uno أو Mega ، بعد تغييره قليلاً لمهامك.إدارة وحدات الرسم التخطيطي
في الجزء الأول من السلسلة ، تحدثت بالفعل عن مبادئ إدارة وحدات لوران عبر الشبكة ، بالنسبة لأولئك الذين لم يقرأوا الجزء الأول ، سأكرر باختصار النظرية هنا.يتم تبادل المعلومات مع الوحدات عبر الشبكة ولبدء العمل معها ، تحتاج إلى إنشاء اتصال TCP / IP على المنفذ 2424. بمجرد إنشاء الاتصال ، يمكنك إرسال أوامر نصية (تسمى أوامر KE) تتحكم في الوحدة النمطية. يحتوي موقع KernelChip على وثائق تفصيلية ، بما في ذلك وصف يمكن الوصول إليه لأوامر KE.الآن دعونا نحاول ترجمة هذه "الشروط المرجعية" النظرية إلى اللغة البسيطة لمخططات اردوينو.رسم
لن أشرح هنا كيفية تثبيت وتكوين بيئة برمجة Arduino ، من المفترض أنك قمت بذلك بالفعل وأنك قادر على كتابة رسومات بسيطة. لذا ، بالنسبة للمبتدئين ، نحتاج إلى توصيل المكتبات الضرورية SPI.h و Ethernet.h للتحكم في الناقل ووحدة Ethernet نفسها.#include <SPI.h>
#include <Ethernet.h>
ثم تحتاج إلى تعيين إعدادات الشبكة لوحدة Ethernet ووحدة Laurent ، والتي سنديرها. لاحظ أن عناوين MAC وعناوين IP يجب أن تكون فريدة ، ويجب تعيين LAURENT_PORT على 2424 وليس أي عنوان آخر.byte SELF_MAC[] = {0x00, 0x2A, 0xF5, 0x12, 0x67, 0xEE};
byte SELF_IP[] = {192, 168, 2, 20};
byte LAURENT_IP[] = {192, 168, 2, 19};
int LAURENT_PORT = 2424;
ما زلنا بحاجة إلى مخزن مؤقت لتخزين أوامر الشبكة ، ويتم تحديده بحجم 200 بايت مع بعض الهامش ، إذا كانت لديك مشاكل مع نقص ذاكرة الوصول العشوائي ، فيمكنك تقليله ، على سبيل المثال ، إلى 100 بايت أو حتى أقل.char buf[200];
واللمسة الأخيرة هي عميل Ethernet لوحدة Laurent. الآن سنقوم بتنفيذ جميع العمليات باستخدام الوحدة باستخدام كائن lclient.EthernetClient lclient;
هذا كل شيء ، دعنا الآن نلقي نظرة على وظيفة ترسل الأوامر إلى وحدة Laurent.void sendLaurentRequest() {
if (lclient.connect(LAURENT_IP, LAURENT_PORT)) {
Serial.print("Command: ");
Serial.println(buf);
lclient.println(buf);
delay(100);
Serial.print("Answer: ");
while(lclient.available() != 0) {
char c = lclient.read();
Serial.print(c);
}
delay(500);
lclient.stop();
} else {
Serial.println("Error sending command");
}
}
إذا تم إنشاء اتصال مع وحدة Laurent على المنفذ 2424 ، فسيتم إرسال محتويات المخزن المؤقت إلى الوحدة النمطية وتكرارها في Serial للفحص البصري. ثم يتوقع 100 مللي ثانية ويتم تلقي استجابة الوحدة. بعد ذلك ، توقف مؤقتًا مرة أخرى وتم قطع الاتصال بالوحدة النمطية. إذا تعذر إنشاء الاتصال بالوحدة النمطية لسبب ما ، يتم عرض رسالة خطأ.الآن دعونا نحلل التهيئة. تهيئة إيثرنت هي وظيفة بسيطةvoid ethernetInit() {
Ethernet.begin(SELF_MAC, SELF_IP);
}
وتتم تهيئة وحدة Laurent بواسطة وظيفة laurentInit () ، التي سنحللها بالتفصيل الآن. إنها كبيرة جدًا وتحتاج إلى فهمها جيدًا لأنه على أساس رمز هذه الوظيفة يمكنك بناء طلباتك الخاصة لوحدات Laurent.void laurentInit() {
Serial.println("Start modul Laurent Init...");
Serial.print("Connect to Laurent... ");
if (lclient.connect(LAURENT_IP, LAURENT_PORT)) {
Serial.println("OK");
lclient.stop();
Serial.println("Selftest...");
sprintf(buf, "$KE");
sendLaurentRequest();
Serial.println("Set password...");
sprintf(buf, "$KE,PSW,SET,Laurent");
sendLaurentRequest();
} else {
Serial.println("failed");
}
delay(500);
sprintf(buf, "$KE,DAT,OFF");
sendLaurentRequest();
delay(100);
sprintf(buf, "$KE,REL,2,0");
sendLaurentRequest();
Serial.println("Modul Laurent Init done");
}
مبدئيًا ، يتم عرض رسالة التهيئة وتتم محاولة الاتصال بوحدة Laurent. إذا فشل ذلك ، يتم عرض رسالة خطأ ، وإذا نجح الاتصال بالوحدة النمطية ، يتم إرسال أمر التشخيص الذاتي ، والذي يجب أن تستجيب له الوحدة السليمة بـ "# موافق".بعد ذلك ، يتم إرسال أمر لإدخال كلمة المرور (في هذه الحالة ، هذه هي كلمة المرور الافتراضية). ومن المتوقع 500 مللي ثانية.بعد ذلك ، يتم إدخال أمرين إضافيين - أحدهما يوقف إخراج البيانات بواسطة الوحدة (إذا ذهبت) ، ويوقف الثاني التتابع رقم 2 ، الذي نستخدمه في تجاربنا. بمعنى آخر ، هذه الأوامر تجلب الوحدة إلى بعض الحالة الأولية.فيما يلي نسخة مطبوعة من عملية التهيئة التي تظهر فيها جميع الأوامر وجميع استجابات الوحدة:Start modul Laurent Init...
Connect to Laurent... OK
Selftest...
Command: $KE
Answer: #OK
Set password...
Command: $KE,PSW,SET,Laurent
Answer: #PSW,SET,OK
Command: $KE,DAT,OFF
Answer: #DAT,OK
Command: $KE,REL,2,0
Answer: #REL,OK
Modul Laurent Init done
الآن رمز وظيفة الإعداد القياسي (). تتم تهيئة جميع الأنظمة الفرعية ، بما في ذلك منفذ تسلسلي بمعدل باود قياسي 9600.void setup() {
Serial.begin(9600);
ethernetInit();
laurentInit();
}
لذا ، قمنا بتهيئة الوحدة النمطية ويمكننا إدارتها بالطريقة التي نحتاجها: إرسال الأوامر ، وقراءة الإجابات ، وبناء منطق التحكم مع مراعاة البيانات الصادرة عن وحدة Laurent.ضع في اعتبارك ، على سبيل المثال ، أبسط مهمة - لتشغيل وإطفاء الضوء على فترات منتظمة على ضوء مصباح متصل بالمرحلة الثانية من وحدة Laurent.void loop() {
sprintf(buf, "$KE,REL,2,1");
sendLaurentRequest();
delay(3000);
sprintf(buf, "$KE,REL,2,0");
sendLaurentRequest();
delay(3000);
}
وظيفة الحلقة () هي حلقة لا نهائية وسيضيء المصباح ، الذي يطيع أوامرنا ، باستمرار ويخرج كل 3 ثوانٍ. هذا ، بالطبع ، مجرد مثال ، في الواقع ، يمكن أن يكون منطق العمل أي وكل شيء يعتمد على احتياجاتك. وبالطبع ، لا يمكنك إرسال أوامر فقط لتمكين أو تعطيل الأحمال ، ولكن أيضًا أي أوامر أخرى تدعمها الوحدة. يمكنك العثور على قائمة كاملة بالأوامر ووصفها في وثائق وحدات Laurent.يمكنك أخذ هذا الرسم ودمجه في مشاريعك الخاصة ، مما يضيف دعمًا لإدارة وحدات Laurent. أو العكس ، خذ هذا الرسم كأساس وقم بزيادة وظائفه تدريجيًا. ليس هناك حد للكمال. هنا الرسم الكامل.كود رسم كامل#include <SPI.h>
#include <Ethernet.h>
byte SELF_MAC[] = {0x00, 0x2A, 0xF5, 0x12, 0x67, 0xEE};
byte SELF_IP[] = {192, 168, 2, 20};
byte LAURENT_IP[] = {192, 168, 2, 19};
int LAURENT_PORT = 2424;
char buf[200];
EthernetClient lclient;
void ethernetInit() {
Ethernet.begin(SELF_MAC, SELF_IP);
}
void laurentInit() {
Serial.println(«Start modul Laurent Init...»);
Serial.print(«Connect to Laurent… „);
if (lclient.connect(LAURENT_IP, LAURENT_PORT)) {
Serial.println(“OK»);
lclient.stop();
// Send test command
Serial.println(«Selftest...»);
sprintf(buf, "$KE");
sendLaurentRequest();
// Send password (default: «Laurent»)
Serial.println(«Set password...»);
sprintf(buf, "$KE,PSW,SET,Laurent");
sendLaurentRequest();
} else {
Serial.println(«failed»);
}
delay(500);
// DATA
sprintf(buf, "$KE,DAT,OFF");
sendLaurentRequest();
delay(100);
//
sprintf(buf, "$KE,REL,2,0");
sendLaurentRequest();
Serial.println(«Modul Laurent Init done»);
} // laurentInit
void sendLaurentRequest() {
if (lclient.connect(LAURENT_IP, LAURENT_PORT)) {
Serial.print(«Command: „);
Serial.println(buf);
lclient.println(buf);
delay(100);
Serial.print(“Answer: „);
while(lclient.available() != 0) {
char c = lclient.read();
Serial.print©;
}
delay(500);
lclient.stop();
} else {
Serial.println(“Error sending command»);
}
} // sendLaurentRequest
void setup() {
Serial.begin(9600);
ethernetInit();
laurentInit();
}
void loop() {
//
sprintf(buf, "$KE,REL,2,1");
sendLaurentRequest();
delay(3000);
//
sprintf(buf, "$KE,REL,2,0");
sendLaurentRequest();
delay(3000);
}
خادم اردوينو ميجا
Arduino Mega Server (AMS) هو نظام قوي لـ Arduino Mega (الآن أيضًا لـ Arduino DUE وقريبًا لمنصات 32 بت الأخرى M0 (Zero) و Genuino 101) ، والذي يحتوي على الرمز "لجميع المناسبات" وأكثر من ذلك خادم مدمج وواجهة ويب سهلة الاستخدام. تدعم AMS وحدات Laurent فور إخراجها من العلبة ولا تحتاج إلى إضافة أي شيء بخلاف منطق المستخدم.تحتوي AMS على هيكل معياري ويتم تشغيل الوحدات النمطية وإيقاف تشغيلها ببساطة عن طريق التعليق على خط في رسم ، على سبيل المثال ،#define LAURENT_FEATURE
أو
إذا تم التعليق على السطر ، فلن يتم تجميع الوحدة النمطية ولا تشارك في العمل ، كما يمكن رؤيته في مؤشرات الوحدات في رأس الموقع. أو العكس ، يشار إلى وحدة العمل المترجمة باللون الأزرق. في هذه الحالة ، لا تعمل وحدة التحكم LRT LRT.
مؤشرات تشغيل الوحدةالعمل مع استجابات وحدة لوران
الآن دعنا نضيف القدرة ليس فقط لإظهار استجابات الوحدة ، ولكن أيضًا للعمل معهم ، على سبيل المثال ، تحليلها أو عرضها على صفحات الويب Arduino Mega Server. للقيام بذلك ، نحتاج إلى متغير سلسلة جديد وثابت يحدد طول السلسلة التي نعينها لإجابات وحدات Laurent. في مثال الاختبار ، يساوي 25 حرفًا ، ولكن يمكنك زيادته إذا لم تتناسب الإجابات مع هذه القيمة. عليك فقط أن تتذكر أن ذاكرة الوصول العشوائي لوحدة التحكم الدقيقة هي مورد قيم وتحتاج إلى حفظها. أضف الأسطر التالية إلى وحدة laurent.ino القياسية من حزمة AMS:byte MAX_LEN_LREQUEST = 25;
String lrequest = String(MAX_LEN_LREQUEST);
نحتاج أيضًا إلى تغيير رمز الوظيفة التي تجعل الطلبات (يتم تمييز التغييرات المضافة بواسطة الأسهم).void sendLaurentRequest() {
if (lclient.connect(LAURENT_IP, LAURENT_PORT)) {
Serialprint("Command: ");
Serial.println(buf);
lclient.println(buf);
delay(100);
Serialprint("Answer: ");
lrequest = "";
while(lclient.available() != 0) {
char c = lclient.read();
Serial.print(c);
if (lrequest.length() < MAX_LEN_LREQUEST) {
lrequest += (c);
}
}
delay(500);
lclient.stop();
} else {
Serialprint("Error sending command\n");
}
}
وهكذا ، تعلمنا كيفية الحصول على إجابات لوران في متغير lrequest والآن يمكننا أن نفعل ما نراه مناسبًا له. بعد ذلك ، سأوضح كيفية عرض نتائج الاستعلامات مباشرة في لوحة العدادات في رأس موقع AMS.ملاحظة صغيرة. يستخدم هذا المثال وظيفة Serialprint بدلاً من Serial.print القياسية لأنها توفر المزيد من ذاكرة الوصول العشوائي. ويمكن تحويلها بسهولة إلى واحدة قياسية بمجرد وضع حد لكلمتين.إخراج استجابة الوحدة النمطية لرأس الموقع
والمثال الأخير. دعونا نعرض إجابات وحدات Laurent في رأس موقع Arduino Mega Server. للقيام بذلك ، نحتاج إلى إضافة الطلب إلى الحلقة الرئيسية () في حلقة رسم AMS. افتح ملف arduino_mega_server.ino وأدخل الكود التالي قبل وظيفة cyclosInSecWork (): #ifdef LAURENT_FEATURE
if (cycle30s) {
sprintf(buf, "$KE");
sendLaurentRequest();
}
#endif
سوف يستعلم هذا الرمز عن حالة وحدة Laurent كل ثلاثين ثانية. بطبيعة الحال ، هذا مجرد مثال ، في هذا المكان يمكن أن يكون هناك أي طلب وأي رمز. وبالتالي ، في المتغير lrequest لدينا إجابة حول حالة الوحدة ويمكننا الآن عرضها في رأس الموقع. للقيام بذلك ، افتح الوحدة النمطية server_ajax.ino وفي النهاية ، في رمز وظيفة responseDash (EthernetClient cl) ، قبل السطر cl.println ("") ؛ أضف الكود التالي: #ifdef LAURENT_FEATURE
sendTagString("laurent", "", lrequest, cl);
#endif
يرسل هذا الرمز ، في الواقع ، استجابات الوحدة النمطية إلى صفحة الويب. يبقى القيام بأمرين: الأول هو إضافة شفرة JavaScript "ستلتقط" بياناتنا والثاني هو رمز HTML على صفحة AMS نفسها ، حيث سيتم عرض إجابات الوحدة.لذا ، افتح ملف scripts.js وفي وظيفة getDashData () قبل قوس الإغلاق} // إذا أدخل (this.responseXML! = Null) الرمز الذي سيقبل منشآتنا.
try {
var laurent = this.responseXML.getElementsByTagName('laurent')[0].childNodes[0].nodeValue;
} catch (err) {
laurent = "-";
}
document.getElementById("laurent").innerHTML = laurent;
يبقى فقط لتصحيح ملف dash.htm قليلاً من تسليم AMS القياسي وإضافة رمز إليه والذي سيعرض المعلومات على الشاشة. مباشرة بعد السطر الذي يحتوي على class = "online-device" ، ندخل سطرنا الجديد مع الرمز:<p>Laurent: <span class="value" id="laurent">...</span></p>
هذا كل شئ. لقد عرضنا استجابات وحدة Laurent في رأس موقع Arduino Mega Server. وهنا نتيجة جهودنا. حالة الوحدة مرئية بوضوح في لوحة AMS ويتم تحديثها كل 30 ثانية ، لذلك إذا حدث شيء ما للوحدة النمطية ، فستعرف عنها بعد 30 ثانية كحد أقصى.
استنتاج
كما ترى ، لا يوجد شيء معقد في إدارة وحدات Laurent باستخدام Arduino و Arduino Mega Server ، وإذا كان لديك بالفعل مثل هذه الوحدات أو تخطط لإضافتها إلى نظام Smart Home الخاص بك ، فستساعدك هذه المقالة على القيام بذلك بسهولة وببساطة.وفي المقالة التالية من الدورة ، ستتعلم كيفية إدارة Loranes مباشرة من شاشة جهاز الكمبيوتر الخاص بك وكيفية جعل عملية تعليم الأطفال برمجة تفاعلية وأكثر إثارة للاهتمام.إضافة . قناة Youtube مفتوحة وهنا فيديو ترويجي لخادم Arduino Mega ، والذي يوضح كيفية العمل مع نظام حقيقي.