Configure a motor with an encoder
Use an encoder with a motor to create a closed feedback loop for better control of your robot. Instead of sending speed or position commands without a way to verify the motor’s behavior, the encoder lets the computer know how the motor is actually rotating in the real world, so adjustments can be made to achieve the desired motor movement.
Some motors come with encoders integrated with or attached to them. You can also add an encoder to a motor. See the encoder component documentation for more information on encoders.
Viam supports gpio
model motors with encoders.
To configure an encoded motor, you must configure the encoder per the encoder documentation and then configure a gpio
motor with an encoder
attribute in addition to the standard gpio
model attributes.
Here’s an example configuration:
{
"components": [
{
"name": "<your-board-name>",
"type": "board",
"model": "<your-board-model>",
"attributes": {},
"depends_on": []
},
{
"name": "<your-encoder-name>",
"type": "encoder",
"model": "<your-encoder-model>",
"attributes": {
... // insert encoder model specific attributes
},
"depends_on": []
},
{
"name": "<your-motor-name>",
"type": "motor",
"model": "gpio",
"attributes": {
"board": "<your-board-name>",
"pins": {
<...> // insert pins struct
},
"encoder": "<your-encoder-name>",
"ticks_per_rotation": <#>
},
"depends_on": []
}
]
}
Here’s an example configuration:
{
"components": [
{
"name": "local",
"type": "board",
"model": "pi",
"attributes": {},
"depends_on": []
},
{
"name": "myEncoder",
"type": "encoder",
"model": "incremental",
"attributes": {
"board": "local",
"pins": {
"a": "13",
"b": "15"
}
},
"depends_on": []
},
{
"name": "myMotor1",
"type": "motor",
"model": "gpio",
"attributes": {
"board": "local",
"pins": {
"pwm": "16",
"dir": "18"
},
"encoder": "myEncoder",
"ticks_per_rotation": 9600
},
"depends_on": []
}
]
}
In addition to the attributes for a non-encoded motor, the following attributes are available for encoded DC motors:
Name | Type | Inclusion | Description |
---|---|---|---|
encoder | string | Required | name of the encoder. |
ticks_per_rotation | int | Required | Number of ticks in a full rotation of the encoder and motor shaft. |
ramp_rate | float | Optional | Rate to increase the motor’s input voltage (power supply) per second when increasing the speed the motor rotates (RPM). Range = ( 0.0 , 1.0 ]Default: 0.2 |
Info
The attribute max_rpm
is not required or available for encoded gpio
motors.
Important
If encoder
is model AM5-AS5048
,ticks_per_rotation
must be 1
, as AM5-AS5048
is an absolute encoder which provides angular measurements directly.
Wiring Example
Here’s an example of an encoded DC motor wired with the MAX14870 Single Brushed DC Motor Driver Carrier. This wiring example corresponds to the example config above.
Test the motor
Once your motor is configured and connected, go to the Control tab and click on the motor’s drop-down panel. Use the buttons to try turning your motor forwards or backwards at different power levels and check whether it moves as expected.
If the motor does not appear on the Control tab, or if you notice unexpected behavior, check your robot’s Logs tab for errors, and review the configuration.
Have questions, or want to meet other people working on robots? Join our Community Discord.
Was this page helpful?
Glad to hear it! If you have any other feedback please let us know:
We're sorry about that. To help us improve, please tell us what we can do better:
Thank you!