اكتسب مشروع FLProg مؤخرًا الكثير من الشعبية ، ولم يعد لدي الوقت الكافي لإنشاء الكتل للأجهزة الطرفية التي يحتاجها المستخدمون. في نفس الوقت ، بين مستخدمي الموقع ، كان هناك عدد كاف من الأشخاص الذين لديهم دراية جيدة بلغة C ويمكنهم مساعدتي في تطوير البرنامج. قررت أن أعطيهم الأداة المناسبة. وهكذا ، في الإصدار 1.10.3 ، أصبح من الممكن إنشاء كتل مخصصة برمز C المدمج ، مما أدى إلى نتائج غير متوقعة إلى حد ما. كانت هذه الأداة مهتمة ليس فقط بالمستخدمين الأذكياء في البرمجة ، ولكن أيضًا أولئك الذين لم يكتبوا سطورًا من التعليمات البرمجية من قبل. بدأوا بكتابة كتل بسيطة في البداية (على سبيل المثال ، الحصول على لوغاريتم - لم يكن لدي مثل هذا الحظر بين القياسية) ،تنتهي بكتل خطيرة باستخدام المكتبات. لذلك ، أريد أن أكسر قليلاً التسلسل المدروس للدروس حول العمل مع البرنامج ، وبدورًا سأخبرك بكيفية إنشاء مثل هذه الكتل.في الدرس ، سيتم إنشاء كتلة للبوصلة الرقمية HMC5883L. تم أخذ هذه المقالة كأساس للكتلة . المكتبة مأخوذة من هنا .لذا ، قم بتشغيل البرنامج وإنشاء مشروع جديد. في مكتبة العناصر ، انتقل إلى علامة التبويب "مخصص" وحدد فرع شجرة مكتبة الكتل المخصصة حيث سيتم وضع الكتلة الجديدة. ثم نضغط على زر "إنشاء كتلة" ،
تفتح نافذة باختيار لغة البرمجة للكتلة. تتوفر لغات FBD و LAD و Code. سيتم مناقشة لغتي LAD و FBD في دروس أخرى ، والآن اختر "Code".
تفتح نافذة محرر كتلة المستخدم. في الجزء العلوي توجد علامات تبويب المعلمات (1) ، في علامات التبويب السفلية لأقسام التعليمات البرمجية (2).
نملأ المعلمات الرئيسية.
يتم إنشاء مدخلات ومخرجات الكتلة بنفس الطريقة. لن يكون لمجموعتنا أي مدخلات ، لذلك نتخطى علامة التبويب هذه ونذهب إلى علامة التبويب "حظر المخرجات". سيكون للكتلة ثلاثة مخارج - الاتجاه على طول المحور X و Y و Z. لإنشاء إخراج ، انقر فوق الزر "إضافة إخراج".
سيتم فتح نافذة إنشاء تسجيل الدخول. إنها تشبه إلى حد كبير نافذة إنشاء متغير في البرنامج الرئيسي ، لذلك لن أصفه بالتفصيل. يتم إرسال قيم إخراج الكتلة بتنسيق Float - وبالتالي ، فإننا نختار نوع المدخلات نفسها. يخضع اسم المخرجات لقيود تنطبق على اسم المتغيرات في C. حيث أنها ستظهر في الكود. لا توجد قيود على كتابة التعليقات.
بنفس الطريقة ننشئ بقية المخرجات.
الآن سنقوم بتعيين المعلمة التي سيعينها المستخدم عند استخدام الكتلة. ستكون هذه حساسية المستشعر. وفقًا للوصف ، يتم تحديده من السلسلة: 0.88 ، 1.3 ، 1.9 ، 2.5 ، 4.0 ، 4.7 ، 5.6 ، 8.1انتقل إلى علامة التبويب "إعدادات المستخدم" وانقر على الزر "إضافة معلمة".
سيتم فتح نافذة لإنشاء معلمة مستخدم. نظرًا لأن لدينا معلمة من النوع Float ، فإننا نختار هذا النوع. لا توجد قيود على اسم المعلمة ، لأنه في الكود الناتج سيتم استبدال هذا الاسم بقيمة المعلمة. كما لا توجد قيود على نص التعليق.
عند إنشاء معلمة ، يمكنك تعيين القيمة الافتراضية. في هذه الحالة ، عند استخدام الكتلة ، لن يكون من الضروري تعيين قيمة المعلمة. من الممكن أيضًا تعيين حدود قيم المعلمات ، وإذا تجاوزت القيمة المدخلة هذه الحدود ، فسيتم اعتبار الكتلة غير صحيحة.الآن دعنا نهتم بالمكتبة. دعنا نذهب إلى علامة التبويب "المكتبات". يمكن تحميل المكتبات المستخدمة في عمل الكتلة مباشرة في الكتلة. للقيام بذلك ، انقر فوق الزر "تنزيل مكتبة".
سيتم فتح نافذة لتحديد مجلد بمكتبة.
بعد اختيار مجلد المكتبة ، سيتم تحميله في الكتلة ، وسيتم عرضه في قائمة المكتبات المحملة. يمكن تحميل عدة مكتبات إذا لزم الأمر لتشغيل الكتلة.
عند استخدام كتلة في مشروع ، قبل تجميع المخطط ، سيتحقق البرنامج من وجود المكتبات التي تم تحميلها في الكتلة في دليل المكتبة ، وإذا لم يكن هناك أي منها ، فسيتم إلغاء تحميل المكتبات المفقودة.في علامة التبويب "الوصف" ، يُنصح بكتابة كيفية العمل مع الوحدة ، والغرض منها ، وما إلى ذلك. سيساعد هذا الوصف المستخدمين الآخرين على استخدامه.الآن دعنا ننتقل إلى منطقة الكود.علامة التبويب الأولى هي قسم "DeclareSection". في علامة التبويب هذه ، تحتاج إلى تسجيل اتصال المكتبات الضرورية ، وإعلان المتغيرات والمصفوفات والبنى. سنملأ هذا القسم ، مسترشداً بمثال من المكتبة.كود قسم Declare من المثال.
#include <Wire.h>
#include <HMC5883L.h>
HMC5883L compass;
int error = 0;
عند النقل إلى الكتلة ، تمت إزالة التعليقات غير الضرورية ، على الرغم من عدم وجود قيود على استخدامها بخلاف لغة C نفسها. كما تمت إضافة بعض المتغيرات التي ستكون مفيدة لاحقًا في الرمز. في المثال الأصلي ، يتم التصريح عنها في قسم الحلقة. هنا يتم نقلهم إلى قسم Declare.
اليوم ، في قسم Declare ، يمكنك استخدام الإعلانات المتغيرة من أي نوع ، وإعلان المصفوفات والبنى. تتم معالجة التوجيه #define بشكل صحيح .لا يمكنك استخدام هذا النوع من التصريح:typedef struct{
...
...}
test;
يجب إعادة بنائه في هذا النموذج:struct test{
...
...
};
لا يمكنك استخدام النوع الخارجي . تحولت هذه إلى مشكلة كبيرة إلى حد ما ، وآمل أن تحلها في المستقبل القريب.الآن دعنا ننتقل إلى قسم "SetupSection". هنا يتم نقل الرمز من المثال تقريبًا إلى واحد.كود من المثالvoid setup()
{
// Initialize the serial port.
Serial.begin(9600);
Serial.println("Starting the I2C interface.");
Wire.begin(); // Start the I2C interface.
Serial.println("Constructing new HMC5883L");
compass = HMC5883L(); // Construct a new HMC5883 compass.
Serial.println("Setting scale to +/- 1.3 Ga");
error = compass.SetScale(1.3); // Set the scale of the compass.
if(error != 0) // If there is an error, print it out.
Serial.println(compass.GetErrorText(error));
Serial.println("Setting measurement mode to continous.");
error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
if(error != 0) // If there is an error, print it out.
Serial.println(compass.GetErrorText(error));
}
تمت إزالة رأس القسم والأقواس التي تقيد القسم من المثال (يتم إدراجه بواسطة البرنامج أثناء التحويل البرمجي). أيضا إزالة جميع المخرجات التشخيصية للمرافقة. إليك ما حدث.
لاحظ أنه بدلاً من معلمة الدقة ، يتم إدراج اسم المعلمة Precision. عند تجميع كتلة ، سيتم إدراج القيمة التي أدخلها المستخدم بدلاً من هذا الاسم.الآن دعنا ننتقل إلى قسم الحلقة.كود أصلي من مكتبة العيناتvoid loop()
{
MagnetometerRaw raw = compass.ReadRawAxis();
MagnetometerScaled scaled = compass.ReadScaledAxis();
int MilliGauss_OnThe_XAxis = scaled.XAxis;
float heading = atan2(scaled.YAxis, scaled.XAxis);
float declinationAngle = 0.0457;
heading += declinationAngle;
if(heading < 0)
heading += 2*PI;
if(heading > 2*PI)
heading -= 2*PI;
float headingDegrees = heading * 180/M_PI;
Output(raw, scaled, heading, headingDegrees);
}
كما هو الحال في قسم الإعداد ، قم بإزالة رأس القسم والأقواس المحيطة. سيتم إدراجها في التعليمات البرمجية تلقائيًا بواسطة البرنامج. نزيل أيضًا إعلان المتغيرات في قسم الحلقة. في هذا القسم ، من غير المرغوب فيه للغاية الإعلان عن المتغيرات المؤقتة ، لأنه إذا تم استخدام الكتلة عدة مرات في المشروع ، فسيحدث خطأ في إعادة تعريف المتغير.والنتيجة هي هذا الكود:
في نهاية الكود ، نسمي وظيفة الإخراج (الخام ، المقياس ، العنوان ، العنوان الدرجات) . من حيث المبدأ ، يمكنك الاستغناء عنها ، لكنني قررت تركها كمثال على إنشاء وظيفة. لذلك ، انتقل إلى علامة التبويب "FunctionSection".لإنشاء وظيفة جديدة ، انقر فوق الزر "Add function".
سيتم فتح نافذة لإدخال رأس الوظيفة ، حيث ندخل تعريفها.
بعد إنشاء الرأس ، اكتب رمز الوظيفة.رمز الوظيفة الأصلي من المثالvoid Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
{
Serial.print("Raw:\t");
Serial.print(raw.XAxis);
Serial.print(" ");
Serial.print(raw.YAxis);
Serial.print(" ");
Serial.print(raw.ZAxis);
Serial.print(" \tScaled:\t");
Serial.print(scaled.XAxis);
Serial.print(" ");
Serial.print(scaled.YAxis);
Serial.print(" ");
Serial.print(scaled.ZAxis);
Serial.print(" \tHeading:\t");
Serial.print(heading);
Serial.print(" Radians \t");
Serial.print(headingDegrees);
Serial.println(" Degrees \t");
}
نقوم بإزالة كل ما يتعلق بالإخراج في الحيز ، وتعيين القيم لمخرجات الكتلة. حسنًا ، كالمعتاد ، قم بإزالة الرأس والأقواس المحيطة. ها هي النتيجة.
اكتمال العمل على الكتلة.دمية صغيرة عند العمل في محرر الكتلة. في أي مجال من التعليمات البرمجية ، من الممكن استخدام قائمة السياق لإدراج اسم الإدخال أو إخراج المعلمة أو قالب استدعاء الوظيفة.
ننهي العمل بالضغط على زر "خروج".
بعد حفظ الكتلة ، يمكن استخدامها في المشروع ككتلة عادية.بالنسبة لأكثر المرضى قراءة حتى النهاية - نسخة فيديو من هذا الدرس.