قيادة ذراع روبوتية مطبوعة بتقنية ثلاثية الأبعاد (3D) بوحدة تحكم PS3: ESP32 وبلوتوث ودون حاسوب (OmArm One، الجزء 1.5)

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

A DualShock 3 controller held in one hand, with the 3D printed OmArm One robot arm behind it holding an orange cube
يتحكم إبهامان في ستة مفاصل وفي القابض. تتصل يد التحكم مباشرة بلوحة ESP32 الموجودة في القاعدة. لا يدخل أي حاسوب أو هاتف أو شبكة واي فاي في العملية أثناء القيادة.

سلسلة OmArm One

هذا فصل إضافي بين مرحلة البناء والتوأم الرقمي. تحتاج إلى ذراع OmArm One مكتملة من الجزء 1 (أو أي ذراع بإلكترونيات ESP32 ولوحة قيادة السيرفو PCA9685 نفسها) وإلى يد تحكم ألعاب تعمل بالبلوتوث. لا توجد توصيلات جديدة.

يُحمَّل الفيديو من YouTube (Google)، وقد يضع ملفات تعريف الارتباط (Cookies). سياسة الخصوصية

في الجزء 1 حصلت الذراع على تطبيق ويب. تُنشئ لوحة ESP32 الموجودة في القاعدة شبكة واي فاي خاصة بها، فتفتح صفحة على هاتفك، وتحرّك سبعة أشرطة تمرير (Sliders) المفاصلَ الستة والقابض. هذه هي الأداة المناسبة لإعداد الذراع: ترى الأرقام، ويمكنك كتابة وضعية، ويمكنك أن تخبر البرنامج الثابت بموضع الذراع بعد انقطاع الطاقة. لكنها الأداة الخاطئة للقيادة. فشريط التمرير يحدد موضعًا: تسحبه فيتبع المفصل إصبعك. تراقب الشاشة بدل الذراع، ولا يحرّك الإبهام إلا مفصلًا واحدًا في كل مرة، وعندما تُقفل شاشة الهاتف تفقد السيطرة على الذراع.

يد تحكم الألعاب تتجنب هذه المشكلات. فعصا التحكم تحدد سرعة: ادفعها قليلًا فيدور المفصل ببطء، وادفعها أكثر فيدور أسرع، واتركها فيكبح حركته. تحرّك العصوان أربعة مفاصل في الوقت نفسه، وتحرّك أزرار الاتجاهات (D-pad) مفصلَي المعصم، ويشغّل الزرّان R1 وR2 القابض، وتبقى عيناك على الذراع. ولأن يد التحكم تتصل بلوحة ESP32 مباشرة عبر البلوتوث، فلا حاجة إلى تشغيل أي شيء آخر أثناء القيادة: لا هاتف ولا حاسوب محمول.

The Part 1 web app open on a phone next to a DualShock 3 controller held in one hand
تُظهر الصورة أشرطة التمرير من الجزء 1 بجانب يد التحكم من الجزء 1.5. يبقى تطبيق الويب للإعداد؛ أما يد التحكم فللقيادة.
Diagram comparing the WiFi web app path and the Bluetooth game controller path to the same motion core, with what each one is good for
ينتهي المساران إلى نواة الحركة نفسها من الجزء 1 (الكود الذي يحوّل الأوامر إلى حركات سلسة للمفاصل).

يد التحكم في الصور هي 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 4CUH-ZCT1 / ZCT2، شريط ضوئي، micro-USBنعماضغط مطولًا على Share + PS حتى يومض الشريط الضوئي
PlayStation 5 DualSenseCFI-ZCT1، USB-Cنعماضغط مطولًا على Create + PS حتى يومض الشريط الضوئي
Xbox One S / Series X|Sالطراز 1708 أو 1914، شعار البلوتوث قرب زر الاقتراننعماضغط مطولًا على زر الاقتران الموجود على الحافة العلوية
Xbox One (2013، الطراز 1537 / 1697)بلا شعار بلوتوثلاتستخدم Xbox Wireless وليس البلوتوث
Nintendo Switch Pro / Joy-ConPro: الطراز HAC-013، منفذ USB-C، زر المزامنة على الحافة العلويةنعماضغط مطولًا على زر المزامنة حتى تومض مصابيح LED بالتتابع
8BitDo وأيدي تحكم من شركات أخرىابحث على العلبة عن وضع “Switch” أو “Xbox”غالبًاشغّلها في وضع Switch (Y + Start في معظم أيدي تحكم 8BitDo؛ راجع دليل الاستخدام) أو في وضع Xbox
Front view of a genuine Sony DualShock 3 controller showing the PS button, both analog sticks and the four face buttons
هذه DualShock 3 أصلية. رقم الطراز موجود على الملصق في الخلف. وأي يد تحكم تشبه هذه لكنها لا تحمل رقم طراز من Sony هي نسخة مقلدة. والنسخ المقلدة سبب شائع لفشل الاقتران: فمعظمها يتخطى جزءًا من مصافحة البلوتوث (Handshake)، أي تبادل الرسائل الذي يُنشئ الاتصال، وهو جزء تحتاجه لوحة ESP32.

