تسجيل البيانات باستخدام دماغ VEX وأجهزة الاستشعار باستخدام Python

مقدمة

في هذه المقالة، سنناقش كيفية إنشاء مشروع تسجيل بيانات يوجه VEX Robot لجمع البيانات باستخدام VEX Brain وحفظها في ملف CSV على بطاقة SD لتحليل البيانات.

يعد تسجيل البيانات أداة قوية يمكننا استخدامها لمساعدة البحث العلمي وإجراء تجاربنا الخاصة وحل مشكلات محددة. هناك العديد من المهام الممتعة والمثيرة التي يمكننا قيادة VEX Robot لإنجازها من خلال تسجيل البيانات. وفيما يلي بعض الأمثلة على ذلك:

  • جمع البيانات باستخدام مستشعر المسافة لحساب سرعة الروبوت.
  • قيادة الروبوت حول الفصل الدراسي وجمع البيانات باستخدام المستشعر البصري لمراقبة تغيرات الضوء في مواقع مختلفة.
  • أخذ الروبوت في مغامرة وتسجيل بيانات إحداثيات نظام تحديد المواقع العالمي (GPS) لإنشاء خريطة.

مهارات الترميز اللازمة لتطوير مشروع تسجيل البيانات

  • استخدم أوامر مختلفة لجمع البيانات باستخدام VEX Brain/Sensors وإضافتها إلى بنية البيانات.
  • اكتب البيانات في ملف قيم مفصولة بفواصل (CSV) على بطاقة SD.

الأجهزة المطلوبة لتسجيل البيانات:

  • الدماغ المضطرب (IQ، V5، EXP)
  • بطاقة SD
  • حساس أو حساسات متعددة (اختياري حسب البيانات المطلوبة)

الحصول على البيانات من أجهزة الاستشعار

يمكننا برمجة VEX Robot (IQ، V5، EXP) لالتقاط البيانات من أجهزة الاستشعار التالية:

  • الاستشعار بالقصور الذاتي
  • مستشعر المسافة
  • أجهزة الاستشعار البصرية
  • مستشعر الرؤية
  • مستشعر الدوران (V5، EXP)
  • مستشعر نظام تحديد المواقع (V5)

ملاحظة: يحتوي VEX IQ (الجيل الثاني) Brain وVEX EXP Brain على مستشعر بالقصور الذاتي مدمج. يمكننا جمع بيانات أجهزة الاستشعار بالقصور الذاتي باستخدام أدمغة VEX هذه.

في هذه المقالة، سنقوم بتطوير مشروع تسجيل بيانات يجمع بيانات التسارع باستخدام VEX IQ Brain (الجيل الثاني) ويخزنها في بطاقة SD. 

