로봇팔을 구성하는 요소 중 손에 해당하는 장치를 만들어 보겠습니다.

손을 만드는 방법은 여러가지가 있겠지만 여기서는 서보모터 1개만을 이용해서 쥐락 펴락하는 동작을 구현할 수 있는 mechanical claw 를 만듭니다. 꽤 많이 사용되는 방식이라 온라인 상에서 모델링 파일을 구해서 3D 프린터로 출력해도 되고, 구매해도 됩니다. 아래 링크에 있는 제품입니다.

http://www.aliexpress.com/item/Freeshipping-1set-2-DOF-Aluminium-Robot-Arm-Clamp-Claw-Mount-kit-No-servo-Un-assembly-Fit/1506837980.html

이 손을 아두이노를 이용해서 제어할 수 있도록 하는 것이 목표입니다.

1. 준비물

아래와 같은 준비물이 필요합니다.

parts

  • Mechanical claw 세트
  • 서보모터(MG995 또는 유사계열)와 부품
  • 십자 드라이버
  • 아두이노 Nano (또는 UNO)
  • 브레드보드
  • 점퍼선
  • 5V 외부전원 (12V 어댑터와 브레드보드용 파워 공급 모듈)
  • PC

MG995 쯤 되는 서보모터의 경우 전류를 많이 잡아먹기 때문에 아두이노에서 전원을 빼서 사용할 수 없습니다. 외부 전원을 공급해줘야 합니다. 위 사진에서 브레드보드 왼편에 달린 모듈이 파워 공급 모듈입니다. 여기에 12V 아두이노용 어댑터를 연결하면 5V 전원을 공급할 수 있습니다. 혹은 1.5V 건전지 3개를 이용해서 전원을 공급해줘도 됩니다. 전 DC power supply 장치가 있어서 이걸 5V로 맞춰 사용했습니다.

2. 조립 순서

2-1. 손(Mechanical claw) 조립

먼저 손을 조립합니다. Mechanical claw 세트와 서보모터를 준비합니다.

손 뒤편을 보면 서보모터를 연결할 수 있는 4개의 나사 구멍이 있습니다. 여기에 아래와 같이 서보모터를 단단히 연결해 줍니다.

claw_assembly_1

반대로 뒤집습니다. 서보모터의 회전축이 보입니다. 여기에 십자 모양으로 나사 구멍이 난 디스크를 끼워줍니다. 디스크 뒤편에 나사산 모양으로 구멍이 있으므로 흔들리지 않게 끼워집니다.

claw_assembly_2

이제 더 조립을 진행하기 전에 서보모터 회전축 위치를 특정 위치에 고정시켜줘야 합니다.

2-2. 서보모터 보정작업

서보모터는 0~180′ 사이를 왕복할 수 있는데 mechanical claw 세트는 약 70′ 정도의 범위만 움직일 수 있습니다. 따라서 서보모터 회전각을 중앙(90′)에 맞추고, 여기에 맞게 손도 중간쯤 되는 위치에 올 수 있도록 보정 작업을 해줘야 합니다.

아두이노와 서보모터, 배터리 등을 준비해서 연결해 줍니다.

RobotArm_claw_circuit

  • 서보모터의 VCC(빨간색), GND(갈색 혹은 검정색) 라인을 배터리의 (+), (-) 라인으로 연결해줍니다. 그리고 Signal(황색) 라인을 아두이노의 D9 핀에 연결해줍니다.
  • 서보모터가 외부 전원을 사용하므로 아두이노와 서보모터는 D9 핀으로만 연결되어 있습니다. 따라서 아두이노의 GND 핀을 서보모터 GND(갈색 혹은 검정색) 라인으로 연결해줘야 정상동작 합니다.
  • 아두이노는 USB를 통해 PC에서 전원을 공급 받을 수 있으니 당장은 별도 전원이 필요 없습니다.

이제 아두이노에 아래 소스를 올려줍니다. 서보모터를 PC에서 제어하기 위한 소스입니다.

#include <Servo.h> 

Servo servo;

int servoPin = 9;
int current_angle = 0; // current servo position in degrees

int centerServo = 90;  // center servo position
int min_angle     =  55;  // minimum servo position
int max_angle     =  125; // maximum servo position
int turnRate     =  5;  // servo turn rate increment (larger value, faster rate)  

void setup() {
  Serial.begin(9600);
  Serial.println("Robot Arm Control");
  Serial.println("Press a or s to move, spacebar to center");
  Serial.println();
  
  servo.attach(servoPin);
  current_angle = centerServo;
  servo.write(current_angle);
}

void loop()
{
  int angle = current_angle;
  
  if (Serial.available() > 0) {
    char command = Serial.read();

    // User contro:   ASCII 'a' == 97,   ASCII 's' == 115  
    if (command == 97) { angle -= turnRate; }
    if (command == 115) { angle += turnRate; }
    if (command == 32) { angle = centerServo; }

    // Check min, max
    if (angle > max_angle) { angle = max_angle; }
    else if (angle < min_angle) { angle = min_angle; }

    Serial.print("Angle = ");
    Serial.print(angle);
    Serial.println();
  }
  
  if(angle != current_angle) {
    moveServo(angle);
  }
}

// Move servo to target angle
void moveServo(int target_angle) {
  int step_angle = 1;
  if(target_angle < current_angle) { step_angle = -1; }
  
  // This code makes smooth movement
  for(int i = current_angle; i != target_angle; i+=step_angle) {
    //if((target_angle - i) < step_angle && (target_angle - i) > step_angle * -1)  // close to target position, break this loop
    //  break;
    
    servo.write(i);
    delay(15);
  }
  current_angle = target_angle;
}

소스를 업로드하면 서보모터가 90′ (중앙) 위치로 갑니다. 아두이노의 Serial monitor 창을 띄워서 서보모터의 위치를 바꿀 수 있지만 이건 나중에 해보기로 하고 일단은 이 상태로 둡니다.

2-3. 손 조립 마무리

서보모터 회전축이 중앙으로 갔으니 손 모양이 반 정도 벌어진 모양으로 고정될 수 있도록 맞춰봅니다.

claw_assembly_3

사진처럼 손 아래쪽 기구를 나사 구멍에 맞게 위치 시켰을 때 손이 반 정도 벌어진 상태가 되는지 확인합니다. 모양이 맞지 않다면… 아래쪽 서보모터 회전축에 끼운 디스크를 빼서 살짝 회전시켜 끼웁니다. 이 과정을 반복해서 손 모양을 맞춥니다. 모양이 맞춰졌다면 나사 2개로 고정합니다. 회전축에 연결된 디스크도 나사로 고정해주세요.

claw_assembly_4

디스크를 고정하는 나사는 세게 조여도 됩니다. 하지만 디스크와 아래 관절을 연결하는 나사 2개는 약간 헐겁게 조여야 합니다. 그리고 나사가 디스크를 뚫고 아래 프레임에 닿지 않도록 주의해야 합니다!!

조립이 완료 되었습니다. 이제 정상 동작하는지 테스트 해볼 차례입니다.

claw_assembly_5

3. 테스트

아두이노 개발환경의 Serial Monitor 창을 띄웁니다. 상단 메시지 입력란에 a(각도 감소, 손 벌어짐), s(각도 증가, 손 닫음), 스페이스(중앙위치)를 입력하고 엔터키를 누르면 5′ 단위로 손이 움직입니다. ‘aaaa’, ‘sssssss’ 와 같이 연속해서 입력 후 엔터키를 누르면 문자 하나당 5’씩 움직입니다.

4. 소스코드

이제 소스코드를 약간 손봐줘야 합니다.

소스코드에는 손이 동작할 수 있는 범위가 55′ ~ 125′ 로 설정되어 있습니다.

int min_angle     =  55;  // minimum servo position
int max_angle     =  125; // maximum servo position

서보모터의 양 끝점을 테스트 해서 소스상에 설정된 범위가 적절한지 테스트해야 합니다.

만약 기구가 움직일 수 있는 범위를 서보모터가 벗어나려 한다면 드드드드~ 와 같은 노이즈가 발생할겁니다. 이 경우는 기구를 수정하던지 소스코드의 동작 범위를 조절해줘야 합니다.

그리고 서보모터 동작에 문제가 없는 구간에서 드드드드~ 노이즈가 발생하는 경우가 있습니다. 이건 그 구간에서 서보모터가 제 위치를 찾아가려고 하는데 부하가 걸려 제대로 움직이질 못해서 입니다. 아래 사항들을 체크해서 문제를 해결하세요.

  • 각 부품들이 연결되는 관절은 나사로 조여져 있습니다. 나사는 약간 헐겁게 조여져야 합니다. 움직이면서 헐거워지기도 하고, 뻑뻑해지기도 하므로 적당히 조여져야 합니다.
  • 서보모터 회전축과 기구를 연결하는 2개의 나사를 확인하세요. 나사가 너무 깊게 조여진 경우 아래쪽의 프레임에 닿아서 제대로 움직이질 못하고 아래 프레임을 긁는 경우가 있습니다.

이제 손은 다 만들었으니 다음 강좌에서는 팔 관절을 하나씩 덧붙여 보겠습니다.

참고자료: