글: Jeremy Cook
산업 제어를 다루는 사람들에게는 비례, 통합, 파생(PID) 이론이 익숙한 개념일 것입니다. 대부분의 사람들에게는 이 용어가 완전히 낯설겠지만 생각보다 더 익숙할 수도 있습니다. 자동차의 가속 페달을 밟으면 원하는 속도와 어느 정도 차이가 나는지, 즉 PID의 비례적 부분 뿐 아니라 특정 차량이 가속하는 방식과 언덕 같은 조건도 고려합니다.
산업 제어를 다루는 사람들에게는 비례, 통합, 파생(PID) 이론이 익숙한 개념일 것입니다. 대부분의 사람들에게는 이 용어가 완전히 낯설겠지만 생각보다 더 익숙할 수도 있습니다. 자동차의 가속 페달을 밟으면 원하는 속도와 어느 정도 차이가 나는지, 즉 PID의 비례적 부분 뿐 아니라 특정 차량이 가속하는 방식과 언덕 같은 조건도 고려합니다.
이와 같이 보다 미묘한 효과를 I 및 D 부분에서 수학적으로 고려합니다. 이 예에서는 자동차의 속도가 상한에서 하한으로 튀는 것을 방지하며, 동일한 개념을 다양한 제어 상황에 적용할 수 있습니다. 제한 기반 제어로 대략적인 범위를 얻을 수 있으나, 시스템이 다소 변덕스럽게 동작하는 경향이 있습니다.
PID 방정식
PID 제어는 다음과 같은 방정식을 사용해 수리적으로 표현할 수 있습니다. 여기에서는 P, I, D의 세 가지 용어를 합쳐서 표현합니다. Kp, Ki, Kd는 시스템이 각 인수에 어떻게 반응하는지를 반영하는 상수입니다.

Ki 및 Kd를 각각 1/Ti 및 Td로 대체할 수도 있습니다. 이렇게 변경하면 방정식이 물리적 의미를 더 정확하게 반영할 수 있으며, 단위가 없는 숫자에 단위를 적절하게 적용할 수 있습니다.

또한 방정식의 위치를 바꿔 Kp 값을 도출할 수도 있으며, 이를 표준 형식으로 알려진 전체 방정식에 적용할 수도 있습니다. 이 형식의 장점 중 하나는 전체 방정식의 전반적인 Kp 상수를 한 번에 조정할 수 있다는 점입니다.

이 모든 내용은 공학 학위를 취득한 사람에게조차 다소 부담스럽게 느껴질 수 있습니다. 다행히 여기에서 일어나는 일을 이해하기 위해 동적 시스템의 모델링 및 분석 교과서를 들여다 볼 필요는 없습니다. 해서 나쁠 것은 없지만 미적분을 알 필요도 없습니다.
첫 번째 방정식을 살펴보면 등호 오른쪽에 있는 세 개의 항인 P, I, D를 더해서 방정식 왼쪽에 있는 단위 없는 컨트롤러 출력값 u(t)를 얻을 수 있습니다. 각 항에는 앞에 상수인 K값이 있고(Kp, Ki, 그리고 Kd), 이는 u(t)를 이루는 각 항의 가중치 또는 특정 시점의 제어 출력을 나타냅니다. 더 나은 시스템 성능을 위해 각 K 값을 개별적으로 조정할 수 있으며, 이에 관해서는 아래에서 추가로 설명할 예정입니다.
비례(P—Kp)
첫 번째이자 이 방정식에서 가장 중요한 항은 e(t)입니다. 따라서 이 앞에 오는 Kp 값은 일반적으로 방정식의 다른 K 값보다 큽니다. 여기서 e(t)는 특정 시점의 순간 오류입니다. 즉, 제어되는 장치의 실제 값에서 원하는 값을 뺀 값입니다. 이 값을 Kp로 곱하면 전반적인 컨트롤러 출력에 미치는 영향을 구할 수 있습니다.
통합(I—KI)
이 방정식의 두 번째 항은 시간의 경과에 따른 복합 오류와 관련이 있습니다. 이는 기기에서 발생하는 모든 오류의 합입니다.
컨트롤러는 u(t)를 계산할 때마다 누적 집계에 순간 오류를 더합니다.
그런 다음 이 수치에 Ki를 곱하고 u(t)에 더합니다.
힘으로 모터를 제자리에 고정하고 있고, 일반적인 조건에서는 설정점으로 돌아가지 않도록 하는 상황을 생각해 보겠습니다. 사양을 벗어나는 시간이 길어지면 I 항이 계속 증가하고 결국 이 힘을 초과하거나 모터 용량의 한도에 도달하게 됩니다.
파생(D—Kd)
이 방정식의 세 번째 항은 오류가 얼마나 빨리 변하는지와 관련이 있습니다.
이론적으로는 이 방정식에 D 항만 있고 프로세스에서 꾸준히 잘못된 값을 유지한다면 이 항은 0으로 남게 되고 적절한 출력에 영향을 주지 않습니다. 반면 다른 두 항 중 하나가 기기의 출력을 너무 빠르게 원상 회복하려고 할 경우 파생은 효과를 약화시키는 데 도움이 될 수 있습니다.
이 개념의 미적분 기반 표현식이 유용할 수는 있지만 실제 PID 제어는 처음 봤을 때처럼 마술 같지는 않습니다. 실제로 우리는 판독값 사이의 오류와 시간을 고려하여 덧셈, 뺄셈, 곱셈만으로 출력을 계산합니다. 사실 PID 제어의 초기 형식을 구현하기 위해 유압 시스템을 사용했으며, 기계적 수단으로 각 "항"을 입력했습니다.
1. 컨트롤러에서 순간 오류 값을 가져옵니다.
2. 여기에서 이전 순간 값을 뺍니다.
3. Kd의 결과 값을 곱해 u(t)에 대한 영향을 계산합니다.
Arduino PID 컨트롤러 튜토리얼
전용 PID 컨트롤러를 프로세스에 플러그인하는 것이 편리하지만, Arduino 또는 유사한 개발 보드로 직접 만들 수도 있습니다. 직접 PID 루틴을 작성할 수도 있습니다. 코드의 각 항은 다음과 비슷한 방식으로 표현할 수 있습니다.
- P:순간 오류 = 설정값 – 입력,
- I:누적 오류 = += 오류 * 경과 시간,
- D:에러율 = (오류 – 직전 오류)/경과 시간
필요한 출력을 얻으려면 각 항을 각 K 값으로 곱한 다음 전부 더하면 됩니다. 반면, 시간을 낭비하지 않으려면 Brett Beuregard의 PID 라이브러리로 건너뛰어도 됩니다. 이 라이브러리에서는 자세한 내용을 다루며, 필요에 따라 P, I, D 상수 값의 조정에 초점을 맞출 수 있습니다.

