يحتوي هذا المقال على روابط تسويق بالعمولة مُعلَّمة بعلامة *. بصفتي شريكًا في برنامج Amazon Associates، أربح من عمليات الشراء المؤهلة، دون أي تكلفة إضافية عليك. يساعد ذلك على إبقاء الشروحات مجانية.

سلسلة OmArm One
- الجزء 1: البناء والاستاتيكا والحمولة.
- الجزء 1.5: حرّك الذراع بيد تحكم ألعاب (هذا المقال).
- الجزء 2: التوأم الرقمي، وURDF في RViz وGazebo.
- الجزء 3: MoveIt 2 على العتاد الحقيقي (قريبًا).
- الجزء 4: الالتقاط والوضع بالرؤية الحاسوبية (قريبًا).
- الجزء 5: الذكاء الاصطناعي: الإمساك بالأشياء بالاسم وبالصوت (قريبًا).
هذا فصل إضافي بين مرحلة البناء والتوأم الرقمي. تحتاج إلى ذراع OmArm One مكتملة من الجزء 1 (أو أي ذراع بإلكترونيات ESP32 ولوحة قيادة السيرفو PCA9685 نفسها) وإلى يد تحكم ألعاب تعمل بالبلوتوث. لا توجد توصيلات جديدة.
في الجزء 1 حصلت الذراع على تطبيق ويب. تُنشئ لوحة ESP32 الموجودة في القاعدة شبكة واي فاي خاصة بها، فتفتح صفحة على هاتفك، وتحرّك سبعة أشرطة تمرير (Sliders) المفاصلَ الستة والقابض. هذه هي الأداة المناسبة لإعداد الذراع: ترى الأرقام، ويمكنك كتابة وضعية، ويمكنك أن تخبر البرنامج الثابت بموضع الذراع بعد انقطاع الطاقة. لكنها الأداة الخاطئة للقيادة. فشريط التمرير يحدد موضعًا: تسحبه فيتبع المفصل إصبعك. تراقب الشاشة بدل الذراع، ولا يحرّك الإبهام إلا مفصلًا واحدًا في كل مرة، وعندما تُقفل شاشة الهاتف تفقد السيطرة على الذراع.
يد تحكم الألعاب تتجنب هذه المشكلات. فعصا التحكم تحدد سرعة: ادفعها قليلًا فيدور المفصل ببطء، وادفعها أكثر فيدور أسرع، واتركها فيكبح حركته. تحرّك العصوان أربعة مفاصل في الوقت نفسه، وتحرّك أزرار الاتجاهات (D-pad) مفصلَي المعصم، ويشغّل الزرّان R1 وR2 القابض، وتبقى عيناك على الذراع. ولأن يد التحكم تتصل بلوحة ESP32 مباشرة عبر البلوتوث، فلا حاجة إلى تشغيل أي شيء آخر أثناء القيادة: لا هاتف ولا حاسوب محمول.


يد التحكم في الصور هي DualShock 3 الخاصة بجهاز PlayStation 3، لأنني كنت أحتفظ بواحدة منها في أحد الأدراج. ويعمل البرنامج الثابت أيضًا مع أيدي تحكم أخرى: فأيدي PS4 وPS5 وXbox وSwitch Pro ومعظم أيدي التحكم من الشركات الأخرى تعمل بالكود نفسه وبتعيين الأزرار نفسه. وحدها DualShock 3 تحتاج إلى خطوة اقتران إضافية، ولهذه الخطوة قسم خاص بها.
نظرة سريعة
ما ستبنيه: برنامج ثابت (Firmware) ثانٍ للوحة ESP32 في ذراعك. حمّله على اللوحة (أي ارفعه إلى ESP32)، واقرن يد تحكم، وحرّك المفاصل الستة والقابض بالعصوين وأزرار الاتجاهات (D-pad) وأزرار الكتف. يوفّر البرنامج الثابت أربعة مستويات للسرعة ودواسة وقود تناظرية على زناد L2. وفيه أيضًا زر للعودة إلى الوضعية الأساسية (Home)، وتسلسل يصل إلى 16 وضعية تسجّلها بضغطة واحدة وتشغّلها في حلقة متكررة. زر PS هو إيقاف طوارئ يبقى مثبّتًا: تظل الذراع متجمدة حتى تضغط Select. تحدد كل عصا سرعة المفصل (التحكم بالسرعة). وتتشكّل الحركة بمنطقة ميتة (نطاق صغير حول مركز العصا يُتجاهَل) ومنحنى Expo (تحكم أدق قرب المركز) ومعدل كبح ثابت.
ما الذي ستتعلمه: لماذا تتحكم العصا بالسرعة بدل الموضع، وأي أيدي التحكم وإصدارات ESP32 تعمل، وكيف تقرن DualShock 3، وما قواعد الأمان التي يفرضها البرنامج الثابت.
الوقت اللازم: أمسية واحدة. عشر دقائق لتثبيت حزمة اللوحة والتحميل عليها، وعشر للاقتران، والباقي للقيادة.
التكلفة الإجمالية: 0 € إذا كانت لديك يد تحكم. تكلّف DualShock 3 المستعملة من 10 إلى 20 €؛ تأكد أنها أصلية (القسم 1)، لأن معظم النسخ المقلدة لا تقترن.
مستوى الصعوبة: سهل، إذا أنهيت الجزء 1.
السلامة: تتحرك الذراع بعصا التحكم أسرع مما تحركت يومًا بشريط التمرير. يجمّدها زر PS فورًا، وتقتصر سرعة الحركة في أول أربع ثوانٍ بعد كل تشغيل على 15 %. لا يحرّك البرنامج الثابت الذراع قبل أن يُعرف موضعها. أبقِ مفتاح طاقة السيرفو من الجزء 1 في متناول يدك الحرة.
ما تحتاج إليه: ذراع OmArm One مكتملة من الجزء 1، أو أي ذراع تعمل بإلكترونيات ESP32 DevKit وPCA9685 نفسها. يد تحكم ألعاب تعمل بالبلوتوث من الجدول في القسم 1. كابل USB وبرنامج Arduino IDE. ومع DualShock 3 تحتاج أيضًا إلى حاسوب لخطوة الاقتران التي تُجرى مرة واحدة. لا قطع جديدة ولا توصيلات جديدة.
الملفات التي ستحتاج إليها: OmArmOne_Gamepad البرنامج الثابت، واختياريًا أداة التعيين (Mapper). كلاهما موجود في مستودع GitHub الذي تجد رابطه في نهاية المقال وفي الحزمة الكاملة، التي تضم الآن هذا الجزء إلى جانب الجزء 1، وتتضمن نسخة PDF قابلة للطباعة من هذا الدليل.
1. ما يد التحكم التي لديك؟
طراز يد التحكم هو ما يحدد طريقة اقترانها. اقلب يد التحكم واقرأ الملصق.
| وحدة التحكم | كيف تميّزها | تعمل؟ | الاقتران |
|---|---|---|---|
| PlayStation 2 DualShock 2 | قابس رمادي في طرف كابل، بلا منفذ USB، وبلا مصابيح LED | لا | لا تحتوي على بلوتوث إطلاقًا |
| PlayStation 3 DualShock 3 / Sixaxis | الطراز CECHZC2E (أوروبا)، CECHZC2U (الولايات المتحدة)، CECHZC2J (اليابان) على الملصق الخلفي؛ منفذ mini-USB، وأربعة مصابيح LED | نعم (الموجودة في الصور) | يُكتب عنوان ESP32 في يد التحكم مرة واحدة، القسم 4 |
| PlayStation 4 DualShock 4 | CUH-ZCT1 / ZCT2، شريط ضوئي، micro-USB | نعم | اضغط مطولًا على Share + PS حتى يومض الشريط الضوئي |
| PlayStation 5 DualSense | CFI-ZCT1، USB-C | نعم | اضغط مطولًا على Create + PS حتى يومض الشريط الضوئي |
| Xbox One S / Series X|S | الطراز 1708 أو 1914، شعار البلوتوث قرب زر الاقتران | نعم | اضغط مطولًا على زر الاقتران الموجود على الحافة العلوية |
| Xbox One (2013، الطراز 1537 / 1697) | بلا شعار بلوتوث | لا | تستخدم Xbox Wireless وليس البلوتوث |
| Nintendo Switch Pro / Joy-Con | Pro: الطراز HAC-013، منفذ USB-C، زر المزامنة على الحافة العلوية | نعم | اضغط مطولًا على زر المزامنة حتى تومض مصابيح LED بالتتابع |
| 8BitDo وأيدي تحكم من شركات أخرى | ابحث على العلبة عن وضع “Switch” أو “Xbox” | غالبًا | شغّلها في وضع Switch (Y + Start في معظم أيدي تحكم 8BitDo؛ راجع دليل الاستخدام) أو في وضع Xbox |

