I had a little bit of trouble of piece together enough information to get this running, so hopefully this will help others. The key document you need is at https://www.dfrobot.com/wiki/index.php/Stepper_Motor_Shield_For_Arduino(DRV8825)_SKU:DRI0023
Connect the stepper wires and power supply to your shield:
- 2B Blue
- 2A Red
- 1A Black
- 1B Grenn
The provided example sketch worked for me, but is not too instructive. We will need to control speed and rotation as well as release the stepper motors when not in use to save power.
I found an modified an example from http://bildr.org/2011/06/easydriver/ which has helper functions. It only drives one stepper at a time, but will give you confidence we are on the right track. We will write some more sophisticated code later.
//////////////////////////////////////////////////////////////////
//©2011 bildr
//Released under the MIT License – Please reuse change and share
//Using the easy stepper with your arduino
//use rotate and/or rotateDeg to controll stepper motor
//speed is any number from .01 -> 1 with 1 being fastest –
//Slower Speed == Stronger movement
//http://bildr.org/2011/06/easydriver/
/*
MS1 MS2 MS3
LOW LOW LOW FULL
HI LOW LOW HALF
LOW HI LOW QUARTER
HI HI LOW EIGHT <----
HI HI HI SIXTEENTH
1/8 Step = 1600 steps per revolution
FIT0278 Hybrid stepper 1.8 deg/step
2B Blue
2A Red
1A Black
1B Green
*/
/////////////////////////////////////////////////////////////////
// Drives M1 only, use DIR_PIN 4 and STEP_PIN 5 for M2
#define DIR_PIN 7
#define STEP_PIN 6
void setup() {
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
}
void loop(){
//rotate a specific number of degrees
rotateDeg(360, 1);
delay(1000);
rotateDeg(-360, .1); //reverse
delay(1000);
//rotate a specific number of microsteps (8 microsteps per step)
//a 200 step stepper would take 1600 micro steps for one full revolution
rotate(1600, .5);
delay(1000);
rotate(-1600, .25); //reverse
delay(1000);
}
void rotate(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) – (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest – Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN, dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest – Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN, dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.