[아두이노 쿼드콥터] PID 제어 보완 + ESC 고장?!

Posted by Doony
2015. 11. 2. 00:55 아두이노 드론 프로젝트

지난번에 드론의 어설픈 균형 잡기 신공까지 보여드렸는데요? 


아직 보완이 더 필요해 보입니다. 우선 무엇이 문제인지 분석해봅시다!






위의 각 바는 드론의 한 축이라고 보시면 됩니다. (참으로 허접한 그림이지만 이해해 주세요;;;) 드론이 중심을 잡는 과정을 네 경우로 나누고 시리얼 창을 통해 PID 값을 확인했는데요. 

우선 첫번째 경우를 보시면 드론이 수평에 있을 때입니다. 저희의 목표가 수평을 잡는 것이기에 error값이 0이 될 것입니다. 

하지만 곧 (한쪽으로 무게가 더 쏠려 있기에) 기울게 됩니다 (두번째 경우). 하지만 각도가 여전히 너무 작아 아직 추가 출력을 주지는 않습니다. 반응이 느린 것이죠. 코딩을 수정하여 적은 각도일 때도 반응을 할 수 있게 조정할 필요가 있겠네요.

세번째 경우처럼 꽤 많이 기운 경우 기울어진 방향의 모터에 더 큰 출력을 주긴 하지만 아직 출력이 약해 움직임이 없네요.

마지막 경우처럼 확 기운 후에야 모터의 출력이 강해져서 기울어진 쪽이 위로 올라오게 됩니다. 하지만 확 기운 후의 출력은 너무나 강해 수평을 맞추는 것이 아니라 수평을 넘어서 반대쪽까지 기울어져 버리네요. 


결국 조그만 각도에서도 반응을 하고 출력이 조금 더 세지도록 코딩을 고쳐야겠네요. 


  PID_value = constrain(PID_scaler * abs(m_y), min_output, max_output);


  if (error_pid_y >= 0) {

    front.write(PID_value);

    

  }

  if (error_pid_y < 0) {

    back.write(PID_value);

    

  }



저희는 기존에 min_output 값으로 40을 줬었는데 이를 이제 20으로 주고 대신 출력 PID 값에다 20을 더해줬습니다. 


  if (error_pid_y >= 0) {

    front.write(PID_value+20);

    

  }

  if (error_pid_y < 0) {

    back.write(PID_value+20);

    

  }


이렇게 하고 나니 이전에 비해 이전보다 훨씬 안정적으로 자세를 잡더라구요.
그런데 기쁨의 순간도 잠시.... 갑자기 문제가 발생했습니다. 역시 인생은 타이밍....ㅋㅋㅋ 

갑자기 ESC가 먹통이 됐는데요. 어떤 값을 주더라도 한쪽 모터가 이상하게 반응하네요. 저는 각 모터에 10이라는 출력값을 줬는데요. 그러면 출력값이 높지 않기에 안도는게 정상인데 한 녀석만 반응을 하네요.



아두이노도 바꿔보고 핀도 확인 했지만 여전히 이상하여 BLDC 모터나 ESC를 의심했는데요. PID를 거의 완성하려고 하니까 고장이라니.... 참 안타깝습니다. 그래도 일단 무엇이 문제인지 알아야하기 때문에 정상적인 모터와 이상한 모터를 바꿔봤는데요. 



이렇게 위에 전기테이프로 이상한 놈을 표시하고 위치를 바꿔봤습니다. 지금은 하얀 축 위에 있는데 검은 축으로 옮겨집니다. 



그리고 아까와 똑같은 신호를 줘봤습니다.


이번에도 하얀 축 위에 있는 모터가 회전하네요. 이로써 모터의 문제는 아닌걸로 밝혀졌네요. ESC의 문제인거 같네요.....


내일 마지막으로 ESC와 모터의 Calibration을 확인해보고 ESC를 재구매할지 결정하려고 합니다. 순간적으로 Calibration이 바뀐 것이길 기대하며....


아. ESC를 재구매하게 되더라도 나머지 모터 세개는 제대로 작동하기에 축을 바꿔서라도 PID를 통한 균형 잡는 목표는 마무리할 수 있을 듯 합니다. 이 목표를 마무리한 뒤에는 수중로봇으로 잠시 방향을 선회해야 할 수도 있겠네요.


오늘 포스팅은 여기까지입니다!