أولاً، نحتاج إلى كتابة برنامج قصير للحصول على قراءات من المؤقت ومستشعر القصور الذاتي المدمج في VEX IQ Brain (الجيل الثاني).

  • في بداية هذا البرنامج، سنحتاج إلى استيراد وحدات Python للتحكم في VEX IQ Brain (الجيل الثاني) وجلب البيانات منه. وبالتالي، ابدأ بإضافة هذه التعليمات إلى المشروع.

    # استيراد المكتبة
    من vex استيراد *
    
    # يجب تعريف Brain افتراضيًا
    brain = Brain()
    brain_inertial = Inertial()
  • بعد ذلك، قم بإضافة الكود لإعلان متغير numOfDataEntries لتخزين عدد إدخالات البيانات للتسجيل، وإعلان متغير polling_delay_msec لتخزين قيمة الفاصل الزمني لقراءة البيانات، وإنشاء متغير سلسلة فارغ data_buffer لتخزينه البيانات المقروءة من المستشعر.

    عدد إدخالات البيانات = 100
    تأخير الاستطلاع بالمللي ثانية = 50
    مخزن البيانات المؤقت = ""
  • بما أننا سنستخدم القيمة الحالية للمؤقت لإضافة الطابع الزمني إلى البيانات، فنحن بحاجة إلى إعادة ضبط قيمة المؤقت إلى 0 ثانية قبل البدء في جمع البيانات.

    # أضف كود تهيئة المؤقت
    brain.timer.clear()
  • قبل استخدام التعليمات التي تجلب البيانات من VEX IQ Brain (الثاني) وتسجل البيانات في المخزن المؤقت، نحتاج إلى فهمها أولاً.
    تقوم التعليمات التالية بإلحاق قيمة المؤقت الحالي بالمتغير data_buffer بتنسيق محدد.

    تم تمييز سطر من كود بايثون على شكل أجزاء لشرحه بالتفصيل. يقرأ سطر التعليمات البرمجية data_buffer += 1.3f % brain.timer.value() + comma. أولاً، يتم تمييز عامل التشغيل += وتسميته "إلحاق البيانات بسلسلة data_buffer". بعد ذلك، يتم تمييز السلسلة 1.3f وتسميتها بسلسلة التنسيق. بعد ذلك، يتم تمييز علامة النسبة المئوية وتسميتها "معامل باقي القسمة للسلسلة". بعد ذلك، يتم تمييز الأمر brain.timer.value() وتسميته "القيمة الحالية للمؤقت". وأخيرًا، يتم تمييز إضافة سلسلة الفاصلة في النهاية ويظهر النص التالي: أضف فاصلة في النهاية لفصل البيانات.

    دعونا نحلل سلسلة التنسيق "%1.3f": 

    • "%": يقدم محدد التحويل.
    • "1": يشير إلى الحد الأدنى لعدد الأرقام الموجودة في السلسلة.
    • ".3": يحدد عدد المنازل العشرية المراد تضمينها في الرقم المنسق.
    • "f": يشير إلى أن القيمة المطلوب تنسيقها هي رقم فاصلة عائمة.

    وبالتالي، يمكننا استخدام سلسلة التنسيق "%1.3f" لتنسيق رقم الفاصلة العائمة بعرض لا يقل عن رقم واحد ودقة 3 منازل عشرية.

  • الآن، يمكننا قراءة المؤقت وقيمة التسارع لمستشعر القصور الذاتي المدمج في VEX IQ Brain (الجيل الثاني) ثم إلحاق البيانات بالمتغير data_buffer بالتنسيق المحدد.

    # أوامر لكتابة البيانات إلى المخزن المؤقت
    data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    تم شرح الكود السابق بالتفصيل. السطر الأول من data_buffer الذي يستخدم brain.timer.value() يحمل عنوان "إضافة طابع زمني إلى المخزن المؤقت". الأسطر الثلاثة التالية تحمل عنوان "أضف قيمة التسارع على طول المحاور X و Y و Z إلى المخزن المؤقت".

    ملاحظة: "\n" هو حرف السطر الجديد. ويشير إلى أن السطر ينتهي هنا وبداية سطر جديد.

  • بعد ذلك، لتسجيل عدد معين من إدخالات البيانات في المتغير data_buffer ، يمكننا استخدام for حلقة لتنفيذ التعليمات التي تجلب البيانات بشكل متكرر وإلحاق البيانات بالمتغير data_buffer لعدد من التكرارات. استراتيجيتنا هي استخدام قيمة المتغير numOfDataEntries لتحديد عدد التكرارات.

    # توليد البيانات
    for i in range(0, numOfDataEntries):
    
        # أوامر لكتابة البيانات إلى المخزن المؤقت
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
  • حتى الآن، يسجل برنامجنا البيانات بأسرع ما يمكن. ومع ذلك، نريد تسجيل البيانات على فترات زمنية محددة. لذلك، يمكننا استخدام دالة wait() في for الحلقة لإيقاف البرنامج مؤقتًا لإضافة فاصل زمني محدد بين قراءتين. نستخدم قيمة المتغير polling_delay_msec لتحديد قيمة الفاصل الزمني.

    # توليد البيانات
    for i in range(0, numOfDataEntries):
    
        # أوامر لكتابة البيانات إلى المخزن المؤقت
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
    
        wait(polling_delay_msec, MSEC)