실제 PID 이론을 시연하기 위해 저는 도구 상자에서 Arduino Nano Every를 꺼냈습니다.
- 모터 드라이버 보드
- 적외선 센서
- Hubsan H107C 드론에서 회수된 모터
회전 시 파동을 놓치지 않기 위해 빛을 50% 차단해 주는 "팬"과 함께 모터의 브레드보드 마운트를 인쇄했습니다. 모터 드라이버는 (제어되지 않았을) 모터의 입력이고, 피드백은 파동 간 시간을 기준으로 합니다.
코드를 실행하고 3D 인쇄된 부품을 얻었을 때 저는 일정한 PWM(파동 너비 모듈화) 출력으로 전원 버튼을 작동했을 때보다 더 정교한 방식으로 모터를 제어할 수 있었습니다.

위에 링크된 PID 루틴의 코드 조각
코드 일부에서는 중단 루틴을 사용하여 각 파동을 기기 차단 회전으로 등록하고 millis()로 파동 간 시간을 계산합니다. 함수 외 코드의 첫 번째 부분에서 다음으로 PID를 설정했습니다.
PID myPID(&difference, &driverOut, &setPoint,Kp,Ki,Kd, DIRECT)
Kp, Ki, Kd는 코드의 이 줄 앞에 정의되어 있으며 &difference는 직렬 모니터에서 수정된 &setPoint로 &driverOut을 제어합니다. 이 수학 공식을 변경하여 이 시간 차이를 RPM으로 변환할 수 있지만 이 특정 드라이버는 입력이 낮게 풀리면 켜지기 때문에 PID 설정은 DIRECT 출력으로 작동합니다. 아날로그 출력이 높아지면(모터 꺼짐), 파동 간 지연도 증가합니다.

PID 루틴 이전 버전입니다. CH1은 입력 파동을 읽고 CH2는 PID 루틴을 사용하여 계산합니다. 낮은 파동은 모터의 입력입니다.
이 단순한 PID 컨트롤러 예시는 구하기 쉬운 부품(새로운 Arduino Nano Every 포함) 및 대략적으로 알고 있는 모터에서 도출한 것입니다. 하지만 이 모든 사실이 없더라도 다양한 상황에서 PID 제어를 적용하는 방법을 시연할 수 있었습니다. 사소한 PID 설정과 조정으로도 모터 제어, 오븐의 온도 제어, 로봇 균형 잡기 등 다양한 실험 옵션을 이용할 수 있습니다.