فحصان آخران لـ DualShock 3 قبل أن تبدأ. يجب أن تحتفظ البطارية بشحنها؛ فيد التحكم التي لا تعمل إلا بالكابل بطاريتها تالفة، ولا يوجد هنا وضع للعمل بالكابل. ويجب ألا تكون مقترنة بجهاز PS3 مشغّل في الغرفة نفسها، لأن الجهاز يتصل بها أولًا.
2. كيف تعمل، ولماذا يحصل ESP32 على برنامج ثابت خاص به
يد تحكم الألعاب جهاز بلوتوث من فئة HID (Human Interface Device، أي جهاز الواجهة البشرية)، وهي فئة الأجهزة نفسها التي تنتمي إليها لوحة المفاتيح اللاسلكية. وللتواصل مع يد تحكم، تحتاج لوحة ESP32 إلى مكدس بلوتوث (Bluetooth Stack)، أي البرمجيات التي تتولى بروتوكول الاتصال اللاسلكي، يدعم HID ويعرف خصوصيات كل عائلة من أيدي التحكم. Bluepad32 مشروع مفتوح المصدر يوفّر ذلك. تدعم هذه المكتبة كل أيدي تحكم البلوتوث في الجدول أعلاه، ويعرضها جميعًا لبرنامجك (Sketch)، أي برنامج Arduino الخاص بك، بتخطيط مجرد واحد. يتكون هذا التخطيط من عصوين وزنادين وأربعة أزرار أمامية وزرّي كتف وأزرار اتجاهات (D-pad) وثلاثة أزرار نظام. لا يرى كودك أبدًا جهاز PlayStation أو Xbox، بل يرى “المحور X للعصا اليمنى” و“الزر A”.

تستبدل Bluepad32 مكدس البلوتوث في ESP32 بمكدسها الخاص، ولهذا تُوزَّع لبيئة Arduino على شكل حزمة لوحات (Board Package) بدل أن تكون مكتبة تضيفها من مدير المكتبات (Library Manager). ويأتي معها قيدان.
تحتاج إلى لوحة ESP32 الأصلية. تستخدم أيدي تحكم PlayStation تقنية Bluetooth Classic، وليس Bluetooth Low Energy (BLE). وتدعم لوحة ESP32 الأصلية (WROOM وWROVER ولوحة DevKit من الجزء 1) التقنيتين معًا. أما ESP32-S2 فلا تحتوي على بلوتوث؛ وتدعم S3 وC3 تقنية BLE فقط، وهذا يكفي ليد تحكم Xbox Series لكنه لا يكفي لأي يد تحكم PlayStation. لذلك تعمل الذراع المزودة بإلكترونيات الجزء 1 دون أي تعديل.
وتحتاج إلى برنامج ثابت خاص بها. تتشارك وحدة راديو البلوتوث ووحدة راديو الواي فاي هوائيًا واحدًا. ولا يمكنهما العمل معًا إلا بتقاسم الوقت: تتناوب الوحدتان على استخدام الهوائي. ومهمة السيرفو التي تضطر إلى انتظار الراديو تعيد الارتجاف (Jitter)، أي عدم انتظام توقيت السيرفو الذي يجعل المفاصل ترتعش، وهو ما تخلّص منه الجزء 1. لذلك فإن البرنامج الثابت الخاص بيد التحكم (OmArmOne_Gamepad) لا يحتوي على واي فاي ولا على خادم ويب إطلاقًا. أما التوصيلات، motion.h, servo_map.h والموضع المخزّن فتبقى كما هي؛ ولا تعمل إلا وحدة راديو واحدة.
أصبح للذراع الآن ثلاثة إصدارات من البرنامج الثابت:
| البرنامج الثابت | الراديو | يتصل بـ | يُستخدم لـ |
|---|---|---|---|
OmArmOne_LittleFS (الجزء 1) | نقطة وصول واي فاي | المتصفح على الهاتف أو الحاسوب | الإعداد، وكتابة الوضعيات، وتحديد الموضع الحالي |
OmArmOne_Gamepad (هذا الجزء) | بلوتوث | يد تحكم ألعاب | القيادة يدويًا، وتسجيل تسلسل وتشغيله في حلقة متكررة |
omarm_one_ros2_serial (موجود في المستودع منذ الجزء 1؛ ويُشرح في الجزء 3، قريبًا) | لا شيء، كابل USB | ROS 2 (Robot Operating System 2، إطار عمل برمجي للروبوتات) على حاسوب | MoveIt (برنامج تخطيط الحركة لـ ROS 2) على الذراع الحقيقية |
تتشارك إصدارات البرنامج الثابت الثلاثة سجل الموضع نفسه في ذاكرة الفلاش. فإذا رفعت البرنامج الثابت الخاص بيد التحكم فوق البرنامج الثابت الخاص بتطبيق الويب، يبقى الموضع المخزّن صالحًا. والأمر نفسه عندما تعيد رفع البرنامج الثابت الخاص بتطبيق الويب.
3. التثبيت والتحميل على اللوحة
1. أضف حزمة اللوحة. Arduino IDE → File → Preferences → Additional boards manager URLs. احتفظ بكل ما هو موجود في القائمة (يبقى رابط ESP32 العادي من الجزء 1) وأضف سطرًا ثانيًا:
https://raw.githubusercontent.com/ricardoquesada/esp32-arduino-lib-builder/master/bluepad32_files/package_esp32_bluepad32_index.json

ثم Tools → Board → Boards Manager، وابحث عن Bluepad32، وثبّت Bluepad32 ESP32 (4.1.0 هو الإصدار الذي استُخدم في إعداد هذا المقال). يستغرق ذلك بضع دقائق.
2. اللوحة والمنفذ. Tools → Board → Bluepad32 ESP32 → ESP32 Dev Module. أو استخدم قائمة اختيار اللوحة في أعلى النافذة واختر الإدخال المعلَّم بـ esp32_bluepad32، وليس الإدخال المعلَّم بـ esp32 العادي الذي يحمل الاسم نفسه. اترك مخطط التقسيم (Partition Scheme)، أي طريقة تقسيم ذاكرة الفلاش في ESP32 بين البرنامج والبيانات، على قيمته الافتراضية. توصي كثير من أدلة Bluepad32 بخيار “Huge APP”؛ لكن هذا البرنامج (Sketch) لا يحتاج إليه. فحجمه بعد الترجمة (Compile) نحو 758 kB، أي 57 % من قسم التطبيق الافتراضي البالغ 1.25 MB. وإذا أضفت لاحقًا كثيرًا من الكود الخاص بك وفشل الرفع برسالة “sketch too big”، فانتقل إلى Huge APP (3MB No OTA) عندها. يمنح هذا المخطط البرنامجَ 3 MB ولا يحجز أي مساحة لتحديثات OTA (التحديث عبر الهواء) من خلال الواي فاي، وهي ميزة لا يستخدمها هذا البرنامج الثابت. كما أنه لا يستخدم نظام ملفات، فلا تخسر شيئًا.

3. المكتبة. مكتبة Adafruit PWM Servo Driver من مدير المكتبات (Library Manager). وهي لديك من الجزء 1. ولا تحتاج إلى غيرها؛ فمكتبة Bluepad32 تأتي مع حزمة اللوحة.
4. افتح البرنامج (Sketch). firmware/OmArmOne_Gamepad/OmArmOne_Gamepad.ino من المستودع. تتعامل بيئة IDE مع المجلد كبرنامج واحد: افتح الملف .ino، فتظهر ملفات الترويسة (Headers) على شكل علامات تبويب، وضغطة Upload واحدة تبني كل شيء.

gamepad_config.h. أما ملفات الترويسة التي تحتوي على منطق التحكم، فيترجمها ويختبرها على حاسوبك سكربت الاختبار run_all.sh (القسم 7) قبل أن تعمل على ESP32.5. تحقق من سطر القنوات. القاعدة نفسها كما في الجزء 1: SERVO_CHANNELS[] = {0, 3, 4, 7, 8, 11} يجب أن يطابق توصيلاتك بلوحة PCA9685. فإذا كان مطابقًا في البرنامج الثابت الخاص بتطبيق الويب، فهو مطابق هنا أيضًا.

6. افصل طاقة السيرفو، وأغلق أي شاشة تسلسلية (Serial Monitor) مفتوحة، وارفع البرنامج، ثم افتح الشاشة التسلسلية بسرعة 115200 baud. الشاشة التسلسلية المفتوحة هي السبب المعتاد لرسالة “Failed to connect to ESP32: No serial data received”. وإذا استمرت المشكلة، فاضغط مطولًا على زر BOOT في اللوحة بينما تعرض بيئة IDE عبارة Connecting. سترى ما يلي:

restored ... nothing moved هو الحالة السليمة. BT address هو الرقم الذي تحتاج إليه DualShock 3 في القسم التالي، وهو خاص بـ DualShock 3 وحدها. Serial commands يعرض ما يمكنك كتابته في الشاشة التسلسلية.تحقق من ثلاثة أسطر. mapping: default ... (v2) يذكر gamepad_config.h الذي يعمل حاليًا، فتعرف ما إذا كان تعديلك قد وصل إلى اللوحة. restored live position ... nothing moved يعني أن الموضع بقي محفوظًا بعد الرفع، وأن محركات السيرفو تلقّت أمرًا بالانتقال إلى المواضع التي تقف فيها أصلًا. أما إذا رأيت The servos lost power بدلًا من ذلك، فلن يحرّك البرنامج الثابت الذراع حتى تؤكد الموضع بيد التحكم (القسم 6).
4. الاقتران خطوة بخطوة

DualShock 3
لا تبحث DualShock 3 عن جهاز مضيف (Host). فهي تخزّن عنوان مضيف واحدًا، هو عنوان آخر جهاز PlayStation اتصلت به، ولا تتصل إلا بهذا العنوان. ولكي تتصل بالذراع، تكتب فوق هذا العنوان عنوانَ ESP32، مرة واحدة، عبر USB.
- اقرأ عنوان ESP32 من سجل الإقلاع (
BT address: ...)، أو اكتبBTADDRفي الشاشة التسلسلية فيطبع السطر مرة أخرى. - وصّل DualShock 3 بحاسوبك بكابل mini-USB. لن يُظهر Windows يد تحكم ألعاب لها. وهذا طبيعي: فلا يوجد تعريف (Driver) لـ DualShock 3 وحدها، وأداة الاقتران لا تحتاج إليه.
- اكتب العنوان في يد التحكم. على Windows: أداة SixaxisPairTool. شغّلها بصلاحيات المسؤول (Administrator). تعرض الأداة عنوان Master الحالي ليد التحكم (عنوان المضيف المخزّن)؛ اكتب عنوان ESP32 في حقل Change Master ثم انقر على Update. لم يعد مطوّر الأداة يوزّعها، لذا ستجدها على مواقع التنزيل البديلة (Mirrors). افحص ملف التثبيت عبر VirusTotal (ماسح فيروسات مجاني على الإنترنت) قبل تشغيله؛ والإصدار 0.3.1 هو الأخير. تتواصل الأداة مع يد التحكم عبر تقارير HID خام: حزم بيانات تذهب إلى الجهاز مباشرة دون تعريف (Driver). ولهذا لا يحتاج Windows إلى التعرف على يد التحكم إطلاقًا. على Linux / macOS: يحتوي مستودع Bluepad32 على
tools/sixaxispairer. ابنِه (make sixaxispairer، ويحتاج إلىlibhidapi-dev) ثم شغّلsudo ./sixaxispairer A4:F0:0F:69:A0:06باستخدام عنوانك أنت. - افصل يد التحكم. اضغط زر PS. تومض المصابيح الأربعة لمدة تصل إلى عشر ثوانٍ، ثم تطبع الشاشة التسلسلية
controller connected - identifying...وبعد لحظة،controller ready: DualShock 3. ثم يأتيstick rest: LX 52 LY 8 ...، وهو قياس البرنامج الثابت لموضع العصوين عندما لا يلمسهما أحد. ويبقى LED 1 مضاءً.
فشل أول اقتران أجريته بسبب البرنامج الثابت، لا بسبب يد التحكم. فقد اتصلت DualShock 3، لكن إصدارًا مبكرًا من البرنامج سأل عن نوع يد التحكم قبل أن تعرفه Bluepad32، فرفض يد التحكم. أما البرنامج الثابت المنشور فيتحقق من النوع بعد لحظة، في خطوة التحكم.


