Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO

โครงงานนี้เป็นการเรียนรู้เบื้องต้นและเป็นการทดลองแบบง่าย สำหรับควบคุมความเร็วมอเตอร์กระแสตรงให้กับพัดลมขนาดเล็กด้วยวิธีการ PID Adaptive Tuning โดยใช้ตัวอย่างโปรแกรมจากไลบารี่ PID_V1.h มาทดลองการทำงาน (โปรแกรมสามารถดาวน์โหลดมาใช้งานได้ฟรี) ทั้งนี้เพื่อเป็นการศึกษาและทำความเข้าใจลักษณะการควบคุมแบบ PID Adaptive Control ซึ่งเป็นลักษณะของการควบคุมระบบปิด (Closed loop control) อีกรูปแบบหนึ่ง โดยในการทดลองจะใช้บอร์ดประมวลผล Arduino UNO ในการควบคุมการทำงานให้กับโครงงานนี้ครับ

Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 1 เตรียมอุปกรณ์ต่างๆ สำหรับประกอบโครงงาน
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 2 สเปกและลักษณะของพัดลมสำหรับทดลอง
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 3 ลักษณะของต่อวงจรสำหรับทดลอง

สำหรับในรูปที่ 1 ถึงรูปที่ 3 เป็นการเตรียมอุปกรณ์ต่างๆ สำหรับทดลองโครงงาน ซึ่งตัวพัดลม (รูปที่ 2) สามารถหาซื้อได้ทั่วไปที่บ้านหม้อหรือร้านค้าออนไลน์ และในรูปที่ 3 เป็นลักษณะการต่อวงจรโดยจะประกอบด้วยวงจรบักคอนเวอร์เตอร์ (Buck converter) วงจรปรับขนาดสัญญาณ (Signal condition) ระหว่างไมโครคอนโทรลเลอร์และวงจรบักคอนเวอร์เตอร์ และวงจรแบ่งค่าแรงดันที่เอาต์พุต (Voltage Divider) สำหรับเป็นสัญญาณป้อนกลับ (Feedback signal)

/*
   Cradit code PID Adaptive Tuning Example Form Library PID_v1.h
   MCU : Arduino UNO
   DC Power supply : 12V/2A
   Fan : DC12V/0.55A, Model : AD0812XB-A73GL 
   Dev by : www.electronicsDNA.com   
 */

#include <PID_v1.h>
#define PIN_INPUT 0
#define PIN_OUTPUT 3

int sampleRate = 10;
//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=2, aggKd=0.001;
double consKp=2, consKi=5, consKd=0.001;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(PIN_INPUT);
  Setpoint = 500;   // SP Test = 300, 500, 700

  pinMode(13, OUTPUT);
  digitalWrite(13, LOW); 
  delay(3000);

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(PIN_INPUT);  

  double gap = abs(Setpoint-Input); //distance away from setpoint
  if (gap < 50)
  {  //we're close to setpoint, use conservative tuning parameters
    myPID.SetTunings(consKp, consKi, consKd);
    digitalWrite(13, HIGH); 
  }
  else
  {
     //we're far from setpoint, use aggressive tuning parameters
    myPID.SetTunings(aggKp, aggKi, aggKd);
    digitalWrite(13, LOW);
  }
  
  myPID.Compute();
  analogWrite(PIN_OUTPUT,Output);  
}

โปรแกรมการทดลองที่แสดงข้างบนนี้ เป็นตัวอย่างหนึ่งที่อยู่ในไฟล์ไลบารี่ PID_V1.h ซึ่งเป็นการควบคุมในลักษณะ PID Adaptive Tuning โดยในส่วนของคำสั่ง if (gap < 50) นี้จะทำหน้าที่กำหนดช่วงระยะค่า ความผิดพลาด (Error) แบบค่าสัมบูรณ์ (Absolute value) เป็นอีก 1 ช่วงเมื่อเทียบกับการควบคุมแบบ PID Control ทั่วไป คือ ในกรณี เมื่อความผิดพลาดมากกว่า 50 จะใช้ค่าคงที่ในการควบคุมระบบ (Kp,Ki และ Kd) เท่ากับ aggKp=4, aggKi=2, aggKd=0.001; ซึ่งจะช่วยให้ระบบเข้าสู่ค่าที่กำหนดได้เร็วขึ้น โดยในช่วงเวลานี้แอลอีดีที่ขา D13 จะดับอยู่ จากนั้นเมื่อค่าวามผิดพลาดน้อยกว่า 50 ก็จะทำให้รูปแบบของการควบคุมคงที่มากขึ้นด้วยการกำหนดค่า consKp=2, consKi=5, consKd=0.001; และแอลอีดีจะติดเพื่อให้ทราบการปรับค่าตัวแปรในการควบคุมใหม่นั้นเอง ทั้งนี้ความเหมาะสมของการทำงานระบบนั้นๆ ผู้ใช้จะต้องศึกษาและปรับแต่งตามกระบวนการในระบบที่มีอยู่ครับ

Download Library (PID_v1.h)

Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 4 การทดลองที่ 1 ค่าแรงดันที่ตกคร่อมพัดลม เมื่อกำหนด SP = 300
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 5 การทดลองที่ 1 สัญญาณ PWM ขับพัดลม เมื่อกำหนด SP = 300
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 6 การทดลองที่ 1 ปริมาณกระแสที่จ่ายให้วงจร เมื่อกำหนด SP = 300