فحصان آخران لـ DualShock 3 قبل أن تبدأ. يجب أن تحتفظ البطارية بشحنها؛ فيد التحكم التي لا تعمل إلا بالكابل بطاريتها تالفة، ولا يوجد هنا وضع للعمل بالكابل. ويجب ألا تكون مقترنة بجهاز PS3 مشغّل في الغرفة نفسها، لأن الجهاز يتصل بها أولًا.

2. كيف تعمل، ولماذا يحصل ESP32 على برنامج ثابت خاص به

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

Block diagram of the controller, the ESP32 Bluetooth stack, the 100 Hz control step, the 250 Hz servo task, flash storage and the PCA9685 driver
تستقبل Bluepad32 تقارير يد التحكم (حزم بيانات تحمل حالة كل عصا وكل زر). وتحوّلها خطوة تحكم بتردد 100 Hz إلى سرعات، وتفرض قواعد الأمان. أما مهمة السيرفو من الجزء 1 فهي حلقة تعمل 250 مرة في الثانية وترسل مواضع المفاصل إلى PCA9685. ويُخزَّن سجل الموضع والتسلسل في ذاكرة الفلاش.

تستبدل 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 (in the repository since Part 1; explained in الجزء 3)لا شيء، كابل USBROS 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
Arduino IDE preferences dialog showing the Espressif ESP32 and the Bluepad32 additional boards manager URLs on two separate lines
يوضع كل رابط في سطر مستقل. رابط Espressif من الجزء 1، أما رابط Bluepad32 فهو الجديد.

ثم 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 (التحديث عبر الهواء) من خلال الواي فاي، وهي ميزة لا يستخدمها هذا البرنامج الثابت. كما أنه لا يستخدم نظام ملفات، فلا تخسر شيئًا.

Arduino IDE board and port selector with ESP32 Dev Module under esp32_bluepad32 highlighted
هناك لوحتان تحملان الاسم نفسه. اللوحة التي تريدها تجد عبارة esp32_bluepad32 بجانبها.

3. المكتبة. مكتبة Adafruit PWM Servo Driver من مدير المكتبات (Library Manager). وهي لديك من الجزء 1. ولا تحتاج إلى غيرها؛ فمكتبة Bluepad32 تأتي مع حزمة اللوحة.

4. افتح البرنامج (Sketch). firmware/OmArmOne_Gamepad/OmArmOne_Gamepad.ino من المستودع. تتعامل بيئة IDE مع المجلد كبرنامج واحد: افتح الملف .ino، فتظهر ملفات الترويسة (Headers) على شكل علامات تبويب، وضغطة Upload واحدة تبني كل شيء.

Code map of the seven files in the sketch folder showing which one you edit, which are tested on the PC, and what the tools folder contains
تعدّل ملفًا واحدًا فقط، gamepad_config.h. أما ملفات الترويسة التي تحتوي على منطق التحكم، فيترجمها ويختبرها على حاسوبك سكربت الاختبار run_all.sh (القسم 7) قبل أن تعمل على ESP32.

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

Wiring schematic showing the ESP32 DevKit connected over I2C to a PCA9685 servo driver with a separate switched servo power supply
الإلكترونيات هي إلكترونيات الجزء 1 نفسها، دون أي تغيير. ووحدة راديو البلوتوث موجودة أصلًا في ESP32.

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

Arduino IDE serial monitor showing the OmArm One gamepad firmware boot log with the ESP32 Bluetooth address line highlighted
هذا هو سجل الإقلاع (Boot Log). السطر 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. الاقتران خطوة بخطوة

