본문으로 건너뛰기

DYNAMIXEL Protocol 1.0

통신 개요

DYNAMIXEL을 제어하기 위해서는 DYNAMIXEL의 프로토콜에 맞추어 통신을 해야 합니다. DYNAMIXEL은 binary 형태의 데이터를 받아 구동됩니다. 이러한 데이터를 전송하기 위한 프로그램 예제는 DYNAMIXEL 전용 Controller 또는 USB2DYNAMIXEL, U2D2 의 사용자 설명서에 자세히 기술되어 있습니다. 따라서 본 DYNAMIXEL의 사용자 설명서에서는 Main controller 가 binary 형태의 데이터를 전송할 수 있다는 가정하에 DYNAMIXEL에서 사용하는 통신 방식에 대한 설명과 통신 프로토콜에 대한 설명만을 기술하였습니다.

: 자세한 내용은 ROBOTIS의 DYNAMIXEL Protocol Compatibility Table을 참고하세요.

Packet

Main Controller와 DYNAMIXEL은 Packet이라고 불리는 데이터를 주고 받으며 통신합니다. Packet에는 두 가지 종류가 있습니다. Main Controller가 DYNAMIXEL을 제어하기 위해 전송하는 Instruction Packet과 DYNAMIXEL이 Main Controller로 답변하는 Status Packet이 그것입니다.

ID

ID는 한 개의 버스에 여러 개의 DYNAMIXEL이 연결되었을 때 각각의 DYNAMIXEL들을 구별하기 위해 만든 고유 번호입니다. Instruction Packet과 Status Packet에 ID를 넣음으로써 Main Controller는 제어하고자 하는 DYNAMIXEL만을 제어할 수 있습니다.

DYNAMIXEL Protocol

DYNAMIXEL은 8 bit, 1 Stop bit, None Parity의 Asynchronous Serial 통신을 합니다.

만약 같은 ID 를 가진 DYNAMIXEL이 연결되었을 경우 Packet 충돌이 일어나서 통신에 문제를 일으키게 됩니다. 그러므로 ID가 같은 DYNAMIXEL이 존재하지 않도록 ID설정을 해야 합니다. ID 설정을 위해서는, DYNAMIXEL 위자드 2.0에서 컨트롤 테이블을 참고 하세요.

노트

참고: DYNAMIXEL은 공장 출하시 초기 ID가 1번입니다.

Half Duplex

Half Duplex란 TxD, RxD를 하나의 선으로 공유하는 통신 방식으로 DYNAMIXEL은 Half Duplex 방식을 사용하고 있습니다. 보통 하나의 BUS에 여러 개의 통신 장치를 연결할 경우에 사용합니다. 여러 개의 장치가 송신하는 동안 그 외의 다른 모든 장치들은 입력 상태이어야 하기 때문에 통신 방향을 제어하는 Direction Port가 필요합니다. DYNAMIXEL을 제어하는 Main Controller는 통신 방향을 입력으로 설정해 놓고 있다가 Instruction Packet을 전송하는 동안만 통신 방향을 출력으로 설정해야 합니다.

Tx, Rx Direction

Half Duplex 통신 방식을 사용하기 위해 필요한 제어 방법입니다. RS485 UART 에서는 송신이 끝나는 Timing 을 잘 맞춰서 Direction 을 수신 Mode 로 바꾸어야 합니다. CPU 에서는 일반적으로 UART_STATUS 를 표시해주는 REGISTER 내에 다음과 같은 의미의 BIT 가 있습니다.

  • TXD_BUFFER_READY_BIT: Transmission DATA 를 Buffer 에 적재할 수 있는 상태임을 뜻합니다. 상태는 SERIAL TX BUFFER 가 비어 있다는 의미이지, 이전에 전송한 데이터가 모두 CPU 밖으로 배출된 상태를 의미하는 것은 아닙니다.
  • TXD_SHIFT_REGISTER_EMPTY_BIT: Transmission Data 가 모두 CPU 밖으로 배출되었을 때 SET 됩니다.

TXD_BUFFER_READY_BIT 의 경우는 Serial 통신에서 한 Byte 를 송신할 때 사용되며 그 예는 다음과 같습니다.

TxDByte(byte bData)
{
while(!TXD_BUFFER_READY_BIT); //wait until data can be loaded.
SerialTxDBuffer = bData; //data load to TxD buffer
}

