DC모터를 이용한 위치 제어 (PID)
회로에서 RV1의 가변 저항 값( 설정값)에따라서 A0로부터 입력되는 전압이 0V~5V로 전압이 변하는데 이 전압의 값에따라 모형 헬리콥터가 위와 아래로 이동하는 프로그램이다
RV1의 어느 특정 값의 위치에 목표값을 설정해 놓으면 RV2의 가변저항으로부터 입력되는 아나로그 값을 받아서 RV1의 값과 같아지면 그위치에서만 DC모터가 계속 동작한다.
#include<PID_v1.h> //1
double Setpoint, Input, Output; //2
PID myPID (&Input, &Output, &Setpoint, 1.6, 0.2, 0.3, DIRECT); //3
int error,down; //4
void setup() {
Input = analogRead(1); //5
Serial.begin(9600); //6
myPID.SetMode(AUTOMATIC); //7
}
void loop() {
Serial.print(Setpoint); //8
Serial.print(" ," );
Serial.print(Input); //9
Serial.print(" ," );
Serial.println(Output ); //10
Setpoint = map(analogRead(0), 0, 1023, 75, 365) ; //11
Input = analogRead(1); //12
error = (Setpoint - Input) ; //13
myPID.Compute(); //14
if ( error >0) //15
{
analogWrite(3,Output); //16
}
if(error <= 0) //17
{
down = map( error , 0, -90, Output , 0); //18
analogWrite(3, down); //19
}
}
소스코드 분석
1)PID제어에 필요한 함수를 사용하기위해 헤더 파일을 불러온다
2) PID 제어에 필요한 변수를 선언한다.
3)PID제어기의 객체를 생성한다.
4)위치정보를 얻기위한 변수를 선언한다
5) 가변저항 ( RV2)로부터 위치 정보를 얻는다.
6)시리얼모니터로 통신하기위한 톤신속돌르 설정한다.
7)PID제어기 모드를 AUTOMATIC으로 설정한다.
8)Setpoint 값을 시리얼 모니터에 출력한다.
9)Input 값을 시리얼 모니터에 츨력한다.
10)Output 값을 시리얼 모니터에 출력한다.
11)아두이노 A0포토로 Setpoint값을 입력 받는다 (RV1-->제어위치설정)
12)아두이노 A1포토로부터 Input 값을 입력받는다.(RV2)
13)설정값과 입력값의 차를 저장한다.
14)pid제어모드를 automatic으로 설정한다.
15)입력값이 설정값에 도달하지 못하면 모터의 속도를 증가시켜 모형헬리곱터를 위로 이동시킨다.(Output 값을 증가 시킨다)
16)아두이노 3번포토로 PWM파형을 출력한다.
17)입력 값이 설정 값보다 크거나 캍다면 모형 헬리콥터를 아래로 이동시킨다
(Output 값을 감소시키거나 유지)
18)입력값과 설정 값의 차이가 0에서 90 사이에 있으면 Output값은 최소 0까지 감소한다 ( Output 값이 0이면 모터는 정지한다)
19)아두이노 3번 포토에 PWM파형을 출력한다