تهانينا! لقد انتهينا من برنامج الحصول على قراءات (بيانات التسارع) من مستشعر القصور الذاتي المدمج في VEX Brain. بعد ذلك، سوف نستكشف كيفية كتابة البيانات إلى ملف CSV على بطاقة SD.

# استيراد المكتبة
من vex استيراد *

# يجب تعريف Brain افتراضيًا
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# إضافة كود تهيئة المؤقت
brain.timer.clear()

# توليد البيانات
for i in range(0, numOfDataEntries):

    # أوامر لكتابة البيانات إلى المخزن المؤقت
    data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    wait(polling_delay_msec, MSEC)

توصيل بطاقة SD بدماغ VEX

قبل كتابة البيانات إلى ملف على بطاقة SD، أدخل بطاقة SD في فتحة بطاقة SD في VEX Brain أولاً.

يظهر جهاز V5 Brain مع تسليط الضوء على فتحة بطاقة SD الخاصة به. توجد فتحة بطاقة SD على جانب وحدة المعالجة المركزية، إلى يمين منفذ USB-C الخاص بها.

ملاحظة: قم بتهيئة بطاقة SD إلى FAT32 لكتابة البيانات. نوصي باستخدام بطاقات SD التي يبلغ حجمها 32 جيجابايت أو أقل.

للتأكد من إمكانية إجراء كتابة البيانات إلى ملف على بطاقة SD في ظل الظروف المناسبة، سنحتاج إلى إضافة رمز للتحقق مما إذا تم إدخال بطاقة SD بشكل صحيح في VEX IQ Brain (الجيل الثاني).

  • استخدم الدالة Brain.sdcard.is_inserted() للتحقق من إدخال بطاقة SD. إذا لم يتم إدخال بطاقة SD، فاعرض الرسالة المقابلة على شاشة VEX IQ Brain Screen واستمر في الضغط على البرنامج.

    # أوقف البرنامج مؤقتًا إذا لم يتم إدخال بطاقة الذاكرة SD
    إذا لم يتم إدخال بطاقة الذاكرة:
        brain.screen.set_cursor(1,1)
        brain.screen.print("بطاقة الذاكرة SD مفقودة")
        while(True):
            wait(5, MSEC)


    : () تُرجع القيمة True إذا تم إدخال بطاقة SD في وحدة المعالجة المركزية.

كتابة البيانات إلى ملف CSV على بطاقة SD

حتى الآن، يستطيع برنامجنا جمع البيانات باستخدام VEX IQ Brain (الجيل الثاني). لإكمال مشروع تسجيل البيانات، نحتاج إلى كتابة البيانات في ملف قيم مفصولة بفواصل (CSV) على بطاقة SD لفحصها وتحليلها في المستقبل.

  • عند كتابة أنواع مختلفة من البيانات إلى ملف CSV، نريد معرفة نوع البيانات التي يحتوي عليها كل عمود. للقيام بذلك، يمكننا إضافة نص رأس ملف CSV إلى قبل تسجيل البيانات.
    أضف الكود لتعريف متغير لتخزين نص رأس ملف CSV لتحديد أسماء ، وتعريف متغير لتخزين اسم ملف CSV المراد كتابته على بطاقة SD.

    csvHeaderText = "time, x, y, z"
    sd_file_name = "myDataPY.csv"

