본문 바로가기

Development/[Project] Arduino Robot

[Humanoid Robot] #5. 로봇 동작 구현하기(1)

728x90
반응형

이전 포스팅에서는 로봇의 관절을 구동하는 법을 배워보았다.

https://udangtangtang-cording-oldcast1e.tistory.com/123?category=1033403 

 

[Humanoid Robot] #4. 17 DOF ROBOT 관절 구동

관절 구동하기 32채널 서보 컨트롤러 소프트웨어를 이용하여 아두이노 서보 모터 다중 제어를 실행해보자. 32채널 서보 컨트롤러 소프트웨어 사용법은 이전 포스팅을 참고한다. https://udangtangtang-

udangtangtang-cording-oldcast1e.tistory.com

해당 포스팅에서는 Torobot이라는 소프트웨어를 이용하여 막대기 바를 통해 각각의 서보모터를 제어할 수 있었다. 하지만 이러한 방법은 꽤나 번거로울 뿐만 아니라, 소프트웨어적으로 불친절하여 일일이 동작 값을 Add 혹은 Delete 해야 한다는 단점이 있었다.

 

물론 Torobot 소프트웨어를 이용하면 직관적인 관절 범위를 파악할 수 있고, 각각의 동작을 Add 한 다음 텍스트 파일로 불러올 수  있다는 장점도 존재한다. 하지만 각각의 동작을 수정하기 위해서는 수정을 원하는 동작의 코드를 일일이 찾아 코드를 바꿔야 한다는 치명적인 단점이 존재한다.

 

하지만 아두이노 코드를 이용하면 이러한 문제점을 해결할 수 있다. 다시 말해 해당 로봇을 코딩을 통해 움직임을 구현할 수 있다. 이는 아두이노 시리얼 통신과 함께 I2C 통신을 이용한다.

아두이노 시리얼 통신은 다음을 참조한다.

https://udangtangtang-cording-oldcast1e.tistory.com/37?category=1019061 

 

[Arduino] #6. ⭐️아두이노 시리얼 입출력하기 ⭐️

아두이노 데이터 속도 설정하기: 문자 출력 선언(시리얼 모니터 사용 선언) void setup(){ Serial.begin(speed); // speed: 데이터의 속도값 //일반적으로 아두이노 우노는 9600,아두이노 메가는 115200을 사용한

udangtangtang-cording-oldcast1e.tistory.com

로봇 동작 구현 준비

앞에서 다룬 Torobot 소프트웨어와 아두이노 IDE를 이용했을 때의 장단점을 정리하면 다음과 같다.

필자가 직접 로봇을 동작하면서 느낀 점을 토대로 했다.
Torobot 소프트웨어 장점 1. 각도 조절 바를 통해 직관적인 각도 조절가능.
2. 동작을 구현하기 위해 각각의 모터를 미리 조절해 볼 수 있음.
3. Add와 Run을 이용하여 동작을 미리 구현할 수 있음.
4. Add를 통해 구현한 동작을 텍스트 파일로 불러올 수 있음.
단점 1. 모터의 각도 제어의 방향이 서로 통일되있지 않아 오히려 헷갈리는 경우가 많음.
2. 해당 소프트웨어를 사용하기 위해서는 항상 Online 상태를 유지해야함.
3. 소프트웨어적으로 불안정해 자주 튕기는 현상이 발생함.
4. 윈도우만 해당 소프트웨어를 사용 가능.
5. 소프트웨어적으로 아두이노 IDE와 직접적인 연결이 불가능.
아두이노 IDE 장점 - 손쉬운 코드 입력 및 변경
- 반복을 이용한 효율적인 로봇 동작 구현
- 조건을 이용한 상황에 따른 코드 사용 가능
단점 난이도가 있음

아두이노와 로봇 사이의 I2C 통신 연결

아두이노 코드를 입력하여 서보모터를 제어하기 위해서는 32 채널 서보 컨트롤러와 아두이노를 연결해야 한다. 이는 I2C 통신을 이용한다.

 I2C 통신에 대해서는 다음 포스팅에 자세히 다루도록하겠다.

아두이노 <->
연결
32채널 서보 컨트롤러
GND   GND
TX   RX

그림으로 알아보는 연결

핑크색 사각형이 그려진 부분에
연결 대상을 정확히 찾아 연결한다.
빨간색 사각형이 TX 핀,
주황색 사각형이 GND 핀이다.

위 두 핀들을 서로 연결한 후, 32 채널 서보 컨트롤러에는 C타입을 이용하여 전원을 연결하고 아두이노는 컴퓨터와 연결한다.

32 채널 서보 컨트롤러의 주의점을 항시 주의한다.

https://udangtangtang-cording-oldcast1e.tistory.com/122?category=1033403 

 

[Humanoid Robot] #3. Humanoid Robot Software

로봇 실행 파일 다음 압축 파일을 풀면 로봇 소프트웨어와 32채널 서보 컨트롤러의 사용법이 적힌 pdf를 볼 수 있다. 자료 설명 자료 이름 기능 Arduino(폴더) 32채널 서보 제어와 아두이노와 연결하

udangtangtang-cording-oldcast1e.tistory.com

아두이노와 32채널 서보 컨트롤러가 연결되었다면, 이제 아두이노 IDE를 이용하여 코딩을 하면 된다.

아두이노 IDE를 이용한 로봇 코딩

32 채널 서보 컨트롤러는 아두이노의 시리얼 출력을 통해 작동한다. 이때 시리얼 출력으로 동작을 실행하기 위해서는 문자열에 특수한 기호를 사용하여 실행해야 한다.

 

이때 주의할 점은 각도 조절의 각도 값이 0~180이 아닌 500~2500이라는 점이다. 따라서 1500이 가운데 값이며, 500/2500이 최솟/최댓값이다. 최댓/최솟값보다 작거나 넘어서는 경우는 자동으로 가장 가까운 극값으로 변경된다.

서보모터의 각의 범위는 500~2500이다.

기호 기능
# 해당 기호를 쓰고 모터의 번호를 작성하면 작성한 모터의 각을 조절할 수 있다.
예) #1: 1번 모터의 각을 제어할 예정임을 알린다.
P 각도조절을 원하는 모터의 각을 제어한다.
예) #1P1500: 1번 모터의 각을 1500으로 변경한다.
T 해당 기호 뒤에 있는 시간 동안 각을 변경한다.
예) #1P1500T1000: 1번 모터의 각을 1초 동안 1500으로 변경한다.

