[아두이노 쿼드콥터] 서보모터 라이브러리를 활용한 PID 제어

Posted by Doony
2015. 10. 22. 14:50 아두이노 드론 프로젝트

이전에 mpu6050 센서에서 각도가 튀는 걸 확인할 수 있었는데요. 그렇기에 [아두이노 쿼드콥터] mpu6050 센서값 보정하기에서 상보필터를 한 센서 값을 한번 더 보정할지 고민을 했었지요. 

하지만 그 전에, 혹시나 몰라서 필터 방법을 바꿔보기로 했습니다. 칼만필터로요 (칼만필터 출처 : Kristian Lauszus, TKJ Electronics). 그랬더니, 웬걸!!! 좌측에 나오는 값이 각도 값인데요. 이 값이 상당히 깔끔하게 나오더라구요.


한참을 기다려도 값이 튀지 않더라구요. 필터 알고리즘에 문제가 있었나 봅니다ㅠㅠ 추가 보정은 하지 않아도 되겠네요.


어쨋든 이렇게 센서 값이 튀는 것도 해결 됐으니 다시 PID 제어를 시작해야겠죠? 

저번에 모터 출력을 세분화 시키기 위해 사용했던 서보모터 라이브러리에 PID 제어 코드를 합쳐봤습니다. 이전에 PID 제어시 사용하던 필터 변수만 바꿔주는 것이기에 엄청 간단하겠죠?



오!! 동영상은 조금 어색해 보이지만 체감상 확실히 좋아진 것 같더라구요. PID 게인 값만 맞추면 잘 될 것 같다는 느낌이 드는데요.

자, 확실한 실험을 위해 손이 아닌 줄로 드론을 고정을 하구요. 

참... 허접합니다....

본격적으로 PID 게인 값을 맞추기 전에 [아두이노 쿼드콥터] 이중 PID 제어에 올렸던 코드를 보시면, 

 

error_x = desired_angle - angle_y; //angle def

 P_angle_pid = P_angle_gain * error_x; //angle def + P control


 // angle rate gy_x;

 error_pid_x = P_angle_pid - rate_x / 100;


 m_x = m_x1 + G1 * error_pid_x + G2 * error_pid_x1 + G3 * error_pid_x2;


 PID_value = constrain(0.1 * abs(m_x), b, 20);


 if (error_x >= 0) {

   r2 = PID_value;

 }

 if (error_x < 0) {

   r4 = PID_value;

 }


진하게 되어 있는 이 부분을 통해 '각도가 한쪽 (error_x)으로 기울어지면 기울여진 모터에 PID 값으로 출력해라'라는 명령을 내렸는데요. 잘 생각해보면 저희가 이중 PID 제어에서 목표로 했던 값은 각속도 값이기에 error_x가 아닌 error_pid_x를 기준으로 if 구문을 써야합니다. 이런 실수를 하다니!


이후 게인 값을 여러번 수정한 다음 실험해봤습니다. 



아직 수평을 이루지 못하고 좌우로 흔들리긴 하지만, 예전처럼 확확 기울거나 그러진 않네요. 아무런 지지대가 없이도 확 기울어지지 않는걸 봐서 게인 값을 조금 더 맞추면 안정적인 중심잡기가 가능하지 않을까 싶어요. 기대가 됩니다!!


다음 번엔 조금 더 안정적인 중심 잡는 모습을 보여드리길 기대하면서 오늘 포스팅은 여기서 마칠게요!