ملاحظة: تأكد من أن الرؤوس بنفس ترتيب البيانات المخزنة في المتغير data_buffer.

  • بعد ذلك، قم بإلحاق نص رأس ملف CSV بالسلسلة data_buffer قبل الحلقة for loop لجمع البيانات.

    # إنشاء رأس ملف CSV
    data_buffer = csvHeaderText + "\n"
    
    # إنشاء بيانات CSV
    for i in range(0, numOfDataEntries):
    
        # أوامر لكتابة البيانات إلى المخزن المؤقت
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
    
        wait(polling_delay_msec, MSEC)
  • قبل كتابة البيانات إلى ملف على بطاقة SD، دعونا نفهم كيفية استخدام وظيفة Brain.sdcard.savefile() أولاً.

    تم تمييز سطر من كود بايثون على شكل أجزاء لشرحه بالتفصيل. يقرأ سطر التعليمات البرمجية brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). أولاً، يتم تمييز قسم brain.sdcard.savefile وتسميته "حفظ مصفوفة بايت في ملف مسمى على بطاقة SD". بعد ذلك، يتم تمييز قسم sd_file_name وتسميته باسم الملف. وأخيرًا، يتم تمييز bytearray(data_buffer, 'utf-8') في النهاية وتسميته Buffer.


    تقوم هذه التعليمات بكتابة البيانات
    ملف CSV مُسمى على بطاقة SD.
    دعونا نشرحها بالتفصيل:

    • Brain.sdcard.savefile(): تحفظ الوظيفة مصفوفة بايت في ملف مسمى على بطاقة SD. ترجع الدالة عدد البايتات المكتوبة إلى الملف.
    • sd_file_name: المعلمة الأولى للوظيفة. يشير إلى اسم الملف المراد كتابته. في هذا المشروع، يتم تخزين اسم الملف في المتغير sd_file_name.
    • bytearray(datat_buffer,'utf-8'): المعلمة الثانية للدالة. يمثل bytearray المراد كتابته في الملف.
      •  
        • bytearray(): تقوم الطريقة بإنشاء bytearray قابل للتغيير. في هذه التعليمات، نستخدمها لتحويل سلسلة إلى مصفوفة بايت عن طريق تحديد التشفير.
        • data_buffer: المعلمة الأولى للطريقة. يشير إلى المصدر المطلوب تحويله إلى bytearray. المصدر في هذا المشروع هو البيانات المخزنة في المتغير data_buffer. 
        • 'utf-8': المعلمة الثانية للطريقة. يشير إلى الترميز المحدد المستخدم لترميز السلسلة. الترميز هو "utf-8" في هذه التعليمات. 
  • بعد للحلقة لجمع البيانات، استخدم الدالة Brain.sdcard.savefile() لكتابة البيانات المخزنة في المتغير data_buffer إلى ملف CSV على بطاقة SD. بالإضافة إلى ذلك، أضف الكود للتحقق من القيمة المرجعة من الدالة brain.sdcard.savefile() للتحقق مما إذا كانت البيانات قد كُتبت في الملف بنجاح وعرض الرسالة المقابلة على شاشة VEX IQ Brain Screen للحصول على تعليقات في الوقت الفعلي.

    # إنشاء بيانات CSV
    for i in range(0, numOfDataEntries):
    
        # أوامر لكتابة البيانات إلى المخزن المؤقت
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
    
        wait(polling_delay_msec, MSEC)
    
    # كتابة البيانات إلى بطاقة SD
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
        brain.screen.print("خطأ في الكتابة على بطاقة SD")
    else:
        brain.screen.print("تمت كتابة البيانات")


    ملاحظة: الدالة brain.sdcard.savefile() تُرجع عدد البايتات المكتوبة في الملف. في هذا المشروع، نستخدمه لكتابة البيانات المجمعة إلى ملف CSV، لذا يجب أن يكون عدد البايتات المكتوبة في الملف أكبر من الصفر. بمعنى آخر، إذا أعادت الدالة brain.sdcard.savefile() القيمة ، فيمكننا أن نستنتج أن البيانات لم تُكتب إلى الملف بنجاح. وإلا، فقد تم كتابة البيانات في الملف.

تهانينا! لقد قمنا بتطوير مشروع تسجيل بيانات يجمع بيانات التسارع باستخدام VEX IQ Brain (الجيل الثاني) ويخزنها في ملف CSV على بطاقة SD. بعد ذلك، سوف نستكشف كيفية فتح ملف CSV لتحليل البيانات. 

# استيراد المكتبات
من vex استيراد *

# يجب تعريف Brain افتراضيًا
brain = Brain()
brain_inertial = Inertial()

csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""

# إيقاف البرنامج مؤقتًا إذا لم يتم إدخال بطاقة SD
if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("بطاقة SD مفقودة")
    while(True):
        wait(5, MSEC)

