프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

[워밍업] 로봇팔 구동하기

2019-10-31 11:42:24

서보모터란?


 

서보(Servo)의 어원은 라틴어의 Servue로서 노예라는 의미를 가지고 있으며, 목표치에 대한 위치, 방위, 자세 등의 제어가 자동화되어 있는 장치 이름에 붙여지곤 합니다.

이와 같이 서보모터는 모터와 기어박스 그리고 제어회로로 구성되어있어, 특정 위치로 이동하거나, 특정한 수치(속도 등)만큼 가동시킬 때, 모터로 부터의 피드백을 통해 정확하게 제어할 수 있는 구조를 갖추고 있는 모터로 자동화 생산 시스템, 로봇, 장난감, 가전제품 등 광범위하게 쓰이고 있습니다.




 

 

 

서보모터 사용방법


 

서보모터는 무한정 회전이 가능한 DC모터와 달리 회전 반경이 정해져 있는 경우가 대부분 입니다.

종류에 따라 다르지만 아두이노에서 사용하는 서보모터의 경우 일반적으로 약 0~180도 범위의 회전각을 가집니다.

그렇기 때문에 180도 이상으로 돌리려고 무리한 힘을 가하게 되면 서보모터가 손상됩니다.

 

서보모터에는 3개의 단자가 있습니다. 각각의 단자는 별도의 핀을 알리는 문구가 써져있는 대신 케이블의 색으로 역할을 구분합니다.

일반적으로 3개의 케이블은 검은색(또는 갈색), 붉은색, 황색(또는 주황색, 흰색)으로 표시되어 있으며, 붉은색 선은 +전원, 검은색 선은 -전원에 연결되어 서보모터에 전기를 공급하는 역할을 하며, 노란색 선은 서보모터의 동작을 제어하는 신호선입니다.

 

 

서보모터의 회전 각도의 원리는 아래 그림과 같이 PWM (펄스폭변조) 방식으로 제어합니다.

전체 20ms의 PWM주기 중 1~2ms사이의 파형을 통해 각도를 제어합니다.

1ms만큼 HIGH신호를 주면 0도를 가르키고, 1.5ms만큼 HIGH신호를 주면 90도, 2ms만큼 준다면 180도를 가르킵니다.
 

 

 

 

 

 

서보모터가 PWM의 원리를 사용하기 때문에 서보모터는 아두이노에서 PWM을 사용할 수 있는 곳에 연결해야 한다고 보통 생각하게 됩니다.

하지만 서보모터는 PWM핀이 아닌 디지털 핀 아무곳에 연결해도 무방합니다.

서보모터를 제어하는 PWM신호가 아두이노의 PWM신호와는 차이가 있기 때문에 서보모터는 별도의 PWM을 생성하여 제어하게 됩니다.

 

※ 단 아두이노에서 서보모터를 사용하는 동안에는 디지털 9, 10번핀에서는 PWM사용(analogWrite())를 사용할 수 없음에 유의하세요!

 

 

 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 + 확장보드 1  
2 서보모터 1 mg90
5 점퍼 케이블 3  

 

 

부품명 오렌지 보드 서보모터 점퍼 케이블
파트

 

 

 

 

 

하드웨어 making


 

1. 서보모터의 주황색선을 오렌지보드 확장쉴드 D8번핀에 연결합니다.

2. 서보모터의 빨간색선을 오렌지보드 확장쉴드 +버스에 연결합니다.

3. 서보모터의 검은색선을 오렌지보드 확장쉴드 -버스에 연결합니다.

 


 

 

 

 

소프트웨어 coding

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <Servo.h>
 
Servo myservo;
 
// 서보모터의 회전 각도입니다.
int angle = 0;
 
void setup() {
  // 서보모터를 8핀으로 설정합니다.
  myservo.attach(8);
}
 
void loop() {
  // 0.01초 마다 모터의 각도를 1도씩 증가시킵니다.
  for(int i = 0; i <= 180; i++){
    myservo.write(i);
    delay(10);
 }
}
 

 

 

attach()와 write()

 

서보모터를 작동시키기 위해서는 별도의 함수인 attach()를 사용합니다.

attach()를 사용함으로써 서보모터에 전원을 공급하여 동작할 수 있게 합니다.

 

반대로 detach()라는 함수도 있으며 detach()를 쓰게 되면 서보모터의 공급되는 전원을 차단함으로써 제어가 불가능하게 됩니다.

서보모터는 액츄에이터로 전원을 많이 차지하기 때문에 특별히 제어가 필요없다면 detach()로 전원을 차단하는 것도 좋은 방법입니다.

 

서보모터의 각도는 write()로 제어하며 대부분 0~180도 사이로 제어합니다.

이때 서보모터가 순간적으로 움직이는것이 아닌 1초 미만의 약간의 텀을두면서 움직이기 때문에 write() 실행 후 바로 또 다른 write()로 각도를 제어하면 원하는 동작으로 실행되지 않습니다.

이때는 delay()를 사용하여 충분히 움직일 시간을 준 다음 write()를 사용하는 것이 좋습니다.

 

 

 

 

 

로봇팔 구동하기


 

로봇팔은 4개의 서보모터로 구성되어 있으며 이 모터를 각각 제어함으로써 로봇팔을 원하는 위치로 움직일 수 있습니다.

 

 

 

 

 

모터1(밑판) 움직임

 

 

 

모터2(옆면1) 움직임

 

 

 

모터3(옆면2) 움직임

 

 

 

집게 움직임

 

 

 

 

서보모터를 움직여서 로봇팔 제어하기

 

로봇팔의 1~4번 모터는 아두이노 디지털 8~11번 핀에 연결하고 있습니다.

 

로봇팔 모터 번호 아두이노 핀 번호
1번 모터(밑면) D8
2번 모터(옆면1) D9
3번 모터(옆면2) D10
4번 모터(집게) D11

 

아래 예제 코드에서 서보모터의 핀번호를 바꿔가면서 테스트를 해보세요.

 

소스코드 7번째 줄에 있는 servo.attach(핀번호) -> 이 부분에서 핀 번호만 8~11로 바꾸시면 됩니다.

 

아래 코드는 시리얼 모니터에서 숫자값(0~180) 을 입력했을 때 해당 각도로 모터가 움직이는 코드입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <Servo.h>
 
Servo myservo;
 
void setup() {
  // 서보모터를 8번핀에 연결합니다. (다른 모터를 사용하실거면 핀 번호를 바꿔주세요.)
  myservo.attach(8);
}
 
void loop() {
  if (Serial.available()) {
    // 시리얼 모니터에서 들어온 숫자값을 angle 변수에 저장합니다.
    int angle = Serial.parseInt();
 
    // 서버모터로 지정된 각도로 회전하도록 설정합니다.
    myservo.write(angle);
 
  }
  // 0.1초 동안 대기합니다.
  delay(100);
}
 

 

코드가 업로드 되었으면 시리얼 모니터에 움직일 각도를(숫자만) 넣고 전송해보세요.

 

 

모터별로 어떤 각도에 어떤 상태가 되는지 확인해보시고 로봇팔로 프로젝트를 만드실 때 원하는 동작의 각도를 체크해두세요!!

 

 

 

kocoafab