동작 제어

arm_power(): 두 팔을 들어 팔 운동을 하고 내려 놓는 동작

해당 동작을 구현하기 위해 필요한 동작들을 블록처럼 하나하나 함수로 구현한 후 함수를 이용해 실행하는 방식을 사용한다.

void arm_power(){
  /**
  두 팔을 들어 팔 운동을 하고 내려 놓는 동작
   */
  arm_up();delay(1000);

  arm_swing();delay(1000);
  
  arm_raise();delay(1000);
  arm_raise_up();delay(1000);
  arm_raise();delay(1000);
  arm_raise_up();delay(1000);
  arm_raise();delay(1000);

  basic_stand();
}

basic_stand() : 기본 자세 동작 코드

/*모터 제어 함수*/
void basic_stand(){
  Serial.print("#1P1500#2P1500#3P1500#4P1500#5P1500#8P1500#9P1500#10P550#11P1500#12P2500#13P1500#14P1500#16P1500#17P1500#18P1500#19P1500#20P1600\r\n");
  /**
  #1P1400
  #2P1500
  #3P1500
  #4P1500
  #5P1500
  #8P1500
  #9P1500
  #10P550
  #11P1500
  #12P2500
  #13P1500
  #14P1500
  #16P1500
  #17P1500
  #18P1500
  #19P1500
  #20P1600
   */
}

총 17개의 모터를 초기화한다. 이때 주의할 점은 로봇을 조립하기 전에 미리 해당 코드 혹은 Torobot 소프트웨어를 통해 각도를 설정해야한다는 점이다.

로봇을 조립하기 전, 각도를 미리 초기화 할 것!

arm_up() / arm_down()

arm_up() 로봇의 팔을 일자로 들어 올린다.
arm_down() 로봇의 팔을 내린다. 가장 기본 자세인 basic_stand의 팔 자세와 같다.
void arm_up(){
  Serial.print("#9P2500#13P500\r\n");
  //9번 모터와 13번 모터를 최대치로 변경
}
void arm_down(){Serial.print("#9P1500#13P1500\r\n");}

