چرا PID به تنظیم دقیق نیاز دارد؟
فرمول PID سه عدد دارد: Kp، Ki، Kd. هیچ مقدار «جادویی» برای همه رباتها وجود ندارد — هر سیستم بسته به جرم، ارتفاع مرکز جرم، قدرت موتور و سرعت حلقه کنترل، اعداد متفاوتی نیاز دارد. تنظیم دستی یاد گرفتنی است اما نیاز به روش و صبر دارد. در این پست یاد میگیریم چطور با ابزارهای رایگان آردوینو PID را بهینه کنیم.
🛠️ ابزارهای لازم
| نرمافزار | Arduino IDE → Serial Plotter (رایگان) |
| سختافزار | ربات/اسکوتر آماده از پستهای قبل |
روش تنظیم دستی گام به گام
| مرحله | کار | نتیجه مورد انتظار |
|---|---|---|
| ۱ | Ki=0, Kd=0 — فقط Kp را بالا ببر | ربات واکنش نشان میدهد اما نوسان دارد |
| ۲ | Kp را تا نوسان پایدار بالا ببر (Ku) | نوسان ثابت با دامنه مشخص (Tu را اندازه بگیر) |
| ۳ | Kp=0.6×Ku، Kd=0.075×Ku×Tu اضافه کن | نوسان کم میشود |
| ۴ | Ki=1.2×Ku/Tu اضافه کن | خطای ماندگار از بین میرود |
| ۵ | دستتنظیم ظریف با Serial Plotter | پاسخ نرم و سریع |
کد با Serial Plotter output
// افزودن به loop() برای نمایش در Serial Plotter:
Serial.print("Setpoint:"); Serial.print(setpoint);
Serial.print(",Angle:"); Serial.print(angle);
Serial.print(",Output:"); Serial.println(output);
// در Serial Plotter سه خط رنگی میبینی
// هدف: Angle روی Setpoint بماند و Output آرام باشد
کالیبراسیون آفست IMU
// قبل از استفاده، MPU-6050 را روی سطح صاف بگذار و این را اجرا کن:
#include <MPU6050_6Axis_MotionApps20.h>
MPU6050 mpu;
void setup(){
Wire.begin(); Serial.begin(115200);
mpu.initialize();
mpu.CalibrateAccel(6); // ۶ بار میانگین
mpu.CalibrateGyro(6);
mpu.PrintActiveOffsets(); // آفستها را یادداشت کن
}
// سپس در کد اصلی:
// mpu.setXAccelOffset(آفستخودت);
// mpu.setYAccelOffset(آفستخودت);
// مقادیر را از PrintActiveOffsets بخوان
جدول عیبیابی PID
| علامت | علت | درمان |
|---|---|---|
| نوسان سریع | Kp یا Kd خیلی زیاد | هر دو را ۲۰٪ کم کن |
| کند و بیتفاوت | Kp کم | Kp را دو برابر کن |
| drift مداوم به یک سمت | آفست IMU یا setpoint اشتباه | setpoint را تنظیم کن، IMU کالیبر کن |
| لرزش موتور (buzz) | dt خیلی کوچک یا Kd خیلی بزرگ | Kd کم کن، یا از فیلتر مشتق استفاده کن |
| Integral Windup | Ki × زمان جمع خطا | errSum = constrain(errSum,-N,N) |