إن متحكم PID Controller هو خوارزمية تحكم تُستخدم في الروبوتات، مثل روبوتات LEGO Mindstorms وEV3 وSPIKE Prime، لضبط تحركاته بدقة، مثل توجيه الروبوت،
التحكم بسرعته أو تتبع الخطوط..
مكونات PID الرئيسية
تتكون الخوارزمية من 3 مكونات وهي كالتالي:
🔹 1. الجزء التناسبي (Proportional - P)
هذا هو الجزء الأساسي من التحكم. يقوم بقياس مقدار الخطأ بين القيمة المستهدفة (الإضاءة المطلوبة) والقيمة الحالية (الإضاءة الفعلية التي يقرأها المستشعر).
- كلما كان الخطأ أكبر، زاد مقدار التصحيح الذي يقوم به الروبوت.
- إذا كان الروبوت بعيدًا عن الخط، يزيد التصحيح لإعادته بسرعة.
- إذا كان قريبًا من الخط، يكون التصحيح أصغر.
💡 المعادلة الأساسية:
![]()
🔹ملاحظة: مشكلة استخدام التناسبية فقط
- إذا كان Kp كبيرًا جدًا، سيهتز الروبوت ويتأرجح بقوة.
- إذا كان Kp صغيرًا جدًا، سيكون التصحيح ضعيفًا، وقد لا يصحح مساره بسرعة.
🔹 2. الجزء التكاملـي (Integral - I)
يُستخدم لإصلاح الأخطاء الصغيرة المتكررة التي تتراكم بمرور الوقت.
- إذا استمر الروبوت في الانحراف قليلاً عن الخط، فإن التكامل يقوم بجمع هذه الأخطاء الصغيرة ويضيف تصحيحًا إضافيًا لمنع الانحراف.
- يساعد في الحالات التي يكون فيها الروبوت غير قادر على تصحيح نفسه بالكامل باستخدام التناسبية فقط.
💡 المعادلة الأساسية:
![]()
🔹ملاحظة: مشكلة زيادة مقدار التكاملية بشكل كبير
- إذا كان Ki كبيرًا جدًا، قد يؤدي إلى تجاوز الروبوت للنقطة المستهدفة والتسبب في اهتزازات غير ضرورية.
🔹 3. الجزء التفاضلي (Derivative - D)
يقيس معدل تغير الخطأ ويعمل على منع التذبذب.
- إذا كان الروبوت يصحح مساره بسرعة كبيرة، يقوم الجزء التفاضلي بتهدئته لمنع الاهتزازات الشديدة.
- يقلل من الاهتزازات المفاجئة عند الاقتراب من الخط.
💡 المعادلة الأساسية:
![]()
🔹ملاحظة: مشكلة زيادة مقدار التفاضلية بشكل كبير
- إذا كان Kd كبيرًا جدًا، يصبح الروبوت حساسًا جدًا لأي تغير صغير، مما قد يجعله غير مستقر.
تطبيق PID في ليغو
يُستخدم PID في روبوتات ليغو لتحسين استجابتها، مثل:
✅ تتبع الخط الأسود بدقة باستخدام مستشعر الألوان.
✅ التوجيه المستقر عند استخدام المحركات.
✅ تعديل السرعة تلقائيًا عند مواجهة عقبات أو تغييرات في الطريق.
كود مبسط لخوارزمية PID في LEGO EV3 بايثون (MicroPython)
# ثوابت PID Kp = 1.0 # معامل التناسبية Ki = 0.1 # معامل التكامل Kd = 0.5 # معامل التفاضل last_error = 0 integral = 0 def pid_control(target, current): global last_error, integral error = target - current # حساب الخطأ integral += error # حساب التكامل derivative = error - last_error # حساب التفاضل output = (Kp * error) + (Ki * integral) + (Kd * derivative) # معادلة PID last_error = error # تخزين الخطأ السابق return output # إرجاع ناتج التحكم
مثال عملي مع روبوت LEGO EV3
🔹 كود تحسين تتبع الخط باستخدام PID
from ev3dev2.motor import LargeMotor, OUTPUT_B, OUTPUT_C from ev3dev2.sensor.lego import ColorSensor from time import sleep # ثوابت PID Kp = 1.2 # معامل التناسبية Ki = 0.1 # معامل التكامل Kd = 0.5 # معامل التفاضل last_error = 0 integral = 0 # تهيئة المحركات والمستشعرات left_motor = LargeMotor(OUTPUT_B) right_motor = LargeMotor(OUTPUT_C) color_sensor = ColorSensor() # تحديد قيمة الإضاءة المستهدفة target_light = 50 def pid_control(target, current): global last_error, integral error = target - current integral += error derivative = error - last_error output = (Kp * error) + (Ki * integral) + (Kd * derivative) last_error = error return output while True: current_light = color_sensor.reflected_light_intensity # قراءة الإضاءة correction = pid_control(target_light, current_light) # حساب تصحيح PID # تعديل سرعة المحركات بناءً على التصحيح base_speed = 30 left_motor.run_forever(speed_sp=base_speed + correction) right_motor.run_forever(speed_sp=base_speed - correction) sleep(0.01) # تأخير بسيط للاستقرار
🔹 ماذا سيحدث عند تشغيل هذا الكود؟
✔ الروبوت سيبدأ في تتبع الخط بسلاسة دون التذبذب المفرط.
✔ سيقوم PID بتعديل المحركات ديناميكيًا ليبقى الروبوت على المسار الصحيح.
✔ إذا ابتعد الروبوت عن الخط، سيقوم PID بتصحيحه فورًا وإعادته إلى المسار.