ومن ذلك الحين تعيد يد التحكم الاتصال بضغطة على زر PS في كل مرة تُشغَّل فيها الذراع. وإذا أردت يومًا إعادتها إلى جهاز PlayStation، فوصّلها بالجهاز بالكابل مرة واحدة؛ فيعيد الجهاز كتابة العنوان.
كل أيدي التحكم الأخرى
ضع يد التحكم في وضع الاقتران (الجدول في القسم 1)، وانتظر. تقبل Bluepad32 أيدي التحكم الجديدة كلما لم تكن هناك يد تحكم متصلة. يكتمل الاقتران عندما تتوقف المصابيح عن الوميض وتطبع الشاشة التسلسلية اسم الطراز. يُخزَّن الاقتران في ESP32، لذا لا تحتاج في المرة التالية إلا إلى الضغط على زر PS أو Xbox أو Home.
إذا رفضت يد تحكم الاقتران بعد أن عملت من قبل، فاكتب FORGET في الشاشة التسلسلية. يمسح ذلك المفاتيح المخزّنة على جانب ESP32، ثم تجري الاقتران من البداية.
5. أزرار التحكم

لا يوجد زر يجب الضغط عليه باستمرار قبل أن تتحرك الذراع. ادفع إحدى العصوين فيدور المفصل؛ واتركها فيتباطأ حتى يتوقف. يشرح القسم 9 ما الذي يجعل ذلك آمنًا.

| الإدخال | الوظيفة |
|---|---|
| العصا اليمنى يسارًا/يمينًا | J1 القاعدة، حتى 70 deg/s |
| العصا اليمنى للأمام/للخلف | J2 الكتف، حتى 50 deg/s |
| العصا اليسرى للأمام/للخلف | J3 المرفق، حتى 60 deg/s |
| العصا اليسرى يسارًا/يمينًا | J4 دوران الساعد، حتى 60 deg/s |
| D-pad أعلى/أسفل | J5 ميل المعصم، حتى 60 deg/s |
| D-pad يسار/يمين | J6 دوران الأداة، حتى 90 deg/s |
| R1 / R2 | فتح / إغلاق القابض (R2 تناظري: نصف الضغطة يعني نصف السرعة) |
| L1 (نقرة) | مستوى السرعة 1 → 2 → 3 → 4 → 1: النسب 25 و45 و70 و100 % من السرعة القصوى لكل مفصل. تعرض مصابيح LED الخاصة بأرقام اللاعبين المستوى الحالي. ويبدأ كل إقلاع وكل تأكيد وكل استئناف من المستوى 1. |
| L2 (تناظري) | دواسة الوقود: اضغط عليها فترتفع السرعة من المستوى الحالي باتجاه 100 %، وحرّرها فتعود إلى مستواها السابق |
| المربع | HOME: تتحرك جميع المفاصل معًا إلى وضعية البداية من الجزء 1 (الزوايا بالدرجات: J1 0، J2 45، J3 45، J4 0، J5 0، J6 0، القابض 61). ويوقف أيضًا أي تسلسل قيد التشغيل أولًا. |
| الدائرة | حفظ الوضعية الحالية بوصفها الخطوة التالية في التسلسل (تهتز يد التحكم وتومض مصابيح LED بعدد الوضعيات المحفوظة). حتى 16 وضعية، تُخزَّن في ذاكرة الفلاش. |
| المثلث | تشغيل التسلسل في حلقة متكررة: من الوضعية الأولى إلى الأخيرة، مع توقف 0.6 s بين كل وضعيتين، ثم من الأولى مجددًا. والضغط على المثلث مرة أخرى يوقفه. |
| X (Cross)، ضغط مطوّل لمدة 2 s | حذف التسلسل بالكامل (اهتزاز مزدوج). أما النقرة القصيرة فلا تفعل شيئًا، وذلك عن قصد. |
| Start | إيقاف التسلسل الجاري أو حركة HOME في مكانها |
| PS | إيقاف الطوارئ. يجمّد كل مفصل في مكانه ويبقى مقفلًا على هذه الحالة. تواصل محركات السيرفو التثبيت؛ فقطع إشارتها سيجعل الذراع تسقط. |
| Select | الاستئناف بعد التوقف. تعود السرعة إلى المستوى 1، وتكون الثواني الأربع التالية من الحركة بطيئة مجددًا. |
| Select + Start، ضغط مطوّل لمدة 2 s | تأكيد الموضع بعد انقطاع الطاقة وعودتها، القسم 6 |
السرعات المحددة لكل مفصل ليست اعتباطية. فالكتف يحمل الذراع بأكملها ولذلك حصل على أدنى حد؛ أما دوران الأداة فلا يحمل سوى القابض ولذلك حصل على أعلى حد. كل رقم منها هو MAP_Jx_VMAX في gamepad_config.h، ويوضح القسم 8 كيفية تغييرها.

التسلسل. كان تطبيق الويب في الجزء 1 قادرًا على تسجيل الوضعيات أيضًا، لكنها كانت تُحفظ في المتصفح وتضيع بعد إعادة تحميل الصفحة. أما هذا التسلسل فيُكتب في ذاكرة الفلاش الخاصة بـ ESP32 مع مجموع اختباري (رقم يُحسب من البيانات ويُظهر ما إذا كانت قد تلفت). أطفئ الذراع ثم شغّلها من جديد، وستجد التسلسل ما زال موجودًا (sequence: 3 pose(s) stored في سجل الإقلاع). حرّك الذراع إلى وضعية واضغط زر الدائرة. حرّكها إلى الوضعية التالية واضغط زر الدائرة. يشغّل زر المثلث الوضعيات في حلقة متكررة إلى أن توقفها، أو تدفع إحدى العصوين لأبعد من 30 %، أو تضغط أزرار الاتجاهات (D-pad) أو R1 أو R2. للإدخال اليدوي الأولوية دائمًا، وتتوقف الذراع في المكان الذي قوطعت فيه.
أثناء تصوير الفيديو، ظلت الذراع تنقل مكعبًا من مكان إلى آخر بمفردها لمدة 20 دقيقة.


6. بعد فصل الطاقة وإعادة توصيلها: حركة التأكيد
شرح الجزء 1 لماذا يجب ألا تتحرك ذراع لا تملك تغذية راجعة للموضع بعد أن فقدت محركات السيرفو فيها الطاقة. فقد يكون الموضع المخزّن خاطئًا، لأن الجاذبية أو يدًا ما ربما حرّكت الذراع بينما كانت محركات السيرفو مرتخية. يعرض تطبيق الويب تحذيرًا وزرّي تأكيد. أما يد التحكم فليس لها شاشة، لذلك تتحول القاعدة إلى إيماءة: انظر إلى الذراع، وتحقق من أنها ما زالت في مكانها، ثم اضغط Select وStart معًا مدة ثانيتين. تهتز يد التحكم، وتتلقى محركات السيرفو الطاقة عند الموضع المخزّن، ولا يتحرك شيء.

