Norse Polytheistic Mythology


    1.1.0 • Public • Published

    Adafruit I2C PWM Driver


    Node.js driver implementation for a PWM i2c device (PCA9685) present in these products:

    This project is a fork from this project that is a fork from this project (original, unmaintained).
    This bring the following to the original project:

    • maintains promise chains
    • major code cleanup and refactoring to use ES6 syntax
    • improved debugging options
    • unit tests
    • capability to compile on non Unix systems

    Try out this project with my PWM Controller App.


    Before installing the driver on a Raspberry Pi you need to enable i2c.
    Follow these steps to enable it while ignoring the Python related instructions: you do not need to install libi2c-dev and python-smbus (first and last set of instructions).

    Install the driver with this command:

    npm i adafruit-i2c-pwm-driver-async

    The driver requires a i2c binding to run but the binding is kept apart from the project dependencies in order to support compilation on non Unix systems. Install the i2c binding dependency on a Raspberry Pi with this command:


    Reminder: running this command will fail on non Unix systems. If you wish to develop on a non Unix system, use the isMockDriver flag (see documentation).


    const { PwmDriver, sleep } = require('adafruit-i2c-pwm-driver-async');
    // Configure driver
    const pwm = new PwmDriver({
      address: 0x40,
      device: '/dev/i2c-1',
      debug: true,
      isMockDriver: true // Remove this if running on a Raspberry Pi
    // Configure min and max servo pulse lengths
    const servoMin = 150; // Min pulse length out of 4096
    const servoMax = 600; // Max pulse length out of 4096
    const loop = () => {
      return sleep(1)
        .then(pwm.setPWM(0, 0, servoMin))
        .then(pwm.setPWM(0, 0, servoMax))
    // Initialize driver and loop

    To configure I2c on your Raspberry-pi / Beaglebone please see here

    You can find a simple example here


    PwmDriver({address:Number, device:String, debug:Bool, i2cDebug:Bool, isMockDriver:Bool})

    Setting up a new PwmDriver

    • address: Address of the i2c panel (defaults to 0x40)
    • device: Device name (defaults to /dev/i2c-1)
    • debug: Flag used to display high level debug messages (defaults to false)
    • i2cDebug: Flag used to display low level i2c signals (defaults to false)
    • isMockDriver: Whether to use the real i2c binding or not (defaults to false). This is usefull for compiling on non Unix systems that don't support i2c.


    Initialize the PwmDriver. Only required once after PwmDriver constructor is called. Returns a Promise.


    Set the PWM frequency to the provided value (in hertz). Returns a Promise.

    pwmDriver.setPWM(channel:Number, on:Number, off:Number)

    Sets a single PWM channel. Returns a Promise.

    pwmDriver.setALLPWM(channel:Number, on:Number, off:Number)

    Sets all PWM channels. Returns a Promise.


    Stops PWM signals. Returns a Promise.



    Based on the Adafruit's Raspberry-Pi Python Code Library

    Here is a growing collection of libraries and example python scripts for controlling a variety of Adafruit electronics with a Raspberry Pi

    In progress!

    Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

    Written by Limor Fried, Kevin Townsend and Mikey Sklar for Adafruit Industries. BSD license, all text above must be included in any redistribution

    To download, we suggest logging into your Pi with Internet accessibility and typing: git clone


    npm i adafruit-i2c-pwm-driver-async

    DownloadsWeekly Downloads






    Unpacked Size

    31.1 kB

    Total Files


    Last publish


    • pozil