Skip to main content

MotorLib: A configurable library for 12V DC Motors

Author: Tiernan Lindauer

MotorLib is for use with any microcontroller/computer that has GPIO, like the popular Raspberry Pi or Arduino boards. It also requires the use of a PWM motor controller, with examples provided below. Examples have been provided on how to use this library are provided in the MotorTest.py and PlotPID.py files. MotorTest.py is also reproduced below:

import math
from time import time

from pymotorlib import Motor, MotorType, RunMode
from pymotorlib.PWMDriver import GoBildaControl

# Time to run the motor, in seconds
RUN_TIME = 10

# Number of periods
N_PERIODS = 2

# Define pwm and encoder pins
pwm = 12
encoder = (11, 12)

# Establish a motor object for a gobilda 312 RPM motor, with the specified pwm and encoder ports and position type control
my_motor = Motor(MotorType.GOBILDA_312, pwm, *encoder, GoBildaControl, RunMode.POSITION_CONTROL)

# Set PID for the motor
my_motor.set_pid_coefficients(kP=0.001)

# Target position function to follow - sin wave of N_PERIODS over RUN_TIME length
target = lambda t: my_motor.type.TICKS_PER_REV * math.sin(N_PERIODS * math.pi * t / (RUN_TIME / 2))

before = time()
current = 0
while current < RUN_TIME:
    my_motor.set_target(target(current))
    my_motor.update_pid()
    current = time() - before

my_motor.stop()

As you can see, it is relatively easy to get your motor up and running with this library. Here are the different config options available:

Motor Configuration

Motor type (What motor you're running):

ORIBITAL_20, GOBILDA_312 - you can add more by creating a class that has a static TICKS_PER_REV variable

Example:

class NEW_MOTOR:
    TICKS_PER_REV = 500  # Use your own value here for the amount of encoder ticks for each revolution
Set the GPIO pins:

The PWM channel should be set to the pin the PWM wire is connected to. The encoder pins should correspond first to channel A, second to channel B.

RunMode (how to use the motor):

POSITION_CONTROL - go to a position using PID, VELOCITY_CONTROL - go to a velocity using PID, RAW_POWER - do not use PID, instead just set the power manually

Using a custom motor controller:

By default, it is assumed you are using the GoBilda Motor Controller. There is also support for the REV Robotics Spark Mini. The example uses GoBildaControl, however if you switch that to SparkMini you can run the motor off the Spark Mini as well.

To use your own custom PWM controller, set a class up as follows:

class NewController(PWMDriver):
    MIN_PULSE = 300  # Set this to whatever your controller's min pulse width is
    MAX_PULSE = 2300  # Set this to whatever your controller's max pulse width is  
    half_width = (MAX_PULSE - MIN_PULSE) / 2

    @staticmethod
    def make_pulse(power):
        return (power * NewController.half_width) + NewController.MIN_PULSE + NewController.half_width

MIN_PULSE should be equivalent to a power of -1. MAX_PULSE should equate to a power of 1.

Bugs/Issues

To report an issue or bug in the code, please start one here on GitHub!

T. Lindauer

Release files for pymotorlib 0.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pymotorlib 0.6
File Size Uploaded
pymotorlib-0.6.tar.gz 8.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pymotorlib 0.6
File Interpreter ABI Platform
pymotorlib-0.6-py3-none-any.whl Python 3 none any Details

Total release size:16.2 kB

Release files / pymotorlib-0.6.tar.gz

Download URL pymotorlib-0.6.tar.gz
Size 8.1 kB
Tags Source
SHA-256 checksum
How to use checksums
728b2713ad09b29501d32f8ef1ff07594213a17da689b654e60adfe3b8b4b8bd
BLAKE2b-256 checksum
How to use checksums
2803a6cf23917b7f8007155c153827d876e86e7cfa277a65cae2035b59fb5d37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.8

Release files / pymotorlib-0.6-py3-none-any.whl

Download URL pymotorlib-0.6-py3-none-any.whl
Size 8.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8a3d9b6c1d17484c75fb58b40669abd0fb9e6a8024714bfa1eeef379265906d6
BLAKE2b-256 checksum
How to use checksums
e0f68bd27193c7500cbf0bfa7b9258262bc01dcc3dd44e96457c5a2c84a2dbc8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.8

Release history Release notifications | RSS feed

This release

0.6 This release

2 release files

0.5

2 release files

0.4

2 release files

0.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page