إذا تحركت الذراع وهي دون طاقة، فلا تؤكد الموضع؛ بل حمّل البرنامج الثابت الخاص بتطبيق الويب على اللوحة وحدّد الموضع بأزرار الشريط التنبيهي فيه (الجزء 1، القسم 9). وعلى لوحة ESP32 جديدة تمامًا لا تحتوي على أي موضع مخزّن، تعتمد الإيماءة نفسها وضعية البداية، لذا حرّك الذراع إلى تلك الوضعية يدويًا قبل الضغط المطوّل على الزرين.
7. لماذا تكون الحركة أكثر سلاسة مما هي مع أشرطة التمرير
منح الجزء 1 الذراع نوعين من الحركة. الأول حركة منسقة من نقطة إلى نقطة بمنحنى من الدرجة الخامسة (Quintic): تكون السرعة والتسارع صفرًا عند الطرفين، ويصل كل مفصل في الوقت نفسه. والثاني متابِع للتحريك التدريجي (Jog Follower) خاص بأشرطة التمرير، يلاحق هدفًا متحركًا بتسارع محدود ويبدأ الكبح مبكرًا بما يكفي كي لا يتجاوز الهدف أبدًا. وتستخدم يد التحكم كلا النوعين: فحركة HOME والتسلسل حركات منسقة، بينما تقود العصوان متابِع التحريك التدريجي، ولكن بطريقة مختلفة عن شريط التمرير.

يرسل شريط التمرير موضعًا. اسحبه 20 درجة فيُدير المتابِع المفصل 20 درجة ثم يتوقف. أما العصا فترسل كسرًا بين −1 و+1، ويحوّل البرنامج الثابت هذا الكسر إلى سرعة. العصا بأقصى انحراف تعني “أدِر هذا المفصل بأقصى سرعته”، ونصف الانحراف يعني نصف تلك السرعة، والمنتصف يعني التوقف. ويقوم المستوى ودواسة الوقود من القسم 5 بتحجيمها، ثم تليها ثلاث مراحل أخرى.
موضع السكون والمنطقة الميتة. نادرًا ما تقرأ العصا غير الملموسة صفرًا تمامًا، والوضع أسوأ مع DualShock 3 مستهلكة: فالعصا في يد التحكم لدي تستقر على بُعد 10 % من المنتصف، ولا تستقر في النقطة نفسها مرتين. لذلك يقيس البرنامج الثابت موضع سكون كل عصا عند اتصال يد التحكم، ويواصل القياس ما دامت العصا خاملة. ويفعل ذلك ببطء كافٍ بحيث لا تُعدّ العصا التي تثبّتها عمدًا عند انحراف صغير في حالة “سكون” أبدًا. تلي ذلك منطقة ميتة بمقدار ±12 %، مع إعادة تحجيم بحيث يبدأ أول مليمتر بعدها من سرعة صفرية بدلًا من القفز مباشرة إلى 12 %. ومعًا، يمنع تتبع موضع السكون والمنطقة الميتة يد التحكم غير الملموسة من تحريك أي مفصل، ويمنعان العصا المنحرفة من تعطيل HOME أو التسلسل. ومع ذلك قد تسبب العصا المستهلكة بأكثر من 12 % زحفًا بطيئًا؛ راجع قسم استكشاف الأخطاء وإصلاحها.
منحنى Expo. الإبهام دقيق قرب المنتصف وأقل دقة عند الأطراف. لذلك يُمزج الأمر بين منحنى خطي ومنحنى تكعيبي: 0.5·x³ + 0.5·x. عند نصف انحراف العصا يعمل المفصل بنسبة 31 % من سرعته القصوى بدلًا من 50 %؛ وعند أقصى انحراف يظل يصل إلى 100 %. ويصبح الثلث الأول من مسار العصا منطقة للتموضع الدقيق.
مرشّح السرعة. يستطيع الإبهام أن ينقل العصا من المنتصف إلى أقصى انحراف في بضعة أجزاء من الألف من الثانية. تمر السرعة المطلوبة عبر مرشّح تمرير منخفض (Low-pass) زمنه 80 ms، فتتحول الحركة الخاطفة إلى منحدر تدريجي. يحدّ المتابِع من التسارع أصلًا؛ ويحدّ المرشّح كذلك من سرعة تغيّر التسارع (الارتجاج أو Jerk)، فيبدأ المفصل حركته ويتوقف بسلاسة.
يتجه المتابِع من الجزء 1 نحو هدفه بأعلى سرعة يستطيع معها التوقف ضمن المسافة المتبقية: v_stop = √(2·a·d). ولكي يسير المفصل بسرعة ثابتة v، يتحرك الهدف بالسرعة v، ويستقر المتابِع خلفه على مسافة توقف واحدة بالضبط: d = v²/(2a). ومع التسارع المضبوط افتراضيًا عند 720 deg/s² وسرعة القاعدة البالغة 70 deg/s، تبلغ هذه المسافة 3.4 درجة. اترك العصا، فيستقر الهدف عند مسافة التوقف تلك أمام المفصل. يتباطأ المتابِع بمعدل 720 deg/s² ويتوقف عند تلك النقطة تمامًا. لا يمكنه تجاوز الهدف، لأن الهدف لا يقع أبدًا بعد نقطة التوقف، ولا يمكنه الارتداد، لأن المتابِع لا يعكس اتجاهه أبدًا.

jog_control.h و motion.h نفسها التي تعمل على ESP32، وبمعدلات البرنامج الثابت ذاتها: 100 Hz لحلقة التحكم و250 Hz لتحديث السيرفو. يبلغ المفصل 90 % من سرعته البالغة 70 deg/s خلال 0.28 s ويحافظ عليها بتفاوت لا يتجاوز 1 %. وبعد ترك العصا يتوقف خلال 0.25 s وبعد 5.7 درجة: منها 3.4 للكبح، والباقي هو ما يسمح المرشّح ذو 80 ms بمروره. ولا يرجع أي جزء من المنحنى إلى الخلف.تكتسب مسافة الكبح هذه أهمية عندما تقود الذراع قرب جدار أو شخص. فعند السرعة القصوى تحتاج القاعدة إلى نحو ست درجات حتى تتوقف، وهذا يعني عند نصف قطر 300 mm أن القابض يقطع 30 mm بعد أن تترك العصا. وفي مستوى السرعة 1 تدور القاعدة بسرعة 17.5 deg/s، فتنكمش هذه المسافة إلى بضعة مليمترات.
لا يتعارض إدخال العصا مع الحركات المنسقة. فأثناء تنفيذ HOME أو التسلسل، ودون لمس أي عصا، لا يغيّر المتابِع الحركة. ادفع عصا بوضوح (لأبعد من 30 % من مسارها، وهي نسبة لا يبلغها الانجراف أبدًا) فتُلغى الحركة في مكانها.
يُختبر كل ذلك على الحاسوب قبل تشغيله على ESP32. فالبرنامج النصي run_all.sh الموجود في مجلد اختبارات يد التحكم يترجم ملفات الترويسة (Headers) الحقيقية باستخدام g++ (مترجم C++ للحاسوب) ويشغّلها مع نواة الحركة بالمعدلات الحقيقية. ومسار هذا المجلد في مستودع GitHub هو firmware/tests-gamepad/؛ وفي الحزمة الكاملة هو firmware/tests/ داخل مجلد الجزء 1.5. وتجد البرامج الخمسة وما يثبته كل منها في خريطة الكود في القسم 3. وينتهي التشغيل بالعبارة all tests passed؛ وإذا غيّرت ملف ترويسة، فشغّله قبل التحميل على اللوحة.
8. تغيير تعيين الأزرار: يدويًا أو بأداة التعيين (Mapper)
كل ما يتعلق بأدوات التحكم موجود في gamepad_config.h. إنه ملف قصير، وقد صُمم ليُعدَّل.

