본문 바로가기

로봇 만들기 - AVR/4족보행로봇

서보 모터 각도 부드럽게 변경시키는 방법.

서보 모터의 경우 입력되는 펄스의 길이에 따라 각도가 변경되는 모터이다.
(내가 말하는 서보 모터는 RC, 무선 모형에서 사용되는 서보모터임)

그런데 서보모터의 이동속도는 일반적으로 조절이 불가능하다.
펄스의 길이에 따라 서보모터의 정해진 응답속도로 움직이게 된다.

저렴한 서보모터인 HS-311의 경우 6V 전원을 사용하면 무부하 상태에서 60도 회전하는데 0.15초가 걸린다고 한다.
(서보의 경우 부하량이나 사용전압에 따라 속도와 토크가 변한다.)

그럼 서보모터 각도를 30도에서 90도로 바꾸는데 0.15초가 걸린다.
그런데 나는 30도에서 90도로 바꾸는 것을 15초 동안 하고 싶다면 어떻게 해야할까?
2.5초마다 10도씩 바꿔준다면 30도에서 90도로 이동하는게 15초가 걸리게 되지만
6단계로 정지하면서 움직이게 될것이다.

그러면 그 단계를 점점 세분화 한다면 어떨까?
만약에 60도를 1500단계로 나누어 0.01초에 한단계씩 서보모터에 입력되는 각도값을 변경시켜 준다면
사람눈으로 보기에는 완전히 부드럽게 천천히 움직이는 것처럼 보일것이다.

그러기 위해서는 우선

1. 서보모터의 동작 펄스를 만드는 타이머의 값이 커야한다.
즉 8비트 타이머를 쓴다면 어떻게 해도 서보모터의 각도는 256단계 뿐이지만
16비트 타이머를 쓴다면 65000단계로 늘어나게 된다.

물론 실제로 타이머를 적용시키다보면 65000단계를 전부 쓰지는 않고 나의 경우 180도를 3500정도의 값으로 나누어 처리한것 같다.(소스를 대충 봐서 정확하지 않다.)
그러나 그 정도면 1도당 20의 타이머값, 즉  0.05도 정도의 정밀도로 서보를 동작시킬수 있는 셈이다.



2. 매번 서보 모터에 입력되는 펄스값이 만들어 질때마다 펄스폭을 조금씩 변경한다.
예를 들어 서모모터의 펄스를 20ms 간격으로 만든다고 가정하자.
그런데 나는 1초동안 서보모터의 각도를 30도에서 40도로 변경시킬것이다.

1도당 타이머 값 :  20
30도의 서보 타이머 값 : 600
40도의 서보 타이머 값 : 800
값의 차이 : 800-600 = 200

1초동안 서보를 위한 펄스 생성 횟수  : 50회
1회 서보 펄스 생성시마다 변화량 : 200/50 = 4    -> 각도로는 0.2도 정도..(계산상)

그럼 타이머 값은 처음 100, 100+300/50, 100+300/50+300/50, 100+300/50+300/50+300/50...
그런식으로 변해 나가게 되고
서보모터는 20ms 마다 0.2도 정도씩 변해서 1초동안 10도를 움직이게 된다.

아마 이런식으로 프로그램을 하려면 MCU자체의 PWM사용하는 것보다
직접 타이머 인터럽트를 이용해서 매 인터럽트 순간마다 펄스폭을 변경하는 것이 프로그램 작성하기가 더 용이하고, 여러개의 서보모터를 제어하는 것에도 응용할수 있다.