Flow diagram in five steps: read the ESP32 Bluetooth address, plug the controller into the PC over USB, write the address, unplug and press PS, then press PS every next time; other controllers use pairing mode
يوضح المخطط خمس خطوات لـ DualShock 3: أربع تنفذها مرة واحدة، ثم ضغطة على زر PS في كل مرة بعد ذلك. أما أي يد تحكم أخرى فلا تحتاج إلا إلى خطوة واحدة: وضع الاقتران.

DualShock 3

لا تبحث DualShock 3 عن جهاز مضيف (Host). فهي تخزّن عنوان مضيف واحدًا، هو عنوان آخر جهاز PlayStation اتصلت به، ولا تتصل إلا بهذا العنوان. ولكي تتصل بالذراع، تكتب فوق هذا العنوان عنوانَ ESP32، مرة واحدة، عبر USB.

  1. اقرأ عنوان ESP32 من سجل الإقلاع (BT address: ...)، أو اكتب BTADDR في الشاشة التسلسلية فيطبع السطر مرة أخرى.
  2. وصّل DualShock 3 بحاسوبك بكابل mini-USB. لن يُظهر Windows يد تحكم ألعاب لها. وهذا طبيعي: فلا يوجد تعريف (Driver) لـ DualShock 3 وحدها، وأداة الاقتران لا تحتاج إليه.
  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 باستخدام عنوانك أنت.
  4. افصل يد التحكم. اضغط زر PS. تومض المصابيح الأربعة لمدة تصل إلى عشر ثوانٍ، ثم تطبع الشاشة التسلسلية controller connected - identifying... وبعد لحظة، controller ready: DualShock 3. ثم يأتي stick rest: LX 52 LY 8 ...، وهو قياس البرنامج الثابت لموضع العصوين عندما لا يلمسهما أحد. ويبقى LED 1 مضاءً.

فشل أول اقتران أجريته بسبب البرنامج الثابت، لا بسبب يد التحكم. فقد اتصلت DualShock 3، لكن إصدارًا مبكرًا من البرنامج سأل عن نوع يد التحكم قبل أن تعرفه Bluepad32، فرفض يد التحكم. أما البرنامج الثابت المنشور فيتحقق من النوع بعد لحظة، في خطوة التحكم.

Screenshot of the Sixaxis pairing tool on Windows showing the ESP32 Bluetooth address in the Current Master and Change Master fields
بعد الضغط على Update، يعرض Current Master عنوان ESP32 أيضًا. وتخزّن يد التحكم هذا العنوان حتى تكتب عنوانًا جديدًا.
Screen with the Arduino sketch open, the serial monitor showing the boot log, and the DualShock 3 pairing tool open beside it
تُظهر لقطة الشاشة هذه إعداد الاقتران كاملًا. على اليسار تعرض الشاشة التسلسلية العنوان، وعلى اليمين تكتبه أداة الاقتران في يد التحكم.

ومن ذلك الحين تعيد يد التحكم الاتصال بضغطة على زر PS في كل مرة تُشغَّل فيها الذراع. وإذا أردت يومًا إعادتها إلى جهاز PlayStation، فوصّلها بالجهاز بالكابل مرة واحدة؛ فيعيد الجهاز كتابة العنوان.

كل أيدي التحكم الأخرى

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

إذا رفضت يد تحكم الاقتران بعد أن عملت من قبل، فاكتب FORGET في الشاشة التسلسلية. يمسح ذلك المفاتيح المخزّنة على جانب ESP32، ثم تجري الاقتران من البداية.

5. أزرار التحكم

Top view of a game controller with every stick, D-pad direction, trigger and face button labelled with the robot arm joint or function it controls
هذا هو التعيين الافتراضي للأزرار. تحرّك العصا اليمنى المفاصل الكبيرة، أي القاعدة والكتف. وتحرّك العصا اليسرى المرفق ودوران الساعد. وتحرّك أزرار الاتجاهات (D-pad) المعصم، ويتحكم R1/R2 في القابض، ويضبط L1/L2 السرعة، بينما تتولى أزرار الأشكال الأمامية الوضعيات.

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

Hands holding a game controller with both thumbs on the analog sticks and the index fingers on the triggers, the 3D printed robot arm in the background
هذه هي طريقة الإمساك أثناء القيادة. يستقر الإبهامان على العصوين، وتضغط السبابة اليسرى على L2 لزيادة السرعة، وتتحكم السبابة اليمنى في القابض عبر R2. وتبقى عيناك على الذراع.
الإدخالالوظيفة
العصا اليمنى يسارًا/يمينًا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 كيفية تغييرها.