สำหรับในรูปที่ 4 ถึงรูปที่ 6 เป็นการทดลองที่ 1 ด้วยการกำหนดค่า Setpoint : SP เท่ากับ 300 และให้วงจรทำงานจากนั้นทดลองวัดสัญญาณเอาต์พุตที่ขา D3 ในรูปที่ 5 ที่ช่องวัดสัญญาณที่ 1 (CH1) เพื่อสังเกตการทำงาน ในส่วนช่องวัดสัญญาณที่ 2 (CH2) จะเป็นสัญญาณป้อนกลับ (Feedback signal) ซึ่งจะเป็นสัดส่วนกับความเร็วรอบของพัดลมและแรงดันที่จ่ายให้กับพัดลม

Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 7 การทดลองที่ 2 ค่าแรงดันที่ตกคร่อมพัดลม เมื่อกำหนด SP = 500
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 8 การทดลองที่ 2 สัญญาณ PWM ขับพัดลม เมื่อกำหนด SP = 500
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 9 การทดลองที่ 2 ปริมาณกระแสที่จ่ายให้วงจร เมื่อกำหนด SP = 500

ในรูปที่ 7 ถึงรูปที่ 9 เป็นการทดลองที่ 2 ด้วยการกำหนดค่า Setpoint เท่ากับ 500 และวัดสัญญาณเอาต์พุตที่ขา D3 ในรูปที่ 8 (CH1 มีความถี่เพิ่มขึ้น) และที่ช่องวัดสัญญาณที่ 2 (CH2) จะเป็นสัญญาณป้อนกลับ ซึ่งจะมีค่าแรงดันเพิ่มขึ้นมาที่ 2.45V เช่นกันปริมาณกระแสที่จ่ายให้กับพัดลมเพิ่มขึ้นมาที่ประมาณ 300mA แสดงในรูปที่ 9

Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 10 การทดลองที่ 3 ค่าแรงดันที่ตกคร่อมพัดลม เมื่อกำหนด SP = 700
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 11 การทดลองที่ 3 สัญญาณ PWM ขับพัดลม เมื่อกำหนด SP = 700
Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 12 การทดลองที่ 3 ปริมาณกระแสที่จ่ายให้วงจร เมื่อกำหนด SP = 700

ในการทดลองสุดท้ายรูปที่ 10 ถึงรูปที่ 12 การทดลองที่ 3 กำหนดค่า Setpoint เท่ากับ 700 และวัดสัญญาณเอาต์พุตที่ขา D3 ในรูปที่ 11 (CH1 มีความถี่เพิ่มขึ้น) และสัญญาณช่องที่ 2 (CH2) เป็นสัญญาณป้อนกลับ ซึ่งจะมีค่าแรงดันเพิ่มขึ้นมาที่ 3.45V และปริมาณกระแสที่จ่ายให้กับพัดลมประมาณ 400mA แสดงในรูปที่ 12

Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 13 วงจรที่ออกแบบและใช้ในการทดลองโครงงาน

ในรูปที่ 13 เป็นวงจรที่ออกแบบและใช้ในการทดลองโครงงาน ซึ่งส่วนที่สำคัญคือบอร์ดควบคุมไมโครคอนโทรลเลอร์ Arduino UNO โดยตัวบอร์ดจะทำหน้าที่รับสัญญาณป้อนกลับ (Vmotor) เข้าที่ขา A0 ผ่านวงจรแบ่งแรงดัน (R5 และ R6) จากนั้นจะส่งสัญญาณขับพัดลมแบบพัลซ์วิดมอดูเลตชั่น (PWM Signal) ที่ขา D3 โดยจะส่งให้ทรานซิสเตอร์ Q2 ทำหน้าที่ปรับระดับสัญาณให้กับเพาเวอร์ทรานซิสเตอร์ Q4 ได้เหมาะสม (Driver) ทั้งนี้สัญญาณที่ได้จาก Q4 จะส่งไปยังวงจรกรองความถี่ต่ำผ่าน (Low pass filter) ที่ตำแหน่ง L1 และ C2 เพื่อจ่ายกำลังไฟฟ้าให้กับพัดลมนั้นเอง

Simple PID Adaptive Tuning for Mini Fan Speed Control with Arduino UNO
รูปที่ 14 ลักษณะของการทดลองโครงงานทั้งหมด

สำหรับการทดลองโครงงานนี้จะสังเกตผลการควบคุมแบบ PID Adaptive Tuning ได้ไม่มากนัก ทั้งนี้เนื่องจากตัวพัดลมจะมีเพียงการปรับความเร็วให้เข้าสู่ค่าที่กำหนด (Setpoint) โดยที่ไม่มีโหลดมากนักและใช้การแสดงผลของแอลอีดี (D13) เพื่อให้เห็นการเปลี่ยนตัวแปรของการควบคุมใหม่ แต่ในกรณีที่เราต้องการนำวิธีการควบคุมลักษณะนี้ไปใช้กับระบบที่มีโหลดเพิ่มมากขึ้นจะช่วยให้เห็นความแตกได้ชัดเจน ในส่วนหนึ่งแอดมินได้นำอุปกรณ์ต่างๆ ที่พอจะมีมาทำการออกแบบและทดลองโครงงาน เพื่อให้เป็นแนวความคิดเบื้องต้นให้กับท่านผู้อ่านก่อนครับ.

Reference

  1. https://en.wikipedia.org/wiki/Adaptive_control
  2. http://image.sciencenet.cn/olddata/kexue.com.cn/upload/blog/file/2009/9/2009930810151118.).pdf
  3. https://mdh.diva-portal.org/smash/get/diva2:1107041/FULLTEXT01.pdf
  4. https://www.youtube.com/watch?v=muaG2VETgHU
  5. https://www.academia.edu/3551433/PID_and_Adaptive_Predictive_Fuzzy_Logic_Controller_for_a_micro_satellite