arm_swing(): 팔을 든 상태로 팔을 회전하는 함수

void arm_swing(){
  Serial.print("#10P2100#12P500\r\n");
  //두 팔을 회전 시킴
  /**
  [오른쪽] S10 : 2100
  [왼쪽] S12: 500
   */
}

arm_raise /  arm_raise_up(): 팔을 들어올리는 동작 - 연결되는 동작 구현

void arm_raise(){
  /**
  <주의>두 팔을 회전 한 후 실행 할 것!
  - arm_swing() 함수를 먼저 실행 한 후 부속 동작
  - arm_swing: 10번과 12번 서보를 사용함.

  근육을 자랑하듯 팔을 드는 동작

  #8P1100
  #9P2000
  #13P1000
  #14P1800
  */
  Serial.print("#8P1100#9P2000#13P1000#14P1800\r\n");
}

void arm_raise_up(){
  /**
  <주의>두 팔을 회전 한 후 arm_raise 함수 실행 후 실행 할 것!
  - arm_swing() 함수를 먼저 실행 한 후 부속 동작
  - arm_swing: 10번과 12번 서보를 사용함.
  - arm_raise : 팔을 회전 후 으쓱 하는 동작을 실행
  */
  Serial.print("#9P1500#13P1500\r\n"); 

}

기본 함수

  • setup() 함수에서 시리얼 속도를 설정
  • basic_stand를 사용하여 현재 동작 초기화
  • arm_power() 함수를 실행하여 운동하는 동작을 구현함
/*아두이노 기본 함수*/
void setup() {
  Serial.begin(9600);
  basic_stand(); delay(1000);
  //기본 자세 설정
  //-------------------------------

  arm_power();
}

void loop() {

}

전체 코드

/**
모터 제어 테스트 코드
 */
void basic_stand(){
  Serial.print("#1P1500#2P1500#3P1500#4P1500#5P1500#8P1500#9P1500#10P550#11P1500#12P2500#13P1500#14P1500#16P1500#17P1500#18P1500#19P1500#20P1600\r\n");
  /**
  #1P1400
  #2P1500
  #3P1500
  #4P1500
  #5P1500
  #8P1500
  #9P1500
  #10P550
  #11P1500
  #12P2500
  #13P1500
  #14P1500
  #16P1500
  #17P1500
  #18P1500
  #19P1500
  #20P1600
   */
}
void arm_up(){
  Serial.print("#9P2500#13P500\r\n");
  //9번 모터와 13번 모터를 최대치로 변경
}
void arm_down(){Serial.print("#9P1500#13P1500\r\n");}

void arm_swing(){
  Serial.print("#10P2100#12P500\r\n");
  //두 팔을 회전 시킴
  /**
  [오른쪽] S10 : 2100
  [왼쪽] S12: 500
   */
}

void arm_power(){
  /**
  두 팔을 들어 팔 운동을 하고 내려 놓는 동작
   */
  arm_up();delay(1000);

  arm_swing();delay(1000);
  
  arm_raise();delay(1000);
  arm_raise_up();delay(1000);
  arm_raise();delay(1000);
  arm_raise_up();delay(1000);
  arm_raise();delay(1000);

  basic_stand();
}

void arm_raise(){
  /**
  <주의>두 팔을 회전 한 후 실행 할 것!
  - arm_swing() 함수를 먼저 실행 한 후 부속 동작
  - arm_swing: 10번과 12번 서보를 사용함.

  근육을 자랑하듯 팔을 드는 동작

  #8P1100
  #9P2000
  #13P1000
  #14P1800
  */
  Serial.print("#8P1100#9P2000#13P1000#14P1800\r\n");
}

void arm_raise_up(){
  /**
  <주의>두 팔을 회전 한 후 arm_raise 함수 실행 후 실행 할 것!
  - arm_swing() 함수를 먼저 실행 한 후 부속 동작
  - arm_swing: 10번과 12번 서보를 사용함.
  - arm_raise : 팔을 회전 후 으쓱 하는 동작을 실행
  */
  Serial.print("#9P1500#13P1500\r\n"); 
}

void setup() {
  Serial.begin(9600);
  basic_stand(); delay(1000);
  //기본 자세 설정
  //-------------------------------
  arm_power();
}

void loop() {

}

로봇 동작 영상

 

 

728x90
반응형
댓글