4자유도 아크릴 아두이노 로봇팔 키트 튜토리얼

조립 완료된 4자유도 아크릴 로봇팔을 아두이노 우노보드로 프로그램하고 제어하는 방법에 대해 알아봅니다. 로봇팔은 총 4개의 서보모터로 구동되며 각각 좌우회전, shoulder(어깨)축 이동, elbow(팔꿈치)축 이동, 그립퍼 열고 닫기를 담당합니다. 아두이노 우노보드에 센서쉴드보드를 결합하여 결선을 최소화하고 조이스틱모듈 2개를 사용하여 로봇팔을 조정하게 됩니다.

AA전지 4개를 사용하거나 DC 5V 2A이상의 USB충전기(스마트폰 충전기)를 사용할 수 있습니다. PC의 USB를 사용하는 경우 전류가 부족하여 구동이 어렵습니다. 또한 5V 2A 미만의 DC전원을 사용하는 경우에도 정상동작이 어려울 수 있으니 주의하시기 바랍니다.

로봇팔은 아크릴제질로 되어 있습니다. 따라서 조립시 무리한 힘을 가하면 부러질 수 있으니 유의하셔야 합니다.  또한 로봇팔 구동시 움직이는 결합부는 볼트를 느슨하게(부품이 움직일 수 있도록) 조립하셔야 합니다.

초보자가 조립하기에는 다소 어려울 수 있으니 주변의 도움을 받으시기 바랍니다.

본 튜토리얼은 로봇팔의 조립이 완료된 상태에서 아두이노 보드와의 결선 및 프로그램 방법에 대해서 설명합니다.

아래는 완성된 로봇팔의 모습입니다.

 

아래는 키트에 포함된 아두이노 우노 R3 호환보드입니다. USB 드라이버만 별도로 설치하시면 됩니다.

 

아래 링크의 드라이버를 다운로드합니다.

아두이노 우노 R3 호환보드용 CH340 USB드라이버

 

다운로드한 드라이버파일의 압축을 풀고 SETUP.EXE를 실행하면 아래의 창이 나타나며 INSTALL버튼을 누르면 드라이버가 설치됩니다.

 

드라이버를 설치한 후 아두이노 우노 보드를 USB에 연결하면 장치관리자에서 아래와 같이 시리얼포트가 등록되어 있는 것을 확인할 수 있습니다.

 

아래 링크로 가시면 아두이노 IDE 소프트웨어 설치파일을 다운로드할 수 있으며 기본적인 아두이노 IDE 사용법을 익힐 수 있습니다.

아두이노IDE 설치 및 사용방법 링크

 

아래 링크로 가시면 아두이노 보드로 서보모터를 제어하는 방법에 대해서 기본적인 실험을 할 수 있습니다.

아두이노 서보모터 각도제어 실험 링크

 

4자유도 로봇팔 제어 소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드하면 됩니다.

아래 소스에서 

myservo[i].detach(); //서보모터를 일정시간 사용하지 않으면 연결을 끊어둔다.

부분은 로봇암을 일정시간 사용하지 않으면 아두이노 보드와의 연결을 끊어서 전류사용을 최소화하여 배터리 사용시간을 늘리기 위함입니다.

그러나 동시에 서보모터에 걸리는 토크가 끊어지면서 그립퍼나 기타 서보모터의 지지하는 힘이 없어집니다.

이 부분을 커맨트 처리(//)하면 항상 토크가 걸리게 되며, 그립퍼의 힘도 유지하게 됩니다. DC 5V 2A이상의 USB충전기(스마트폰 충전기)를 사용하시는 경우에 적용하시면 됩니다.

//myservo[i].detach(); //서보모터를 일정시간 사용하지 않으면 연결을 끊어둔다.

// 아두이노 4자유도 로봇팔 제어
#include <Servo.h> 

#define XPOS 0
#define YPOS 1

const int SERVOS = 4;
int PIN[SERVOS], value[SERVOS], idle[SERVOS], currentAngle[SERVOS], MIN[SERVOS];
int MAX[SERVOS], INITANGLE[SERVOS], previousAngle[SERVOS],ANA[SERVOS];
Servo myservo[SERVOS];

void setup()   {

  //좌우회전 서보모터
  PIN[0] = 9; //서보모터 IO를 9번핀으로 지정
  MIN[0] = 0; //서보모터 최소 회전각도
  MAX[0] = 180; //서보모터 최대 회전각도
  INITANGLE[0] = 90; //서보모터 초기각도
  ANA[0] = 3; //조이스틱스위치입력 IO를 아날로그 A3번핀으로 지정
  //왼쪽 서보모터
  PIN[1] = 6;
  MIN[1] = 30; 
  MAX[1] = 165;
  INITANGLE[1] = 152;
  ANA[1] = 2;
  //오른쪽 서보모터
  PIN[2] = 5;
  MIN[2] = 40;
  MAX[2] = 180;
  INITANGLE[2] = 90;
  ANA[2] = 0;
  //그립퍼 서보모터
  PIN[3] = 10;
  MIN[3] = 60;
  MAX[3] = 180;
  INITANGLE[3] = 60;
  ANA[3] = 1;
  
  for (int i = 0; i < SERVOS; i++){
    myservo[i].attach(PIN[i]);
    myservo[i].write(INITANGLE[i]);
    value[i] = 0;
    idle[i] = 0;
    previousAngle[i]=INITANGLE[i];
  }
}

void loop() {
  delay(20); // 로봇팔 속도조정을 위한 딜레이
 
    for (int i = 0; i < SERVOS; i++){
      value[i] = analogRead(ANA[i]);
      currentAngle[i] = myservo[i].read();
    
      if (value[i] > 612) {
        idle[i] = 0;
      
        if (currentAngle[i] < MAX[i]) ++currentAngle[i];
        if (!myservo[i].attached()){
          myservo[i].attach(PIN[i]);
        }
        myservo[i].write(currentAngle[i]);     
      } else if (value[i] < 412) {
      idle[i] = 0;
      if (currentAngle[i] > MIN[i]) --currentAngle[i];
      if (!myservo[i].attached()){
        myservo[i].attach(PIN[i]);
      }
      myservo[i].write(currentAngle[i]);    
    } else {
      ++idle[i];
    }
    if (idle[i] > 100){
      myservo[i].detach(); //서보모터를 일정시간 사용하지 않으면 연결을 끊어둔다.
      idle[i] = 0;
    }  
  }  
  
}

아두이노 IDE에서 보드를 Arduino Uno 보드를 선택합니다.

 

새로 설치된 시리얼 포트로 선택합니다.

 

위의 소스를 복사하여 붙여넣기하고 컴파일한 후 업로드하면 됩니다.

 

이제 아두이노 우노 보드와 센서쉴드 보드를 아래와 같이 조립합니다.

 

 

 

 

그리퍼 서보모터의 케이블이 바로 결선하기에는 선이 짧으므로 3P 암수케이블을 사용하여 아래와 같이 연장합니다.

 

 

다음으로 아래와 같이 서보모터와 결선합니다. 서모모터의 갈색선은 G(GND), 적색선은 V(VCC), 오렌지색선은 S(SIGNAL)의 순서가 되도록 합니다.

 

다음으로 2개의 조이스틱을 아래와 같이 결선합니다.

 

 

아래는 결선을 완료하고 케이블타이로 마무리한 모습입니다.

 

AA전지 4개를 사용하는 경우는 아래와 같이 아두이노 우노 보드의 아답터 잭으로 전원을 공급해줍니다.

 

USB 충전기를 통해 전원을 공급하는 경우는 아래와 같이 사용하시면 됩니다.

 

 

 

 

 

 

 

Topic: 

Tags