다이나믹셀 예제 중 Dynamixel2Arduino → Basic → Ping 예제를 실행시켜 보았더니 연결이 실패했다고 뜹니다. 보드레이트 57600bps , 프로토콜 2.0 , 모터 아이디 1 , 외부전원 12V인가 전부 위자드를 통해서 확인을 하였습니다. 위자드에서는 스캔이 되고 액추에이터 제어또한 수동으로 가능합니다. 하지만 아두이노에서 컴파일을 해보니 인식이 안된다고 뜹니다. 당연히 아두이노 실행할 때 위자드를 끄고 실행을하였습니다. Ping 예제 안되니 당연히 Position Mode 업로딩 또한 되지 않습니다. 계속 0을 출력합니다. MX-64, MX-28 둘 다 업로딩이 되지 않습니다. 하지만 위자드에서는 잘 돌아갑니다.
XL 모터는 아두이노 업로딩이 잘 됩니다.
For a couple of years now, PING has not worked well, so I just ignored it and just programmed the DXL directly. And that big chunk of “IF DEFINED” code is not very useful also.
The code below should work for the OpenRB-150 (I used 1 Mbps for all my DXLs and 115 Kbps for the Serial Monitor.
#include <Dynamixel2Arduino.h>
#define DXL_SERIAL Serial1
#define DEBUG_SERIAL Serial
const int DXL_DIR_PIN = -1;
const uint8_t DXL_ID = 1;
const float DXL_PROTOCOL_VERSION = 2.0;
Dynamixel2Arduino dxl(DXL_SERIAL, DXL_DIR_PIN);
//This namespace is required to use Control table item names
using namespace ControlTableItem;
void setup() {
// put your setup code here, to run once:
// Use UART port of DYNAMIXEL Shield to debug.
DEBUG_SERIAL.begin(115200);
while(!DEBUG_SERIAL);
// Set Port baudrate to 1000000 bps. This has to match with DYNAMIXEL baudrate.
dxl.begin(1000000);
// Set Port Protocol Version. This has to match with DYNAMIXEL protocol version.
dxl.setPortProtocolVersion(DXL_PROTOCOL_VERSION);
// Get DYNAMIXEL information
// dxl.ping(DXL_ID);
// Turn off torque when configuring items in EEPROM area
dxl.torqueOff(DXL_ID);
dxl.setOperatingMode(DXL_ID, OP_POSITION);
dxl.torqueOn(DXL_ID);
// Limit the maximum velocity in Position Control Mode. Use 0 for Max speed
dxl.writeControlTableItem(PROFILE_VELOCITY, DXL_ID, 100);
}
void loop() {
// put your main code here, to run repeatedly:
// Please refer to e-Manual(http://emanual.robotis.com/docs/en/parts/interface/dynamixel_shield/) for available range of value.
// Set Goal Position in RAW value
dxl.setGoalPosition(DXL_ID, 1000);
int i_present_position = 0;
float f_present_position = 0.0;
while (abs(1000 - i_present_position) > 10)
{
i_present_position = dxl.getPresentPosition(DXL_ID);
DEBUG_SERIAL.print("Present_Position(raw) : ");
DEBUG_SERIAL.println(i_present_position);
}
delay(1000);
// Set Goal Position in DEGREE value
dxl.setGoalPosition(DXL_ID, 6.0, UNIT_DEGREE);
while (abs(6.0 - f_present_position) > 2.0)
{
f_present_position = dxl.getPresentPosition(DXL_ID, UNIT_DEGREE);
DEBUG_SERIAL.print("Present_Position(degree) : ");
DEBUG_SERIAL.println(f_present_position);
}
delay(1000);
}
If you need more help you can try the free Kindle sample of my book at this link