Interfacing my GIM 8115-9 actuator with Arduino via MCP2515 CAN module

Hello guys , I have recently bought GIM 8115-9 actuator from Steadywin, it has a built in motor driver based on Ben Katz documentation ( MIT Mini Cheetah Creator) , I have already updated its firmware according to my needs and currently trying to run it via Arduino Mega interfaced with a MCP2515 CAN module. I have been unsuccessful so far and the worst part is that there is little to no information about these motors online.

I searched on youtube and on forums for hours and the closest thing I got was Skyentific's videos regarding a previous version of the motors which he ran via a Sparkfun CAN Bus Module (its unavailable currently in the market) . Even he used the built-in joystick of the module to move the motor, however, I want to do it autonomously.

I configured the code provided by him based off Ben Katz original CAN master test code but the motor just wont run. Its not even going into motor mode via arduino. I have to manually put it into the motor mode again and again via its firmware settings through Tera Term software. Despite clearly using the initializing commands provided for it to run in normal state. Please help me out, I have already double checked the connections, everything is fine.

The Code I am using is this:

#include <MCP_CAN.h>
#include <SPI.h>

// Value Limits
#define P_MIN -12.5f
#define P_MAX 12.5f
#define V_MIN -65.0f
#define V_MAX  65.0f
#define KP_MIN  0.0f
#define KP_MAX  500.0f
#define KD_MIN  0.0f
#define KD_MAX  5.0f
#define T_MIN  -1.0f
#define T_MAX  1.0f

// Set Values
float p_in = 0.0f;
float v_in = 0.0f;
float kp_in = 100.0f;
float kd_in = 1.0f;
float t_in = 0.0f;

// Measured values
float p_out = 0.0f;
float v_out = 0.0f;
float t_out = 0.0f;

// cs pin
const int SPI_CS_PIN = 53;

MCP_CAN CAN(SPI_CS_PIN);

void setup() {
  Serial.begin(115200);
  delay(1000);
  while(CAN_OK != CAN.begin(MCP_ANY, CAN_1000KBPS, MCP_8MHZ)) {
    Serial.println("CAN BUS Shield init fail");
    Serial.println("Init CAN BUS Shield again");
    delay(100);
  }
  Serial.println("CAN BUS Shield init ok");
}

long previousMillis = 0;
int cycle = 0;

void loop() {
  unsigned long currentMillis = millis();
  
  if (cycle < 2) {
    if (currentMillis - previousMillis >= 1000) { // Change position every second
      previousMillis = currentMillis;
      if (p_in < P_MAX) {
        p_in += 1.0f;
      } else {
        p_in = P_MIN;
        cycle++;
      }
      p_in = constrain(p_in, P_MIN, P_MAX);
      EnterMotorMode();
      pack_cmd();
    }
  } else {
    ExitMotorMode();
  }

  // Receive CAN
  if(CAN_MSGAVAIL == CAN.checkReceive()) {
    unpack_reply();
  }

  // Print data
  Serial.print(millis() - previousMillis);
  Serial.print(" ");
  Serial.print(p_in);
  Serial.print(" ");
  Serial.print(p_out);
  Serial.print(" ");
  Serial.print(v_out);
  Serial.print(" ");
  Serial.print(t_out);
  Serial.println();
}

void EnterMotorMode() {
  // Enter Motor Mode (enable)
  byte buf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC};
  CAN.sendMsgBuf(0x01, 0, 8, buf);
}

void ExitMotorMode() {
  // Disable motor
  byte buf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD};
  CAN.sendMsgBuf(0x01, 0, 8, buf);
}

void Zero() {
  // Zero
  byte buf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE};
  CAN.sendMsgBuf(0x01, 0, 8, buf);
}

void pack_cmd() {
  byte buf[8];

  // Limit data to be within bounds
  float p_des = constrain(p_in, P_MIN, P_MAX);
  float v_des = constrain(v_in, V_MIN, V_MAX);
  float kp = constrain(kp_in, KP_MIN, KP_MAX);
  float kd = constrain(kd_in, KD_MIN, KD_MAX);
  float t_ff = constrain(t_in, T_MIN, T_MAX);

  // Convert floats to unsigned ints
  unsigned int p_int = float_to_uint(p_des, P_MIN, P_MAX, 16);
  unsigned int v_int = float_to_uint(v_des, V_MIN, V_MAX, 12);
  unsigned int kp_int = float_to_uint(kp, KP_MIN, KP_MAX, 12);
  unsigned int kd_int = float_to_uint(kd, KD_MIN, KD_MAX, 12);
  unsigned int t_int = float_to_uint(t_ff, T_MIN, T_MAX, 12);

  // Pack ints into the CAN buffer
  buf[0] = p_int >> 8;
  buf[1] = p_int & 0xFF;
  buf[2] = v_int >> 4;
  buf[3] = ((v_int & 0xF) << 4) | (kp_int >> 8);
  buf[4] = kp_int & 0xFF;
  buf[5] = kd_int >> 4;
  buf[6] = ((kd_int & 0xF) << 4) | (t_int >> 8);
  buf[7] = t_int & 0xFF;
  CAN.sendMsgBuf(0x01, 0, 8, buf);
}

void unpack_reply() {
  byte len = 0;
  byte buf[8];
  long unsigned int id;
  CAN.readMsgBuf(&id, &len, buf);

  // Unpack ints from CAN buffer
  unsigned int p_int = (buf[0] << 8) | buf[1];
  unsigned int v_int = (buf[2] << 4) | (buf[3] >> 4);
  unsigned int i_int = ((buf[3] & 0xF) << 8) | buf[4];

  // Convert uint to floats
  p_out = uint_to_float(p_int, P_MIN, P_MAX, 16);
  v_out = uint_to_float(v_int, V_MIN, V_MAX, 12);
  t_out = uint_to_float(i_int, -T_MAX, T_MAX, 12);
}

unsigned int float_to_uint(float x, float x_min, float x_max, int bits) {
  float span = x_max - x_min;
  float offset = x_min;
  return (unsigned int) ((x - offset) * ((float)((1 << bits) - 1) / span));
}

float uint_to_float(unsigned int x_int, float x_min, float x_max, int bits) {
  float span = x_max - x_min;
  float offset = x_min;
  return ((float)x_int * span / (float)((1 << bits) - 1)) + offset;
}

Please help me out, its very urgent, and I cant replace the motor or its driver anymore due to lack of funds as it was a pretty hefty investment for me.

Links to datasheets and schematics are prefered. Tons of words are not.
Why at all buy things having no or poor documentation?


Catch(06-14-11-0(06-14-11-34-03)(1)

works for you? the connections are pretty straightforward, but here is the datasheet for you

You will not jump the queue by that.

Remains to post info about the MCP2515 wiring and powering.

@sobimon will be spending some time away from the forum to consider their use of language.

Without the previously requested information I cannot help either. I have several problems not just not being able to see the project or its schematics but many others.

brother, I genuinely dont have any more information for you, what do you want me to send? kindly let me know

Send it back and get one with the needed documentation.

Hello sobimon,

I wanted to know if you have been able to make it work?

I think steadywin uses their own driver with its own CAN protocol, instead of the MIT one.

So, the motor turning hex will be EnterMotorControlMode[8] = {0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

instead of byte buf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC};

Hello brother,

Yes, Ive made them work. Thankfully. It wasnt an issue of the motors, instead, the mcp2515 CAN module wasnt being grounded properly ( you need to make sure its CANL is grounded with the battery's ground. That would remove any issue. Ive made them work perfectly using the exact code provided by steadywin! Also. Make sure you ask them to send 2 modules along with the motors.

  1. USB-TTL module (chinese made. Any other doesnt work. ) for firmware settings
  2. USB2CANmodule + its software ( for testing of motors using different parameters directly via the software)

The spec you gave shows the voltage should be between 36 and 48 volts, but you do not seem to be following the specification. Why?

Who said so? I am using 2 6s Li-po batteries pal.

Your picture shows 24 volts. So what is the voltage, under load, that you are using?

Yeah, that photo is kind of untrue. It was provided in the chinese documentation. I think they misprinted or something . Im using approx 44-46 V

Hello Mr. Sobimon,
I am a student currently working on a project involving the use of the GIM 6010-6 Actuator from Steadywin. I came across your post on the forum Arduino, where you discussed issues with the GIM 8115-9 Actuator. Although you initially encountered difficulties with the actuator not functioning, you eventually resolved the issue.

I am facing a similar problem with the GIM 6010-6 Actuator. Despite using CAN communication and following the specifications provided by Steadywin, the actuator is still not working as expected. Additionally, I have been unable to find an official code or more detailed documentation from Steadywin.

I would like to ask for your help, if possible, to share your experience or the solution you found. Do you have any suggestions or tips that might help me solve this issue? Your assistance would be greatly appreciated.
The Code I am using is this:

#include <SPI.h>
#include <mcp2515.h>

// CAN Frame for communication
struct can_frame canMsg1;
MCP2515 mcp2515(10); // CS Pin for MCP2515 uses pin 10 on Arduino Uno

// STEADYWIN GIM6010 Settings
#define P_MIN -12.5f
#define P_MAX 12.5f
#define V_MIN -45.0f
#define V_MAX 45.0f
#define KP_MIN 0.0f
#define KP_MAX 500.0f
#define KD_MIN 0.0f
#define KD_MAX 5.0f
#define T_MIN -18.0f
#define T_MAX 18.0f

// Set values for GIM6010
float p_in = 0.0f;
float v_in = 1.0f;
float kp_in = 10.0f;
float kd_in = 1.0f;
float t_in = 0.0f;

// Measured values from the motor
float p_out = 0.0f;
float v_out = 0.0f;
float t_out = 0.0f;

void setup() {
  Serial.begin(115200);
  SPI.begin();
  
  // Initialize MCP2515
  mcp2515.reset();
  mcp2515.setBitrate(CAN_1000KBPS, MCP_8MHZ);
  mcp2515.setNormalMode();

  Serial.println("MCP2515 Initialized for GIM6010");
  
  // Prepare the CAN message for GIM6010 motor control
  canMsg1.can_id = 0x036;  // CAN ID for GIM6010
  canMsg1.can_dlc = 8;     // Set data length code to 8 bytes
}

void loop() {
  // Send command to operate motor in every loop
  motoron(canMsg1);
  
  // Send control data to the motor
  pack_cmd();
  
  // Small delay for control
  delay(100);
}

void motoron(struct can_frame canMsg) {
  // Command to turn the motor on
  canMsg.data[0] = 0xFF;
  canMsg.data[1] = 0xFF;
  canMsg.data[2] = 0xFF;
  canMsg.data[3] = 0xFF;
  canMsg.data[4] = 0xFF;
  canMsg.data[5] = 0xFF;
  canMsg.data[6] = 0xFF;
  canMsg.data[7] = 0xFC;
  mcp2515.sendMessage(&canMsg);
  
  // Display motor ON status in the serial monitor
  Serial.println("Motor ON");
}

void motoroff(struct can_frame canMsg) {
  // Command to turn the motor off
  canMsg.data[0] = 0xFF;
  canMsg.data[1] = 0xFF;
  canMsg.data[2] = 0xFF;
  canMsg.data[3] = 0xFF;
  canMsg.data[4] = 0xFF;
  canMsg.data[5] = 0xFF;
  canMsg.data[6] = 0xFF;
  canMsg.data[7] = 0xFD;
  mcp2515.sendMessage(&canMsg);
  
  // Display motor OFF status in the serial monitor
  Serial.println("Motor OFF");
}

void pack_cmd() {
  // Pack and send position, velocity, and torque commands to the motor via CAN bus
  float p_des = constrain(p_in, P_MIN, P_MAX);
  float v_des = constrain(v_in, V_MIN, V_MAX);
  float kp = constrain(kp_in, KP_MIN, KP_MAX);
  float kd = constrain(kd_in, KD_MIN, KD_MAX);
  float t_ff = constrain(t_in, T_MIN, T_MAX);

  // Convert to unsigned integer for sending
  unsigned int p_int = float_to_uint(p_des, P_MIN, P_MAX, 16);
  unsigned int v_int = float_to_uint(v_des, V_MIN, V_MAX, 12);
  unsigned int kp_int = float_to_uint(kp, KP_MIN, KP_MAX, 12);
  unsigned int kd_int = float_to_uint(kd, KD_MIN, KD_MAX, 12);
  unsigned int t_int = float_to_uint(t_ff, T_MIN, T_MAX, 12);

  // Pack data into CAN buffer
  canMsg1.data[0] = p_int >> 8;
  canMsg1.data[1] = p_int & 0xFF;
  canMsg1.data[2] = v_int >> 4;
  canMsg1.data[3] = ((v_int & 0xF) << 4) | (kp_int >> 8);
  canMsg1.data[4] = kp_int & 0xFF;
  canMsg1.data[5] = kd_int >> 4;
  canMsg1.data[6] = ((kd_int & 0xF) << 4) | (t_int >> 8);
  canMsg1.data[7] = t_int & 0xFF;

  // Send the CAN message to the motor
  mcp2515.sendMessage(&canMsg1);

  // Display command data on the Serial Monitor
  Serial.println("Sending control data to motor:");
  Serial.print("Position (p_in): "); Serial.println(p_in);
  Serial.print("Velocity (v_in): "); Serial.println(v_in);
  Serial.print("KP: "); Serial.println(kp_in);
  Serial.print("KD: "); Serial.println(kd_in);
  Serial.print("Torque (t_in): "); Serial.println(t_in);
}

unsigned int float_to_uint(float x, float x_min, float x_max, int bits) {
  // Convert float to unsigned integer
  float span = x_max - x_min;
  float offset = x_min;
  return (unsigned int) ((x - offset) * ((float)((1 << bits) - 1) / span));
}

float uint_to_float(unsigned int x_int, float x_min, float x_max, int bits) {
  // Convert unsigned integer back to float
  float span = x_max - x_min;
  float offset = x_min;
  return ((float)x_int * span / (float)((1 << bits) - 1)) + offset;
}

Thank you in advance for your time and attention. I look forward to hearing back from you.

Best regards,

Hello Theresa,

How are you? I have looked into your code and it seems fine to me. However, since I have tested the library myself, could you please try using "mcp_can" library from arduino ide instead?

Firstly, could you please provide me with your circuit diagram please? Or if you dont want to, make sure your mcp2515 CAN module's CANL is grounded with the ground of your battery. This is very important.

Once you have done that, go to their example codes and use their "CANsend" (or a similar name, Ive forgotten the exact name, my bad) . Make changes to the provided preset using the motormodeon commands (ff,ff,ff,ff,ff,ff,ff,fc) along with the CAN ID you are using. (I do have a few more questions , such as, have you configured the firmware using USB-TTL component via sscom or teraterm? If not you might need to use it. Otherwise, your default can id is 1 hence use 0x001 instead ) .

Run this code. It should simply turn your motor's motormode on (the green led would turn on)

If it doesnt work, please feel free to reach out to me via email instead , I'd happily help you! Do let me know if it works.

Regards,
Soban

Hello Mr. Soban

Thank you very much for your previous response. I truly appreciate the time and assistance you've provided.

In response to your feedback, I would like to inform you that I have previously tried uploading the CAN library, but each time I did so in the Arduino IDE, I kept receiving messages that the CAN library I added could not be recognized. I'm confused about whether the issue stems from an error in the coding, wiring, or possibly a problem with the hardware I am using.

Additionally, I managed to obtain the GIM Motor Driver Protocol Specification, but unfortunately, I am unable to attach it to this forum.

I also came across a statement mentioning that "the MCP2515 CAN module's CANL is grounded with the ground of your battery. This is very important." However, I am still unclear about how this fits into the wiring diagram I am using. Could you kindly help me with a wiring schematic that includes this detail?

Therefore, I kindly ask for your help in reviewing the wiring I have made. Here is the wiring diagram I am currently using:

Additionally, here is the PCB of the GIM6010 that I am working with:

Apologies if I am asking too many questions. Honestly, this is my first time working with the GIM6010, so many things are new to me.

Lastly, if possible, may I also know your email address? I haven't been able to find it, and I want to ensure smoother communication going forward.

Once again, thank you so much for your time and assistance. I look forward to hearing back from you soon.

Best regards,
Theressa
theressa.121430113@student.itera.ac.id

Hello Mr. Sobimon,

I’m experiencing a similar issue with the GIM4305 actuator from Steadywin. The LED on the motor lights up, but the motor itself doesn't turn. I’ve already tried adjusting my code as you suggested (the code I’m using is shown below), but it hasn’t resolved the issue. Basen on my code, the serial output shows results such as:

Time: 249 ms, Position Set: 12.50, Position Out: -51212.50, Velocity Out: 300.22, Torque Out: -0.95
Time: 257 ms, Position Set: 12.50, Position Out: -51212.50, Velocity Out: 300.22, Torque Out: -0.95
...

The position output seems to be an unusually large negative value, and I suspect there might be an issue with the MCP2515 CAN module. Could it be related to improper grounding, as you mentioned? I haven’t checked if CANL is properly grounded with the battery’s ground yet.

Also, I currently only have the motor itself. I don't have additional USB-TTL module and USB2CAN module, as you did to properly configure and test the motor.

Could you please let me know what steps I should take to resolve this issue? I would greatly appreciate your help. Thank you in advance for your time and attention.

#include <SPI.h>         // Library SPI untuk komunikasi dengan MCP2515
#include <mcp2515.h>     // Library MCP2515 untuk protokol CAN

// Value Limits for GIM4305 (Based on provided specs)
#define P_MIN -12.5f   // Position range remains the same (adjust if needed)
#define P_MAX 12.5f
#define V_MIN 300.0f   // Velocity range based on provided specs
#define V_MAX 400.0f
#define KP_MIN 0.0f    // Proportional gain range
#define KP_MAX 500.0f
#define KD_MIN 0.0f    // Derivative gain range
#define KD_MAX 5.0f
#define T_MIN -1.0f    // Torque remains at 1 N.m, both positive and negative
#define T_MAX 1.0f

// Set Values
float p_in = 0.0f;
float v_in = 300.0f; // Starting with minimum velocity
float kp_in = 100.0f;
float kd_in = 1.0f;
float t_in = 0.0f;

// Measured values
float p_out = 0.0f;
float v_out = 0.0f;
float t_out = 0.0f;

// Pin definisi
struct can_frame canMsg;
MCP2515 mcp2515(10);  // Chip select pin 10

void setup() {
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_1000KBPS, MCP_8MHZ);  // Menyetel bitrate
  mcp2515.setNormalMode();  // Menyetel ke normal mode
  
  Serial.println("CAN BUS MCP2515 init ok");
}

long previousMillis = 0;
int cycle = 0;

void loop() {
  unsigned long currentMillis = millis();
  
  if (cycle < 2) {
    if (currentMillis - previousMillis >= 1000) { // Change position every second
      previousMillis = currentMillis;
      if (p_in < P_MAX) {
        p_in += 1.0f;
      } else {
        p_in = P_MIN;
        cycle++;
      }
      p_in = constrain(p_in, P_MIN, P_MAX);
      EnterMotorMode();
      pack_cmd();
    }
  } else {
    ExitMotorMode();
  }

  // Receive CAN
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
    unpack_reply(canMsg);
  }

  // Print data
  Serial.print("Time: ");
  Serial.print(millis() - previousMillis);
  Serial.print(" ms, Position Set: ");
  Serial.print(p_in);
  Serial.print(", Position Out: ");
  Serial.print(p_out);
  Serial.print(", Velocity Out: ");
  Serial.print(v_out);
  Serial.print(", Torque Out: ");
  Serial.println(t_out);
}

void EnterMotorMode() {
  // Enter Motor Mode (enable)
  canMsg.can_id = 0x01;
  canMsg.can_dlc = 8;
  for (int i = 0; i < 7; i++) {
    canMsg.data[i] = 0xFF;
  }
  canMsg.data[7] = 0xFC;
  mcp2515.sendMessage(&canMsg);
  Serial.println("Motor Mode Enabled");
}

void ExitMotorMode() {
  // Disable motor
  canMsg.can_id = 0x01;
  canMsg.can_dlc = 8;
  for (int i = 0; i < 7; i++) {
    canMsg.data[i] = 0xFF;
  }
  canMsg.data[7] = 0xFD;
  mcp2515.sendMessage(&canMsg);
  Serial.println("Motor Mode Disabled");
}

void pack_cmd() {
  canMsg.can_id = 0x01;
  canMsg.can_dlc = 8;

  // Limit data to be within bounds
  float p_des = constrain(p_in, P_MIN, P_MAX);
  float v_des = constrain(v_in, V_MIN, V_MAX);
  float kp = constrain(kp_in, KP_MIN, KP_MAX);
  float kd = constrain(kd_in, KD_MIN, KD_MAX);
  float t_ff = constrain(t_in, T_MIN, T_MAX);

  // Convert floats to unsigned ints
  unsigned int p_int = float_to_uint(p_des, P_MIN, P_MAX, 16);
  unsigned int v_int = float_to_uint(v_des, V_MIN, V_MAX, 12);
  unsigned int kp_int = float_to_uint(kp, KP_MIN, KP_MAX, 12);
  unsigned int kd_int = float_to_uint(kd, KD_MIN, KD_MAX, 12);
  unsigned int t_int = float_to_uint(t_ff, T_MIN, T_MAX, 12);

  // Pack ints into the CAN buffer
  canMsg.data[0] = p_int >> 8;
  canMsg.data[1] = p_int & 0xFF;
  canMsg.data[2] = v_int >> 4;
  canMsg.data[3] = ((v_int & 0xF) << 4) | (kp_int >> 8);
  canMsg.data[4] = kp_int & 0xFF;
  canMsg.data[5] = kd_int >> 4;
  canMsg.data[6] = ((kd_int & 0xF) << 4) | (t_int >> 8);
  canMsg.data[7] = t_int & 0xFF;
  mcp2515.sendMessage(&canMsg);

  Serial.println("Command Sent: ");
  Serial.print("Position: "); Serial.print(p_des);
  Serial.print(", Velocity: "); Serial.print(v_des);
  Serial.print(", KP: "); Serial.print(kp);
  Serial.print(", KD: "); Serial.print(kd);
  Serial.print(", Torque: "); Serial.println(t_ff);
}

void unpack_reply(struct can_frame canMsg) {
  // Unpack ints from CAN buffer
  unsigned int p_int = (canMsg.data[0] << 8) | canMsg.data[1];
  unsigned int v_int = (canMsg.data[2] << 4) | (canMsg.data[3] >> 4);
  unsigned int i_int = ((canMsg.data[3] & 0xF) << 8) | canMsg.data[4];

  // Convert uint to floats
  p_out = uint_to_float(p_int, P_MIN, P_MAX, 16);
  v_out = uint_to_float(v_int, V_MIN, V_MAX, 12);
  t_out = uint_to_float(i_int, -T_MAX, T_MAX, 12);

  Serial.println("Reply Unpacked: ");
  Serial.print("Position Out: "); Serial.print(p_out);
  Serial.print(", Velocity Out: "); Serial.print(v_out);
  Serial.print(", Torque Out: "); Serial.println(t_out);
}

unsigned int float_to_uint(float x, float x_min, float x_max, int bits) {
  float span = x_max - x_min;
  float offset = x_min;
  return (unsigned int) ((x - offset) * ((float)((1 << bits) - 1) / span));
}

float uint_to_float(unsigned int x_int, float x_min, float x_max, int bits) {
  float span = x_max - x_min;
  float offset = x_min;
  return ((float)x_int * span / (float)((1 << bits) - 1)) + offset;
}

Best Regards,
Berliana

Hello Berliana,

how are you? could you please share your circuit diagram?

also, I went through your code, it seems okay, but too complex for simple movement, try shortening it, as far as the large values in your position are concerned,

unsigned int id = buf[0];
unsigned int p_int = (buf[1] << 8) | buf[2]; // Position data
unsigned int v_int = (buf[3] << 4) | (buf[4] >> 4); // Velocity data
unsigned int i_int = ((buf[4] & 0xF) << 8) | buf[5];

modify the first 4 lines in your void unpack_reply with this one, it will fix that.

please provide me with your email address if you need further help.

Regards,
Soban

Hello Theresa,

Soban here, I looked into your circuit diagram and could see quite a few issues, could you send me a photo of your actual setup? so that I can help you out better? also, do let me know whether you have a USB-TTL , provided by the vendor herself, it is VERY essential for your motor's firmware configuration, also please share all the documentations that the vendor sent to you, dont worry your motor will be working in no time!

Sorry for the delayed responses btw ,feel free to provide your email in the next response, I'll reach out to you on it with mine.
Regards,
Soban