StepperUNO Library 1.4: Difference between revisions
Line 104: | Line 104: | ||
''address'' parameter is the i2c address of the motor controller. Usually 0x04 or 0x05. | ''address'' parameter is the i2c address of the motor controller. Usually 0x04 or 0x05. | ||
''n_step'' is the number of steps per revolution the motor | ''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 by the driver. | ||
===void goto_position(int32_t goto_position)=== | ===void goto_position(int32_t goto_position)=== |
Revision as of 19:34, 27 January 2022
Installation
Download the zip file from Stepper_UNO_v1.0#Files.
Copy the StepperUNO folder in the sketchbook/library directory.
Download
Configuration
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
Keypad
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 PRESSED_SELECT 5 #define RELEASED_NONE 6 #define RELEASED_RIGHT 7 #define RELEASED_UP 8 #define RELEASED_DOWN 9 #define RELEASED_LEFT 10 #define RELEASED_SELECT 11
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 #define LONG_RELEASED_RST 15
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.
Motor Control
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 setDirection(bool dir);
Set the direction.
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 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 by the driver.
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.
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().
bool acceleration
Returns true if acceleration is enabled. false otherwise.
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
// lechacal.com
// 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
motor1.enable();
lcd.begin(16, 2); //LCD INITIALISATION
lcd.setCursor(0, 0);
lcd.print("READY");
}
void loop() {
int POTval = analogRead(Pot);
int rpm = map(POTval, 0, 1023, 5, 500); // Speed range from 5 to 500rpm
Keypad.ReadKey();
if (Keypad.state == PRESSED_RIGHT) {
motor1.set_direction(true);
motor1.set_speed_rpm(rpm);
motor1.start();
lcd.setCursor(0, 0);
lcd.print("RIGHT");
Keypad.closeEvent(); // Must be here to indicate we are done with the event
}
else if (Keypad.state == PRESSED_LEFT) {
motor1.set_direction(false);
motor1.set_speed_rpm(rpm);
motor1.start();
lcd.setCursor(0, 0);
lcd.print("LEFT ");
Keypad.closeEvent();
}
else if ( Keypad.state == RELEASED_RIGHT ) {
motor1.stop();
lcd.setCursor(0, 0);
lcd.print("READY");
Keypad.closeEvent();
}
else if ( Keypad.state == RELEASED_LEFT ) {
motor1.stop();
lcd.setCursor(0, 0);
lcd.print("READY");
Keypad.closeEvent();
}
}//end loop