
منصة توازن بمحركي BLDC: تصميم نظام غير مستقر لاختبار التحكم في الزمن الحقيقي
لماذا تبني آلة غير مستقرة عن قصد؟
أداة ضبط لم تُختبر إلا في المحاكاة لا تثبت الكثير. المحاكاة تعطيك إشارات نظيفة، وتوقيتاً مثالياً، ونظاماً يتصرف تماماً كما تقول معادلاته. أردت العكس: نظاماً يسقط في اللحظة التي يتوقف فيها التحكم، ويستجيب خلال أجزاء من الثانية، ويحمل معه كل مشكلات العالم الحقيقي من ضجيج المحركات ولاخطية المشغّلات ومحدودية قدرة المعالجة.
لذلك صممت منصة توازن بمحركي BLDC: عارضة صلبة حرة الدوران حول محور مركزي، في كل طرف منها محرك بدون فرش ومروحة. هي نفس مسألة البندول المقلوب الكلاسيكية، وهي تحاكي محور الميلان (Pitch) لطائرة بدون طيار ثنائية المراوح. إذا أخطأ المتحكم ارتطمت العارضة بالأرض، وإذا أصاب طفت مستوية على عمودين من الهواء.
كانت هذه المنصة نظام التحقق العتادي لـأداة ضبط PID ومراقبتها في الزمن الحقيقي.
التصميم الميكانيكي
نمذجت التجميع كاملاً في Fusion 360 قبل طباعة أي قطعة، وكان هناك متطلبان أساسيان:
- تناظر الكتلة. إذا لم يكن الذراعان متطابقين تماماً، تولّد الجاذبية عزماً ثابتاً على العارضة، فيضطر المتحكم لمقاومة انحياز دائم بدل أن يوازن.
- محور دوران منخفض الاحتكاك. الاحتكاك في المحور يخفي الديناميكية الحقيقية ويجعل النظام يبدو أكثر استقراراً مما هو عليه. لذلك يحتوي حامل المحور على محمل كريات (Ball Bearing) لتدور العارضة بحرية في مستوى الميلان.


طُبعت جميع الأجزاء الإنشائية ثلاثياً بمادة PLA (كثافة ملء 25%، سماكة طبقة 0.2 mm)، ما منحني دقة هندسية جيدة وكتلة متكررة على الجانبين.




الديناميكية: ما الذي يقاومه المتحكم
حالة النظام هي زاوية الميلان $\theta(t)$ مقاسة من وضع التوازن ($\theta = 0$). وبتطبيق قانون نيوتن الثاني للحركة الدورانية حول المحور:

حيث $m_1, m_2$ كتلتا مجموعتي المحركين، و$l_1, l_2$ بعداهما عن المحور، و$F_1, F_2$ قوتا دفع المروحتين، و$g$ تسارع الجاذبية.
هنا تظهر قيمة التصميم المتناظر. عندما $m_1 = m_2 = m$ و$l_1 = l_2 = L$، تُلغي حدود الجاذبية بعضها تماماً:
$$ \ddot{\theta} = \frac{L\,(F_1 - F_2)}{2 m L^2} = \frac{F_1 - F_2}{2 m L} $$تسارع العارضة يعتمد فقط على فرق الدفع. لا يوجد عزم إرجاع، فأي اضطراب صغير يكبر حتى توقفه تغذية راجعة فعّالة. ويتبع دفع كل مروحة القانون التربيعي الكلاسيكي:
$$ T = C_T \, \omega^2 $$حيث $C_T$ ثابت دفع المروحة و$\omega$ سرعة الدوار. هذه العلاقة التربيعية لاخطية تقع مباشرة بين خرج المتحكم والقوة الفيزيائية.
الإلكترونيات ومعمارية العتاد