تعديلات شائعة: لنقل الكتف إلى العصا اليسرى والمرفق إلى اليمنى، بدّل سطرين. ولإضافة زر الرجل الميت أو Deadman (لا يتحرك شيء ما لم تضغط عليه باستمرار)، اضبط MAP_DEADMAN على زر. ولتشغيل التسلسل مرة واحدة بدلًا من تكراره، اضبط SEQ_LOOP 0; SEQ_DWELL_MS يحدد مدة التوقف بين الوضعيات. ويحتاج كل تغيير إلى عملية رفع واحدة. ويطبع سجل الإقلاع اسم التعيين وإصداره (mapping: default ... (v2)) لتعرف أن التغيير وصل، وتكون الثواني الأربع الأولى بعده بطيئة عن قصد.
أداة التعيين تؤدي المهمة نفسها بيد التحكم في يدك بدلًا من محرر النصوص. وهي برنامج Python صغير موجود في tools/gamepad-mapper/. ويحتاج إلى مكتبتين: pygame (تقرأ أجهزة التحكم في الألعاب على الحاسوب) وpyserial (للاتصال التسلسلي مع ESP32 عبر USB):
pip install pygame pyserial python omarm_gamepad_mapper.py

gamepad_config.h مباشرة في مجلد برنامج Arduino (Sketch). التُقطت لقطة الشاشة على Linux.تعثر الأداة على يد التحكم وتعرض كل عصا وكل زر مباشرة، فتعرف أن يد التحكم تعمل قبل تحميل البرنامج على ESP32. وتتعلم الربط باللمس. وفي تبويب ESP32 تقرأ سطر عنوان BT من الذراع عبر USB، مع زر ينسخه لاستخدامه في أداة الإقران. ويستعيد زر “Reset to defaults” التعيين الموصوف في هذا المقال. والبرنامج النصي check_defaults.py الموجود في المجلد نفسه يتحقق من ذلك لكل سطر من نوع #define في ملف الترويسة.
تعمل الأداة مع أي يد تحكم يتعرّف عليها الحاسوب على أنها يد تحكم للألعاب. فمكتبة SDL (Simple DirectMedia Layer، وهي المكتبة التي يستخدمها pygame لقراءة أجهزة التحكم) تعيّن أجهزة التحكم الشائعة على الحاسوب إلى التخطيط نفسه الذي يستخدمه Bluepad32 على ESP32. يمكنك تعلّم الربط على يد تحكم Xbox وأنت على مكتبك، ثم تحميل البرنامج على ESP32 والقيادة بيد تحكم DualSense. استثناء واحد: لا يتوفر في Windows تعريف (Driver) لـ DualShock 3 دون برامج إضافية، لذا لا ترى الأداة يد التحكم هذه تحديدًا. اختر مدخلاتها من القوائم بدلًا من ذلك، أو تجاوز الأداة كليًا: فملف الترويسة المرفق يستخدم أصلًا تخطيط DualShock 3، ولا يحتاج الإقران إلى الأداة أيضًا.
9. طبقة الأمان
ما زالت جميع قواعد الجزء 1 سارية. لا حركة قبل معرفة الموضع. يُوثق بالموضع المخزّن الذي صمد بعد إعادة التشغيل، أما الذي لم يصمد فيؤكده إنسان. أول حركة بعد الإقلاع بطيئة. وأي عطل في ناقل I2C (الوصلة ثنائية الأسلاك من ESP32 إلى PCA9685) يعطّل خرج السيرفو. ويضيف البرنامج الثابت الخاص بيد التحكم أربع قواعد، ويكيّف قاعدتين من الجزء 1 (البدء البطيء، والتأكيد) مع يد تحكم بلا شاشة. وكل قاعدة منها تعالج طريقة محددة قد يفشل بها اتصال لاسلكي أو عصا مستهلكة أو جهاز بلا شاشة.