# إضافة أي مستشعر & كود تهيئة المؤقت هنا
brain.timer.clear()

# إنشاء رأس CSV
data_buffer = csvHeaderText + "\n"

# إنشاء بيانات CSV
for i in range(0, numOfDataEntries):

    # أوامر لكتابة البيانات إلى المخزن المؤقت
    data_buffer += "%1.3f" % brain.timer.value() + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    wait(polling_delay_msec, MSEC)

# كتابة البيانات إلى بطاقة SD
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("خطأ في الكتابة على بطاقة SD")
else:
    brain.screen.print("تمت كتابة البيانات")

 

فتح ملف CSV لتحليل البيانات

بمجرد كتابة البيانات إلى ملف CSV على بطاقة SD، يمكننا استخدام تطبيق جدول البيانات لفتح الملف لقراءة البيانات وتحليلها. 

ملاحظة: اثنان من تطبيقات جداول البيانات الأكثر شيوعًا هما Google Sheets وMicrosoft Excel. في هذه المقالة، سنستخدم جداول بيانات Google (المستندة إلى الويب) لفتح ملف CSV على بطاقة SD. عملية استخدام التطبيقات الأخرى مشابهة.

  • قم بإزالة بطاقة SD من فتحة بطاقة SD الخاصة بجهاز VEX IQ Brain. إذا كان الكمبيوتر يحتوي على فتحة بطاقة Micro SD مدمجة، فيمكننا إدخال بطاقة SD مباشرة في تلك الفتحة. بخلاف ذلك، أدخل بطاقة SD في محول بطاقة SD ثم قم بتوصيل المحول بالكمبيوتر. 
  • قم بتسجيل الدخول إلى حساب Google الخاص بنا وافتح جداول بيانات Google. إنشاء جدول بيانات جديد.
  • في جدول البيانات، افتح القائمة "ملف" ، وحدد "استيراد" -> "تحميل" -> "تصفح" ، ثم اختر ملف CSV على جهاز الكمبيوتر. بعد تحميل ملف CSV، انقر فوق الزر "استيراد البيانات". بعد استيراد البيانات، انقر فوق "فتح الآن" لرؤية البيانات المجمعة في ملف CSV.

    تم فتح بيانات المشروع بصيغة CSV في مستند جداول بيانات جوجل. يوجد أربعة أعمدة تقرأ الوقت، س، ص، ع. وهناك العديد من صفوف البيانات التي توثق التسارع عند كل طابع زمني.

  • (اختياري) إحدى الطرق السهلة لتحليل البيانات هي رسم رسم بياني، ثم البحث عن الاتجاهات في البيانات. في جدول البيانات، افتح القائمة "إدراج" وحدد "مخطط" لرسم رسم بياني باستخدام البيانات الموجودة في ملف CSV. الرسم البياني التالي هو نتيجة بيانات التسارع التي تم جمعها باستخدام VEX IQ Brain (الجيل الثاني).

    تم فتح مخطط البيانات في جداول بيانات جوجل، والذي يوضح تسارع المحاور X و Y و Z بمرور الوقت. تبقى قيمة Z قريبة من سالب واحد، وتبقى قيمتا X و Y قريبتين من الصفر.


    : يمكننا استخدام محرر المخططات لاختيار نوع مخطط مختلف أو تعديل المخطط بناءً على احتياجاتنا.

حتى هذه اللحظة، انتهينا من مشروع تسجيل البيانات الذي يجمع البيانات باستخدام VEX IQ Brain (الجيل الثاني) ويحفظها في ملف CSV على بطاقة SD. لقد تعلمنا أيضًا كيفية قراءة ملف CSV الموجود على بطاقة SD باستخدام جداول بيانات Google وحتى إنشاء رسم بياني لمزيد من التحليل. ماذا بعد؟ دعونا نحاول التخطيط لتجارب أكثر إثارة باستخدام VEX Robot لتسجيل البيانات، لمراقبة كيفية تأثير العوامل البيئية المتغيرة على أنواع مختلفة من البيانات والحصول على فهم أعمق للعالم من حولنا.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: