Analog Input
Overview
Analog inputs can be used to measure voltages between 0 and 3.3V, and optionally map to position, velocity, or torque setpoints (or any other ODrive endpoint).
ODrive uses a 12 bit ADC (4096 steps) and so has a maximum resolution of 0.8 mV.
Look for analog input in the pinout (Pro, S1) to see which GPIO pins support analog inputs.
Given a analog-capable GPIO pin Gxx (here, N will be used to notate the GPIO pin number), the pin can be configured in analog mode with <odrv>.config.gpioN_mode = GpioMode.ANALOG_IN
.
All GPIO mode changes require a <odrv>.save_configuration()
before taking effect.
Once configured, the voltage on Gxx can be read using <odrv>.get_adc_voltage(N)
.
Endpoint Mapping
Analog inputs can also be used to feed any of the numerical properties that are visible in odrivetool
or the Web GUI .
This is done by configuring the endpoint mapping for the analog Gxx pin in question: <odrv>.config.gpio(N)_analog_mapping
.
Every time the analog value is read, the voltage width will be remapped from 0 - 3.3V to a range defined by <odrv>.config.gpio(N)_analog_mapping.min
to <odrv>.config.gpio(N)_analog_mapping.max
.
The mapped value will then be written to the endpoint defined by <odrv>.config.gpio(N)_analog_mapping.endpoint
. This can be any writable value on the ODrive, not just pos/vel/torque setpoints.
Typically, the name of this endpoint will be the property name with a leading underscore, and followed by _property
.
For instance, if you want to map to <odrv>.axis0.controller.input_torque
, the property name will be <odrv>.axis0.controller._input_torque_property
.
As another example, the name of <odrv>.axis0.config.motor.current_soft_max
would be <odrv>.axis0.config.motor._current_soft_max_property
.
This mapping can be disabled by setting <odrv>.config.gpio(N)_analog_mapping
to None
.
Note
Changes to the endpoint mapping will be ignored after a reboot unless you run <odrv>.save_configuration()
.
Velocity Control Example
As an example, we’ll configure the axis with a velocity setpoint from 0 to 5 turn/s, controlled by the analog input voltage. This assumes your ODrive is connected to ODrivetool as odrv0
. In the GUI, this can be set up graphically in the configurator, so this guide is only relevant for when using ODrivetool.
Make sure you’re able to control the axis0 velocity by writing to
odrv0.axis0.controller.input_vel
, and that the velocity controller is properly tund. If you need help with this follow the getting started guide.If you want to control your ODrive with the analog input without using anything else to activate the ODrive, you can configure the ODrive such that it automatically enters closed loop at startup. See here for more information.
Select an analog-capable pin (see the Pro, S1 pinout pages for details).
In
odrivetool
, configure the analog input mapping, where N is the GPIO pin number selected (e.g. if pin G15 on ODrive Pro is used for analog input,gpio(N)
would be replaced withgpio15
)odrv0.config.gpio(N)_mode = GpioMode.ANALOG_IN odrv0.config.gpio(N)_analog_mapping.min = 0 odrv0.config.gpio(N)_analog_mapping.max = 5 odrv0.config.gpio(N)_analog_mapping.endpoint = odrv0.axis0.controller._input_vel_property
Note
you can disable the input by setting
odrv0.config.gpio(N)_analog_mapping.endpoint = None
Save the configuration and reboot
Now, once the ODrive is powered and running in closed loop control (whether manually commanded in the GUI/ODrivetool or set to enter closed loop control on startup), the velocity setpoint will be set by the analog input.