Visual C++

    Visual C++용 예제입니다. 이 예제는 Visual Studio 2005에서 테스트 되었습니다.

    환경 설정

    예제를 실행하기 위해서는 C++에서 환경 설정을 해주어야 합니다.

    경로 등록하기

    Visual Studio에 Dynamixel API의 위치를 등록해야 합니다.

    1. 메뉴에서 도구->옵션을 선택합니다. img

    2. 프로젝트 및 솔루션 -> VC++ 디렉터리를 클릭 합니다. img

    3. 다음 파일의 디렉터리 표시 부분을 포함 파일(include) 로 바꾼 후 2번 표시가 있는 부분을 클릭하여, DynamixelSDK가 설치 된 폴더를 추가 시킵니다. (예, C:\DynamixelSDK\import) img

    4. 다음 파일의 디렉터리 표시 부분을 라이브러리 파일(library) 로 바꾼 후 2번 표시가 있는 부분을 클릭하여,DynamixelSDK가 설치 된 폴더를 추가 시킵니다. (예, C:\DynamixelSDK\import) img

    Dynamixel API 사용하기

    STEP1) Header 파일 지정

    소스 파일에 #include “dynamixel.h”을 추가합니다.

    STEP2) Library 파일 지정

    소스 파일에 #pragma comment(lib, “dynamixel.lib”)를 추가하거나, 프로젝트 속성에서 Link 탭의 Input에서 Module에 Dynamixel.lib를 추가합니다

    STEP3) 함수호출

    소스 상에서 필요한 함수를 호출하면 됩니다. 각 함수의 사용법은 API Reference를 참고하시기 바랍니다.

    img

    Read/Write Example

    다이나믹셀의 Read / Write예제입니다.

    준비

    USB2Dynamixel의 통신 모드를 환경에 맞게 선택합니다.

    img

    스위치 위치에 따른 통신 모드에 대한 정보는 다음과 같습니다.

    1 - TTL Mode AX-Series, MX(TTL)-Series 와 같은 3핀 케이블을 사용하는 장치와 통신할 수 있습니다.

    2 - RS485 Mode DX-Series, RX-Series, EX-Series, MX(RS485)-Series 등 4핀 케이블을 사용하는 장치와 통신할 수 있습니다.

    3 - RS232 Mode CM-5, CM-510 등과 같이 시리얼 케이블을 사용하는 장치와 통신할 수 있습니다.

    1개의 다이나믹셀이 USB2Dynamixel에 연결되어 있어야 합니다. 사용하는 다이나믹셀은 ID 는 1, 통신 속도는 1Mbps로 설정되어야 합니다.

    EX 시리즈의 다이나믹셀을 사용하는 경우에는 EX시리즈용 소스로 바꿔야 합니다.

    img

    소스

    초기화

      // Open device
      if( dxl_initialize(DEFAULT_PORTNUM, DEFAULT_BAUDNUM) == 0 )
      {
      // Failed to open USB2Dynamixel
      }
      else
      {
      // Succeed to open USB2Dynamixel
      }
    

    위 소스는 초기화가 제대로 되었는지를 확인합니다. 초기화가 성공하였으면 1, 실패할경우엔 0이 반환 되므로 if문에는 실패했을 경우에 대한 소스가 들어가게 되고, else문 안에는 성공했을 경우의 소스가 들어가게 됩니다. dynamixel API 중 dxl_initialize 함수를 호출 합니다.

    DEFAULT_PORTNUM는 통신장치가 연결되어 있는 번호를 의미 합니다. DEFAULT_BAUDNUM는 Baud Rate의 설정값을 의미 합니다. DEFAULT_PORTNUM 과 DEFAULT_BAUDNUM 은 사용자의 상황에 맞게 설정하셔야 합니다. PORTNUM은 COM3, DEFAULT_BAUDNUM은 1Mbps 로 기본 셋팅이 되어있습니다.

    종료

      // Close device
      dxl_terminate();
    

    위 소스는 종료하는 소스입니다. dynamixel API 중 dxl_teminate 함수를 호출하여 연결을 종료 시킵니다.

    목표 위치로 이동하기

      // Write goal position
      dxl_write_word( DEFAULT_ID, P_GOAL_POSITION_L, GoalPos[index] );
    

    위 소스는 다이나믹셀을 목표 지점으로 이동시키는 소스입니다. dynamixel API 중 [dxl_write_word] 함수를 호출 합니다. DEFAULT_ID 는 현재 연결되어있는 다이나믹셀의 아이디값을 의미합니다. P_GOAL_POSITION_L은 다이나믹셀의 Control Table의 GOAL_POSITION의 해당하는 번지의 시작 주소값 (30) 을 미리 선언해준 값입니다. GoalPos(index)는 이동하고 싶은 GoalPosition 값을 배열로 선언하여 인덱스가 바뀔때마다 해당하는 값을 전달해줍니다.
    caption 다이나믹셀에 값을 읽고 쓸 경우에 쓰는 함수는 word형 과 byte형이 있습니다.{:. caption}
    Control Table 내의 다이나믹셀에서의 값들이 byte형일 경우에는 dxl_write_byte , dxl_read_byte 같은 함수를 사용하고, word형일 경우엔 dxl_write_word , dxl_read_word 함수를 사용합니다. Position 정보는 word형 함수이기 때문에 밑의 예제들은 word형 함수를 사용하였습니다.

    현재 위치 읽어오기

      // Read present position
      PresentPos = dxl_read_word( DEFAULT_ID, P_PRESENT_POSITION_L );
    

    위 소스는 PresentPos 변수에 현재 다이나믹셀의 포지션값을 읽어 드리는 소스입니다. dynamixel API 중 dxl_read_word 함수를 호출 합니다. DEFAULT_ID 는 현재 연결되어있는 다이나믹셀의 아이디값을 의미합니다. P_PRESENT_POSITION_L은 다이나믹셀의 현재위치를 저장 하고 있는 번지의 시작 주소값(36)을 미리 선언해준 값입니다.

    패킷 통신 결과 확인

      CommStatus = dxl_get_result();
      if( CommStatus == COMM_RXSUCCESS )
      {
      PrintErrorCode();
      }
      else
      {
      PrintCommStatus(CommStatus);
      }
    

    위 소스는 패킷 통신결과를 CommStatus 변수에 저장하는 소스입니다. 통신결과가 제대로 되었는지 확인하는 함수 dxl_get_result를 이용하여 확인합니다. 통신결과가 성공일때 PrintErrorCode함수를 호출하여 다이나믹셀의 동작 중에 발생된 오류 상태를 점검합니다. 통신결과가 실패일때 dxl_get_result 함수로 부터 리턴받은 에러정보를 PrintCommStatus함수에 전달하여 에러 정보를 화면에 출력하여 줍니다.

    움직임 유무

    // Check moving done
    Moving = dxl_read_byte( DEFAULT_ID, P_MOVING );
    

    위 소스는 Moving 변수에 dxl_read_byte를 이용하여 현재 다이나믹셀이 움직이고 있는지를 검사하여 저장합니다. DEFAULT_ID 는 해당 다이나믹셀의 id값을 의미합니다. P_MOVING은 다이나믹셀의 Control Table의 Moving부분의 번지값 (46) 을 의미합니다. Moving은 byte형 데이터이기 때문에 dxl_read_byte를 이용해 Moving값을 검사합니다.

    Sync Write Example

    준비

    3개의 다이나믹셀이 USB2Dynamixel에 연결되어야 합니다. 각 다이나믹셀은 ID는 1,2,3이고 통신 속도는 1Mbps로 설정 되어야 합니다. EX 시리즈의 다이나믹셀을 사용하는 경우에는 EX시리즈용 소스로 바꿔 사용하셔야 합니다.

    소스

    아이디 값 셋팅 하기

      for( i=0; i<NUM_ACTUATOR; i++ )
      {
        id[i] = i+1;
      }
    

    위 소스는 id 배열에 다이나믹셀의 아이디 값을 넣는 소스 입니다. 예제에 사용 되는 다이나믹셀을 ID 값이 1,2,3 인 다이나믹셀을 사용했습니다. 다른 ID값을 갖고 있는 다이나믹셀을 이용할 경우엔 다이나믹셀의 ID값을 바꾸거나, 소스내의 id배열에 값을 해당 다이나믹셀 id값으로 넣어 주셔야 합니다.

    패킷 만들기

      dxl_set_txpacket_id(BROADCAST_ID);
      dxl_set_txpacket_instruction(INST_SYNC_WRITE);
      dxl_set_txpacket_parameter(0, P_GOAL_POSITION_L);
      dxl_set_txpacket_parameter(1, 2);
      for( i=0; i<NUM_ACTUATOR; i++ )
      {
        dxl_set_txpacket_parameter(2+3*i, id[i]);
        GoalPos = (int)((sin(theta+phase[i]) + 1.0) * (double)AmpPos);
        printf( "%d  ", GoalPos );
        dxl_set_txpacket_parameter(2+3*i+1, dxl_get_lowbyte(GoalPos));
        dxl_set_txpacket_parameter(2+3*i+2, dxl_get_highbyte(GoalPos));
      }
      dxl_set_txpacket_length((2+1)*NUM_ACTUATOR+4);
      dxl_txrx_packet();
      CommStatus = dxl_get_result();
    

    위 소스는 syncwrite 패킷을 만드는 소스입니다.

    패킷의 구조는 다이나믹셀 패킷 구조를 참조하여 패킷을 만드는데 필요한 함수를 이용하여 패킷을 만들어야 합니다.