안녕하세요. 직접 IAR컴파일러로 다이나믹셀 제어 소스를 만들고있는데요,
sync_write모드로 아예 동작조차 하질않네요,
아래 소스를 봐주세요.
#define num_of_motor 18
void RX_sync_move(unsigned int ID_1_goal, unsigned int ID_1_speed, unsigned int ID_2_goal, unsigned int ID_2_speed,
unsigned int ID_3_goal, unsigned int ID_3_speed, unsigned int ID_4_goal, unsigned int ID_4_speed,
unsigned int ID_5_goal, unsigned int ID_5_speed, unsigned int ID_6_goal, unsigned int ID_6_speed,
unsigned int ID_7_goal, unsigned int ID_7_speed, unsigned int ID_8_goal, unsigned int ID_8_speed,
unsigned int ID_9_goal, unsigned int ID_9_speed, unsigned int ID_10_goal, unsigned int ID_10_speed,
unsigned int ID_11_goal, unsigned int ID_11_speed, unsigned int ID_12_goal, unsigned int ID_12_speed,
unsigned int ID_13_goal, unsigned int ID_13_speed, unsigned int ID_14_goal, unsigned int ID_14_speed,
unsigned int ID_15_goal, unsigned int ID_15_speed, unsigned int ID_16_goal, unsigned int ID_16_speed,
unsigned int ID_17_goal ,unsigned int ID_17_speed, unsigned int ID_18_goal, unsigned int ID_18_speed
)
{
unsigned char i,data[96];
unsigned int check_sum=0;
unsigned char length = 0x04;
usart0_transmit(0xff);
usart0_transmit(0xff);
data[0]=0xfe; // Broad casting ID
data[1]=(length+1)*num_of_motor + 4; // length (L+1)*N+4 5*18+4 = 94
data[2]=0x83; // instruction
data[3]=0x1e; //start adrress
data[4]=length; //data length : each motor
data[5]=1;
data[6]=(unsigned char)(ID_1_goal&0x00ff); // position (L)
data[7]=(unsigned char)((ID_1_goal>>8)&0x00ff); // position (H)
data[8]=(unsigned char)(ID_1_speed&0x00ff); // speed (L)
data[9]=(unsigned char)((ID_1_speed>>8)&0x00ff); // speed (H)
data[10]=2;
data[11]=(unsigned char)(ID_2_goal&0x00ff); // position (L)
data[12]=(unsigned char)((ID_2_goal>>8)&0x00ff); // position (H)
data[13]=(unsigned char)(ID_2_speed&0x00ff); // speed (L)
data[14]=(unsigned char)((ID_2_speed>>8)&0x00ff); // speed (H)
data[15]=3;
data[16]=(unsigned char)(ID_3_goal&0x00ff); // position (L)
data[17]=(unsigned char)((ID_3_goal>>8)&0x00ff); // position (H)
data[18]=(unsigned char)(ID_3_speed&0x00ff); // speed (L)
data[19]=(unsigned char)((ID_3_speed>>8)&0x00ff); // speed (H)
....~
.... 1~18번모터까지 제어
data[90]=18;
data[91]=(unsigned char)(ID_18_goal&0x00ff); // position (L)
data[92]=(unsigned char)((ID_18_goal>>8)&0x00ff); // position (H)
data[93]=(unsigned char)(ID_18_speed&0x00ff); // speed (L)
data[94]=(unsigned char)((ID_18_speed>>8)&0x00ff); // speed (H)
for(i=0;i<95;i++) {
usart0_transmit(data[i]); //이부분은 USART로 송신하는 부분이라 문제는 없습니다.
check_sum+=data[i];
}
// Check Sum 결정
data[95]=~(unsigned char)(check_sum&0x00ff);
usart0_transmit(data[95]);
__delay_cycles(16000);
}
이렇게 되있는데, 제 계산으로는 length 길이도 맞고 check sum도 문제가없다고 생각되구요,,
그리고 각 다이나믹셀의 수신버퍼 한계용량도 넘지 않는것같은데,, 뭐가문제인지 봐주시면 감사하겠습니다.
아 그리고 이외의 다른동작들은 다 잘 되더라구요.
그리고 한가지 질문을 더 추가하자면, sync_write동작 말고 개별적으로 모터를 움직여서 동작을 만들고있는데요
연속된 동작을 하다보면 다이나믹셀이 보내는 값을 받지 못해서 움직이질 않더라구요
그래서 동작이 제대로 안되는 경우가 생기기도 합니다.
이건 송신 속도나 노이즈때문일까요? 대회가 얼마 안남았네요,, 마음만 자꾸 급해집니다^^;
그럼 좋은하루 되시고 답변 기다리고 있을게요~
안녕하세요. 로보티즈입니다.
죄송합니다. 직접 만드신 프로그램에 대해 디버깅은 지원은 되지 않습니다.
Tech Support에 예제가 올라와 있으니 참고해주세요.
Dynamixel SDK
도움을 못드려 죄송합니다.