| المكوّن | الدور | المواصفات الأساسية |
|---|---|---|
| EMAX RS2205 ×2 | محركات BLDC | 2300 KV، مراوح ثابتة الخطوة |
| Hobbywing Skywalker 20 A ×2 | وحدات ESC | تحكم بإشارة PWM، نبضة 1–2 ms |
| MPU6050 | وحدة قياس عطالية IMU (عند المحور) | جيروسكوب ومقياس تسارع ثلاثي المحاور، I²C @ 400 kHz |
| Arduino Uno | المتحكم الرئيسي | ATmega328P @ 16 MHz، اتصال تسلسلي @ 115200 bps |
| بطارية Li-Po | التغذية | 3S، 11.1 V، 1800 mAh |
| محوّل DC–DC | تغذية المنطق | 5 V، 2 A، يعزل دارات المنطق عن ضجيج المحركات |
| PLA (طباعة ثلاثية) | الهيكل | كثافة ملء 25%، سماكة طبقة 0.2 mm |
تُغذّى دارات المنطق عبر محوّل DC–DC مخصص بجهد 5 V لإبعاد ضجيج تبديل المحركات عن المتحكم الدقيق والحساس. لكن كما أظهرت التجارب، عزل التغذية وحده لا يكفي.

التحكم المدمج: من بيانات IMU الخام إلى فرق الدفع
يشغّل Arduino حلقة تحكم متقطعة مصممة لتعمل بتردد 100 Hz ($T_s = 10$ ms). وكل دورة تمر بالمراحل نفسها: تقدير ← مقارنة ← حساب ← تحديد ← توزيع.

1. تقدير الوضعية (المرشح التكاملي)
الجيروسكوب سريع لكنه ينجرف، ومقياس التسارع لا ينجرف لكنه مليء بالضجيج. لذلك أدمجهما بمرشح تكاملي (Complementary Filter). يُكامَل معدل الجيروسكوب:
$$ \theta_g[k] = \theta_g[k-1] + \dot{\theta}[k]\, T_s $$ثم يُدمج مع زاوية الميل من مقياس التسارع $\theta_a[k]$ المحسوبة من $(a_x, a_y, a_z)$:
$$ \hat{\theta}[k] = \alpha \left( \hat{\theta}[k-1] + \dot{\theta}[k]\, T_s \right) + (1-\alpha)\, \theta_a[k], \qquad \alpha = 0.98 $$مع $\alpha = 0.98$ يهيمن الجيروسكوب على الديناميكية السريعة، بينما تصحح الجاذبية الانجراف ببطء.
2. متحكم PID المتقطع
مع خطأ التتبع $e[k] = \theta_{ref}[k] - \hat{\theta}[k]$:
$$ u[k] = K_p\, e[k] + K_i \sum_{i=0}^{k} e[i]\, T_s + K_d\, \frac{e[k] - e[k-1]}{T_s} $$3. الإشباع
لحماية المشغّلات والحد من تراكم التكامل (Windup)، يُقيَّد الخرج بحد متناظر $L$، وهو حد PID الذي يُضبط مباشرة من الأداة:
$$ u'[k] = \begin{cases} +L, & u[k] > +L \\ u[k], & -L \le u[k] \le +L \\ -L, & u[k] < -L \end{cases} $$4. التوزيع التفاضلي
أخيراً تُوزَّع الإشارة المحدودة بشكل متناظر حول سرعة دفع محايدة $U_{base}$:
$$ PWM_1[k] = U_{base} - u'[k], \qquad PWM_2[k] = U_{base} + u'[k] $$يتسارع محرك ويتباطأ الآخر، فيبقى الدفع الكلي ثابتاً تقريباً، ويتحول خرج المتحكم إلى أمر عزم صافٍ.
وفي الكود، الحلقة الأساسية مكتوبة بإيجاز مقصود:
void loop() {
unsigned long currentTime = millis();
mpu.update();
angle = mpu.getAngleY();
if (pid.Compute() && !emergency) {
int motor1 = constrain(baseSpeed - out, 1000, 2000);
int motor2 = constrain(baseSpeed + out, 1000, 2000);
ESC.writeMicroseconds(motor1);
ESC2.writeMicroseconds(motor2);
}
if (currentTime - lastSerialTime >= SERIAL_INTERVAL) {
handleSerialCommands(); // non-blocking, newline-terminated
lastSerialTime = currentTime;
}
}
تُجمَّع الأوامر الواردة حرفاً حرفاً وتُطبَّق دفعة واحدة: أي كسب جديد يمر عبر pid.SetTunings() ويصبح فعّالاً خلال فترة عينة واحدة. ويُرسَل البث القياسي على مؤقت مستقل بمعدل محدود حتى لا يستحوذ على الحلقة، وتُحفظ القيم المضبوطة في EEPROM لتقلع المنصة بآخر إعداد ناجح.
ما الذي علّمني إياه العتاد
هذا الجزء الذي أعتز به أكثر. المنصة توازنت، والأداة ضبطتها مباشرة، لكن التجارب قاست أيضاً لماذا لم يكن التوازن سلساً تماماً، وحوّلت مشكلتين خفيتين إلى أرقام.
الاكتشاف الأول: الحلقة لم تكن تعمل فعلياً بـ 100 Hz
صُمم الكود ليعمل بتردد 100 Hz، لكن السجلات المختومة زمنياً أظهرت متوسط فترة حلقة فعلي يقارب 30 ms، أي نحو 33 Hz. معالج ATmega328P بنواة واحدة وثمانية بتات مضطر لتنفيذ قراءة الحساس عبر I²C، وحساب PID، وتحديث وحدتي ESC، والاتصال التسلسلي ثنائي الاتجاه بالتتابع في كل دورة.
في الأنظمة الشبيهة بالبندول المقلوب، القاعدة الشائعة أنها تحتاج معدل تحديث لا يقل عن نحو 50 Hz للحصول على استقرار متين. عند 33 Hz بقيت المنصة متوازنة، لكن مع تذبذبات مستمرة صغيرة السعة، لأن المتحكم ببساطة لم يكن يستطيع الاستجابة بالسرعة الكافية لرفض الاضطرابات.
ولفصل كلفة الاتصال عن كلفة الحساب، أضفت وضع إيقاف العرض (Visualization-Off) الذي يوقف بث القياسات. تحسنت سلاسة الاستجابة بشكل ملحوظ، وهذا يؤكد أن البث يضيف حملاً. لكن التذبذب لم يختفِ، فعنق الزجاجة الرئيسي هو المتحكم الدقيق نفسه لا البروتوكول.
الاكتشاف الثاني: المحركات كانت تسمّم إشارة الحساس
المشكلة الثانية كانت التداخل الكهرومغناطيسي (EMI). سجّلت الزاوية في حالة الاستقرار ضمن نوافذ مدتها 5 ثوانٍ تحت ثلاث حالات:

