إنشاء وحدة تحكم اللعبة الخاصة بك

مصدر الإلهام


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


تم نشر برنامج تعليمي من Arduino على موقع الويب الخاص باللعبة مع وصف لبروتوكول الاتصال لوحدات التحكم هذه.

أريد إنشاء نفسه للعبة الخاصة بي

في هذا المثال ، سوف أنفق حوالي 40 دولارًا لإضافة رموز تبديل جميلة وكبيرة وثقيلة إلى قمرة القيادة لمحاكي سباق. ترتبط التكاليف الرئيسية بهذه المفاتيح - إذا كنت تستخدم مفاتيح / أزرار بسيطة ، فإن السعر سيكون نصف هذا المبلغ! هذه هي معدات حقيقية يمكنها تحمل 240 واط من الطاقة ، وسأسمح فقط بحوالي 0.03 واط منها.

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

المكونات الرئيسية






أدوات مميزة



البرمجيات


  • اردوينو IDE لبرمجة معالج اردوينو
  • لإنشاء وحدة تحكم تظهر كوحدة تحكم / ذراع تحكم USB حقيقي للأجهزة:
  • لإنشاء وحدة تحكم تتصل بها اللعبة مباشرة ( أو تظهر كوحدة تحكم / عصا تحكم USB افتراضية )
    • مكتبة ois_protocol الخاصة بي على جيثب
    • برنامج تشغيل VJoy إذا كنت تريد استخدام وحدة التحكم كوحدة تحكم / عصا تحكم USB افتراضية.

تحذير


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

بالنسبة لي كان مشروعًا تدريبيًا ، لذا فقد تكون لديه نصيحة أو أخطاء سيئة!

الجزء 1. وضع وحدة تحكم معا!


نحن نعمل مع مفاتيح دون وثائق ...


كما هو مذكور أعلاه ، يمكنني شراء قطع غيار رخيصة من تاجر تجزئة منخفض الهامش ، لذا فإن أول شيء فعله هو معرفة كيفية عمل هذه المفاتيح / الأزرار.

بسيطة الضغط على زر / التبديل


باستخدام الزر ، كل شيء بسيط - لا توجد مصابيح LED فيه ولا يوجد سوى جهة اتصال واحدة. التبديل المتعدد إلى وضع الاستمرارية / الطلب ( ) ولمس تحقيقات جهات الاتصال المختلفة - سيتم عرض OL (حلقة مفتوحة ، دائرة مفتوحة) على الشاشة: هذا يعني أنه لا يوجد اتصال بين التحقيقين. ثم نضغط على الزر ، مع الاستمرار في لمس مجسات الاتصال - شيء مثل 0.1Ω ، يجب أن يظهر الآن على الشاشة وسيبدأ المتر المتعدد في إصدار صوت تنبيه ( مما يشير إلى وجود مقاومة منخفضة للغاية بين المجسات - دائرة مغلقة ).

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

نحن ربط التبديل إلى اردوينو


ابحث عن اثنين من المسامير على لوحة Arduino: المسمى GND والمسمى "2" (أو أي رقم تعسفي آخر - وهما دبابيس I / O للأغراض العامة التي يمكننا التحكم فيها من خلال البرنامج).

إذا قمنا بتوصيل المفتاح بهذه الطريقة ، ثم طلبنا من Arduino تكوين دبوس "2" باعتباره دبوس INPUT ، سنحصل على الدائرة الموضحة على اليسار (في الشكل أدناه). عند الضغط على الزر ، سيتم توصيل pin 2 مباشرة بالأرض / 0V ، وعند الضغط عليه ، لن يتم توصيل pin 2 بأي شيء. تسمى هذه الحالة ( غير مرتبطة بأي شيء ) "عائمة" (حالة مقاومة عالية) ، وللأسف ، هذه ليست حالة جيدة للغاية لأغراضنا. عندما نقرأ بيانات من جهة اتصال في البرنامج ( باستخدام digitalRead (2) ) ، نحصل على LOW إذا تم تأسيس جهة الاتصال ، ونتيجة غير متوقعة (LOW أو HIGH) إذا كانت جهة الاتصال عائمة!

