본문 바로가기
공부/아두이노 & 회로구성

Arduino uno, PID control, 아두이노 우노 PID 제어 라이브러리 활용

by 쉬고 싶다 2020. 10. 18.
반응형

 

- PID (proportional integral derivative control) control

- PID 제어 라이브러리 다운

- PID 제어 코드 분석

 

 

 PID (proportional integral derivative control) control

 

2020/09/20 - [정리, 공부해요/전기, 전자, 통신] - PID 제어 (Proportional Integral Derivative control) 원리/정리/튜닝

 

PID 제어 (Proportional Integral Derivative control) 원리/정리/튜닝

- Proportional Integral Derivative control - P제어 - I제어 - PI제어 - PD제어 - PID제어 - 튜닝 (Tuning)  Proportional Integral Derivative control 개루프 제어가 아닌, 폐루프(closed loop feedback c..

setoo0922.tistory.com

PID 제어에 관한 원리는 이전 포스팅에서 정리해 두었습니다.

 

 

 PID 제어 라이브러리 다운

 

www.arduinolibraries.info/libraries/pid

 

PID

PID controller

www.arduinolibraries.info

PID 라이브러리 파일을 받을 수 있는 링크입니다.

혹은 아래에서 다운 받으시면 됩니다 :)

 

PID-1.2.0.zip
0.01MB

 

PC – 문서 – Arduino – libraries

아두이노 라이브러리 폴더에, 알집을 푸시면 됩니다.

(libraries 폴더 안에 PID-1.2.0, 압축파일 안의 폴더를 푸시면 됩니다.)

 

 

 PID 제어 코드 분석

 

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>

#define PIN_INPUT 0
#define PIN_OUTPUT 3

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(PIN_INPUT);
  Setpoint = 100;

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

void loop()
{
  Input = analogRead(PIN_INPUT);
  myPID.Compute();
  analogWrite(PIN_OUTPUT, Output);
}

PID myPID(&Input ~~): 사용할 변수 설정

myPID.SetMode(AUTOMATIC): PID 세팅, PID모드 켜기

myPID.Compute(): 받은 Input을 Setpoint와 비교해서 Output값 계산

 

코드를 보고 궁금했던 부분: 

1. Input 값과 Setpoint의 비교 비율

  • Input 들어온 값을 곧이 곧대로 Setpoint와 비교하는 라이브러리 코드인지,
  • 아니면 인풋 값인 0 ~ 1023을 특정 비율로 줄이거나 늘려서 Setpoint 값과 비교하는 것인지

2. Input과 Setpoint의 어떤 차이에 따라 Output 값이 결정 되는지

  • 이부분은 Kp, Ki, Kd의 값에 따라 달라질 것이라 판단됨
  • 코드를 돌려보니 DIRECT 와 REVERSE 에 따라 변화 확인

 

3. 아웃풋 값은 0~255 범위인지

 

 

300x250

 

우선 Input값을 쉽게 바꿔주기 위해 가변저항 연결

int pin = A0;
int val;

void setup(){

  Serial.begin(9600);
  pinMode(pin,INPUT);
}

void loop(){
  val=analogRead(pin);
  Serial.println(val);
  delay(100);
}

화질이 별로지만,, 위의 궁금증 해결

DIRECT: Input 값이 Setpoint를 넘어서면 그 값을 줄여 맞추기 위해 Output 출력

REVERSE: Input 값이 Setpoint 보다 낮아지면 그 값을 늘려 맞추기 위해 Output 출력

(저는 실험 셋업 온도가 특정 지점 이상으로 올라가지 못하게 쿨링을 해주는 것이 목적이기에 REVERSE를 사용합니다.)

 

Setpoint: 500, DIRECT

Input(가변저항 값)이 500을 넘는 근처부터 Output(제어값) 비례해서 상승. ~150정도까지 상승

Output 최대 255, Input값(시스템에서 센싱 값)이 Setpoint로 부터 100~200 차이만 나도 Output 출력은 최대가 됩니다.

 

Setpoint: 300, REVERSE

Setpoint인 300보다 낮아지는 순간부터 Output값 급상승, 255까지

REVERSE의 경우 (DIRECT는 반대로 Input이 내려 갔을 시 발생), Input 값이 Setpoint보다 높아지면, 값이 더 올라가던가 변하지 않아도 빠르게 Output 값이 0에 수렴함을 볼 수 있습니다.

 

 

마무리

 

위의 내용을 참고해서 코드를 짜시면, 간단히 PID 컨트롤을 할 수 있지 않을까 합니다.

물론, Kp/Ki/Kd 값은 자신의 시스템에 맞게 튜닝 하셔야 합니다 :)

 

 

반응형

댓글