diff --git a/darkwater/DW640.cpp b/darkwater/DW640.cpp index e9052c4..9e8a670 100644 --- a/darkwater/DW640.cpp +++ b/darkwater/DW640.cpp @@ -29,6 +29,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "DW640.h" +#if (MICROSTEPS == 8) +uint8_t microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255}; +#elif (MICROSTEPS == 16) +uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255}; +#endif + /** PCA9685 constructor. * @param address I2C address * @see DW640_DEFAULT_ADDRESS @@ -276,6 +282,50 @@ DW_Servo *DW640::getServo(uint8_t servo) { } +DW_Stepper *DW640::getStepper(uint16_t steps, uint8_t stepper) { + + num--; + + uint8_t ain1, ain2, bin1, bin2; + + // Get the stepper + switch(stepper) { + case 0: + ain1 = 2; + ain2 = 3; + bin1 = 4; + bin2 = 5; + break; + case 1: + ain1 = 6; + ain2 = 7; + bin1 = 8; + bin2 = 9; + break; + case 2: + ain1 = 10; + ain2 = 11; + bin1 = 12; + bin2 = 13; + break; + default: + fprintf(stderr, "Stepper number must be between 1 and 3 inclusive"); + } + + if (steppers[stepper].stepper == 0) { + // not init'd yet! + steppers[stepper].stepper = stepper; + steppers[stepper].revsteps = steps; + steppers[stepper].MC = this; + + steppers[stepper].AIN1pin = ain1; + steppers[stepper].AIN2pin = ain2; + steppers[stepper].BIN1pin = bin1; + steppers[stepper].BIN2pin = bin2; + } + return &steppers[stepper]; +} + /* Motors code */ DW_Motor::DW_Motor(void) { diff --git a/darkwater/DW640.h b/darkwater/DW640.h index b7c62ca..c67e537 100644 --- a/darkwater/DW640.h +++ b/darkwater/DW640.h @@ -57,6 +57,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define DW_ININ 0 #define DW_PHASE 1 +#define MICROSTEPS 16 // 8 or 16 + using namespace DarkWater; class DW640; @@ -95,6 +97,27 @@ class DW_Servo { }; +class DW_Stepper { + public: + DW_Stepper(void); + friend class DW640; + + void off(void); + void setMotorSpeed(uint16_t speed); + uint8_t onestep(uint8_t dir, uint8_t style); + void step(uint16_t steps, uint8_t dir, uint8_t style = DW_SINGLE); + uint32_t usperstep; + + private: + uint8_t AIN1pin, AIN2pin; + uint8_t BIN1pin, BIN2pin; + uint16_t revsteps; // # steps per revolution + uint8_t currentstep; + uint8_t stepper; + DW640 *DWC; + +}; + class DW640 { public: DW640(uint8_t address = DW640_DEFAULT_ADDRESS); @@ -124,7 +147,8 @@ class DW640 { void allOff(); DW_Motor *getMotor(uint8_t motor); - DW_Servo *getServo(uint8_t servo); + DW_Servo *getServo(uint8_t servo); + DW_Stepper *getStepper(uint16_t steps, uint8_t stepper); // void setStepperOff(uint8_t stepper); // void setStepperSpeed(uint8_t stepper, uint16_t speed); @@ -140,17 +164,8 @@ class DW640 { DW_Motor motors[6]; DW_Servo servos[2]; - - uint16_t revsteps; // # steps per revolution - uint8_t currentstep; - - - + DW_Stepper steppers[3]; }; -// class DW_Stepper { - -// } - #endif // DW640_H \ No newline at end of file