This is an I2C to stepper motor controller featuring standard modules, current limiting and micro stepping. Ideal because only an I2C interface is required. Suitable for art installation, animatronics, mechanical furniture and the like.

It can be supplied as a kit or ready built.


This is the complete kit of parts that can be soldered into place. Important the capacitors need to go the correct way round with the long lead going to the left hand side. Connectors may be supplied with different colours.

This is the assembled device without the motor controllers in place.


Arduino Library

*** Pull up resistors will be required if used with the UNO or Nano ***

Please not that this is intended as a staring point, it is not intended as a full blown library. I has also only been tested on the UNO

(see example for constructor, default i2c address is 0x29)

Applies to all Motors

        void en(uint8_t on); // global enable 1=enable 0 = disable
        uint8_t status(void); // returns status
        void mreset(void); // resets motor
        void all(uint8_t xH,uint8_t xL,uint8_t yH,uint8_t yL,uint8_t zH,uint8_t zL); // sets all at once

Applies to specific motor = 10 = X, 20 = Y, 30 = X

        void ru(uint8_t motor, uint8_t value); // set ramp up
        void rd(uint8_t motor, uint8_t value); // set ramp down
        void sps(uint8_t motor, uint16_t value); // set steps per second
        void steps(uint8_t motor, uint16_t value); // set number of steps to step
        void dir(uint8_t motor, uint8_t value); // set direction
        void steps(uint8_t motor, uint16_t steps, uint8_t direction); // sets steps and direction in one command
        uint16_t togo(uint8_t motor); // returns number of steps to go


        void EEreset(); // reset default eeprom values
        void change_i2c(uint8_t new_address); // changes i2c address
        void EEwrite(uint8_t adr, uint8_t value); // write to eeprom
        uint8_t EEread(uint8_t adr); // read from eeprom
        uint16_t ID(); // return device id
        void Version(uint8_t *b); // return firmware version 3 bytes
        void reset(void); // global reset

RPi and ESP8266 Libraries

Both of these are very similar because they use either Python of MicroPython. Currently Python version 3 is used.

See the individual classes for the names of the functions, there are not that many and reasonably straightforward.


The device can work on 3.3 or 5V logic and so is compatible with both voltages. However because it is I2C providing the pull up resistors go to (match) the host voltage then it does not matter which voltage is used.


Released 21 March 2018