لإصلاح ذلك ، يمكننا تهيئة جهة الاتصال لتكون في وضع INPUT_PULLUP ، الذي يتصل بالمقاوم داخل المعالج ويقوم بإنشاء الدائرة الموضحة على اليمين. في هذه الدائرة ، مع فتح المفتاح ، يكون للطرف 2 مسار + 5V ، لذلك عند قراءته ، ستكون النتيجة عالية دائمًا. عندما يكون المفتاح مغلقًا ، سيظل للمسام مسار ذو مقاومة عالية لـ + 5V ، بالإضافة إلى مسار بدون مقاومة للأرض / 0V ، والذي "يفوز" ، لذلك عندما نقرأ جهة الاتصال ، نحصل على LOW.


بالنسبة إلى مطوري البرامج ، قد يبدو الأمر عكسيًا - عندما نضغط على الزر ، نقرأ false / LOW ، وعند الاكتئاب ، نقرأ true / HIGH.

يمكنك القيام بالعكس ، لكن المعالج يحتوي فقط على مقاومات سحب مدمجة ولا توجد مقاومات قابلة للسحب ، لذلك سنلتزم بهذا الطراز.

إن البرنامج الأبسط لبرنامج Arduino ، الذي يقرأ حالة التبديل ويخبر الكمبيوتر عن حالته ، يبدو مثل البرنامج الموضح أدناه. يمكنك النقر فوق الزر "تنزيل" في Arduino IDE ثم فتح "المسلسل مراقب" (في قائمة "أدوات") لمشاهدة النتائج.

