Page 133 - 최강 아두이노 스마트 자동차 로봇 키트
P. 133
조금 더 안전한 서보모터 제어
프로젝트의 구현 성격에 따라 본 섹션의 내용 및 함수는 필요하지 않을 수 있습니다.
최소 요구 작동 시간 내에 myservo.write() 함수를 호출 하는 경우 약간의 오차 또
는 오류가 발생될 수 있습니다
서보모터 sg90 모델의 스펙을 서보모터의 회전 속도에 대한 소요 시간이 나와 있습니
다.
Operating speed: 0.1 s/60 degree 60 도에 0.1 초 회전 합니다.
반대로 말하면 0.1 초에 60 도 회전합니다.
왼쪽에서 오른쪽으로 120 도 회전 하는 경우 0.2 초의 최소 잠시 정지 시간이 필요
합니다. 또는 필요에 의해 더 많은 회전을 하였다면 더 많은 소모시간이 요구 됩니다.
물론, 4WD 운행 코드 구현 시 아래의 예제코드는 필요하지 않을 수 있습니다.
보다 더 세밀한 프로젝트를 위해 적용시켜 봅니다.
코드 및 구현 개념에 따라 여러 가지 방법이 있습니다. 현재 각도 설정에 대한 변수
를 정의하여, 현재 서보모터의 각도를 저장하고 변수를 참조하여 함수를 구현할 수
있습니다. 또는 지원되는 라이브러리를 참조하여 세부 함수를 구현할 수도 있습니다.
아두이노 스케치의 Servo 클래스 라이브러리에는 현재 서보 모터의 회전 각도를 구
할 수 있는 함수가 있습니다.
Servo 클래스의 read() 함수를 사용하여 현재 서보 모터의 각도를 구할 수 있습니다.
int nCurrDegree = myservo.read();
그럼 현재 각도에 대한 이동해야 할 각도를 구해 60 도에 0.1 초 기준으로 지연시간
을 계산해줍니다.
조건은 무조건 60 도 미만일 경우에도 0.1 초 지연시간을 주기로 합니다.
// nDegree : 회전할 각도
// 반환값: delay 함수에 들어가는 1 초 1000 비율로 환산.
int checkServoDelayByDegree(int nDegree)
{
nDegree=nDegree%360; //
int nCurrDegree = myservo.read(); // 현재 서보모터의 각도
float fDegree = fabs(nCurrDegree - nDegree); // 절대값.
fDegree = fDgeree / 60.0f;
fDegree=max(1.0f,fDegree);
//fDegree=min(10.0f,fDegree);
132