Hello all.
I have some problems with serial ascii comunication.
What I do is set axis[0] speed, set axis[1] speed, get axis[0] encoder shadow_count and axis[1] shadow_count.
When my robot is driving sudeenly the serial connection is not responding anymore but the motor are still running.
I need to reboot odrive to get it running again. So I’m building some safety in my robot to cut off power to odrive when communication drops. Maybe I’m stressing the oderive to much. Because of this issue I was running behind my robot to stop it
To prevent too much serial communication to odrive I changed the protocol a bit.
Looking at the code I see some threads are being made. But I did not see any mutexes being used.
For example set_vel_setpoint. So I presume I can acces the encoder_.shadow_count_ without any problems in below code?
} else if (cmd[0] == 'V') { // velocity control extended
float vel_0_setpoint, vel_1_setpoint;
int numscan = sscanf(cmd, "V %f %f", &vel_0_setpoint, &vel_1_setpoint);
if (numscan < 2) {
respond(response_channel, use_checksum, "invalid command format");
} else {
axes[0]->controller_.set_vel_setpoint(vel_0_setpoint, 0);
axes[1]->controller_.set_vel_setpoint(vel_1_setpoint, 0);
respond(response_channel, use_checksum, "%d %d", axes[0]->encoder_.shadow_count_,axes[1]->encoder_.shadow_count_);
}
Also I’m thinking of implementing a heartbeat feature. If odrive does not get a ping every X ms the odrive will shut down the motor.