| الحالة | الانحراف المعياري σ | القيمة من القمة إلى القمة |
|---|---|---|
| المحركات متوقفة | 0.014° | 0.080° |
| سرعة منخفضة (1200 µs) | 0.264° | 1.610° |
| سرعة التوازن (1320 µs) | 0.534° | 3.840° |
عند دفع التوازن ارتفع ضجيج الحساس 37 ضعفاً في الانحراف المعياري و48 ضعفاً في القيمة من القمة إلى القمة مقارنة بحالة المحركات المتوقفة. وارتفاع الضجيج مع قدرة المحركات يشير بوضوح إلى تداخل كهرومغناطيسي من محركات BLDC ووحدات ESC. وهذا حرج للمتحكم: الحد التفاضلي يقرأ الضجيج عالي التردد كحركة حقيقية، فيصدر تصحيحات لم تكن العارضة بحاجة إليها.
الخطوات التالية
- نقل المتحكم إلى متحكم دقيق أسرع بمعمارية 32 بت لرفع معدل الحلقة الفعلي بأمان فوق 100 Hz.
- تحصين سلسلة القياس ضد التداخل الكهرومغناطيسي: التدريع، وتوجيه الكابلات، وموضع الحساس، وترشيح الزاوية المقاسة.
- استخدام البيانات المسجّلة في تعريف النظام (System Identification) والضبط المعتمد على النموذج، ومقارنته بالضبط اليدوي المنفّذ بالأداة.
منشورات مرتبطة ضمن هذه السلسلة
- 💻 PID Tuning aVT: أداة الضبط مفتوحة المصدر: المعمارية، والبروتوكول، والتحقق بأسلوب البرنامج داخل الحلقة.
- 📄 البحث المنشور في المجلة التركية للهندسة: الورقة العلمية المحكّمة وراء هذا العمل.