Skip to main content

A lightweight library for controlling RC servos on the Raspberry Pi Zero 2 W using hardware PWM via the Linux kernel.

Project description

Raspberry Pi Zero 2 W Servo PWM

A lightweight Python library for controlling RC servos on the Raspberry Pi Zero 2 W using hardware PWM via the Linux kernel.

This library is specifically designed for servo PWM control. The PWM frequency is fixed to 50 Hz by default, and you specify the pulse length in microseconds.

Typical RC servos expect a pulse width between 1000 µs and 2000 µs, where 1500 µs is the center position. Some servo models support a wider range, e.g., 900–2100 µs, but you must verify this in your servo's datasheet or test cautiously. Increase or decrease values gradually; if the servo starts making crackling or buzzing noises, reduce the range. Extended pulse width ranges are usually symmetrical – for example, if you can safely reduce the pulse width by 100 µs, you can usually increase it by a similar amount.

Setup

This library uses the kernel PWM driver provided by Raspberry Pi OS. To enable it, configure the Device Tree Overlay and reboot.

Make sure you are not running any other PWM-related software like pigpio(d) for example.

Enable PWM in /boot/config.txt

Add the following line:

dtoverlay=pwm-2chan

Reboot:

sudo reboot

Verify PWM availability

After reboot, check that the PWM interface is present:

ls /sys/class/pwm/pwmchip0
# Expected output: device  export  npwm  power  subsystem  uevent  unexport

Verify that there are two available channels:

cat /sys/class/pwm/pwmchip0/npwm
# Expected output: 2

Default GPIO mapping

With the default overlay configuration, channels are mapped as follows:

Channel GPIO Pin
0 GPIO 18
1 GPIO 19

Optional: remapping PWM pins

You can remap PWM channels to other supported GPIO pins using overlay parameters. For example, to map channel 1 to GPIO 13:

dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4

Resulting mapping:

Channel GPIO Pin
0 GPIO 18
1 GPIO 13

Verify the mapping:

raspi-gpio get 18
# GPIO 18: level=0 fsel=2 alt=5 func=PWM0

raspi-gpio get 13
# GPIO 13: level=0 fsel=4 alt=0 func=PWM1

Note: Depending on firmware version, multiple dtoverlay=pwm lines may not both load. If you encounter issues, combine pins into a single pwm-2chan line or consider creating a custom overlay.

Goals

This library provides low-level access to Raspberry Pi's hardware PWM interface via sysfs, avoiding high-level wrappers. This enables:

  • Deterministic servo control
  • Low-latency, real-time compatible operation
  • Direct access to kernel PWM without background daemons

Installation

Install via pip:

pip install rpi-servo-pwm

Usage

Example using manual resource management:

from rpi-servo-pwm import HardwarePWM

# Initialize PWM on channel 0 (GPIO 18), using 50 Hz
pwm = HardwarePWM(channel=0, frequency_hz=50)

# Start PWM with initial pulse width
pwm.setup(1500)

# Move servo to a new position
pwm.set_pulse_width(2000)

# Disable and close
pwm.disable()
pwm.close()

Example using a context manager:

from rpi-servo-pwm import HardwarePWM

with HardwarePWM(channel=0) as pwm:
    pwm.setup(1500)
    pwm.set_pulse_width(2000)

Testing

Run unit tests with:

python -m pytest tests

Tests are fully mocked and safe to run without hardware access.

Contributing

Pull requests and issue reports are welcome.

Before contributing:

python -m venv ./venv
source ./venv/bin/activate
pip install -r requirements.txt

Distribution

To build and upload to PyPI:

  1. Update the version in both src/__init__.py and pyproject.toml
  2. Build and publish:
python -m build
python -m twine upload --repository testpypi dist/*
python -m twine upload dist/*

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rpi_servo_pwm-0.1.4.tar.gz (5.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rpi_servo_pwm-0.1.4-py3-none-any.whl (6.2 kB view details)

Uploaded Python 3

File details

Details for the file rpi_servo_pwm-0.1.4.tar.gz.

File metadata

  • Download URL: rpi_servo_pwm-0.1.4.tar.gz
  • Upload date:
  • Size: 5.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.2

File hashes

Hashes for rpi_servo_pwm-0.1.4.tar.gz
Algorithm Hash digest
SHA256 17de2adac1e89d1786ab3a4a2f3566e987da4731ce057a4362f7f7f7a8f5182c
MD5 48437d0145277951466b50849458b676
BLAKE2b-256 f4ff90f647b9c1ec7684cad16ff3796f783396903bdb4b476f1f4d003ba7493c

See more details on using hashes here.

File details

Details for the file rpi_servo_pwm-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: rpi_servo_pwm-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 6.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.2

File hashes

Hashes for rpi_servo_pwm-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 877c43d2a4ceeef38a3b8f3a63c8ca23b97edaaf1ac3d22d9143be5e4ec4dafc
MD5 f6b2e5ea4031739c9d92a82a9626cbf3
BLAKE2b-256 e4cb436853781c2acc09c2377cdc59fff9b593fe5779f0484e624f679f9e7780

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page