프로젝트

[아두이노 프로젝트] 서보모터와 조이스틱을 활용한 로봇 팔 만들기

페이지 정보

작성자 메카 작성일16-03-17 18:23 조회9,050회 댓글0건

본문

안녕하세요 메카솔루션입니다.

 

 

 

이번에는 아두이노를 이용한 로봇 팔을 소개하도록 하겠습니다.

 

02cd46d8a607ca14b01d10ead866e139_1458206
 

 

총 4개의 서보 모터를 사용하며, 조이스틱 1개와 스위치 두개로 조작할 수 있습니다.

 

 

사용한 소스코드 입니다.

 

 #include<Servo.h>

 

Servo base;

Servo shoulder;

Servo elbow;

Servo grip;

 

//서보 이름 설정

 

 

int x = A0;

int y = A1;

 

// 조이스틱 설정

 

 

int z = 13;

int r = 12;

 

//스위치 설정

 

 

int base1,  shoulder1,  elbow1,  grip1;

 

//서보 각도값 변수 지정

 

 

void setup() {

 

  pinMode(z, INPUT);

  pinMode(r, INPUT);

 

//스위치 인풋 설정

 

 

  base.attach(3);

  shoulder.attach(5);

  elbow.attach(6);

  grip.attach(9);

 

  //서보 핀 설정

 

 

  base.write(90);

  shoulder.write(90);

  elbow.write(90);

  grip.write(90);

  base1 = shoulder1 = elbow1 = grip1;

 

  //아두이노 실행했을때 서보의 초기 각도값 설정

 

 

 

}

 

 

 

void loop() {

 

  if (analogRead(x) >= 500)

  {

    base1 = base1 + ((analogRead(x) - 500) / 400);

  }

  else

  {

    base1 = base1 - ((500 - analogRead(x)) / 400);

  }

 

  // 베이스 움직인값

 

 

  if (analogRead(y) >= 500)

  {

    shoulder1 = shoulder1 +  ((analogRead(y) - 500) / 400);

  }

  else

  {

    shoulder1 = shoulder1 - ((500 - analogRead(y)) / 400);

  }

 

  //숄더 움직인값

 

 

  if (digitalRead(r) == HIGH)

  {

    elbow.write(90);

  }

  else

  {

    elbow.write(120); 

  }

 

  //버튼을 누를때 엘보 동작

 

 

  if (digitalRead(13) == HIGH)

  {

    grip.write(140);

  }

  else

  {

    grip.write(60);

  }

 

  //버튼을 누를때 그립 동작

 

 

  if (base1 <= 0)

  {

    base1 = 38;

  }

  else if (base1 >= 170)

  {

    base1 = 170;

  }

  else

  {

    ;

  }

 

 

  if (shoulder1 <= 30)

  {

    shoulder1 = 30;

  }

  else if  (shoulder1 >= 170)

  {

    shoulder1 = 170;

  }

  else

  {

    ;

  }

 

 

  //최대, 최소 각도 설정

 

 

  base.write(base1);

  shoulder.write(shoulder1);

 

  //베이스 숄더 동작 값 지정

 

 

}

 

  if (analogRead(x) >= 500)

  {

    base1 = base1 + ((analogRead(x) - 500) / 400);

  }

  else

  {

    base1 = base1 - ((500 - analogRead(x)) / 400);

  }

 

 

 

루프문 중 이 부분은 서보모터가 움직일때 이전 값(base1)에 새 값을 더해서 동작하게 하는,

 

즉 절댓값으로 움직이지 않고 상대값으로 움직이는 서보를 만들어주기 위한 부분입니다.


절댓값으로 움직이게 해버리면

조이스틱의 값에 따라서만 움직이게 되므로 한 값에 고정시키고 싶으면 조이스틱을 계속 잡고 있어야 합니다.

그러나 상대값으로 움직이게 되면 놓더라도 그 상태의 서보값을 기준으로 다시 움직이게 되므로 중간 값으로 돌아갈 일은 없게 됩니다.







그리고 간단한 조작 영상입니다.

 

 

물건을 집어 옮기는 영상입니다. 

 

 

제 컨트롤이 너무 미숙하네요...

02cd46d8a607ca14b01d10ead866e139_1458206
 

 

 

 

 

 

 

이상으로 마치겠습니다!

 

댓글목록

등록된 댓글이 없습니다.


모바일 버전으로 보기