로보티즈의 다이나믹셀은 로봇 연구 개발에 가장 많이 활용되고 있는 액추에이터이다. 모터끼리 연결이 매우 쉽다(데이지 체인 연결 방식). RoboPlus 소프트웨어를 설치한 후, 다이나믹셀 위자드 프로그램을 이용해 간단히 각 모터에 ID를 부여하고, 아두이노와 유사한 OpenCM 을 사용해, 속도나 위치를 설정해 주면, 그에 따라서 동작한다.
1. OpenCM 필수 드라이버 및 통합개발환경 설치
다음 링크에서 OpenCM IDE 도움말을 따라하면서, 관련 필수 드라이버 및 OpenCM 통합개발환경을 설치한다.
http://support.robotis.com/ko/e-manual_kor.htm#software_manual.htm
제대로 설치된다면, 다음과 같이 ROBOTIS Virtual COM Port 가 설치된다.
2. 다이나믹셀 연결 및 RoboPlus 소프트웨어 설치
다이나믹셀을 다음과 같이 연결한다. 상세한 내용은 다음 영상을 참고해서 따라한다.
아울러, 다아나믹셀 시리얼도 다음과 같이 연결한다.
RoboPlus를 설치한다. 그리고, 다음과 같이 실행한다.
앞의 동영상에서 설명한 대로, 따라하면서, 모터의 ID를 설정한다.
3. 코딩
다음과 같이, OpenCM 개발환경에서 샘플을 참고해, 두개의 모터에 대한, 해당 ID의 모터 스피드나 위치를 설정해 준다.
그럼 다음과 같이 동작한다.
이제 센서를 마운팅한 로봇암을 테스트할 수 있도록, OpenCM으로 코딩해, 다음과 같이 테스트해본다.
사실, 로보티즈 다이나믹셀(dynamixel) 리미트 값 제어가 쉽지 않다. 여러번의 시행착오를 해서 적절한 값을 설정해야 한다. 참고로, 토크 부하값이 넘어가면, 해당 모터가 동작하지 않으며, 그 이후의 데이지 체인에 연결된 모터들은 먹통이 된다.
테스트에 사용된 코드는 다음과 같다. 테스트 전에 Dynamixel Wizard를 이용해 아래부터 마운트 엔드까지 사용된 모터를 1, 2, 3, 4로 설정한 상태이다. 참고로, 이동 속도(moving speed)를 안전하게 설정하기 위해, 수치를 10으로 설정하였다.
#define DXL_BUS_SERIAL1 1 //Dynamixel on Serial1(USART1) <-OpenCM9.04
#define DXL_BUS_SERIAL2 2 //Dynamixel on Serial2(USART2) <-LN101,BT210
#define DXL_BUS_SERIAL3 3 //Dynamixel on Serial3(USART3) <-OpenCM 485EXP
/* Dynamixel ID defines */
#define ID_NUM1 1
#define ID_NUM2 2
#define ID_NUM3 3
#define ID_NUM4 4
/* Control table defines */
#define GOAL_SPEED 10
#define GOAL_POSITION 30
#define CCW_Angle_Limit 8
#define CONTROL_MODE 11
Dynamixel Dxl(DXL_BUS_SERIAL1);
void setup() {
// Dynamixel 2.0 Protocol -> 0: 9600, 1: 57600, 2: 115200, 3: 1Mbps
Dxl.begin(3);
//AX MX RX Series
Dxl.jointMode(ID_NUM1);
Dxl.jointMode(ID_NUM2);
Dxl.jointMode(ID_NUM3);
Dxl.jointMode(ID_NUM4);
Dxl.writeWord(ID_NUM1, 32, 10); // MOVING SPEED
Dxl.writeWord(ID_NUM2, 32, 10);
Dxl.writeWord(ID_NUM3, 32, 10);
Dxl.writeWord(ID_NUM4, 32, 10);
Dxl.writeWord(ID_NUM1, 33, 20);
Dxl.writeWord(ID_NUM2, 33, 20);
Dxl.writeWord(ID_NUM3, 33, 20);
Dxl.writeWord(ID_NUM4, 33, 20);
Dxl.cwAngleLimit(ID_NUM1, 680); // 60 degree
Dxl.ccwAngleLimit(ID_NUM1, 1500); // 130 degree
Dxl.cwAngleLimit(ID_NUM2, 2000);
Dxl.ccwAngleLimit(ID_NUM2, 3590);
Dxl.cwAngleLimit(ID_NUM3, 230);
Dxl.ccwAngleLimit(ID_NUM3, 1150);
Dxl.cwAngleLimit(ID_NUM4, 100); //CW Angle Limit
Dxl.ccwAngleLimit(ID_NUM4, 4000); //CCW Angle Limit
//XL-320
//Dxl.writeByte(ID_NUM, CONTROL_MODE, 1);
//test
//pinMode(BOARD_LED_PIN, OUTPUT);
}
void loop() {
//forward
Dxl.goalPosition(ID_NUM1, 700);
Dxl.goalPosition(ID_NUM2, 2500);
Dxl.goalPosition(ID_NUM3, 350);
Dxl.goalPosition(ID_NUM4, 3000);
delay(5000);
//stop
Dxl.goalPosition(ID_NUM1, 1200);
Dxl.goalPosition(ID_NUM2, 3000);
Dxl.goalPosition(ID_NUM3, 500);
Dxl.goalPosition(ID_NUM4, 4000);
delay(5000);
}
4. 응용 사례
다음은 참고 사이트 및 자료이다.
- 로보티즈 지원 사이트
- 다이나믹셀 SDK 다운로드 및 사용법
- 다이나믹셀 시리얼 USB 사용법
댓글 없음:
댓글 쓰기