شرح متحكم PID مع الأردوينو - التحكم الذكي في الأنظمة

في هذا الدرس سنتعلّم كيفية استخدام متحكم PID (Proportional-Integral-Derivative) مع الأردوينو. المتحكم PID هو خوارزمية تحكم ذكية تُستخدم للحفاظ على قيمة معينة في النظام بدقة عالية، مثل التحكم في زاوية الميل، السرعة، أو درجة الحرارة.

ما هو متحكم PID؟

متحكم PID هو نظام تحكم يستخدم ثلاثة مكونات رئيسية للوصول إلى القيمة المطلوبة (Setpoint) بأقل خطأ وأسرع استجابة:

معادلة متحكم PID

المعادلة الأساسية لمتحكم PID هي:

Output = (Kp × Error) + (Ki × Integral) + (Kd × Derivative)

مكونات المتحكم بالتفصيل

1. المكون التناسبي (P)

يحسب الخطأ الحالي ويضربه في معامل Kp. كلما زاد الخطأ، زادت قوة التصحيح.

P = Kp × Error

2. المكون التكاملي (I)

يجمع الأخطاء عبر الزمن ويضربها في معامل Ki. يزيل الخطأ المتبقي على المدى الطويل.

I = Ki × ∫(Error × dt)

3. المكون التفاضلي (D)

يحسب معدل تغير الخطأ ويضربه في معامل Kd. يقاوم التغيرات السريعة ويقلل التذبذبات.

D = Kd × (dError/dt)

المكونات المطلوبة

ملاحظة: الكود المقدم يوضح منطق PID فقط. ستحتاج إلى إضافة كود قراءة المستشعر وكود التحكم في المحرك حسب مشروعك.

برمجة الأردوينو

استخدم الكود التالي لتطبيق متحكم PID:

// معاملات PID (يجب ضبطها حسب النظام)
float Kp = 1.0;    // معامل التناسبي
float Ki = 0.5;    // معامل التكاملي
float Kd = 0.1;    // معامل التفاضلي

// متغيرات PID
float integral = 0.0;
float derivative = 0.0;
float controlOutput = 0.0;
float previousError = 0.0;
float setpoint = 0.0;         // القيمة المطلوبة (الهدف)
float currentAngle = 5.0;     // القراءة الحالية من المستشعر

// متغيرات الوقت
unsigned long currentTime;
unsigned long previousTime;
float deltaT;

void setup() {
  
  // إضافة: معايرة ESC إذا كنت تستخدم محرك Brushless
  // إضافة: تهيئة ومعايرة MPU6050
  
  previousTime = millis();
  
}

void loop() {
  
  // الخطوة 0: حساب الزاوية الحالية من المستشعر
  // TODO: استبدل هذا بقراءة فعلية من MPU6050
  // currentAngle = readMPU6050Angle();
  
  // الخطوة 1: حساب الفرق
  float error = setpoint - currentAngle;
  
  // الخطوة 2: حساب الفارق الزمني
  currentTime = millis();
  deltaT = (currentTime - previousTime) / 1000.0;  // تحويل إلى ثوانٍ
  previousTime = currentTime;
  
  // الخطوة 3: حساب المكون التكاملي
  integral = integral + (error * deltaT);
  
  // تحديد المكون التكاملي لمنع التراكم الزائد (Anti-windup)
  float integralMax = 100.0;
  if (integral > integralMax) integral = integralMax;
  if (integral < -integralMax) integral = -integralMax;
  
  // الخطوة 4: حساب المكون التفاضلي
  derivative = (error - previousError) / deltaT;
  previousError = error;
  
  // الخطوة 5: حساب الخرج النهائي
  controlOutput = (Kp * error) + (Ki * integral) + (Kd * derivative);
  
  // تحديد الخرج ضمن نطاق معين
  float outputMax = 255.0;  // للمحركات DC (PWM)
  float outputMin = -255.0;
  if (controlOutput > outputMax) controlOutput = outputMax;
  if (controlOutput < outputMin) controlOutput = outputMin;
  
  // TODO: استخدم controlOutput للتحكم في المحرك
  // مثال: analogWrite(motorPin, abs(controlOutput));
  
  // طباعة القيم للمراقبة
  
  delay(10);  // تأخير 10 ميلي ثانية (100 Hz)
}

خطوات التطبيق العملي

  1. قم بتوصيل المستشعر (مثل MPU6050) لقراءة القيمة الحالية
  2. قم بتوصيل المحرك أو المشغل الذي تريد التحكم فيه
  3. حمّل الكود على الأردوينو
  4. ابدأ بضبط معاملات PID (انظر القسم التالي)

ضبط معاملات PID (Tuning)

ضبط معاملات PID هو أهم خطوة للحصول على أداء جيد. اتبع هذه الطريقة البسيطة:

طريقة Ziegler-Nichols المبسطة:

  1. ابدأ بصفر: اضبط جميع المعاملات على صفر Kp=0, Ki=0, Kd=0
  2. زد Kp تدريجياً: زد قيمة Kp حتى يبدأ النظام بالتذبذب بشكل مستمر
  3. اضبط Ki: زد Ki قليلاً لإزالة الخطأ المتبقي
  4. أضف Kd: زد Kd لتقليل التذبذبات
نصيحة: ابدأ بقيم صغيرة جداً وزدها تدريجياً. على سبيل المثال:
Kp = 0.1, Ki = 0.01, Kd = 0.001 ثم اضبطها بناءً على الاستجابة.

جدول تأثير المعاملات

المعامل زيادته تؤدي إلى نقصانه يؤدي إلى
Kp استجابة أسرع، تذبذبات أكثر استجابة أبطأ، استقرار أفضل
Ki إزالة الخطأ المتبقي، قد يسبب تجاوز خطأ متبقي طويل المدى
Kd تقليل التذبذبات، قد يبطئ الاستجابة تذبذبات أكثر، حساسية للضوضاء

تحسينات على الكود

الكود المقدم يتضمن بعض التحسينات المهمة:

التطبيقات العملية

يُستخدم متحكم PID في العديد من المشاريع:

معلومة: لمشروع روبوت التوازن، القيم الجيدة للبداية عادة تكون:
Kp = 15-40, Ki = 0.1-1.0, Kd = 0.5-3.0
لكن هذا يعتمد على وزن وحجم روبوتك، لذا الضبط التجريبي ضروري!

نصائح مهمة

الخلاصة

متحكم PID هو أداة قوية جداً للتحكم في الأنظمة الديناميكية. مع الفهم الصحيح والضبط الدقيق للمعاملات، يمكنك تحقيق تحكم دقيق ومستقر في مشاريعك. تذكر أن ضبط المعاملات يحتاج إلى صبر وتجربة، لكن النتيجة تستحق الجهد!