Diagram of the four speed levels on L1 shown on the player LEDs, the analog gas pedal formula on L2, and the slow window after every start
يعمل المستوى والدواسة معًا كمُعامل واحد يُضرب في سرعات جميع المفاصل. ففي المستوى 2 مع الضغط على L2 حتى منتصفه، يعمل كل مفصل بنسبة 45 % + 0.5 × 55 % = 72.5 % من سرعته القصوى.

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

أثناء تصوير الفيديو، ظلت الذراع تنقل مكعبًا من مكان إلى آخر بمفردها لمدة 20 دقيقة.

Three frames of the 3D printed robot arm working through a recorded pose sequence with the controller lying on the table
سُجّلت ثلاث وضعيات بزر الدائرة، وتُشغَّل في حلقة متكررة بزر المثلث. يد التحكم موضوعة على الطاولة بينما تكرر الذراع التسلسل بمفردها.
State machine diagram of the sequence player showing Circle to record, Triangle to play and loop, and Cross held to delete, with what interrupts playback
يستخدم التشغيل الحركة المنسقة نفسها المستخدمة في HOME، لذا تبدأ جميع المفاصل وتصل معًا. ولا تُقبل الوضعية إلا إذا كانت قيمة كل مفصل رقمًا صالحًا ضمن الحدود، أما البيانات المخزنة التي لا تجتاز التحقق من مجموعها الاختباري فتُستبعد بدلًا من الوثوق بها.

6. بعد فصل الطاقة وإعادة توصيلها: حركة التأكيد

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

State diagram showing the restored, lost power and unknown position paths, the ready state with its slow window, moving, latched stop and resume
لكل حالة من حالات بدء التشغيل (استعادة الموضع، فقدان محركات السيرفو للطاقة، موضع غير معروف) نتيجة محددة. ويخبرك سجل الإقلاع بالحالة التي تنطبق.

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

7. لماذا تكون الحركة أكثر سلاسة مما هي مع أشرطة التمرير

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

Diagram of seven stages: raw stick, rest tracking, dead zone, expo curve, speed scale, velocity filter and jog follower, with joint speeds and braking distances
يمر أمر العصا بسبع مراحل في طريقه إلى محرك السيرفو. ويشغّل البرنامج الثابت هذه السلسلة 100 مرة في الثانية.

يرسل شريط التمرير موضعًا. اسحبه 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² ويتوقف عند تلك النقطة تمامًا. لا يمكنه تجاوز الهدف، لأن الهدف لا يقع أبدًا بعد نقطة التوقف، ولا يمكنه الارتداد، لأن المتابِع لا يعكس اتجاهه أبدًا.

Plot of joint velocity, position and jog target over time showing full stick at 0.1 seconds and release at 0.7 seconds with no overshoot
حُسب هذا الرسم البياني باستخدام 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. إنه ملف قصير، وقد صُمم ليُعدَّل.

Diagram of the config header showing the five lines that define a joint, the single line of a function, the input names available and the feel block
يأخذ المفصل محورًا، أو زوجًا من الأزرار، أو كليهما؛ وتأخذ الوظيفة مدخلًا واحدًا. يعكس INVERT الاتجاه، ويحدد VMAX السرعة عند المستوى 4.

تعديلات شائعة: لنقل الكتف إلى العصا اليسرى والمرفق إلى اليمنى، بدّل سطرين. ولإضافة زر الرجل الميت أو 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
Screenshot of the Python mapper tool showing joints, functions and feel settings with a Learn button next to every binding
صِل يد تحكم بالحاسوب، وانقر Learn بجوار الوظيفة، ثم اضغط الزر. تسجل الأداة الاسم المجرد، وتحذّر من الربط المزدوج ومن أنواع الإدخال الخاطئة، وتكتب 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 (البدء البطيء، والتأكيد) مع يد تحكم بلا شاشة. وكل قاعدة منها تعالج طريقة محددة قد يفشل بها اتصال لاسلكي أو عصا مستهلكة أو جهاز بلا شاشة.

Diagram pairing six risks with the rule that answers each: stick drift, lost link, undoable stop, backwards joint, arm moved while limp, silent refusal
لا تغني أي من هذه القواعد عن المفتاح الموجود في خط طاقة محركات السيرفو.

لا يُحتسب إلا إدخال العصا المتعمَّد. لا يوجد زر يجب الضغط عليه باستمرار للتحريك، لذا يجب أن يميّز البرنامج الثابت بين الدفع المتعمَّد والاهتزاز العرضي. ويُرشّح تتبع موضع السكون والمنطقة الميتة البالغة 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. القيادة الأولى: قائمة فحص على طاولة العمل

