Skip to content

StepperUNO Library 1.5


Download the zip file from

StepperUNO Library v1.5.0

Copy the StepperUNO folder in the sketchbook/library directory.


Open the config.h file in the library/stepperUNO folder. Change the KEYPAD_VERSION value as needed. Values should be 0 1 or 2. Use test and trials to find out which options works best for your keypad.

Function list


uint8_t ReadKey()

This function should be called as often as possible. Typically inside the main loop. This will update the Keypad.state variable with one of the defined event below.

#define PRESSED_NONE    0
#define PRESSED_RIGHT   1
#define PRESSED_UP      2
#define PRESSED_DOWN    3
#define PRESSED_LEFT    4

#define RELEASED_NONE   6
#define RELEASED_UP     8
#define RELEASED_DOWN   9
#define RELEASED_LEFT   10

Note this function does not manage the RST button. Use RstReadKey instead.

bool RstReadKey()

Same as above but for the RST button only.

The RST button is a special case. It has its own pin to the arduino mcu.

#define PRESSED_RST       12
#define RELEASED_RST      13
#define LONG_PRESSED_RST  14

On a conventional Arduino UNO these LCD keypad will connect the RST button directly to the reset of the arduino. On the stepperUNO we have rerouted this RST key so that it can be used for something else than reset. This is to explain why the RST key used different functions.

uint8_t state

Event state variable. This is equal to one of the states listed above once an event has occurred. It indicates what buttons have been pressed and released at any given time.

uint8_t rst_state

Same as state but for the RST button only.

void closeEvent()

Must be called once all action have been executed for a given event.

void rst_closeEvent()

Must be called once all action have been executed for a given event on the RST button.

Potentiometer Control

void begin(stepMOTOR *, uint8_t * pot, float min_rpm, float max_rpm)

Initialiser for potentiometer control instance.
stepMOTOR is a pointer to a Motor control instance.
pot is the pin number where the potentiometer is. Usually 3 on stepperUNO v1 and 6 and 7 on v2.
min_rpm minimum speed in rpm when pot is at minimum value (0).
max_rpm maximum speed in rpm when pot is at maximum value (1023).

float check_pot_update_speed()

Function to read potentiometer value with analogRead then update speed if the potentiometer is found to be changed.

returns the new speed in rpm and update the has_changed variable.

uint8_t has_changed

Variable. Is 0 if speed has not changed. 1 otherwise.

uint8_t pot_delta

Smallest change in the potentiometer value to trigger a change. Default is 2. Setting this too small will cause too many change and might have undesired effect.

Motor Control

void begin(uint8_t _address, uint16_t n_step)

Initialiser to be used in Setup section of Arduino.

address parameter is the i2c address of the motor controller. Usually 0x04 or 0x05.

n_step is the number of steps per revolution. This depends on the motor specifications and driver setup. This should be modified accordingly if microstepping is used on the driver.

int32_t get_status()

Get the current status of the motor controller.
0 - Motor stopped
1 - Motor Running
2 - Motor going to position
3 - Accelerating (or decelerating)
4 - Motor accelerating and going to position
5 - Motor accelerating with the aim to change direction.

uint8_t get_version()

Get the version of the motor controller.

void set_speed(uint16_t step_delay)

Set the motor speed.

step_delay is the delay between steps in microseconds.

uint8_t set_speed_rpm(float rpm)

Set the motor speed.

rpm is the rotation speed.

This function will check for minimum speed to avoid a step_delay larger than 65535us.

Returns 0 is successful. 1 otherwise.

void set_direction(bool dir);

Set the direction.

dir is the direction as true or false.

void enable();

Enable the motor driver. Holds torque on the motor.

void disable();

Disable the motor. Allows the motor to spin freely.

void step();

Perform one single step.

Avoid using this in a loop to create motion as it will make more inter-mcu communications than actual motion.

void start();

Start the motor.

void stop()

Stop the motor. Will slow down and stop if acceleration is on.

void brute_stop()

Stop the motor immediately regardless of acceleration state. If acceleration is off this will be no different than stop().

void goto_position(int32_t goto_position)

Move motor to the given position. 'goto_position' is the position in terms of step number.

void set_position(int32_t new_position)

Modify set position. This is similar as setting the tare or homing.

int32_t get_position()

Returns current motor position.

void set_acceleration(int16_t Acc)

Set the acceleration level. Default is 1000step/s/s.

void acceleration_on()

Set acceleration on.

void acceleration_off()

Set acceleration off.

bool running

Boolean variable. Indicates if the motor is running.

bool direction

Boolean variable. Indicates the motor direction.

The assignment of True/False to clockwise and anticlockwise will depend on the wiring of the stepper motor. Adapt the code according to observed behaviour.

float min_rpm

Returns the smallest rpm that can be used. Calculated when begin() is called.

float rpm

Current speed in rpm. This is only valid if the set_speed_rpm function is used.

uint16_t step_delay

Step delay currently used. This is updated when calling set_speed() and set_speed_rpm().

Note this is not the instant step_delay as computed by acceleration. This is only the step delay for the target speed.

bool acceleration

If equals to true then acceleration is enabled. Disabled if false.

Usage Example

The installation package contains a set of examples. We are showing the most basic example below.

More examples are in the zip file of the library itself.

// simpledrive v1.3
// Example usage of stepperUNO library
// drive a single motor with left/right button

// library: stepperUNO_v1.4

#define Pot 3 // Potentiometer is on pin 3

#include <LiquidCrystal.h>
#include <stepperUNO.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
keypad Keypad;
stepMOTOR motor1;

const int Nstep = 200; // Enter here the number of step/rev for your motor

void setup() {

  motor1.begin(0x4, Nstep); // Motor 1 is at address 0x5. Motor 2 on 0x4

  lcd.begin(16, 2); //LCD INITIALISATION
  lcd.setCursor(0, 0);

void loop() {

  int POTval = analogRead(Pot);
  int rpm = map(POTval, 0, 1023, 5, 500); // Speed range from 5 to 500rpm


  if (Keypad.state == PRESSED_RIGHT) {
    lcd.setCursor(0, 0);
    Keypad.closeEvent(); // Must be here to indicate we are done with the event
  else if (Keypad.state == PRESSED_LEFT) {
    lcd.setCursor(0, 0);
    lcd.print("LEFT ");

  else if ( Keypad.state == RELEASED_RIGHT ) {
    lcd.setCursor(0, 0);
  else if ( Keypad.state == RELEASED_LEFT ) {
    lcd.setCursor(0, 0);

}//end loop

Version history


  • Added support for potentiometer
  • Now using new attiny firmware to support version and state queries.


  • Fixed bug where 'running' variable was not updating when using brute_stop.
  • Added #define stepperUNO_1_4_1 for future library version control.
  • Acceleration value was wrongly set as int16_t. Now using uint16_t.
  • Added file.


  • For use with motor controller flashed with attiny_stepperUNO_v1.2