لا يُحتسب إلا إدخال العصا المتعمَّد. لا يوجد زر يجب الضغط عليه باستمرار للتحريك، لذا يجب أن يميّز البرنامج الثابت بين الدفع المتعمَّد والاهتزاز العرضي. ويُرشّح تتبع موضع السكون والمنطقة الميتة البالغة 12 % ذلك الاهتزاز. ولا يُعدّ متعمَّدًا بما يكفي لمقاطعة حركة جارية إلا انحراف يتجاوز 30 %. وإذا كنت تفضّل زر الرجل الميت، فإن سطرًا واحدًا في gamepad_config.h يوفّره لك.
انقطاع الاتصال. تنفد البطاريات، وللبلوتوث مدى محدود؛ وتومض مصابيح LED في DualShock 3 عندما تنخفض بطاريتها. وإذا انقطع الاتصال أثناء الإمساك بإحدى العصوين، فسيبقى آخر أمر ساريًا إلى الأبد لولا هذه القاعدة. فعند انقطاع الاتصال تتجمد الذراع في مكانها وتبقى مقفلة؛ أعد توصيل يد التحكم، واضغط PS، ثم Select للمتابعة.
إيقاف مقفل. يعمل زر PS لحظة الضغط عليه لا عند تحريره، فيجمّد الذراع ويرفض كل أمر حتى يُضغط Select. ولا تستطيع العصوان فك هذا الإيقاف، لذا لا يمكن للإدخال الذي سبب المشكلة أن يعيد تشغيل الذراع.
بدء بطيء. تُحدّ الثواني الأربع الأولى من الحركة بعد الإقلاع أو الاستئناف أو التأكيد بسرعة 15 %، أيًّا كان المستوى أو وضع دواسة الوقود. ويُعاد المستوى نفسه إلى 1. هذه هي الفترة التي تكتشف فيها أن مفصلًا ما مُعيَّن بالاتجاه المعاكس.
لا حركة قبل أن يؤكد إنسان. يصف القسم 6 إيماءة التأكيد. يقبل البرنامج الثابت التأكيد دون أي تحقق؛ لذا انظر جيدًا قبل الضغط المطوّل على الزرين.
لا شيء يفشل بصمت. عندما يرفض البرنامج الثابت ضغطة زر، يطبع السبب على الشاشة التسلسلية (Serial Monitor). أمثلة: HOME ignored: let go of the sticks first, sequence is empty - tap Circle to save poses first, save: position unknown - confirm first. كما أن WATCH يبث حالة كل عصا وكل زر خمس مرات في الثانية، فإذا شعرت بأن شيئًا ما ليس على ما يرام يمكنك رؤية ما ترسله يد التحكم.
جاءت قاعدتان من هذه القواعد من اختباراتي الشخصية. ففي نسختي الأولى كان L1 زر الرجل الميت: تضغط عليه باستمرار لتتحرك الذراع. وبعد أمسية واحدة صار يبدو كفرامل اليد، فأزلته؛ والآن يؤدي هذه المهمة تتبع موضع السكون والمنطقة الميتة وعتبة 30 %. وفي نسخة مبكرة، كانت العصا المنحرفة عن المنتصف في DualShock 3 المستهلكة لدي تمنع HOME أيضًا، دون أن يذكر البرنامج الثابت أي سبب. ومنذ ذلك الحين يطبع كل رفض سببه على الشاشة التسلسلية.
كما في الجزء 1: لا شيء من هذا يغني عن مفتاح في خط طاقة محركات السيرفو. يستطيع البرنامج الثابت أن يتوقف عن إرسال الأوامر إلى السيرفو؛ لكنه لا يستطيع إيقاف سيرفو تلقّى أمرًا خاطئًا قبل جزء من الألف من الثانية. أبقِ المفتاح في متناول يدك الأخرى.
10. القيادة الأولى: قائمة فحص على طاولة العمل
طاقة السيرفو مفصولة، والذراع في وضعية البداية، ولا شيء في القابض. ثم نفّذ الخطوات بهذا الترتيب:
- شغّل النظام واقرأ السجل.
restored ... nothing movedأو طلب تأكيد. ولا يُقبل أي شيء آخر؛POSITION UNKNOWNعلى ذراع جرى إعدادها في الجزء 1 يعني أن ذاكرة الفلاش قد مُسحت، لذا حدّد الموضع أولًا باستخدام البرنامج الثابت الخاص بتطبيق الويب. - أجرِ الإقران.
controller ready: DualShock 3في السجل، ثمstick rest: .... يضيء LED 1: مستوى السرعة 1. - أكّد إذا طُلب منك ذلك. انظر إلى الذراع، ثم اضغط Select + Start لمدة ثانيتين. يعرض السجل
position adopted. - وصّل طاقة السيرفو. يجب ألا ترتعش الذراع. فإن ارتعشت، فهذا يعني أن الموضع المخزّن لا يطابق وضع الذراع الفعلي: افصل الطاقة، وصحّح ذلك باستخدام تطبيق الويب.
- حرّك العصا اليمنى قليلًا إلى اليمين. تدور القاعدة ببطء إلى اليمين، ويعرض السجل
moving. وإذا دارت إلى اليسار، فاعكسMAP_J1_INVERT. تحقق من كل مفصل بالطريقة نفسها. الثواني الأربع الأولى بطيئة مهما فعلت؛ ولجولة بطيئة أخرى، اضغط PS ثم Select. - اترك العصا في منتصف الحركة. يتباطأ المفصل حتى يتوقف؛ وبعد لحظة يعرض السجل
idle. - اضغط L2 أثناء الدوران. تتسارع القاعدة مع الضغط على الزناد وتتباطأ عند تحريره. انقر L1 مرتين: تضيء ثلاثة مصابيح LED، ويصبح انحراف العصا نفسه الآن أسرع بكثير.
- زر PS في منتصف الحركة. يتجمد كل شيء، ويعرض السجل
STOP (PS button) - latched. لا تستجيب عصوا التحكم. يُلغيه زر Select، وتعود مصابيح LED إلى مصباح واحد مضيء. - أطفئ وحدة التحكم أثناء الحركة (اضغط مطولًا على زر PS لمدة عشر ثوانٍ في DualShock 3). تتجمد الذراع في مكانها ويبقى الإيقاف مُقفَلًا. شغّل وحدة التحكم، واضغط PS، ثم Select.
- Square. تعود الذراع إلى وضعية البداية (Home)، بجميع مفاصلها معًا، في نحو ثانيتين.
- وجّه الذراع إلى وضعية ما، واضغط Circle ضغطة قصيرة (اهتزاز، وتومض المصابيح مرة واحدة). وجّهها إلى موضع آخر، واضغط Circle مرة أخرى (ومضتان). Triangle. تنفّذ الذراع الوضعيتين ثم تبدأ من جديد. حرّك إحدى العصوين قليلًا: تتوقف الذراع حيث هي. اضغط Triangle مرة أخرى: تعيد التشغيل. اضغط مطولًا على Cross لمدة ثانيتين: اهتزاز مزدوج،
sequence cleared.
إذا نجحت الفحوص الأحد عشر جميعها، فقد اكتمل الإعداد.
11. استكشاف الأخطاء وإصلاحها
| العَرَض | السبب | الحل |
|---|---|---|
| فشل الرفع: “No serial data received” | الشاشة التسلسلية (Serial Monitor) تحجز المنفذ، أو لم تعمل إعادة الضبط التلقائية (Auto-reset، أي تحويل ESP32 تلقائيًا إلى وضع الرفع) | أغلق الشاشة التسلسلية؛ وإذا استمرت المشكلة، فاضغط مطولًا على زر BOOT في اللوحة بينما تعرض بيئة التطوير (IDE) الرسالة Connecting |
| فشل الرفع: “sketch too big” | أضفت كودًا فتجاوز البرنامج حجم قسم التطبيق البالغ 1.25 MB | Tools → Partition Scheme → Huge APP (3MB No OTA)؛ لا يستخدم هذا البرنامج الثابت أي نظام ملفات، فلا يضيع شيء |
Bluepad32.h: No such file | تمت ترجمة البرنامج (Sketch) للوحة ESP32 العادية | Tools → Board → Bluepad32 ESP32 → ESP32 Dev Module (الخيار المعلَّم بـ esp32_bluepad32) |
| تعرض أداة SixaxisPairTool الرسالة “no device found” | وحدة التحكم ليست في وضع نقل البيانات عبر USB، أو أن الكابل مخصص للشحن فقط | استخدم كابلًا يحتوي على خطوط بيانات (كثير من كابلات mini-USB الرخيصة تشحن فقط). وصّل وحدة التحكم قبل تشغيل الأداة، وشغّل الأداة بصلاحيات المسؤول (Administrator)، واضغط PS مرة واحدة لتنبيه وحدة التحكم |
| وحدة DualShock 3 تومض ولا تتصل أبدًا | عنوان الجهاز الرئيسي (Master Address) خاطئ أو لم يُكتب، أو أن وحدة التحكم مقلَّدة | أعد قراءة BTADDR، واكتبه مرة أخرى؛ وابحث على الملصق الخلفي عن رقم طراز Sony |
| وحدة DualShock 3 تتصل بجهاز آخر | جهاز PS3 قريب قيد التشغيل | أطفئ جهاز الألعاب |
وحدة التحكم متصلة لكن لا شيء يتحرك، ولا تظهر moving في السجل | الوضعية لم تُؤكَّد، أو أن الإيقاف مُقفَل | type STATUS: known=0 تعني أن عليك تأكيد الوضعية (Select + Start لمدة 2 s)، estop=1 تعني أن عليك الضغط على Select. WATCH يُظهر ما إذا كانت قيم العصوين تصل أصلًا |
| أحد المفاصل يتحرك في الاتجاه الخاطئ | اتجاه ذلك المحور | اعكس قيمة MAP_Jx_INVERT |
| العصوان تحرّكان مفاصل خاطئة | المحاور مُبدَّلة، أو أن وحدة التحكم تُبلغ عن ترتيب مختلف للمحاور | افتح تبويب Live inputs في أداة التعيين (Mapper) وأعد ربط المدخلات |
| أحد المفاصل يزحف ببطء رغم أن العصا لم تُلمس | تتبّع وضع السكون لم يستقر بعد، أو أن إحدى العصوين مهترئة بأكثر من 12 % | اترك العصوين لمدة ثلاث ثوانٍ، أو اكتب CENTER؛ وإذا استمرت المشكلة فارفع STICK_DEADZONE إلى 0.15 |
| زر Square أو Triangle لا يفعل شيئًا | إحدى العصوين ليست في المنتصف | يعرض السجل HOME ignored: let go of the sticks first مع القيم؛ WATCH يعرضها مباشرةً |
| الحركة بطيئة الاستجابة | زمن المرشّح (Filter) طويل جدًا | lower VELOCITY_FILTER_S إلى 0.05؛ ودون 0.03 يختفي التدرّج في الحركة |
| الحركة متشنجة | التسارع مرتفع جدًا | lower JOG_ACCEL إلى 480 |
late servo ticks في السجل | حزمة بلوتوث البرمجية (Bluetooth stack) تحرم مهمة السيرفو من وقت المعالجة | لا ينبغي أن يحدث هذا على ESP32 الأصلي؛ أبلغ عنه وأرفق السجل |
| وحدة التحكم كانت تعمل، والآن ترفض الاقتران | مفاتيح اقتران قديمة مخزنة على ESP32 | type FORGET، ثم أعد الاقتران |
12. الأسئلة الشائعة
هل يمكنني استخدام تطبيق الويب ووحدة التحكم في الوقت نفسه؟ ليس في هذا البرنامج الثابت. فوحدتا الاتصال اللاسلكي تتشاركان هوائيًا واحدًا، وتوقيت السيرفو هو الأمر الذي أرفض المساومة عليه. أما البرنامج الثابت التسلسلي في الجزء 3 فسيقبل وحدة تحكم (عبر ROS 2) والتوأم الرقمي معًا.
هل يمكن توصيل وحدتَي تحكم؟ تسمح Bluepad32 بما يصل إلى أربع وحدات؛ ويقبل البرنامج الثابت الأولى ويتجاهل البقية.
هل يمكنني استخدام العصوين للقابض والزنادين لأحد المفاصل؟ نعم. يمكن لأي مدخل تناظري أن يقود أي مفصل. اضبط MAP_J7_AXIS على محور إحدى العصوين (في gamepad_config.h القابض هو J7). وللمفصل الذي ستنقله إلى الزنادين، اضبط الزنادين بوصفهما مدخلَي POS و NEG الخاصين به (زناد واحد لكل اتجاه).
لماذا لا يصبح المستوى 4 أسرع عند الضغط على دواسة الوقود؟ المستوى 4 هو بالفعل قيمة VMAXلكل مفصل، وقد ضُبطت هذه القيم عند الحد الذي لا تزال فيه محركات السيرفو تتبع منحنى الحركة بدقة تحت الحمل. يمكنك رفعها في gamepad_config.h؛ إذ يصل DS3240 إلى نحو 300 deg/s عند 5 V (327 deg/s عند 6 V) دون حمل، لكن ليس مع القصور الذاتي للذراع.
هل يعمل هذا على OmArm Zero? نواة الحركة هي نفسها، والتوصيلات متقاربة. يستخدم Zero قنوات PCA9685 الست نفسها (0، 3، 4، 7، 8، 11)، لكن بوصفها خمسة مفاصل إضافةً إلى القابض على القناة 11، بدلًا من ستة مفاصل وقابض على طرف (Pin) من أطراف ESP32. غيّر NUM_SERVOS، وجدول القنوات، ومخرج القابض، ووضعية البداية، وينبغي أن يعمل؛ لكنني لم أختبر ذلك.
13. ما التالي
الجزء 2 متاح الآن. أصبح للذراع الآن توأم رقمي: نموذج CAD بعد تصديره إلى URDF (Unified Robot Description Format، وهو ملف نصي يصف وصلات الذراع ومفاصلها). خضع النموذج للتدقيق والتصحيح، ويعمل في RViz (أداة العرض المرئي في ROS 2) وفي Gazebo Harmonic (محاكي فيزيائي) على ROS 2 Jazzy.

