[code]
/* шаговый двигатель NEMA23, драйвер к нему TB6600, три тактовых кнопки, два потенциометра, светодиод.
режимы работы шагового двигателя определяются кнопками
КнЛЕВО - при нажатии и удержании - ШД вращается в ЛЕВО
КнПРАВО -при нажатии и удержании - ШД вращается в ПРАВО
<двойной клик> по КнЛЕВО или КнПРАВО - запускается режим ТАРГЕТ (крутит туда-сюда относительно текущей позиции на определенный угол)
<клик> по КнЛЕВО или КнПРАВО - двигатель останавливается (с обмоток снимается напряжение, вал двигателя можно свободно вращать рукой)
КнТАРГЕТ - при <нажатии и удержании> - двигатель останавливается с обмоток снимается напряжение, вал двигателя можно свободно вращать вручную
- при отпускании ранее нажатой кнопки КнТАРГЕТ> двигатель переходит в режим ТАРГЕТ - крутит туда-сюда относительно текущей позиции на определенный угол
Потенциометр СКОРОСТЬ - регулирует скорость вращения двигателя от Vмин, до Vмакс.
Потенциометр УГОЛ - изменяет угол поворота в режиме ТАРГЕТ от Uмин градусов до Uмакс градусов
*/
//---------------------------------------------------------------------------------
#define DRIVER_STEP_TIME 1 // задержка 1 мкс для драйвера ШД (TB6600)
#define PIN_POT_V A5 // пин потенциометра для Скорость
#define PIN_POT_U A4 // пин потенциометра для Угол таргетирования
#define PIN_LED_0 A0 // пин светодиода индикации
#define speedmin 50 // минимальная скорость в шаг/сек
#define speedmax 3200 // максимальная скорость в шаг/сек
#define tarmin 50 // минимальный угол в шагах
#define tarmax 800 //максимальный угол в шагах
// Опциональные дефайн-настройки для кнопок(показаны по умолчанию)
//#define EB_DEB 50 // дебаунс кнопки, мс
//#define EB_CLICK 400 // таймаут накликивания, мс
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
//#include <FIFO.h>
//#include <GStypes.h>
//#include <GyverPlanner.h>
//#include <GyverPlanner2.h>
//#include <GyverStepper.h>
#include <GyverStepper2.h>
//#include <StepperCore.h>
//#include <AnalogKey.h>
#include <EncButton.h>
//---------определяем кнопки------------------------------------------------------
EncButton<EB_TICK, 5> btnLEFT; // кн.ЛЕВО
EncButton<EB_TICK, 6> btnRIGHT; // кн.ПРАВО
EncButton<EB_TICK, 7> btnTARGET; // кн.ТАРГЕТ
//--------------------------------------------------------------------------------
GStepper2<STEPPER2WIRE> stepper(800, 8, 9, 10); // параметры ШД 800 шагов/оборот, step, dir, en на пины 8,9,10 соответственно
//---------------флажок для состояния ШД------------------------------------------
int stepperSt = 1; // 1 - не вращается, 2 - вращается влево, 3 - вращается вправо, 4- временно не вращается , 5 - таргет
//----------- для мигания светодиода ---------------------------------
int ledState = LOW; // состояние светодиода
long previousMillis = 0; // время последнего переключения светодиода
long interval = 150; // интервал между включение (милисекунды)
//---------------------------------------------------------------------
void setup() {
//------- настройки кнопок------------------------------------------------------
btnLEFT.setButtonLevel(HIGH); // уровень кнопки: HIGH - кнопка подключает VCC
btnRIGHT.setButtonLevel(HIGH); // уровень кнопки:HIGH - кнопка подключает VCC
btnTARGET.setButtonLevel(HIGH); // уровень кнопки: HIGH - кнопка подключает VCC
//----------потенциометры скорости V, угла таргетирования U---------------------
pinMode(PIN_POT_V, INPUT); // пин потенциометра скорости как ВЫХОД (подключение левый пин VCC, средний пин - А5, правый пин GND)
pinMode(PIN_POT_U, INPUT); // пин потенциометра угла как ВЫХОД (подключение левый пин VCC, средний пин - А4, правый пин GND)
//---------------------------------------------------------- -------------------
pinMode(PIN_LED_0, OUTPUT);
}
void loop() {
//========================ОПРАШИВАЕМ КНОПКИ=====================================
btnLEFT.tick(); //кнопка ЛЕВО ----------------------------------------------------
if (btnLEFT.hasClicks(1)) stepperSt = 1; // один клик, ШД не вращается
if (btnLEFT.hasClicks(2)) stepperSt = 5; // два клика, ШД в ТАРГЕТ
if (btnLEFT.held()) stepperSt = 2; // удерживается , ШД вращается в ЛЕВО
if (btnLEFT.release()) stepperSt = 1; // отпущена, ШД не вращается
btnRIGHT.tick(); //кнопка ПРАВО ----------------------------------------------------
if (btnRIGHT.hasClicks(1)) stepperSt = 1; // один клик, ШД не вращается
if (btnRIGHT.hasClicks(2)) stepperSt = 5; // два клика, ШД в ТАРГЕТ
if (btnRIGHT.held()) stepperSt = 3; // удерживается , ШД вращается в ПРАВО
if (btnRIGHT.release()) stepperSt = 1; // отпущена, ШД не вращается
btnTARGET.tick(); //кнопка ТАРГЕТ ----------------------------------------------------
if (btnTARGET.held(0)) stepperSt = 4; // пока удерживается ШД временно не вращается
if (btnTARGET.release()) stepperSt = 5; // отпущена, ШД в ТАРГЕТ
// =========== ПОЕХАЛИ ==========================================================
switch (stepperSt) { // 1 =============== ШД выключен ======================
case 1: {
stepper.brake(); // тормозим
stepper.reset(); // сбрасываем позицию в 0
stepper.disable(); //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками
digitalWrite(PIN_LED_0, HIGH);
}
break;
case 2: { // 2 ============= едем в ЛЕВО =========================
stepper.enable(); //ШД включить
stepper.setSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax));
stepper.tick();
digitalWrite(PIN_LED_0, HIGH);
}
break;
case 3: { // 3 ============= едем в ПРАВО ========================
stepper.enable(); //ШД включить
stepper.setSpeed(-(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)));
stepper.tick();
digitalWrite(PIN_LED_0, HIGH);
}
break;
case 4: { //4 ============== ШД временно выключен =================
stepper.brake(); // тормозим
stepper.reset(); // сбрасываем позицию в 0
stepper.disable(); //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками
{ // ---------------------- мигаем светодиодом-----------------------------
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(PIN_LED_0, ledState);
}
} //---------------------------------------------------------------------
}
break;
case 5: { // 5============= ШД в ТАРГЕТ ===========================
stepper.setMaxSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)); // установка скорости в шагах/сек
stepper.setAcceleration(500); // установка ускорения в шагах/сек2
if (!stepper.tick()) {
static bool dir;
dir = !dir;
stepper.setTarget(dir ? -(map(analogRead(PIN_POT_U), 0, 1023, tarmin, tarmax)) : map(analogRead(PIN_POT_U), 0, 1023, tarmin, tarmax));
}
}
break;
}
}