Direction을 전환하는 시점에서는 TXD_SHIFT_REGISTER_EMPTY_BIT를 확인해야 합니다. 다음은 Instruction packet을 전송하는 예제 프로그램입니다.

DIRECTION_PORT = TX_DIRECTION;
TxDByte(0xff);
TxDByte(0xff);
TxDByte(bID);
TxDByte(bLength);
TxDByte(bInstruction);
TxDByte(Parameter0); TxDByte(Parameter1); ...
DisableInterrupt(); // interrupt should be disable
TxDByte(Checksum); //last TxD
while(!TXD_SHIFT_REGISTER_EMPTY_BIT); //Wait till last data bit has been sent
DIRECTION_PORT = RX_DIRECTION; //Direction change to RXD
EnableInterrupt(); // enable interrupt again
경고

주의: LINE 8부터 LINE 12까지의 부분에 주의하세요. LINE 8이 필요한 이유는 해당 시점에 Interrupt가 발생해 Return Delay Time보다 긴 시간 동안 Interrupt routine이 수행될 경우 Status Packet의 앞부분이 손상될 수 있기 때문입니다.

Byte to Byte Time

Instruction Packet을 전송할 때 Byte와 Byte사이의 Delay Time을 의미하는데, 이 시간이 100msec가 넘을 경우 RX-64는 전송 장애가 발생한 것으로 간주하고, 다시 Packet의 header(0xff 0xff)를 기다립니다.

Instruction Packet

Instruction Packet은 제어기가 DYNAMIXEL에게 보내는 명령 데이터입니다. Instruction Packet의 구조는 아래와 같습니다.

Header1Header2Packet IDLengthInstructionParam 1...Param NChecksum
0xFF0xFFPacket IDLengthInstructionParam 1...Param NCHKSUM

Packet의 시작을 알리는 신호입니다.

Packet ID

Instruction Packet을 받을 DYNAMIXEL의 ID입니다.

  1. 일반 ID : 0 ~ 253 (0x00~0xFD), 254개를 사용할 수 있습니다.
  2. Broadcast ID : 254 (0xFE), 연결된 모든 DYNAMIXEL이 Instruction Packet의 명령을 수행하며 Status Packet은 반환되지 않습니다.

Length

Packet의 길이로서, Instruction, Parameter, Checksum 필드의 Byte Size를 나타내는 필드입니다.

Length = Parameter 개수(N) + 2

Instruction

DYNAMIXEL에 지시하는 명령으로 아래와 같은 종류가 있습니다.

명령어설명
0x01PingPacket ID와 동일한 ID를 가진 장치에 Packet이 도달했는지 확인하는 Instruction
0x02ReadDYNAMIXEL의 데이터를 읽는 Instruction
0x03WriteDYNAMIXEL에 데이터를 쓰는 Instruction
0x04Reg WriteInstruction Packet을 대기 상태로 등록하고, 이후 Action instruction으로 실행하는 Instruction
0x05ActionReg Write로 미리 등록한 Packet을 실행하는 Instruction
0x06Factory ResetControl Table을 공장 출하 상태의 기본값으로 되돌리는 Instruction
0x08RebootDYNAMIXEL을 재부팅하는 Instruction (지원 모델은 설명을 참고하세요)
0x83Sync Write여러 장치의 동일한 Address에 동일한 길이의 데이터를 한 번에 쓰는 Instruction
0x92Bulk Read여러 장치의 서로 다른 Address에서 서로 다른 길이의 데이터를 한 번에 읽는 Instruction (지원 모델은 설명을 참고하세요)

Parameters

Instruction의 보조 데이터 필드로써, Instruction 별로 용도가 다릅니다. Instruction 을 참고하세요.

Checksum (Instruction Packet)

Checksum 은 Packet이 통신 중에 파손되었는지를 점검하기 위해 사용됩니다. 아래와 같은 방법으로 Checksum을 계산할 수 있습니다.

Checksum = ~( ID + Length + Instruction + Parameter1 + ... Parameter N )

~ 은 Not Bit 연산자입니다. 위 식에서 괄호 안의 계산 결과가 255(0xFF) 보다 클 경우 하위 byte 만 사용합니다.

예를 들면 아래와 같은 Instruction Packet 을 쓰고 싶을 경우

ID=1(0x01), Length=5(0x05), Instruction=3(0x03), Parameter1=12(0x0C), Parameter2=100(0x64), Parameter3=170(0xAA)

Checksum = ~ ( ID + Length + Instruction + Parameter1 + ... Parameter 3 ) = ~ [ 0x01 + 0x05 + 0x03 + 0x0C + 0x64 + 0xAA ] = ~ [ 0x123 ] // 하위 byte인 0x23만 Not 연산을 수행합니다. = 0xDC

따라서, Instruction Packet은 0xFF, 0xFF, 0x01, 0x05, 0x03, 0x0C, 0x64, 0xAA, 0xDC가 되어야 합니다.

Status Packet(Return Packet)

DYNAMIXEL은 Main Controller로부터 받은 명령을 수행한 뒤 그 결과를 Main Controller에게 Return합니다. 이 때 Return 되는 데이터를 Status Packet이라고 합니다. Status Packet의 구조는 아래와 같습니다.

Header1Header2Packet IDLengthErrorParam 1...Param NChecksum
0xFF0xFFIDLengthErrorParam 1...Param NCHKSUM

Header Packet의 시작을 알리는 신호입니다.

Packet ID Status Packet을 전송하는 DYNAMIXEL의 ID입니다. 0 ~ 253 (0x00~0xFD), 254개를 사용할 수 있습니다.

Length Packet의 길이로서, Error, Parameter, Checksum 필드의 Byte Size를 나타내는 필드입니다. Length = Parameter 개수(N) + 2

Error

DYNAMIXEL의 동작 중에 발생된 오류 상태를 나타내며, 각 Bit별 의미는 다음 표와 같습니다.

Bit명령세부 설명
Bit 70-
Bit 6Instruction Error정의되지 않은 Instruction이 전송된 경우, 또는 Reg Write명령없이 action명령이 전달된 경우 1로 설정됨
Bit 5Overload Error설정된 Torque로 현재의 하중을 제어할 수 없을 때 1로 설정됨
Bit 4Checksum Error전송된 Instruction Packet의 Checksum이 맞지 않을 때 1로 설정됨
Bit 3Range Error사용범위를 벗어난 명령일 경우 1로 설정됨
Bit 2Overheating ErrorDYNAMIXEL 내부 온도가 Control Table에 설정된 동작온도 범위를 벗어났을 때 1로 설정
Bit 1Angle Limit ErrorGoal Position이 CW Angle Limit ~ CCW Angle Limit 범위 밖의 값으로 Writing 되었을때 1로 설정됨
Bit 0Input Voltage ErrorError인가된 전압이 Control Table에 설정된 동작전압 범위를 벗어났을 경우 1로 설정됨

예를 들어 Status Packet이 아래와 같이 Return 되었을 경우

0xFF 0xFF 0x01 0x02 0x24 0xD8

ID 가 01 번인 RX-64로부터 0x24 의 Error가 발생했다는 것을 의미합니다. 0x24는 2 진수로 00100100 이므로 Bit 5Bit 21이 된 것입니다. 즉, Overload Error 와 Overheating Error 가 발생되었다는 것을 알 수 있습니다.

경고

주의: 위 표의 에러 종류는 액추에이터와 관련된 항목이며, DYNAMIXEL 종류에 따라 내용이 다를 수 있습니다.

Parameters

ERROR 외의 Data 를 Return 합니다. 사용 방법은 Instruction의 종류를 참고하시기 바랍니다.

Checksum (Status Packet)

Checksum 은 Packet이 통신 중에 파손되었는지를 점검하기 위해 사용됩니다. 아래의 방법으로 Checksum 을 계산할 수 있습니다.

Status Checksum = ~( ID + Length + Error + Parameter1 + ... Parameter N )

Instruction 상세

설명의 편의를 위하여, 다음과 같은 약어를 사용합니다.

  • Header : H
  • Reserved: RSRV
  • Length: LEN
  • Instruction: INST
  • Error : ERR
  • Param: P
  • Checksum: CKSM
노트

참고: 아래 예제는 DYNAMIXEL 액추에이터 RX-64를 기준으로 작성되었습니다. AX-12A, DX 시리즈 등 Protocol 1.0을 사용하는 다른 DYNAMIXEL도 동일한 Packet 형식으로 사용할 수 있습니다.

Ping

장치의 존재 여부를 확인하기 위해 사용됩니다. 장치는 Status Return Level에 관계없이, Ping Instruction에는 무조건 Status Packet을 전송합니다.

LENINSTP
0x020x01-

예제

조건
  • ID 1(RX-64)가 동일한 통신속도를 사용하는 PC와 연결되어 있을것.
Ping Instruction Packet
H1H2Packet IDLENINSTCKSM
0xFF0xFF0x010x020x010xFB
ID 1 Status Packet
H1H2Packet IDLENERRCKSM
0xFF0xFF0x010x020x000xFC

Read

Control Table의 Data를 읽는 명령입니다.

LENINSTP1P2
0x040x02시작 주소데이터 길이

예제

조건
  • ID 1(RX-64) : Present Temperature 읽어오기, 시작주소 43(0x2B)
Read Instruction Packet
H1H2Packet IDLENINSTP1P2CKSM
0xFF0xFF0x010x040x020x2B0x010xCC
ID 1 Status Packet
H1H2Packet IDLENERRP1CKSM
0xFF0xFF0x010x030x000x200xDB

Write

Control Table에 Data를 쓰는 명령입니다.

LENINSTP1P2P3P N+1
N + 30x03시작 주소첫번째 바이트두번째 바이트N번째 바이트

예제

조건
  • Broadcast ID(RX-64) : 불특정 DYNAMIXEL의 ID를 '1'로 설정합니다.
Write Instruction Packet
H1H2Packet IDLENINSTP1P2CKSM
0xFF0xFF0xFE0x040x030x030x010xF6
경고

주의: Broadcast ID(0xFE)를 사용하면 Status Packet은 반환되지 않습니다.

Reg Write

Reg Write명령은 Write명령과 기능은 유사하나, 명령이 수행되는 시점이 다릅니다.

  1. Instruction Packet이 도착하면 그 값을 Buffer에 저장하고 Write 동작은 대기 상태로 남겨둡니다.
  2. 이때, Registered Instruction (Address 44 (0x2C)) 이 1로 설정됩니다.
  3. 이후에 Action Instruction Packet이 도착하면 Registered Instruction 이 0으로 바뀌면서 비로소 등록되어 있던 Write명령이 실행됩니다.
LENINSTP1P2P N+1
N+30x04시작 주소첫번째 바이트N번째 바이트

예제

조건
  • ID 1(RX-64) : Reg Write을 이용해서 500(0x1F4)을 Goal Position(30)에 입력하고 Action 명령어를 기다렸다가 움직입니다.
Reg Write Instruction Packet
H1H2Packet IDLENINSTP1P2P3CKSM
0xFF0xFF0x010x050x040x1E0xF40x010xE2
ID 1 Status Packet
H1H2Packet IDLENERRCKSM
0xFF0xFF0x010x020x000xFC

Action

Reg Write 명령으로 등록된 Packet을 실행하라는 명령입니다. Action 명령은 여러 개의 DYNAMIXEL들을 동시에 움직여야 하는 경우 사용합니다. 여러 개의 구동장치를 통신에 의해 제어할 때, 맨 처음 명령을 전달 받는 구동장치와 맨 마지막에 명령을 전달 받는 구동장치는 구동 시점에 약간의 시간 차이가 있는데, Action 명령은 이 문제를 해결합니다.

LENINSTP
0x020x05-

예제

조건
  • DYNAMIXEL이 미리 Reg Write를 이용해서 데이터를 수신해야 합니다.
  • Packet ID가 Broadcast ID(0xFE)이므로 Status Packet은 반환되지 않습니다
Action Instruction Packet
H1H2Packet IDLENINSTCKSM
0xFF0xFF0xFE0x020x050xFA
노트

참고 : Broadcast ID(0xFE)를 사용한 경우 Status Packet은 반환되지 않습니다.

Factory Reset

Control Table의 Data를 공장 출하 값 상태로 되돌려 놓습니다.

경고

주의:

  • Factory Reset 명령을 사용하면 사용자가 EEPROM에 설정했던 값이 지워지므로 주의하세요.
  • Broadcast ID(0xFE)로는 Factory Reset 명령을 사용할 수 없습니다.
LENINSTP
0x020x06-

예제

조건
  • ID 0(RX-64) : DYNAMIXEL을 공장 출하시 설정으로 복구시킵니다.
Factory Reset Instruction Packet
H1H2Packet IDLENINSTCKSM
0xFF0xFF0x000x020x060xF7
ID 0 Status Packet
H1H2Packet IDLENERRCKSM
0xFF0xFF0x000x020x000xFD

Reboot

장치를 재부팅 시킵니다.

예제

조건
  • ID 1(XM430-W210)를 Reboot 시킬 경우
Reboot Instruction Packet
H1H2Packet IDLENINSTCKSM
0xFF0xFF0x010x020x080xF4
ID 1 Status Packet
H1H2Packet IDLENERRCKSM
0xFF0xFF0x010x020x000xFC

Sync Write

한번의 Instruction Packet전송으로 여러 개의 DYNAMIXEL들을 동시에 제어하고자 할 때 사용되는 명령어입니다. 이 명령을 사용하면 여러 명령을 한번에 전달하므로 Reg Write/Action에 비해 통신시간이 줄어듭니다. 단, Write 하고자 하는 컨트롤 테이블의 주소와 길이가 모두 동일해야 Sync Write 명령을 사용할 수 있습니다. 또한 Packet ID는 Broadcast ID로 전송되어야 합니다.

항목설명
Instruction0x83
Length((L + 1) * N) + 4 (L:데이터 길이, N:DYNAMIXEL 개수)
Parameter 1시작주소
Parameter 2데이터 길이
Parameter 3첫번째 장치 ID
Parameter 4첫번째 장치 첫번째 데이터 바이트
Parameter 5첫번째 장치 두번째 데이터 바이트
......
Parameter L+3첫번째 장치 L번째 데이터 바이트
Parameter L+4두번째 장치 ID
Parameter L+5두번째 장치 첫번째 데이터 바이트
Parameter L+6두번째 장치 두번째 데이터 바이트
......
Parameter 2L+4두번째 장치 L번째 데이터 바이트

예제

조건
  • ID 0(MX-64) : Goal Position(30, 0x1E)에 0x010을 입력하고 Moving Speed(32, 0x20)에 0x150을 입력합니다.
  • ID 1(MX-64) : Goal Position(30, 0x1E)에 0x220을 입력하고 Moving Speed(32, 0x20)에 0x360을 입력합니다.
Sync Write Instruction Packet
H1H2Packet IDLENINSTP1P2P3P4P5P6P7P8P9P10P11P12CKSM
0xFF0xFF0xFE0x0E0x830x1E0x040x000x100x000x500x010x010x200x020x600x030x67
경고

주의: Broadcast ID(0xFE)를 사용하면 Status Packet은 반환되지 않습니다.

Bulk Read

한 번의 Instruction Packet 전송으로 여러 개의 DYNAMIXEL(MX시리즈)에서 동시에 값을 읽어오고자 할 때 사용되는 명령어입니다. 여러 번의 READ 명령을 내리는 것에 비해 패킷의 길이가 줄어들고, 리턴 되는 상태 패킷들 사이에 유휴 시간이 줄어들어 통신 시간을 절약할 수 있습니다. 단, 하나의 모듈에 여러 번 읽어 오도록 사용할 수는 없으며 동일한 모듈 ID 를 여러 번 지정할 경우 가장 먼저 지정된 파라미터만 처리됩니다.

항목설명
Instruction0x92
Length3N + 3
Parameter 10x00
Parameter 2첫번째 장치 읽어들일 데이터 길이
Parameter 3첫번째 장치 ID
Parameter 4첫번째 장치 시작주소
......
Parameter 3N+2N번째 장치 읽어들일 데이터 길이
Parameter 3N+3N번째 장치 ID
Parameter 3N+4N번째 장치 시작주소
경고

주의: DYNAMIXEL Protocol 2.0의 Bulk Read 패킷과 Parameter 필드의 구성이 다르므로 주의하세요.

예제

조건
  • ID 1(RX-64) : 2 바이트 Goal Position(30, 0x1E) 값을 읽어옵니다.
  • ID 2(RX-64) : 2 바이트 Present Position(36, 0x24) 값을 읽어옵니다.
Bulk Read Instruction Packet
H1H2Packet IDLENINSTP1P2P3P4P5P6P7CKSM
0xFF0xFF0xFE0x090x920x000x020x010x1E0x020x020x240x1D

Bulk Read Instruction을 수신하면, ID 2인 DYNAMIXEL은 데이터 버스에서 ID 1(앞선 장치 ID)의 Status Packet이 전송되는 것을 감시하다가, ID 1 장치의 Status Packet 전송이 완료되면 자신의 Status Packet을 전송합니다.

ID 1 Status Packet
H1H2Packet IDLENERRP1P2CKSM
0xFF0xFF0x010x040x000x000x800x7A
ID 2 Status Packet
H1H2Packet IDLENERRP1P2CKSM
0xFF0xFF0x020x040x000x000x800x79

추가 Packet 예제