RoboWheels Motor from Skysedge also failed to run on Odrive

This is another motor from SkysEdge called Robowheel runs perfectly with their controller but failed to calibrate with Odrive. does someone tried it before with these motors.

Reconnected to ODrive 2062356E5748 as odrv0
In [3]: odrv0.axis0.motor.config.pole_pairs = 13
…: odrv0.axis0.encoder.config.cpr = 78
…: odrv0.axis0.motor.config.resistance_calib_max_voltage = 5
…: odrv0.axis0.motor.config.requested_current_range = 30

In [5]: odrv0.save_configuration()
Oh no odrv0 disappeared

Reconnected to ODrive 2062356E5748 as odrv0
In [6]: odrv0.reboot()
Oh no odrv0 disappeared

Reconnected to ODrive 2062356E5748 as odrv0
In [7]: odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE

In [8]: odrv0.axis0.requested_state
Out[8]: 0

In [9]: odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE

Oh no odrv0 disappeared

laptop:~$ odrivetool
ODrive control utility v0.5.3.post0
Website: https://odriverobotics.com/
Docs: https://docs.odriverobotics.com/
Forums: https://discourse.odriverobotics.com/
Discord: ODrive
Github: GitHub - odriverobotics/ODrive: High performance motor control
Please connect your ODrive.
You can also type help() or quit().

Connected to ODrive 2062356E5748 as odrv0
In [1]: odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE

In [2]: dump_errors(odrv0, True)
system: no error
axis0
axis: no error
motor: Error(s):
MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE
sensorless_estimator: no error
controller: no error
axis1
axis: no error
motor: no error
sensorless_estimator: no error
encoder: no error
controller: no error

Oh no odrv0 disappeared

MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE

Robowheel has 1.7Ω resistance. This is high enough that you should consider using gimbal model, but can still be run in high current mode if you really want.

Use 56V odrive on 48V bus voltage, set resistance_calib_max_voltage = 20 and calibration_current = 4 or so, should work.

1 Like

I change the setup but got the following error.

odrv0.axis0.motor.config.pole_pairs = 13
odrv0.axis0.encoder.config.cpr = 78
odrv0.axis0.motor.config.resistance_calib_max_voltage = 4
odrv0.axis0.motor.config.requested_current_range = 36
odrv0.axis0.motor.config.current_control_bandwidth = 100
odrv0.axis0.motor.config.torque_constant = 8.27 / 10

system: Error(s):
ODRIVE_ERROR_DC_BUS_OVER_REGEN_CURRENT
axis0
axis: no error
motor: Error(s):
MOTOR_ERROR_SYSTEM_LEVEL
sensorless_estimator: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: Error(s):
MOTOR_ERROR_SYSTEM_LEVEL
sensorless_estimator: no error
encoder: no error
controller: no error

Then I input the following command according to the documentation troubleshooting
n [13]: odrv0.config.enable_brake_resistor = True

In [14]: odrv0.save_configuration()
Oh no odrv0 disappeared

Now got the following error

system: Error(s):
ODRIVE_ERROR_DC_BUS_OVER_REGEN_CURRENT
axis0
axis: no error
motor: Error(s):
MOTOR_ERROR_SYSTEM_LEVEL
sensorless_estimator: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: Error(s):
MOTOR_ERROR_SYSTEM_LEVEL
sensorless_estimator: no error
encoder: no error
controller: no error

The wheel’s dataset is available here https://www.skysedge.com/robotics/robowheel170/RoboWheel170_Datasheet.pdf

hi expert-bot

I have been away from my deck donkey project for a few months, but I did get it to work.
It has two robowheels. I run it with Dewalt 20 v lithium pack.
Noticed you have 13 pole pairs, I used 27 pole pairs. Seems like I might have done something different with the cpr also?? I will try to dig it out (may take a week or so…lot going on)

Created a program for Jetson Nano and drove it remotely.
Did have some problems and it would stop working (might be do to hall sensors?? )

I like the features of odrive and BLDC motors but there is alot to the setup. I have a bigger donkey with
4 wheel chair DC motors , the drives are simpler but the wheels will turn at different speeds so you would have steering drift ; also going to within a millimeter of a wall is better with BLDC motors

Any how will dig out my deck donkey.

1 Like

Hi expert-bot,

Here is part of my config set up for Skysedge RW170:

odrv0.axis0.motor.config.pole_pairs = 27
odrv0.axis0.motor.config.resistance_calib_max_voltage = 9
odrv0.axis0.motor.config.requested_current_range = 25 #Requires config save and reboot
odrv0.axis0.motor.config.current_control_bandwidth = 100
odrv0.axis0.motor.config.torque_constant = 8.27 / 10

odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis0.encoder.config.cpr = 162
odrv0.axis0.encoder.config.calib_scan_distance = 150

1 Like

My config has change since I posted the above. Below is my new config.
It is for two wheels and the optical encoder instead of the hall encoders.

odrv0.config.enable_brake_resistor = True # Using included 2ohm resistor #remove enable_
odrv0.axis0.motor.config.calibration_current = 2 # highest integer value where I heard the square wave was 4
odrv0.axis0.motor.config.pole_pairs = 15
odrv0.axis0.motor.config.resistance_calib_max_voltage = 6 # motor config still worked with this set to 6
odrv0.axis0.motor.config.requested_current_range = 35 # 35 was the lowest value that produced and audible square wave.
odrv0.axis0.motor.config.current_control_bandwidth = 100.0
odrv0.axis0.motor.config.torque_constant = 8.27 / 10 # KV 10
odrv0.axis1.motor.config.calibration_current = 2 # highest integer value where I heard the square wave was 4
odrv0.axis1.motor.config.pole_pairs = 15
odrv0.axis1.motor.config.resistance_calib_max_voltage = 6 # motor config still worked with this set to 6
odrv0.axis1.motor.config.requested_current_range = 35 # 35 was the lowest value that produced and audible square wave.
odrv0.axis1.motor.config.current_control_bandwidth = 100.0
odrv0.axis1.motor.config.torque_constant = 8.27 / 10 # KV 10

encoder

odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL
odrv0.axis0.encoder.config.cpr = 3200
odrv0.axis0.encoder.config.bandwidth = 1000
odrv0.axis1.encoder.config.mode = ENCODER_MODE_INCREMENTAL
odrv0.axis1.encoder.config.cpr = 3200
odrv0.axis1.encoder.config.bandwidth = 1000

odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis0.controller.config.pos_gain = 1
odrv0.axis0.controller.config.vel_gain = 0.002 * odrv0.axis0.motor.config.torque_constant * odrv0.axis0.encoder.config.cpr
odrv0.axis0.controller.config.vel_integrator_gain = 0.01 * odrv0.axis0.motor.config.torque_constant * odrv0.axis0.encoder.config.cpr
odrv0.axis0.controller.config.vel_limit = 5
odrv0.axis1.controller.config.input_mode = INPUT_MODE_VEL_RAMP
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis1.controller.config.pos_gain = 1
odrv0.axis1.controller.config.vel_gain = 0.002 * odrv0.axis1.motor.config.torque_constant * odrv0.axis1.encoder.config.cpr
odrv0.axis1.controller.config.vel_integrator_gain = 0.01 * odrv0.axis1.motor.config.torque_constant * odrv0.axis1.encoder.config.cpr
odrv0.axis1.controller.config.vel_limit = 5

BREAK HERE

odrv0.save_configuration()
odrv0.reboot()

odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION

dump_errors(odrv0)

odrv0.axis1.requested_state = AXIS_STATE_MOTOR_CALIBRATION

odrv0.axis0.motor.config.pre_calibrated = True
odrv0.axis1.motor.config.pre_calibrated = True

BREAK HERE

odrv0.save_configuration()
odrv0.reboot()

Encoder

odrv0.axis0.encoder.config.calib_range = 0.05
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
odrv0.axis1.encoder.config.calib_range = 0.05
odrv0.axis1.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION

Movement

odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 0.5
odrv0.axis1.controller.input_vel = 0.5

Your motor should spin here

odrv0.axis0.controller.input_vel = 0
odrv0.axis1.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE
odrv0.axis1.requested_state = AXIS_STATE_IDLE

Hi @andyinyakima, can you confirm the above config works? I have two of these wheels on the way :wink:

Hi abrown,

Yes I can.

I use ASCII protocol and run it in velocity control mode.
I use a Jetson Nano to control the Odrive via optical USB.
Tried hall sensors but smoother with optical encoder. The optical encoder on these motors are not index so each time you power up Odrive you have to calibrate the encoders then I can go forward, reverse, turn, acclerate and stop. 95% of time is glitch free, few times one wheel might not turn in
calibration, I think encoder wires are loose in sensor J4 sometimes.

1 Like

Thanks! Can I ask when you ordered/received your wheels? I placed an order last week but have yet to receive a confirmation / follow up.

I replied to this via email. Did you receive it?

Your solution was blocked!

Anyhow I am glad your wheels are on the way.

Let me know if you have any issues with the config.