ROBOTIS-GIT / Dynamixel2Arduino

DYNAMIXEL protocol library for Arduino
Apache License 2.0
88 stars 55 forks source link

Need help on bulk read of MX106 (Protocol 2.0) #133

Open bbrr132 opened 12 months ago

bbrr132 commented 12 months ago

Hi im new to programming and i need help to peform bulk read on my dynamixel for faster speed. I am trying to access position current and voltage at the same time. Could anyone provide guidance. Thank you.

`

include

DynamixelShield dxl(Serial2, 18); // Using Serial2 for Dynamixel communication

const uint8_t BROADCAST_ID = 254; const float DYNAMIXEL_PROTOCOL_VERSION = 2.0; const uint8_t DXL_ID_CNT = 2; const uint8_t DXL_ID_LIST[DXL_ID_CNT] = {0, 1}; // Motor IDs 0 and 1 const uint16_t user_pkt_buf_cap = 128; uint8_t user_pkt_buf[user_pkt_buf_cap];

// Starting addresses and lengths of data to read for each Dynamixel motor const uint16_t SR_START_ADDRS[DXL_ID_CNT] = {132, 126}; // Present Position and additional data const uint16_t SR_ADDR_LENGTHS[DXL_ID_CNT] = {4, 2}; // Lengths of data for each starting address

typedef struct sr_data { int32_t present_position; int16_t present_current; } attribute((packed)) sr_data_t;

sr_data_t sr_data[DXL_ID_CNT]; DYNAMIXEL::InfoSyncReadInst_t sr_infos; DYNAMIXEL::XELInfoSyncRead_t info_xels_sr[DXL_ID_CNT];

void setup() { uint8_t i; //pinMode(LED_BUILTIN, OUTPUT); Serial.begin(115200); // Using Serial for printing debug information dxl.begin(115200); // Using Serial2 for Dynamixel communication dxl.setPortProtocolVersion(DYNAMIXEL_PROTOCOL_VERSION);

for (i = 0; i < DXL_ID_CNT; i++) { dxl.torqueOff(DXL_ID_LIST[i]); dxl.setOperatingMode(DXL_ID_LIST[i], OP_POSITION); } dxl.torqueOn(BROADCAST_ID);

// Fill SyncRead structure members using an external user packet buffer sr_infos.packet.p_buf = user_pkt_buf; sr_infos.packet.buf_capacity = user_pkt_buf_cap; sr_infos.packet.is_completed = false; sr_infos.p_xels = info_xels_sr; sr_infos.xel_count = 0;

// Prepare SyncRead structure for (i = 0; i < DXL_ID_CNT; i++) { info_xels_sr[i].id = DXL_ID_LIST[i]; info_xels_sr[i].p_recv_buf = (uint8_t *)&sr_data[i]; sr_infos.addr = SR_START_ADDRS[i]; sr_infos.addr_length = SR_ADDR_LENGTHS[i]; sr_infos.xel_count++; } sr_infos.is_info_changed = true; }

void loop() { static uint32_t try_count = 0; uint8_t i, recv_cnt;

// Transmit predefined SyncRead instruction packet // and receive a status packet from each DYNAMIXEL recv_cnt = dxl.syncRead(&sr_infos); if (recv_cnt > 0) { Serial.print("[SyncRead] Success, Received ID Count: "); Serial.println(recv_cnt); for (i = 0; i < recv_cnt; i++) { Serial.print(" ID: "); Serial.print(sr_infos.p_xels[i].id); Serial.print(", Error: "); Serial.println(sr_infos.p_xels[i].error); Serial.print("\t Present Position: "); Serial.println(sr_data[i].present_position); Serial.print("\t Present Current: "); Serial.println(sr_data[i].present_current); } } else { Serial.print("[SyncRead] Fail, Lib error code: "); Serial.println(dxl.getLastLibErrCode()); } Serial.println("=======================================================");

delay(750); } `