التحكم التفاعلي في Unity عن طريق مستشعر EMG اكتب تعليقُا

تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث الحرائق أو غيرها لا سمح الله.

شرح فكرة المشروع

في هذا المشروع نستخدم مستشعر EMG لقراءة إشارات العضلات وربطها مع Unity لصنع تجربة تفاعلية واقعية.
بالسابق كان يتم استخدام مكتبه Serial Port للتواصل مع Arduino، لكن التحديثات الأخيرة في Unity لم تعد تدعمه بشكل مباشر.
لذلك تُعد حزمة Uduino الخيار الأنسب حاليًا، فهي مدعومة، سهلة الربط، ومتوفر منها إصدار مدفوع عبر الرابط  التالي  كما ان الحزمة تحتوي الى  دعم فني وشرح مفصل بعد شرائها ولكن تدعم فقط اصدار يونيتي 2022.1.0b3

💡 مهم: هذا المشروع موجّه للمستوى المبتدئ، حيث يركّز على إنشاء قاعدة بسيطة (rule-based) يمكن البناء عليها. لا يشمل المشروع تعقيدات الذكاء الاصطناعي أو نماذج التعلم من البيانات أو واجهات خلفية متقدمة، كما هو الحال في المشاريع الاحترافية التي تتعامل مع أنماط انقباض العضلات وتحليلها بذكاء , الهدف هنا هو تقديم نموذج بسيط وفعّال لتطبيق الفكرة وفهم آلية الربط بين الأجهزة والبرمجيات.

هذا المشروع يُعدّ نقطة انطلاق ممتازة لتعلّم كيفية إرسال البيانات من العالم الحقيقي إلى Unity، مما يمكّنك مستقبلاً من تطوير تطبيقات صحية، تعليمية، ترفيهية، وحتى تفاعلية متقدمة

أدوات المشروع

  • اردوينو اونو R3 مع سلك توصيل Arduino Uno: عدد 1
  • أسلاك توصيل من ذكر إلى أنثى 40 دبوس 20 سم wires 40pcs Male to Female
  • مستشعر EMG ، مستشعر إشارة العضلات ، EMG ،

مخطط المشروع

الكود البرمجي

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

 أولاً: قسم Arduino

 الوظيفة:

  • قراءة الإشارة القادمة من مستشعر EMG من المنفذ A0.
  • إرسال القيمة إلى Unity عند كل طلب.

⚠️ ملاحظة مهمة:

قبل البدء بالتفاعل، يجب على كل مستخدم قياس الإشارة في حالتين:

  1. عند استرخاء اليد (دون أي حركة)، وتسجيل القيمة الناتجة.
  2. عند انقباض العضلة المستهدفة (مثل عضلة لف المعصم أو قبض الإصبع)، وتسجيل القيمة الجديدة.

لا توجد قيمة ثابتة لجميع المستخدمين، ولكن عادةً:

  • في حالة الاسترخاء: تتراوح القيم بين 200 إلى 400.
  • في حالة الانقباض: قد تصل القيم إلى 500 أو حتى 800.

    معلومة إضافية عن الكود:

في كود الأردوينو، يتم تعريف اسم اللوحة بعبارة : Uduino uduino(“board1“); إذا تم تغيير هذا الاسم، يجب تعديله أيضًا في كود Unity ليتطابق، حتى يتمكن النظام من التواصل بشكل صحيح بين الطرفين.

#include
Uduino uduino("Board1");
void setup() {
uduino.init();
uduino.addCommand("readEMG", []() {
int val = analogRead(A0);
uduino.println(val);
});
}
void loop() {
uduino.update();
}

 ثانياً: قسم Unity

بعد تحميل مكتبة Udino من متجر Unity، قم بعمل Import لها إلى مشروعك. ثم تابع نفس خطوات الفيديو المرفق لتفعيل الاتصال بين Unity ولوحة Arduino، واستقبال البيانات الحيوية من مستشعر EMG، وربطها بردود فعل تفاعلية داخل اللعبة أو المحاكاة.

💡 شرح وظيفة الكود:

الكود يستقبل إشارات العضلات القادمة من مستشعر EMG , وعندما تتجاوز الإشارة القيمة الحدية (threshold) التي قام المستخدم بتحديدها مسبقاً (بناءً على قياسه لحالة الاسترخاء والانقباض)، يقوم الكود بتحريك الكائن داخل Unity نحو اليسار.

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

🛠️ ويمكنك التعديل على الكود بكل سهولة، مثل:

  • تغيير اتجاه الحركة (يمين، أعلى، إلخ).
  • إضافة مؤثرات صوتية أو ضوئية.
  • ضبط حساسية التفاعل لتناسب إشارات عضلات كل مستخدم

using UnityEngine;
using Uduino;
public class EMGController : MonoBehaviour
{
public int threshold = 500; // This value depends on your own muscle reading
public GameObject targetObject; // The object you want to move
public float moveDistance = 1.0f; // How far to move left
private bool triggered = false;
void Start()
{
UduinoManager.Instance.OnValueReceived += OnEMG;
}
void Update()
{
UduinoManager.Instance.Read("Board1", "readEMG");
}
void OnEMG(string data, string board)
{
int emg = int.Parse(data);
Debug.Log("EMG Reading: " + emg);
if (emg > threshold && !triggered)
{
triggered = true;
Debug.Log("Muscle contracted! Moving object to the left.");
targetObject.transform.position += Vector3.left * moveDistance;
}
else if (emg < threshold)
{
triggered = false; // Allow triggering again after muscle relaxes
}
}

}

⚠️ تنبيهات بالمشاكل الشائعة في المشروع:

  1. عدم ظهور قراءات من المستشعر في Unity:
    • تأكّد أن منفذ USB (COM) المُستخدم في الكود هو نفس المنفذ الظاهر في Arduino IDE.
    • جرّب فتح منفذ السيريال عبر Serial Monitor في Arduino أولاً للتأكد من أن المستشعر يعمل فعليًا قبل فتحه من Unity
  2. القراءات غير ثابتة أو متذبذبة بشكل غريب:
    • تأكّد أن لاصقات مستشعر EMG موضوعة بإحكام على الجلد، وعلى أماكن العضلات الصحيحة.
    • تجنّب الحركة الزائدة أو ملامسة الأسلاك أثناء التجربة لأنها تسبب ضجيجًا كهربائيًا (noise).
  3. Unity يتجمّد أو يظهر خطأ عند تشغيل المشروع:
    • قد يكون السبب أنك لم تغلق منفذ السيريال بشكل صحيح بعد الاستخدام. تأكّد من تنفيذ sp.Close() في OnApplicationQuit().
  4. عدم التوافق بين مكتبة Uduino وإصدار Unity:
    • بعض إصدارات Unity الحديثة تغيّرت فيها طريقة التعامل مع التوصيل الخارجي. استخدم الإصدار الذي تم اختباره في الشرح (مثلاً Unity 2022.1b03) لتجنب مشاكل التوافق.
  5. عدم تطابق اسم البورد في Unity مع الكود في Arduino:
    • إذا قمت بتغيير اسم البورد في كود الأردوينو Uduino(“board1”)، يجب تغييره في Unity أيضًا حتى يتم التعرّف عليه.
  6. عدم إرسال البيانات بسبب خلل في الأسلاك أو Breadboard:
    • استبدل الأسلاك وجرب تغيير موقع التوصيل في الـBreadboard.
    • تحقق من أن الجهد الكهربائي (VCC وGND) متصلان بشكل صحيح 14.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *