[아두이노 쿼드콥터] 시리얼 통신으로 받는 속도가 느린 이유

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

시리얼 통신으로 받는 속도가 느린 이유



네 오늘은 시리얼 통신에 대해 알아보겠습니다.

지난 포스팅에서 저희가 갖고 있었던 문제 중 하나가 바로,


블루투스로 시리얼 통신을 통해 전송하는 속도가 좀 느리다는 점이었습니다. 이게 왜 느린지 몰랐는데..

아무튼 약 1초 정도 딜레이가 걸리는 순간, loop가 제대로 돌지 않아 pid 제어가 불가능했고,

결과적으로 제어에 실패하는 양상이었는데요.


그 이유를 말씀드리도록 하겠습니다.



바로,


Serial.parseInt 에 정답이 있습니다.



저희가 시리얼 통신을 통해 받는 모든 데이터는, Serial.parseInt 또는 Serial.parseFloat 입니다.

즉, 정수형이나 실수형으로만 받는것입니다.


정수형으로는 주로 전진후진 혹은 호버링을 위해 목표 각도값을 입력하고,

실수형은 PID 게인 값을 받는 형식입니다.


Float이 int보다 통신 시간이 더 걸린다는 얘길 들어서 그 문제가 아닐까 먼저 의심을 해보았는데,

알고 보니 전혀 다른 곳에 있었습니다.





parseInt도 그렇고 parseFloat도 그렇고 같은 문제인데요.

기본적으로 이 두가지는, 입력값중에 정수형 혹은 실수형만을 받기 때문에 받은 후에도 기다린다고 합니다.


즉, 다음에 더 입력되는 값이 정수형일수도 있고 실수형일수도 있으니 기다리는거죠.

그 기다리는 시간만큼, 제가 위에서 말했던 1초 정도의 딜레이가 생기는 겁니다.


1초 정도는 기다리고 있는 것이죠. 

이게 보니까 기본, 즉 디폴트 값이 1초라고 설정되어 있는 것 같더라구요.

1초 정도 기다려보고, 더이상 정수형 혹은 실수형이 들어오지 않으면 이 값을 저장해라! 뭐 이런 느낌.

그래서 해결책은 아래와 같습니다.



Serial.setTimeout(50);


요 녀석을 Setup 부분에 하나 넣어주는 건데요. 이게 바로 타임아웃을 설정하는 것입니다.

즉, 1초라는 딜레이를 50ms로 줄여라~~ 라는 명령이죠.



이렇게 해보시면, 재빠르게 값들을 받는 것을 알 수가 있습니다.


저희도 아직 블루투스와 실제로 연동해보진 않았는데, 내일 실험을 해볼 생각입니다.