لا يعرف البرنامج الثابت حتى الآن موضع القابض في الفراغ. فست زوايا للمفاصل ليست موضعًا للقابض؛ والرياضيات التي تحوّل أحدهما إلى الآخر (الحركيات الأمامية) تعمل على الحاسوب، داخل التوأم الرقمي.
يستخدم الجزء 3 البرنامج الثابت التسلسلي من القسم 2، ويضيف برنامج تشغيل ROS 2 (Driver) وتخطيط الحركة عبر MoveIt 2، فتقود وحدة التحكم التي أقرنتها التوأمَ الرقمي على الشاشة، ويقود التوأمُ الذراعَ. ويضيف الجزء 4 كاميرا، وفي الجزء 5 تخبر الذراع بما يجب أن تلتقطه.
إذا بنيت إعداد وحدة التحكم هذا، فأودّ أن أرى تعيين الأزرار الخاص بك. وإذا وجدت وحدة تحكم لا تقترن، فأخبرني برقم طرازها؛ فالجدول في القسم 1 يكبر مع كل بلاغ.
المصادر
- البرنامج الثابت لوحدة التحكم (Gamepad)، وأداة التعيين، والاختبارات (MIT): github.com/OmArTronics/OmArm-One →
firmware/OmArmOne_Gamepad/,firmware/tests-gamepad/,tools/gamepad-mapper/. - Bluepad32، حزمة دعم وحدات التحكم عبر بلوتوث: bluepad32.readthedocs.io.
- الذراع نفسها، وملفات STL، ودليل التجميع: الحزمة الكاملة لـ OmArm One في المتجر و دليل تجميع الجزء 1.
