From 536de53075715cad6027890f68a0bc292cfb6f8d Mon Sep 17 00:00:00 2001 From: Gregg Date: Fri, 9 Jun 2023 23:11:38 -0500 Subject: [PATCH] Added Stepper_TB6612 and Stepper_A3967 directly to HomeSpan HomeSpan now includes both drivers as part of the "extras" functionality. The StepperMotorControl Window Shade Example has been updated accordingly to use the built-in TB6612 driver. --- .../StepperMotorControl.ino | 21 +- src/extras/Stepper_A3967.h | 30 +++ src/extras/Stepper_TB6612.h | 30 +++ src/src/extras/StepperControl.cpp | 12 +- src/src/extras/StepperControl.h | 2 +- .../src/extras/Stepper_A3967.h | 116 +++++----- src/src/extras/Stepper_TB6612.h | 181 +++++++++++++++ src/src/extras/extras.ino | 214 ++---------------- 8 files changed, 333 insertions(+), 273 deletions(-) create mode 100644 src/extras/Stepper_A3967.h create mode 100644 src/extras/Stepper_TB6612.h rename examples/Other Examples/StepperMotorControl/Stepper_TB6612.h => src/src/extras/Stepper_A3967.h (51%) create mode 100644 src/src/extras/Stepper_TB6612.h diff --git a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino index 3745239..e66ea5f 100644 --- a/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino +++ b/examples/Other Examples/StepperMotorControl/StepperMotorControl.ino @@ -26,24 +26,19 @@ ********************************************************************************/ // This example demonstrates how to control a real-world Stepper Motor using HomeSpan's -// StepperControl Class. Note the StepperControl Class serves as a generic interface -// and cannot be instantiatiated directly. Rather, you must create a child class derived -// from StepperClass that implements the details of a specific Stepper Motor Driver Board. +// generic StepperControl Class. -// In this example we will implement a child class of StepperControl designed to operate -// the Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board using only the 4 control -// pins AIN1, AIN2, BIN1, and BIN2 (https://www.adafruit.com/product/2448) +// For this sketch we will use an implementation of StepperControl designed to operate an +// Adafruit TB6612 1.2A DC/Stepper Motor Driver Breakout Board (https://www.adafruit.com/product/2448) +// using only its 4 control pins: AIN1, AIN2, BIN1, and BIN2 -// The implementation of this class is found in the file "Stepper_TB6612.h" included -// with this sketch. By separating the details of the Stepper Motor Driver Board from the -// HomeSpan logic below, you can easily change the code that operates the Stepper Motor Driver Board -// without very little modification to the HomeSpan sketch itself. +// See HomeSpan's StepperControl documentation for a list of built-in driver boards, as well as for +// detailed instructions on how you can easily use StepperControl to implement a custom driver for any board. -// Note this sketch is based on the WindowShade Accessory from Example 13. Please review -// that Example first if new to HomeSpan since it is fully commented. +// Note this example is based on the fully-commented WindowShade Accessory sketch from Tutorial Example 13. #include "HomeSpan.h" -#include "Stepper_TB6612.h" // Here we include the implementation of thge Adafruit TB6612 Stepper Motor Driver Board +#include "extras/Stepper_TB6612.h" // this contains HomeSpan's StepperControl Class for the Adafruit TB6612 Driver Board //////////////////////////////////// diff --git a/src/extras/Stepper_A3967.h b/src/extras/Stepper_A3967.h new file mode 100644 index 0000000..a5fb2b0 --- /dev/null +++ b/src/extras/Stepper_A3967.h @@ -0,0 +1,30 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2020-2022 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ********************************************************************************/ + +#pragma once + +#include "../src/extras/Stepper_A3967.h" diff --git a/src/extras/Stepper_TB6612.h b/src/extras/Stepper_TB6612.h new file mode 100644 index 0000000..14365d9 --- /dev/null +++ b/src/extras/Stepper_TB6612.h @@ -0,0 +1,30 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2020-2022 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ********************************************************************************/ + +#pragma once + +#include "../src/extras/Stepper_TB6612.h" diff --git a/src/src/extras/StepperControl.cpp b/src/src/extras/StepperControl.cpp index a6e3224..d5aac4e 100644 --- a/src/src/extras/StepperControl.cpp +++ b/src/src/extras/StepperControl.cpp @@ -25,7 +25,7 @@ * ********************************************************************************/ - #include "StepperControl.h" +#include "StepperControl.h" ////////////////////////// @@ -40,12 +40,12 @@ StepperControl::StepperControl(uint32_t priority, uint32_t cpu){ void StepperControl::setAccel(float accelSize, float accelSteps){ if(accelSize<0.0){ - ESP_LOGE(TAG,"accelSize cannot be less than 0.0"); + ESP_LOGE(STEPPER_TAG,"accelSize cannot be less than 0.0"); return; } if(accelSteps<1.0){ - ESP_LOGE(TAG,"accelSteps cannot be less than 1.0"); + ESP_LOGE(STEPPER_TAG,"accelSteps cannot be less than 1.0"); return; } @@ -57,7 +57,7 @@ void StepperControl::setAccel(float accelSize, float accelSteps){ void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ if(msDelay==0){ - ESP_LOGE(TAG,"msDelay must be greater than zero"); + ESP_LOGE(STEPPER_TAG,"msDelay must be greater than zero"); return; } @@ -71,7 +71,7 @@ void StepperControl::move(int nSteps, uint32_t msDelay, endAction_t endAction){ void StepperControl::moveTo(int nPosition, uint32_t msDelay, endAction_t endAction){ if(msDelay==0){ - ESP_LOGE(TAG,"msDelay must be greater than zero"); + ESP_LOGE(STEPPER_TAG,"msDelay must be greater than zero"); return; } @@ -143,7 +143,7 @@ void StepperControl::motorTask(void *args){ if(downLinkData.stepsRemaining!=0) msDelay+=msDelay * motor->accelSize * (exp(-fabs(upLinkData.nSteps-downLinkData.stepsRemaining)/motor->accelSteps) + exp(-(fabs(downLinkData.stepsRemaining)-1.0)/motor->accelSteps)); - ESP_LOGD(TAG,"Position: %d Steps Remaining: %d Delay=%d ms",downLinkData.position,downLinkData.stepsRemaining,(int)(msDelay)); + ESP_LOGD(STEPPER_TAG,"Position: %d Steps Remaining: %d Delay=%d ms",downLinkData.position,downLinkData.stepsRemaining,(int)(msDelay)); int dStep=0; diff --git a/src/src/extras/StepperControl.h b/src/src/extras/StepperControl.h index 23bb415..2c63266 100644 --- a/src/src/extras/StepperControl.h +++ b/src/src/extras/StepperControl.h @@ -29,7 +29,7 @@ #include -[[maybe_unused]] static const char* TAG = "StepperControl"; +[[maybe_unused]] static const char* STEPPER_TAG = "StepperControl"; ////////////////////////// diff --git a/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h b/src/src/extras/Stepper_A3967.h similarity index 51% rename from examples/Other Examples/StepperMotorControl/Stepper_TB6612.h rename to src/src/extras/Stepper_A3967.h index 25f097c..1279e97 100644 --- a/examples/Other Examples/StepperMotorControl/Stepper_TB6612.h +++ b/src/src/extras/Stepper_A3967.h @@ -3,7 +3,7 @@ * * Copyright (c) 2023 Gregg E. Berman * - * https://github.com/HomeSpan/HomeSpan + * https://github.com/HomeSpan/HomeStep * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,89 +24,93 @@ * SOFTWARE. * ********************************************************************************/ + +// Implementation of StepperControl for a Sparkfun A3967 EasyDriver Stepper Motor Driver +// Breakout Board (https://www.sparkfun.com/products/12779) + +// This implementation uses the driver board's MS1, MS2, STEP, DIR, and ENABLE pins. +// Separate PWM pins on the ESP32 are NOT needed since the driver board contains its own +// waveform generation. Supported modes include FULL_STEP (double-phase only), HALF_STEP, +// QUARTER_STEP, and EIGHTH_STEP. + +// The motor outputs can be enabled (current running through the coils) or +// disabled (no current / high impedence). The EasyDriver board does NOT support +// the short brake mode. + +#pragma once + +#include "StepperControl.h" + +////////////////////////// - #include "extras/StepperControl.h" +struct Stepper_A3967 : StepperControl { + + int m1Pin; + int m2Pin; + int stepPin; + int dirPin; + int enablePin; ////////////////////////// -struct Stepper_TB6612 : StepperControl { + Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin) : StepperControl(){ + this->m1Pin=m1Pin; + this->m2Pin=m2Pin; + this->stepPin=stepPin; + this->dirPin=dirPin; + this->enablePin=enablePin; - int pins[4]; - uint8_t phase; - uint8_t nPhases; - uint32_t runCode; - -////////////////////////// - - Stepper_TB6612(int a1Pin, int a2Pin, int b1Pin, int b2Pin) : StepperControl(){ - pins[3]=a1Pin; - pins[2]=a2Pin; - pins[1]=b1Pin; - pins[0]=b2Pin; - - for(int i=0;i<4;i++) - pinMode(pins[i],OUTPUT); + pinMode(m1Pin,OUTPUT); + pinMode(m2Pin,OUTPUT); + pinMode(stepPin,OUTPUT); + pinMode(dirPin,OUTPUT); + pinMode(enablePin,OUTPUT); setStepType(FULL_STEP_TWO_PHASE); } +////////////////////////// + + void onStep(boolean direction){ + digitalWrite(dirPin,direction); + digitalWrite(stepPin,HIGH); + digitalWrite(stepPin,LOW); + } + ////////////////////////// void onEnable() override { - setPinCode((runCode>>(phase*4)) & 0xF); + digitalWrite(enablePin,0); } ////////////////////////// void onDisable() override { - setPinCode(0); - } - -////////////////////////// - - void onBrake() override { - setPinCode(0xF); - } - -////////////////////////// - - void onStep(boolean direction){ - if(direction) - phase=(phase+1)%nPhases; - else - phase=(phase+nPhases-1)%nPhases; - - setPinCode((runCode>>(phase*4)) & 0xF); - } - -////////////////////////// - - void setPinCode(uint8_t pinCode){ - for(int i=0;i<4;i++) - digitalWrite(pins[i],(pinCode>>i)&1); + digitalWrite(enablePin,1); } ////////////////////////// void setStepType(int mode) override { switch(mode){ - case FULL_STEP_ONE_PHASE: - phase=0; - nPhases=4; - runCode=0x2418; - break; case FULL_STEP_TWO_PHASE: - phase=0; - nPhases=4; - runCode=0x659A; + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,LOW); break; case HALF_STEP: - phase=0; - nPhases=8; - runCode=0x2645198A; + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,LOW); + break; + case QUARTER_STEP: + digitalWrite(m1Pin,LOW); + digitalWrite(m2Pin,HIGH); + break; + case EIGHTH_STEP: + digitalWrite(m1Pin,HIGH); + digitalWrite(m2Pin,HIGH); break; default: - ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); + ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); } } diff --git a/src/src/extras/Stepper_TB6612.h b/src/src/extras/Stepper_TB6612.h new file mode 100644 index 0000000..bf53133 --- /dev/null +++ b/src/src/extras/Stepper_TB6612.h @@ -0,0 +1,181 @@ +/********************************************************************************* + * MIT License + * + * Copyright (c) 2023 Gregg E. Berman + * + * https://github.com/HomeSpan/HomeSpan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + ********************************************************************************/ + +// Implementation of StepperControl for an Adafruit TB6612 1.2A DC/Stepper Motor Driver +// Breakout Board (https://www.adafruit.com/product/2448) + +// This implementation supports two constructors reflecting implementations both with and +// without the use of PWM pins. The first operates the driver board using only its +// four digital control pins: AIN1, AIN2, BIN1, BIN2. In this configuration the +// PWMA, PWMB, and STBY pins on the driver board should be directly connected to Vcc. + +// The second configuration uses the four digital control pins (AIN1, AIN2, BIN1, and BIN2) +// as well as the PWMA and PWMB pins. In this configuration only the STBY pin on the +// driver board should be directly connected to Vcc. + +// The first configuration supports both single-phase and double-phase FULL_STEP modes, +// as well as a HALF_STEP mode. The second configuration also includes QUARTER_STEP +// and EIGHTH_STEP modes, made possible by the use of the PWM pins to micro-step the motor. + +// In either configuration the motor outputs can be enabled (current running through the coils) +// disabled (no current / high impedence) or set to a short brake. + +#pragma once + +#include "StepperControl.h" +#include "PwmPin.h" + +////////////////////////// + +struct Stepper_TB6612 : StepperControl { + + int ain1, ain2, bin1, bin2; + uint8_t phase, nPhases; + double offset; + LedPin *pwmA=NULL, *pwmB; + +////////////////////////// + + Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2) : StepperControl(){ + + ain1=AIN1; + ain2=AIN2; + bin1=BIN1; + bin2=BIN2; + + pinMode(ain1,OUTPUT); + pinMode(ain2,OUTPUT); + pinMode(bin1,OUTPUT); + pinMode(bin2,OUTPUT); + + setStepType(FULL_STEP_TWO_PHASE); + } + +////////////////////////// + + Stepper_TB6612(int AIN1, int AIN2, int BIN1, int BIN2, int PWMA, int PWMB) : Stepper_TB6612(AIN1,AIN2,BIN1,BIN2){ + + pwmA=new LedPin(PWMA,0,50000); + pwmB=new LedPin(PWMB,0,50000); + } + +////////////////////////// + + void onEnable() override { + setPins(); + } + +////////////////////////// + + void onDisable() override { + digitalWrite(ain1,0); + digitalWrite(ain2,0); + digitalWrite(bin1,0); + digitalWrite(bin2,0); + } + +////////////////////////// + + void onBrake() override { + digitalWrite(ain1,1); + digitalWrite(ain2,1); + digitalWrite(bin1,1); + digitalWrite(bin2,1); + } + +////////////////////////// + + void onStep(boolean direction){ + if(direction) + phase=(phase+1)%nPhases; + else + phase=(phase+nPhases-1)%nPhases; + + setPins(); + } + +////////////////////////// + + void setPins(){ + float levelA=cos(phase*TWO_PI/nPhases+offset)*100.0; + float levelB=sin(phase*TWO_PI/nPhases+offset)*100.0; + digitalWrite(ain1,levelA>0.01); + digitalWrite(ain2,levelA<-0.01); + digitalWrite(bin1,levelB>0.01); + digitalWrite(bin2,levelB<-0.01); + if(pwmA){ + pwmA->set(fabs(levelA)); + pwmB->set(fabs(levelB)); + } + } + +////////////////////////// + + void setStepType(int mode) override { + + switch(mode){ + case FULL_STEP_ONE_PHASE: + phase=0; + nPhases=4; + offset=0; + break; + case FULL_STEP_TWO_PHASE: + phase=0; + nPhases=4; + offset=TWO_PI/8.0; + break; + case HALF_STEP: + phase=0; + nPhases=8; + offset=0; + break; + case QUARTER_STEP: + if(!pwmA){ + ESP_LOGE(STEPPER_TAG,"QUARTER_STEP requires PWM pins"); + return; + } + phase=0; + nPhases=16; + offset=0; + break; + case EIGHTH_STEP: + if(!pwmA){ + ESP_LOGE(STEPPER_TAG,"EIGHTH_STEP requires PWM pins"); + return; + } + phase=0; + nPhases=32; + offset=0; + break; + default: + ESP_LOGE(STEPPER_TAG,"Unknown StepType=%d",mode); + } + } + +}; + +////////////////////////// diff --git a/src/src/extras/extras.ino b/src/src/extras/extras.ino index 55aac2a..c80d93a 100644 --- a/src/src/extras/extras.ino +++ b/src/src/extras/extras.ino @@ -28,215 +28,35 @@ // This is a placeholder .ino file that allows you to easily edit the contents of this files using the Arduino IDE, // as well as compile and test from this point. This file is ignored when the library is included in other sketches. -#include "StepperControl.h" +#include "Stepper_TB6612.h" +#include "Stepper_A3967.h" -////////////////////////// +StepperControl *motor; -struct Stepper_TB6612 : StepperControl { - - int pins[4]; - uint8_t phase; - uint8_t nPhases; - uint32_t runCode; - -////////////////////////// - - Stepper_TB6612(int a1Pin, int a2Pin, int b1Pin, int b2Pin) : StepperControl(){ - pins[3]=a1Pin; - pins[2]=a2Pin; - pins[1]=b1Pin; - pins[0]=b2Pin; - - for(int i=0;i<4;i++) - pinMode(pins[i],OUTPUT); - - setStepType(FULL_STEP_TWO_PHASE); - } - -////////////////////////// - - void onEnable() override { - setPinCode((runCode>>(phase*4)) & 0xF); - } - -////////////////////////// - - void onDisable() override { - setPinCode(0); - } - -////////////////////////// - - void onBrake() override { - setPinCode(0xF); - } - -////////////////////////// - - void onStep(boolean direction){ - if(direction) - phase=(phase+1)%nPhases; - else - phase=(phase+nPhases-1)%nPhases; - - setPinCode((runCode>>(phase*4)) & 0xF); - } - -////////////////////////// - - void setPinCode(uint8_t pinCode){ - for(int i=0;i<4;i++) - digitalWrite(pins[i],(pinCode>>i)&1); - } - -////////////////////////// - - void setStepType(int mode) override { - switch(mode){ - case FULL_STEP_ONE_PHASE: - phase=0; - nPhases=4; - runCode=0x2418; - break; - case FULL_STEP_TWO_PHASE: - phase=0; - nPhases=4; - runCode=0x659A; - break; - case HALF_STEP: - phase=0; - nPhases=8; - runCode=0x2645198A; - break; - default: - ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); - } - } - -}; - -////////////////////////// - - struct Stepper_A3967 : StepperControl { - - int m1Pin; - int m2Pin; - int stepPin; - int dirPin; - int enablePin; - -////////////////////////// - - Stepper_A3967(int m1Pin, int m2Pin, int stepPin, int dirPin, int enablePin) : StepperControl(){ - this->m1Pin=m1Pin; - this->m2Pin=m2Pin; - this->stepPin=stepPin; - this->dirPin=dirPin; - this->enablePin=enablePin; - - pinMode(m1Pin,OUTPUT); - pinMode(m2Pin,OUTPUT); - pinMode(stepPin,OUTPUT); - pinMode(dirPin,OUTPUT); - pinMode(enablePin,OUTPUT); - - setStepType(FULL_STEP_TWO_PHASE); - } - -////////////////////////// - - void onStep(boolean direction){ - digitalWrite(dirPin,direction); - digitalWrite(stepPin,HIGH); - digitalWrite(stepPin,LOW); - } - -////////////////////////// - - void onEnable() override { - digitalWrite(enablePin,0); - } - -////////////////////////// - - void onDisable() override { - digitalWrite(enablePin,1); - } - -////////////////////////// - - void setStepType(int mode) override { - switch(mode){ - case FULL_STEP_TWO_PHASE: - digitalWrite(m1Pin,LOW); - digitalWrite(m2Pin,LOW); - break; - case HALF_STEP: - digitalWrite(m1Pin,HIGH); - digitalWrite(m2Pin,LOW); - break; - case QUARTER_STEP: - digitalWrite(m1Pin,LOW); - digitalWrite(m2Pin,HIGH); - break; - case EIGHTH_STEP: - digitalWrite(m1Pin,HIGH); - digitalWrite(m2Pin,HIGH); - break; - default: - ESP_LOGE(TAG,"Unknown StepType=%d. Stepper Unchanged",mode); - } - } - -}; - -////////////////////////// - -StepperControl *motor[2]; +//////////////////////////////////// void setup() { Serial.begin(115200); delay(1000); - Serial.printf("\nReady.\n\n"); + Serial.printf("\nHomeSpan Steppers\n\n"); - pinMode(33,OUTPUT); - pinMode(27,OUTPUT); - digitalWrite(33,HIGH); - digitalWrite(27,HIGH); + motor=new Stepper_TB6612(23,32,22,14,33,27); +// motor=new Stepper_TB6612(23,32,22,14); - motor[0]=new Stepper_A3967(16,17,21,19,18); - motor[1]=new Stepper_TB6612(23,32,22,14); - - motor[0]->setStepType(Stepper_A3967::QUARTER_STEP); - motor[1]->setStepType(Stepper_TB6612::HALF_STEP); - - motor[0]->setAccel(10,20); - motor[1]->setAccel(50,100); - + motor->setStepType(StepperControl::EIGHTH_STEP); + motor->setAccel(10,100); + motor->move(1600,2); + while(motor->stepsRemaining()); + motor->moveTo(0,2,StepperControl::BRAKE); } -void loop() { - motor[0]->move(1000,5); - motor[1]->move(2000,2); - - do { - for(int i=0;i<2;i++) - Serial.printf("Motor %d - %5d %5d ",i,motor[i]->stepsRemaining(),motor[i]->position()); - Serial.printf("\n"); - delay(500); - } while(motor[0]->stepsRemaining() || motor[1]->stepsRemaining()); - - motor[0]->moveTo(0,5); - motor[1]->moveTo(0,2); - - do { - for(int i=0;i<2;i++) - Serial.printf("Motor %d - %5d %5d ",i,motor[i]->stepsRemaining(),motor[i]->position()); - Serial.printf("\n"); - delay(500); - } while(motor[0]->stepsRemaining() || motor[1]->stepsRemaining()); +////////////////////////////////////// +void loop(){ } +////////////////////////////////////// + + //////////////////////////