Доброе время суток всем.
кому не трудно - посмотрите мой скетч.... уже мозг сломал....
если изменяю вручную переменную stepperSt (строка 37) то режимы 1,2,3,4,5 отрабатываются как нужно
но стоит обрабатывать их кнопками
(использую библиотеку "OneButton.h" , пробовал обрабатывать encButton -- но как то не срослось.... ).
судя по монитору COM порта должно работать . переменная stepperSt изменяется кнопками
и case выбираются правильно ... НО...
нажимаю и удерживаю ЛЕВО или ПРАВО - ШД - двигается правильно
пытаюсь включить режим ТАРГЕТТ - ШД молчит.....
-------------------------------------------------------------------------------------------------
[/CODE]
кому не трудно - посмотрите мой скетч.... уже мозг сломал....
если изменяю вручную переменную stepperSt (строка 37) то режимы 1,2,3,4,5 отрабатываются как нужно
но стоит обрабатывать их кнопками
(использую библиотеку "OneButton.h" , пробовал обрабатывать encButton -- но как то не срослось.... ).
судя по монитору COM порта должно работать . переменная stepperSt изменяется кнопками
и case выбираются правильно ... НО...
нажимаю и удерживаю ЛЕВО или ПРАВО - ШД - двигается правильно
пытаюсь включить режим ТАРГЕТТ - ШД молчит.....
-------------------------------------------------------------------------------------------------
C++:
[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 //максимальный угол в шагах#include <FIFO.h>
#include <GStypes.h>
//#include <GyverPlanner.h>
//#include <GyverPlanner2.h>
//#include <GyverStepper.h>
#include <GyverStepper2.h>
#include <StepperCore.h>
#include "OneButton.h"
OneButton btnLeft(5, false); // кнопка ЛЕВО на 5 пин, подключена VCC
OneButton btnRight(6, false); // кнопка ЛЕВО на 6 пин, подключена VCC
OneButton btnTarget(7, false); // кнопка ЛЕВО на 7 пин, подключена VCC
//--------------------------------------------------------------------------------
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 = 100; // интервал между включение (милисекунды)
//---------------------------------------------------------------------
void setup() {
Serial.begin(9600);
//-------------- связываем функции кнопки ЛЕВО-----------------------------------
btnLeft.attachClick(click1); //клик
btnLeft.attachDoubleClick(doubleclick1); //двойной клик
btnLeft.attachLongPressStart(longPressStart1); //долгое нажатие (удержание)старт
btnLeft.attachLongPressStop(longPressStop1); //отпускание после долгого удержания
//---------- связываем функции кнопки ЛЕВО----------------------------------------
btnRight.attachClick(click2); //клик
btnRight.attachDoubleClick(doubleclick2); //двойной клик
btnRight.attachLongPressStart(longPressStart2); //долгое нажатие (удержание) старт
btnRight.attachLongPressStop(longPressStop2); //отпускание после догого удержания
// ------------------связываем функции кнопки ТАРГЕТ -------------------------------
btnTarget.attachClick(click3); //клик
btnTarget.attachLongPressStart(longPressStart3); //долгое нажатие (удержание) старт
btnTarget.attachLongPressStop(longPressStop3); //отпускание после догого удержания
//--------------------------------------------------------------------------------------
btnLeft.setDebounceTicks(50); //Время, в течение которого игнорируются дополнительные изменения уровня.(50 msec)
btnLeft.setClickTicks(500); // Тайм-аут, используемый для того, чтобы отличить одиночные клики от двойных(500 msec)
btnLeft.setPressTicks(800); //Продолжительность удержания кнопки для срабатывания длительного нажатия (800 msec)
btnRight.setDebounceTicks(50); //Время, в течение которого игнорируются дополнительные изменения уровня.(50 msec)
btnRight.setClickTicks(500); // Тайм-аут, используемый для того, чтобы отличить одиночные клики от двойных(500 msec)
btnRight.setPressTicks(800); //Продолжительность удержания кнопки для срабатывания длительного нажатия (800 msec)
btnTarget.setDebounceTicks(50); //Время, в течение которого игнорируются дополнительные изменения уровня.(50 msec)
btnTarget.setClickTicks(500); // Тайм-аут, используемый для того, чтобы отличить одиночные клики от двойных(500 msec)
btnTarget.setPressTicks(800); //Продолжительность удержания кнопки для срабатывания длительного нажатия (800 msec)
//----------потенциометры скорости 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();
btnRight.tick();
btnTarget.tick();
//Serial.println(stepperSt);
// =========== ПОЕХАЛИ ==========================================================
switch (stepperSt) { // 1 =============== ШД выключен ======================
case 1: {
Serial.println("кейс 1");
Serial.println(stepperSt);
stepper.brake(); // тормозим
stepper.reset(); // сбрасываем позицию в 0
stepper.disable(); //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками
digitalWrite(PIN_LED_0, HIGH);
}
break;
case 2: { // 2 ============= едем в ЛЕВО =========================
Serial.println("кейс 2");
Serial.println(stepperSt);
stepper.enable(); //ШД включить
stepper.setSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax));
stepper.tick();
digitalWrite(PIN_LED_0, LOW);
}
break;
case 3: { // 3 ============= едем в ПРАВО ========================
Serial.println("кейс 3");
Serial.println(stepperSt);
stepper.enable(); //ШД включить
stepper.setSpeed(-(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)));
stepper.tick();
digitalWrite(PIN_LED_0, LOW);
}
break;
case 4: { //4 ============== ШД временно выключен =================
Serial.println("кейс 4");
Serial.println(stepperSt);
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============= ШД в ТАРГЕТ ===========================
Serial.println("кейс 5");
Serial.println(stepperSt);
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;
}
} //==================== end loop =====================================
// ============================== функции обратного вызова ЛЕВО ===========================================
//----------Эта функция будет вызвана, когда кнопка 1 была нажата 1 раз (и не последовало двойное нажатие кнопки).
void click1() {
stepperSt = 1;
//Serial.println("ЛЕВО клик");
} // click1
//----------------- Эта функция будет вызываться при 2-кратном нажатии кнопки 1 в течение короткого промежутка времени.
void doubleclick1() {
stepperSt = 5;
// Serial.println("ЛЕВО двойной клик");
} // doubleclick1
//------------------ Эта функция будет вызываться один раз при длительном нажатии кнопки ЛЕВО.
void longPressStart1() {
stepperSt = 2;
//Serial.println("ЛЕВО долгое нажатие start");
} // longPressStart1
// Эта функция будет вызвана один раз, когда кнопка 1 будет отпущена после длительного нажатия.
void longPressStop1() {
stepperSt = 1;
//Serial.println("ЛЕВО долгое нажатие stop");
} // longPressStop1
// ----- функции обратного вызова ПРАВО
void click2() {
stepperSt = 1;
//Serial.println("ПРАВО клик");
} // click2
void doubleclick2() {
stepperSt = 5;
// Serial.println("ПРАВО двойной клик.");
} // doubleclick2
void longPressStart2() {
stepperSt = 3;
// Serial.println("ПРАВО долгое нажатие start");
} // longPressStart2
void longPressStop2() {
stepperSt = 1;
//Serial.println("ПРАВО долгое нажатие stop");
} // longPressStop2
// ----------------------- функции обратного вызова ТАРГЕТ---------------------------------
void click3() {
stepperSt = 1;
//Serial.println("ТАРГЕТ клик");
} // click2
void longPressStart3() {
stepperSt = 4;
// Serial.println("ТАРГЕТ долгое нажатие start");
} // longPressStart2
void longPressStop3() {
stepperSt = 5;
//Serial.println("ТАРГЕТ долгое нажатие stop");
} // longPressStop2
// End