[피지컬컴퓨팅] 서보모터

2018. 7. 6. 17:10Study_ing/About_Programming

#서론_'왜?'라는 답답함에서부터

주니어 소프트웨어 교육 업계에서 야매로, 정식으로 통합 2년 넘게 근무하면서 배워온 걸 정리해본 적이 없는 것 같아요. 그래서 깨알 같이 메모해둔 것을 최근 것부터 발굴하며 하나씩 써보려고 합니다. (물론 지금은 그 업계를 떠났지만^^)

근무 당시 교구에 센서를 좀 더 추가할 수는 없냐는 요청이 다수 들어왔습니다. 간략한 상황만 들은 뒤 자세한 연락이 오기 전 미리 테스트하기 위해서 기존 교구와 서보 모터를 연결하려고 시도해보았는데요, 연결은 분명 잘 했는데 꽂은 핀에 따라서 움직이는 범위도 다르고  LED도 제대로 동작하지 않는 상황이 계속 되었습니다. 펌웨어 코드의 문제인 것 같아 읽어보는데 공부가 더 필요하구나 싶어 서보모터에 대해 좀 더 찾아보게 되었습니다.

 

#본론1_서보모터에 관한 사전 조사

먼저 아두이노 공식 홈페이지코코아팹 사이트를 통해 서보모터에 대해 간단히 알아보았습니다.

(1) 모터란?
전기 에너지를 기계 에너지로 치환하는 동력 기계 장치입니다.
전력을 입력 받아 축에 회전력을 발생시키는데요, 모터에 공급되는 전력의 방식에 따라 크게 직류용, 교류용으로 나뉘나 동작 원리는 동일합니다. 모터 내부에 장착된 자석으로 자기장을 형성하고, 중앙 축에 연결된 도선에 전류를 흘러 발생한 전자력이 회전력을 생성합니다.

(2) 서보모터란?

서보모터(출처: https://www.dexterindustries.com/product/servo-motor-raspberry-pi-small/)

지정된 각도만큼 회전할 수 있을 뿐만 아니라 목표치에 대한 위치, 방위 등의 좀 더 섬세한 제어가 자동으로 가능한 모터입니다.
서보(servo)의 어원은 종속의 의미를 가지며, 서보라는 이름이 붙여지는 장치는 보통 목표치에 대한 위치, 방위 등의 제어가 자동화되어 있습니다. 서보모터는 모터와 기어박스, 제어회로로 구성되어 있는데요, 이러한 구성으로 인해 서보모터는 특정 위치, 수치에 대해 지정하여 동작시킬 때 모터로부터의 피드백을 받아 정확하게 제어할 수 있습니다.

(3) 서보모터 사용법
서보모터는 약 0~180 범위의 회전각을 가지며, 이 각도는 PWM 방식으로 제어합니다.
서보모터는 일반 모터와 달리 회전 반경이 정해져있습니다. 보통 0~180 범위를 가지며 이 각도는 PWM(펄스폭변조) 방식으로 제어합니다. (360도 이상 돌 수 있는 서보모터도 존재하지만 이건 언젠가 다른 포스팅에서..) 서보모터를 동작하기 위해 3개의 단자를 연결해야 하는데, 검정색(혹은 갈색) 단자는 GND, 즉 (-) 전원을, 빨강색 단자는 5V와 같은 (+) 전원을, 주황색(혹은 흰색) 단자는 서보모터의 동작을 제어하는 신호선을 의미합니다. 보드에 연결된 서보모터는 아두이노 스케치에서 Servo 라이브러리를 통해 제어할 수 있다. 이 라이브러리는 아두이노 Mega 보드를 제외한 나머지 보드에서 최대 12개의 서보모터를 제공할 수 있도록 보조하지만, 9번 핀과 10번 핀에서는 서보모터의 연결 여부에 상관 없이 analogWrite() 기능을 사용할 수 없습니다. (Mega 보드에서는 12개 모터까지는 어떤 핀을 사용해도 상관 없지만 그 이상의 모터를 사용하면 11번과 12번 핀은 사용할 수 없습니다.)

 

#본론2_문제 해결에 필요한 정보 수집

애석(?)하게도 전자전파 지식을 제일 잘 가르쳐주실 수 있는 분이 대표님이시기에 바쁘신 와중에 잠시 시간을 빌려 직접 설명을 들었습니다.

(1) PWM 방식과 그 주기
제가 가지고 있는 교구에서 O는 Oragne 신호선, R은 Red 5V 전원선,  B는 Brown GND 전원선을 의미하며 이는 아래와 같은 주기의 PWM 방식으로 동작합니다. 약 20ms(밀리초) 주기를 가지는데, 신호가 몇 초 주어지는지에 따라 서보모터의 회전각이 결정됩니다. 일반적으로 1ms는 0도, 2ms는 180도입니다. 

그림1 PWM 방식의 서보모터 동작


(2) 아두이노에서의 사용
아두이노에서 서보모터를 제어하기 위해 Servo 혹은 SoftwareServo 라이브러리를 사용합니다. (SoftwareServo 라이브러리는 아두이노 사이트에서 따로 다운로드 받아야 합니다.) Servo 라이브러리가 아두이노 스케치의 디폴트 라이브러리이기 때문에 사용하는데 원활하지만, 제가 사용 중인 교구에서는 9, 10번 핀에 모터를 연결해야 하기에 SoftwareServo 라이브러리를 사용하는 것으로 예상했습니다.
서보모터를 제어하기 위해 먼저 attach(int) 함수를 사용해야 합니다. 해당 함수는 아두이노 보드에 연결된 서보모터에게 핀을 할당하라고 명령을 내립니다. 해당 핀 번호를 사용할 수 있도록 부착(attach)시킨 뒤 write(int) 함수를 통해 지정한 핀 번호의 서보모터 각도 값을 읽어올 수 있습니다. 다만, 본 교구에서는 SoftwareServo 라이브러리를 사용하므로 동작하는 과정에서 서보모터의 업데이트를 위해 refresh() 함수를 최소 50ms마다 실행해주어야 합니다.

 

#결론_그래서, 왜 안됐을까?

그렇다면 서론에서 제시했던 문제점: 왜 핀마다 움직이는 범위가 다르거나 아예 동작하지 않는지에 대해서 정리해볼까요? 다른 핀들은 이미 다른 센서와 연결되어 있어 서보모터를 사용하기 위한 설정이 필요하지 않았습니다. 즉, attach() 함수를 해당 핀에서 사용하지 않았기 때문에 동작을 아예 하지 않을지언정, 해당 핀에 연결된 다른 센서라고 가정한 상황에서 움직였던 것입니다. 그래서 제가 서보모터를 추가로 사용하고 싶은 핀에 attach() 함수와 refresh() 함수를 추가하여 서보모터를 사용할 수 있는 환경을 세팅하였습니다. 알면 간단하지만 모르면 복잡한 건 어디서나 마찬가지인가봅니다.

'Study_ing > About_Programming' 카테고리의 다른 글

[피지컬컴퓨팅] 아두이노에 대하여  (2) 2018.07.11
[JAVA] STATIC/ARRAY  (1) 2017.07.22
[Linux] set nu/nonu  (0) 2016.12.21
[OS] 프로세스 메모리 구조  (0) 2016.05.03