안녕하세요. 메카럽입니다.
추석 연휴 즐겁게 보내셨나요? 일상으로 복귀하는 오늘이 가장 힘든날이 되겠지만 힘내시고 하늘 한 번 보시고 기분 좋은 하루 되시길 바랍니다. 이번 포스팅에서는 RC 비행기, 자동차 등에 적용되어 조향, 비행 방향 조정 등과 같은 회전각 제어에 사용되는 서보 모터를 다루는 방법에 관해 알아보도록 하겠습니다. DC 모터가 자동차의 바퀴나 비행기의 프로펠러를 동작시키는 역할을 한다면, 서보 모터는 자동차의 조향, 비행기의 진행 방향 변경, 로봇팔과 같이 일정 범위 내에서의 회전각을 제어하는 역할을 합니다. 아두이노를 통해서 마이크로 서보 모터를 많이 접할 수 잇을 것입니다. 마이크로 서보 모터는 수천 원 수준으로 저렴하고 DC 모터의 경우와 마찬가지로 각도 제어를 위해 PWM 신호를 활용합니다.
더불어 마이크로 서보 모터는 DC 모터처럼 별도의 전원장치 없이 아두이노의 전원과 출력핀만으로도 제어 가능하다는 장점이 있습니다.
아두이노에서 아날로그 핀을 통해 PWM 신호를 인가하면, 서보 모터는 펄스 폭에 따라 회전각을 움직입니다. 서보 모터는 0도에서 180도 사이에서 제어되며, 제어하는 것 또한 Servo 라이브러리를 통해 쉽게 구현할 수 있습니다. 그리고 Servo 라이브러리는 IDE에 이미 포함되어 있으므로 따로 구할 필요 없이 #include <Servo.h>만 선언해주면 됩니다.
서보 모터는 3개의 핀을 갖고 있습니다. 제조사마다 모델마다 다를 수 있으므로 항상 매뉴얼상의 핀 맵을 찾길 바라지만, 대체로 붉은 색은 5V(또는 3.3V) 전원, 검은색이나 갈색과 같이 어두은 색은 접지(GND), 그리고 주황색, 노란색 등 전원을 나타내는 색깔과 다른 색깔을 갖는 핀은 신호선(PWM)입니다.
아래 예제에서는 가변저항의 저항값 변화에 따른 서보 모터 각도 제어를 구현해보겠습니다. 아두이노의 디지털 핀중 PWM 출력을 낼 수 있는 단자에 서보 모터의 신호선을 연결합니다. 가변 저항 또한 5V와 GED핀에 연결한 후 나머지 신호선은 아날로그 핀 A2에 연결합니다.
서보 모터 제어에서 한 가지 특이한 점은 servo.attach( )라는 함수를 사용한다는 점입니다. 이 함수는 해당 서보 모터에 접근하는 데 필요한 함수로, 해당 함수에 신호선이 연결 핀 번호를 입력합니다. 해당 서보 모터와 연결을 해제하고 싶으면 servo.detach( )함수를 사용합니다.
servo.attach(서보 신호핀) servo.detach(서보 신호핀) |
아두이노 IDE에서 제공하는 knob 예제를 조금 수정한 내용입니다. Servo 라이브러리를 사용하기 위한 코드로 시작합니다. 이어 Servo.myservo; 구문은 라이브러리를 활용하여 서보 모터를 사용할 준비를 나타내고 있습니다.
#include <Servo.h> Servo myservo; // 서보 모터 사용할 준비 int potpin = A2; // 가변 저항은 A3 핀에 연결 int val; void setup( ) { myservo.attach(9); // 서보 모터의 신호선은 D9에 연결 } void loop( ) { val = analogRead(potpin); val = map(val, 0, 1023, 0, 180); // mapㅏ함수로 0-1023을 서보 모터의 각도 0-180으로 변환 myservo.write(val); // 서보 모터 신호선에 가변 저항 출력값에 맵핑값을 입력하여 각도 제어 delay(300); // 서보 모터의 팔이 해당 각도까지 움직이는 시간을 위해 확보한 시간지연 } |
가변 저항은 A2 핀에 연결되어 있는데, analogRead( )함수로 가변 저항의 저항값을 읽어 들입니다. 가변 저항 값은 ADC 되어 0~1023의 범위를 갖습니다.
이후 map( ) 함수를 볼 수 있는데, 이 함수는 서로 다른 범우를 갖는 변수값을 조절(Scaling)하여 맵핑시켜주는 역할을 합니다. 가령 가변 저항의 아날로그 출력값은 0에서 1023이지만, 이에 대응될 서보 모터의 각도 변화는 0도에서 180도 이기 때문입니다. map( ) 함수는 다음과 같이 사용할 수 있습니다.
map(변환할 변수, 변환 전 최저값, 변환 전 최고값, 변환 후 최저값, 변환 후 최고값) |
맵핑 과정이 끝나면 실제 서보 모터에 각도값을 전달하여 서보의 팔을 이동시킵니다. 이때는 servo.write( ) 함수가 사용되며, 한 가지 유의할 사항은 서보의 팔이 이동하는데 걸리는 시간을 감안해야한다는 것입니다. 그 뒤의 300ms 시간지연이 바로 그런 의미입니다.
이번 포스팅에서는 아두이노에서 사용하는 서보모터에 대해 알아보았습니다. 명절 후 하는 공부라 머리속에 잘 들어오지 않지만 하다보면 어찌어찌 되지 않을까 생각합니다. 오늘 하루 화이팅하시고 즐거운 하루 되시길 바랍니다.
읽어보면 도움되는 글
'3D프린터와 아두이노 > 아두이노' 카테고리의 다른 글
아두이노에서 스피커와 MP3재생 (12) | 2020.10.07 |
---|---|
아두이노에서 부저와 멜로디 재생 (옥타브와 음계별 표준 주파수 실습) (13) | 2020.10.06 |
analogWrite( ) 함수와 PWM제어 (4) | 2020.09.29 |
아두이노 모터 드라이버 (H-bridge 회로 구성 및 모터 드리이버와 주변 구성) (10) | 2020.09.28 |
DC모터와 트랜지스터 (2) | 2020.09.25 |