متحكم PID Controller

متحكم PID Controller

إن متحكم 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 بتصحيحه فورًا وإعادته إلى المسار.

 

 

 

 

 

مقالات ذات صلة