void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); } void loop() { int state = digitalRead(pin); Serial.println( state == HIGH ? "Released" : "Pressed" ); delay(100);//artifically reduce the loop rate so the output is at a human readable rate... } 

رموز التبديل الأخرى بدون وثائق تقريبًا ...


ثلاثة دبوس التبديل الصمام


لحسن الحظ ، توجد علامات لثلاث جهات اتصال على المفاتيح الرئيسية للوحة:


لست متأكدًا تمامًا من الطريقة التي يعمل بها ، لذلك سنقوم بتغيير المقياس المتعدد مرة أخرى إلى الوضع المستمر ولمس جميع أزواج جهات الاتصال عند تشغيل المفتاح وإيقاف تشغيله ... ومع ذلك ، لا يصدر صوت المتردد هذه المرة على الإطلاق عندما نلمس تحقيقات [GND] و [+] بـ " التبديل على! التكوين الوحيد الذي يصدر صوت تنبيه متعدد المقاييس ( يكتشف اتصالًا ) هو عندما يكون المفتاح "قيد التشغيل" وتكون التحقيقات في [+] و [مصباح].

يمنع مصباح LED الموجود داخل المفتاح قياسات الاستمرارية ، لذا من الاختبارات المذكورة أعلاه ، يمكننا افتراض أن مؤشر LED متصل مباشرة بـ pin [GND] وليس بجهات الاتصال [+] و [المصباح]. بعد ذلك ، سوف نقوم بالتبديل المتعدد إلى وضع اختبار الصمام الثنائي (الرمز ) وتحقق من زوج جهات الاتصال مرة أخرى ، ولكن هذه المرة يعد الاستقطاب مهمًا ( مسبار أحمر وأسود ). الآن إذا قمنا بتوصيل المجس الأحمر بـ [مصباح] ، والأسود بـ [GND] ، فسيضيء مؤشر LED وسيظهر 2.25 فولت على المتر المتعدد. هذا هو الجهد المباشر للديود ، أو الحد الأدنى للجهد المطلوب لتشغيله. بغض النظر عن موضع التبديل ، يؤدي 2.25V من [المصباح] إلى [GND] إلى إضاءة المصباح. إذا قمنا بتوصيل المسبار الأحمر بـ [+] ، والسود بـ [GND] ، فسيضيء المصباح فقط عند تشغيل المفتاح.

من هذه القراءات ، يمكننا أن نفترض أن الدواخل الداخلية لهذا المفتاح تبدو شبيهة بالشكل التالي:

  1. [+] و [المصباح] عبارة عن دائرة قصيرة عندما يكون المفتاح في وضع التشغيل / مغلق.
  2. يضيء مصباح LED دائمًا بجهد إيجابي من [المصباح] إلى [GND].
  3. يعمل الجهد الإيجابي من [+] إلى [GND] على إضاءة المصباح فقط عندما يكون المفتاح قيد التشغيل / مغلقًا.



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

نحن ربط التبديل إلى اردوينو


أسهل طريقة هي استخدام رمز التبديل مع Arduino ، وتجاهل دبوس [المصباح]: توصيل [GND] بـ GND في Arduino وتوصيل [+] بأحد جهات اتصال Arduino المُرقمة ، على سبيل المثال 3.

إذا قمنا بتكوين الرقم 3 على أنه INPUT_PULLUP ( كما في الزر السابق ) ، فسنحصل على النتيجة الموضحة أدناه. يُظهر الجزء العلوي الأيسر القيمة التي نتلقاها من خلال تنفيذ "digitalRead (3)" في كود Arduino.

عندما يكون المفتاح قيد التشغيل / مغلقًا ، نقرأ LOW ويضيء المصباح! لاستخدام رمز التبديل هذا في هذا التكوين ، يمكننا استخدام نفس رمز Arduino كما في مثال الزر.


مشاكل هذا الحل


بعد الاتصال بـ Arduino ، تبدو الدائرة الكاملة كما يلي:


ومع ذلك ، هنا يمكننا أن نرى أنه عندما يكون المفتاح مغلقًا ، بالإضافة إلى المقاوم صغير الحد الحالي أمام LED (أفترض أن مقاومته 100 أوم) ، هناك أيضًا مقاوم سحب يصل إلى 20 كيلو أوم ، مما يقلل من كمية التيار المتدفقة عبر LED. هذا يعني أنه على الرغم من أن الدائرة تعمل ، فلن يكون مصباح LED ساطعًا.

عيب آخر في هذا المخطط هو أننا لا نملك تحكمًا في برنامج LED - يتم تشغيله عند تشغيل المفتاح ، وتعطيله في الحالة المقابلة.

يمكنك أن ترى ما يحدث إذا وصلنا [مصباح] دبوس إما 0V أو + 5V.

إذا كان [المصباح] متصلاً بـ 0V ، فسيتم إيقاف تشغيل مؤشر LED باستمرار ( بغض النظر عن موضع المفتاح ) ، ولا يزال التعرف على موضع Arduino قيد التنفيذ. هذا يتيح لنا تعطيل LED برمجيًا!


إذا كان [المصباح] متصلًا بـ + 5V ، فسيظل مؤشر LED قيد التشغيل باستمرار ( بغض النظر عن موضع المفتاح ) ، ومع ذلك ، يتم التعرف على موضع Arduino - سيتم دائمًا قراءة HIGH من جهة الاتصال.


نربط هذا التحول إلى اردوينو بشكل صحيح


يمكننا التغلب على القيود الموضحة أعلاه ( التيار المنخفض / سطوع مؤشر LED ونقص التحكم في البرنامج على مؤشر LED ) من خلال كتابة المزيد من التعليمات البرمجية! لحل التعارض بين القدرة على التحكم في مؤشر LED والتعرف على الموضع الذي تم كسره بسببه ، يمكننا فصل المهمتين في الوقت المناسب ، أي إيقاف مؤشر LED مؤقتًا عند قراءة جهة اتصال المستشعر (3).

أولاً ، قم بتوصيل دبوس [المصباح] بدبوس Arduino آخر للأغراض العامة ، على سبيل المثال ، إلى 4 بحيث يمكنك التحكم في المصباح.

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

 int pinSwitch = 3; int pinLed = 4; void setup() { //connect to the PC Serial.begin(9600); //connect our switch's [+] connector to a digital sensor, and to +5V through a large resistor pinMode(pinSwitch, INPUT_PULLUP); //connect our switch's [lamp] connector to 0V or +5V directly pinMode(pinLed, OUTPUT); } void loop() { int lampOn = (millis()>>8)&1;//make a variable that alternates between 0 and 1 over time digitalWrite(pinLed, LOW);//connect our [lamp] to +0V so the read is clean int state = digitalRead(pinSwitch); if( lampOn ) digitalWrite(pinLed, HIGH);//connect our [lamp] to +5V Serial.println(state);//report the switch state to the PC } 

في Arduino Mega ، يمكن أن تستخدم المسامير 2-13 و 44-46 وظيفة analogWrite ، التي لا تولد فعلًا الجهد من 0V إلى + 5V ، ولكنها تقاربها باستخدام موجة مربعة. إذا كنت ترغب في ذلك ، يمكنك استخدامه للسيطرة على سطوع LED! هذا الكود سوف يجعل النبض خفيفًا ، وليس وميضًا فقط:

 void loop() { int lampState = (millis()>>1)&0xFF;//make a variable that alternates between 0 and 255 over time digitalWrite(pinLed, LOW);//connect our [lamp] to +0V so the read is clean int state = digitalRead(pinSwitch); if( lampState > 0 ) analogWrite(pinLed, lampState); } 

نصائح التجميع


المشاركة كبيرة جدًا بالفعل ، لذا لن أضيف البرنامج التعليمي الخاص باللحام ، يمكنك google ذلك!

ومع ذلك ، سأقدم النصائح الأساسية:

  • عند توصيل الأسلاك بأطراف معدنية كبيرة ، تأكد أولاً من أن مكواة اللحام ساخنة وتسخن الملامسة المعدنية لفترة من الوقت. معنى اللحام هو تكوين مفصل دائم عن طريق إنشاء سبيكة ، ولكن إذا كان جزء واحد فقط من المفصل حارًا ، فيمكنك بسهولة الحصول على "مفصل بارد" يبدو وكأنه مفصل ، ولكنه غير متصل بالفعل.
  • عند توصيل الأسلاك ، قم أولاً بوضع قطعة من الأنابيب التي تقلص الحرارة على أحدهما - بعد الاتصال ، لا يمكن وضع الأنابيب. يبدو هذا واضحًا ، لكنني أنسى ذلك دائمًا وأضطر إلى استخدام شريط كهربائي بدلاً من الأنبوب ... اسحب أنبوب الانكماش بعيدًا عن الاتصال حتى لا يتم تسخينه في وقت مبكر. بعد التحقق من الاتصال الملحوم ، حرك الأنبوب عليه وقم بتسخينه.
  • إن أسلاك التوصيل الصغيرة الرفيعة التي ذكرتها في البداية مناسبة تمامًا للاتصالات التي لا تحتوي على لحام (على سبيل المثال ، عند الاتصال بـ Arduino!) ، ولكنها هشة إلى حد ما. بعد اللحام ، استخدم مسدس الغراء لإصلاحها وإزالة جميع الضغوط من الاتصال نفسه. على سبيل المثال ، يمكن سحب الأسلاك الحمراء في الصورة أدناه بطريق الخطأ أثناء التشغيل ، لذلك بعد اللحام قمت بتثبيتها بنقطة من الغراء الساخن:


الجزء 2. نحول الجهاز إلى وحدة تحكم لعبة!


لكي يتعرف نظام التشغيل على الجهاز كوحدة تحكم في ألعاب USB ، فأنت بحاجة إلى رمز بسيط إلى حد ما ، ولكن لسوء الحظ ، تحتاج أيضًا إلى استبدال البرامج الثابتة لشرائح Arduino USB بواحدة أخرى ، والتي يمكن اتخاذها هنا: https://github.com/harlequin-tech/arduino-usb .

ولكن بعد تحميل هذه البرامج الثابتة إلى Arduino ، يصبح الجهاز عصا تحكم USB ويتوقف عن كونه Arduino. لذلك ، لإعادة برمجة ذلك ، تحتاج إلى إعادة وميض برنامج Arduino الأصلي الثابت. هذه التكرارات مؤلمة تمامًا - قم بتحميل كود Arduino ، وفحص برنامج جويستيك الثابت ، واختبر ، وقم ببرمجة برنامج arduino الثابت ، كرر ...

يظهر أدناه مثال لبرنامج Arduino الذي يمكن استخدامه مع هذه البرامج الثابتة - حيث يقوم بتكوين ثلاثة أزرار كمدخلات ، وقراءة قيمها ، ونسخ القيم إلى بنية البيانات المتوقعة من قبل هذه البرامج الثابتة ، ثم إرسال البيانات. يغسل والصابون ، كرر.

 // define DEBUG if you want to inspect the output in the Serial Monitor // don't define DEBUG if you're ready to use the custom firmware #define DEBUG //Say we've got three buttons, connected to GND and pins 2/3/4 int pinButton1 = 2; int pinButton2 = 3; int pinButton3 = 4; void setup() { //configure our button's pins properly pinMode(pinButton1, INPUT_PULLUP); pinMode(pinButton2, INPUT_PULLUP); pinMode(pinButton3, INPUT_PULLUP); #if defined DEBUG Serial.begin(9600); #else Serial.begin(115200);//The data rate expected by the custom USB firmware delay(200); #endif } //The structure expected by the custom USB firmware #define NUM_BUTTONS 40 #define NUM_AXES 8 // 8 axes, X, Y, Z, etc typedef struct joyReport_t { int16_t axis[NUM_AXES]; uint8_t button[(NUM_BUTTONS+7)/8]; // 8 buttons per byte } joyReport_t; void sendJoyReport(struct joyReport_t *report) { #ifndef DEBUG Serial.write((uint8_t *)report, sizeof(joyReport_t));//send our data to the custom USB firmware #else // dump human readable output for debugging for (uint8_t ind=0; ind<NUM_AXES; ind++) { Serial.print("axis["); Serial.print(ind); Serial.print("]= "); Serial.print(report->axis[ind]); Serial.print(" "); } Serial.println(); for (uint8_t ind=0; ind<NUM_BUTTONS/8; ind++) { Serial.print("button["); Serial.print(ind); Serial.print("]= "); Serial.print(report->button[ind], HEX); Serial.print(" "); } Serial.println(); #endif } joyReport_t joyReport = {}; void loop() { //check if our buttons are pressed: bool button1 = LOW == digitalRead( pinButton1 ); bool button2 = LOW == digitalRead( pinButton2 ); bool button3 = LOW == digitalRead( pinButton3 ); //write the data into the structure joyReport.button[0] = (button1?0x01:0) | (button2?0x02:0) | (button3?0x03:0); //send it to the firmware sendJoyReport(joyReport) } 

الجزء 3. ندمج الجهاز مع لعبتنا!


إذا كنت تتحكم في اللعبة التي يجب أن يتفاعل معها الجهاز ، يمكنك كبديل أن تتصل بوحدة التحكم مباشرةً - ليست هناك حاجة لجعلها مرئية لنظام التشغيل كجويستيك! في بداية المنشور ، ذكرت الكائنات في الفضاء. هذا هو النهج الذي يستخدمه مطوروها. قاموا بإنشاء بروتوكول اتصال ASCII بسيط يسمح وحدة التحكم واللعبة للتواصل مع بعضها البعض. ما عليك سوى سرد المنافذ التسلسلية للنظام ( فهي منافذ COM على نظام Windows ؛ بالمناسبة ، انظر إلى كيف تبدو فظيعة في C ) ، وابحث عن المنفذ الذي يتصل به الجهاز المسمى "Arduino" ، وابدأ في قراءة / كتابة ASCII من هذا الرابط.

من جانب Arduino ، نستخدم فقط وظائف Serial.print التي تم استخدامها في الأمثلة أعلاه.

في بداية هذا المنشور ، ذكرت أيضًا مكتبتي لحل هذه المشكلة: https://github.com/hodgman/ois_protocol .

يحتوي على رمز C ++ يمكن دمجه في اللعبة واستخدامه كـ "خادم" ، وكود Arduino الذي يمكن تنفيذه في وحدة التحكم لاستخدامه ك "عميل".

تخصيص اردوينو


في example_hardware.h ، قمت بإنشاء فئات لتجريد أزرار فردية / أزرار الاختيار ؛ على سبيل المثال ، "Switch" عبارة عن زر بسيط من المثال الأول. و "LedSwitch2Pin" هو مفتاح ذو مؤشر LED مسيطر عليه من المثال الثاني.

نموذج التعليمة البرمجية لشريط الأزرار الخاص بي في example.ino .

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

 #include "ois_protocol.h" //instantiate the library OisState ois; //inputs are values that the game will send to the controller struct { OisNumericInput myLedInput{"Lamp", Number}; } inputs; //outputs are values the controller will send to the game struct { OisNumericOutput myButtonOutput{"Button", Boolean}; } outputs; //commands are named events that the controller will send to the game struct { OisCommand quitCommand{"Quit"}; } commands; int pinButton = 2; int pinLed = 3; void setup() { ois_setup_structs(ois, "My Controller", 1337, 42, commands, inputs, outputs); pinMode(pinButton, INPUT_PULLUP); pinMode(pinLed, OUTPUT); } void loop() { //read our button, send it to the game: bool buttonPressed = LOW == digitalRead(pin); ois_set(ois, outputs.myButtonOutput, buttonPressed); //read the LED value from the game, write it to the LED pin: analogWrite(pinLed, inputs.myLedInput.value); //example command / event: if( millis() > 60 * 1000 )//if 60 seconds has passed, tell the game to quit ois_execute(ois, commands.quitCommand); //run the library code (communicates with the game) ois_loop(ois); } 

تخصيص اللعبة


تتم كتابة رمز اللعبة بأسلوب "رأس واحد". لاستيراد المكتبة ، قم بتضمين oisdevice.h في اللعبة.

في ملف CPP واحد ، قبل تنفيذ رأس #include ، اكتب #define OIS_DEVICE_IMPL و #define OIS_SERIALPORT_IMPL - سيؤدي هذا إلى إضافة التعليمات البرمجية المصدر للفئات إلى ملف CPP. إذا كانت لديك بياناتك الخاصة أو تسجيل الدخول أو السلاسل أو المتجهات ، فهناك العديد من وحدات OIS_ * الأخرى التي يمكنك تعريفها قبل استيراد الرأس للاستفادة من إمكانيات المحرك.

لسرد منافذ COM وإنشاء اتصال بجهاز معين ، يمكنك استخدام الكود التالي:

 OIS_PORT_LIST portList; OIS_STRING_BUILDER sb; SerialPort::EnumerateSerialPorts(portList, sb, -1); for( auto it = portList.begin(); it != portList.end(); ++it ) { std::string label = it->name + '(' + it->path + ')'; if( /*device selection choice*/ ) { int gameVersion = 1; OisDevice* device = new OisDevice(it->id, it->path, it->name, gameVersion, "Game Title"); ... } } 

بعد تلقي مثيل OisDevice ، تحتاج إلى الاتصال بانتظام بوظيفة عضو Poll (على سبيل المثال ، في كل إطار) ، يمكنك الحصول على الحالة الحالية لمخرج وحدة التحكم باستخدام DeviceOutputs () ، واستخدام أحداث الجهاز باستخدام PopEvents () وإرسال قيم إلى الجهاز باستخدام SetInput ().

يمكن العثور على تطبيق مثال يفعل كل هذا هنا: example_ois2vjoy / main.cpp .

الجزء 4. ماذا لو أردت الجزأين 2 و 3 في نفس الوقت؟


لكي تعمل وحدة التحكم في الألعاب الأخرى (الجزء 2) ، تحتاج إلى تثبيت البرامج الثابتة الخاصة بك وبرنامج Arduino واحد ، ولكن لكي تكون وحدة التحكم مبرمجة بالكامل من قبل اللعبة ، استخدمنا البرامج الثابتة القياسية Arduino وبرنامج Arduino آخر. لكن ماذا لو أردنا الحصول على كلا الاحتمالين في نفس الوقت؟

نموذج التطبيق الذي أعطيته الرابط أعلاه ( ois2vjoy ) يحل هذه المشكلة.

يتصل هذا التطبيق بجهاز OIS (البرنامج من الجزء 3) ، ثم يقوم الكمبيوتر بتحويل هذه البيانات إلى بيانات جهاز التحكم / ذراع التحكم العادية ، والتي يتم نقلها بعد ذلك إلى جهاز التحكم / ذراع التحكم الظاهري . هذا يعني أنه يمكنك السماح لوحدة التحكم الخاصة بك باستخدام مكتبة OIS باستمرار (لا يلزم وجود برامج ثابتة أخرى) ، وإذا أردنا استخدامها كوحدة تحكم / ذراع تحكم عادية ، فقم فقط بتشغيل تطبيق ois2vjoy على جهاز الكمبيوتر ، الذي يقوم بإجراء التحويل.

الجزء 5. الانتهاء


آمل أن يكون شخص ما قد وجد هذه المقالة مفيدة أو ممتعة شكرا لك على القراءة حتى النهاية!

إذا كنت فضوليًا ، فأنا أدعوك للمشاركة في تطوير مكتبة ois_protocol ! أعتقد أنه سيكون من الرائع تطوير بروتوكول واحد لدعم جميع أنواع أجهزة التحكم المنزلية الصنع في الألعاب وتشجيع الألعاب على دعم أجهزة التحكم المنزلية مباشرةً.

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


All Articles