طاقة السيرفو مفصولة، والذراع في وضعية البداية، ولا شيء في القابض. ثم نفّذ الخطوات بهذا الترتيب:

  1. شغّل النظام واقرأ السجل. restored ... nothing moved أو طلب تأكيد. ولا يُقبل أي شيء آخر؛ POSITION UNKNOWN على ذراع جرى إعدادها في الجزء 1 يعني أن ذاكرة الفلاش قد مُسحت، لذا حدّد الموضع أولًا باستخدام البرنامج الثابت الخاص بتطبيق الويب.
  2. أجرِ الإقران. controller ready: DualShock 3 في السجل، ثم stick rest: .... يضيء LED 1: مستوى السرعة 1.
  3. أكّد إذا طُلب منك ذلك. انظر إلى الذراع، ثم اضغط Select + Start لمدة ثانيتين. يعرض السجل position adopted.
  4. وصّل طاقة السيرفو. يجب ألا ترتعش الذراع. فإن ارتعشت، فهذا يعني أن الموضع المخزّن لا يطابق وضع الذراع الفعلي: افصل الطاقة، وصحّح ذلك باستخدام تطبيق الويب.
  5. حرّك العصا اليمنى قليلًا إلى اليمين. تدور القاعدة ببطء إلى اليمين، ويعرض السجل moving. وإذا دارت إلى اليسار، فاعكس MAP_J1_INVERT. تحقق من كل مفصل بالطريقة نفسها. الثواني الأربع الأولى بطيئة مهما فعلت؛ ولجولة بطيئة أخرى، اضغط PS ثم Select.
  6. اترك العصا في منتصف الحركة. يتباطأ المفصل حتى يتوقف؛ وبعد لحظة يعرض السجل idle.
  7. اضغط L2 أثناء الدوران. تتسارع القاعدة مع الضغط على الزناد وتتباطأ عند تحريره. انقر L1 مرتين: تضيء ثلاثة مصابيح LED، ويصبح انحراف العصا نفسه الآن أسرع بكثير.
  8. زر PS في منتصف الحركة. يتجمد كل شيء، ويعرض السجل STOP (PS button) - latched. لا تستجيب عصوا التحكم. يُلغيه زر Select، وتعود مصابيح LED إلى مصباح واحد مضيء.
  9. أطفئ وحدة التحكم أثناء الحركة (اضغط مطولًا على زر PS لمدة عشر ثوانٍ في DualShock 3). تتجمد الذراع في مكانها ويبقى الإيقاف مُقفَلًا. شغّل وحدة التحكم، واضغط PS، ثم Select.
  10. Square. تعود الذراع إلى وضعية البداية (Home)، بجميع مفاصلها معًا، في نحو ثانيتين.
  11. وجّه الذراع إلى وضعية ما، واضغط 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 MBTools → 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 الأصلي؛ أبلغ عنه وأرفق السجل
وحدة التحكم كانت تعمل، والآن ترفض الاقترانمفاتيح اقتران قديمة مخزنة على ESP32type 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.

Part 2 of the OmArm One series: the robot arm as a ROS 2 digital twin in RViz and Gazebo
يعرض فيديو الجزء 2 (16 دقيقة) الطريق من Fusion 360 إلى URDF، وما تخطئ فيه أداة التصدير. اقرأ المقال: من Fusion 360 إلى توأم رقمي في ROS 2. نزّل مساحة العمل (Workspace): حزمة التوأم الرقمي لـ OmArm One.

لا يعرف البرنامج الثابت حتى الآن موضع القابض في الفراغ. فست زوايا للمفاصل ليست موضعًا للقابض؛ والرياضيات التي تحوّل أحدهما إلى الآخر (الحركيات الأمامية) تعمل على الحاسوب، داخل التوأم الرقمي.

يستخدم الجزء 3 البرنامج الثابت التسلسلي من القسم 2، ويضيف برنامج تشغيل ROS 2 (Driver) وتخطيط الحركة عبر MoveIt 2، فتقود وحدة التحكم التي أقرنتها التوأمَ الرقمي على الشاشة، ويقود التوأمُ الذراعَ. ويضيف الجزء 4 كاميرا، وفي الجزء 5 تخبر الذراع بما يجب أن تلتقطه.

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

المصادر

أضف تعليق