Надо посмотреть описание библиотеки. Алекс не зря писал, там все достаточно подробно написано, SetSpeed(4) это 4 шага двигателя в секунду. Соотв. 240 шагов в минуту. А сколько шагов в обороте зависит от характеристик мотора.
#include "GyverStepper.h"
#define STEP_A 54// step
#define STEP_B 60
#define STEP_C 46
#define STEP_D 26
#define DIR_A 55 // dir направления вращения
#define DIR_B 61
#define DIR_C 48
#define DIR_D 28
#define EN_A 38// enable вкл/выкл
#define EN_B 56
#define EN_C 62
#define EN_D 24
char thisChar;
byte availableBytes;
String strData = "";
boolean recievedFlag;
int step_X,
step_Y,
step_Z;
// Расположение двигателей (вид сверху)
GStepper<STEPPER2WIRE> stepperA(100, STEP_A, DIR_A, EN_A);// B*******A
GStepper<STEPPER2WIRE> stepperB(100, STEP_B, DIR_B, EN_B);// * *
GStepper<STEPPER2WIRE> stepperC(100, STEP_C, DIR_C, EN_C);// * *
GStepper<STEPPER2WIRE> stepperD(100, STEP_D, DIR_D, EN_D);// D*******C
void setup() {
Serial.begin(115200);
stepperA.setRunMode(FOLLOW_POS);
stepperA.setMaxSpeed(2000);
stepperA.setAcceleration(1000);
stepperA.autoPower(true);
stepperA.enable();
stepperB.setRunMode(FOLLOW_POS);
stepperB.setMaxSpeed(2000);
stepperB.setAcceleration(1000);
stepperB.autoPower(true);
stepperB.enable();
stepperC.setRunMode(FOLLOW_POS);
stepperC.setMaxSpeed(2000);
stepperC.setAcceleration(1000);
stepperC.autoPower(true);
stepperC.enable();
stepperD.setRunMode(FOLLOW_POS);
stepperD.setMaxSpeed(2000);
stepperD.setAcceleration(1000);
stepperD.autoPower(true);
stepperD.enable();
}
void move_X(long steps)
{
stepperA.setTarget(-steps);
stepperB.setTarget(steps);
stepperC.setTarget(-steps);
stepperD.setTarget(steps);
stepperA.tick();
stepperB.tick();
stepperC.tick();
stepperD.tick();
}
void move_clock(long steps)
{
stepperA.setTarget(-steps);
stepperB.setTarget(-steps);
stepperC.setTarget(-steps);
stepperD.setTarget(-steps);
stepperA.tick();
stepperB.tick();
stepperC.tick();
stepperD.tick();
}
void move_Y(long steps)
{
stepperA.setTarget(steps);
stepperB.setTarget(steps);
stepperC.setTarget(-steps);
stepperD.setTarget(-steps);
stepperA.tick();
stepperB.tick();
stepperC.tick();
stepperD.tick();
}
void loop()
{
if (Serial.available() > 0) { // если есть что то на вход
strData = ""; // очистить строку
while (Serial.available() > 0) { // пока идут данные
strData += (char)Serial.read(); // забиваем строку принятыми данными
delay(2); // обязательно задержка, иначе вылетим из цикла раньше времени
}
recievedFlag = true; // поднять флаг что получили данные
}
if (recievedFlag)
{ // если есть принятые данные
int intVal = strData.substring(1).toInt(); // перевести в int всю строку кроме первых двух символов!
String header = strData.substring(0, 1); // создать мини строку, содержащую первые два символа
if (strData.startsWith("X")) // если строка начинается с X
step_X = (long)intVal;
if (strData.startsWith("Y")) // если строка начинается с Y
step_Y = (long)intVal;
if (strData.startsWith("Z")) // если строка начинается с Z
step_Z = (long)intVal;
Serial.print(step_X); Serial.print(" "); move_X(purp);
Serial.print(step_Y); Serial.print(" "); move_Y(step_Y);
Serial.print(step_Z); Serial.println(" ");move_clock(step_Z);
recievedFlag = false; // данные приняты, мой капитан!
// выводим в порт для отладки
}
}
Использую Arduino Mega 2560.Какой используется МП?
Зачем delay при чтении?
Что такое purp и где она определена?
Алгоритм парсинга брал из этой статьи.Тогда рассказывайте поточнее. Как задаются команды и обеспечивается время между символами не более 2мс? Почему не отслеживаете конец строки или признак конца команды вместо наличия символов в буфере и delay? Что означает "шаговик начинает дрожать": он дрожит в момент ввода или постоянно, даже без ввода?
Неплохо было бы исправить скетч на актуальный в первом сообщении и привести рабочий вариант (без Serial).
#define STEP_A 54// step
#define STEP_B 60
#define STEP_C 46
#define STEP_D 26
#define DIR_A 55 // dir направления вращения
#define DIR_B 61
#define DIR_C 48
#define DIR_D 28
#define EN_A 38// enable вкл/выкл
#define EN_B 56
#define EN_C 62
#define EN_D 24
#include "GyverStepper.h"
GStepper<STEPPER2WIRE> stepperA(200, STEP_A, DIR_A, EN_A);
GStepper<STEPPER2WIRE> stepperB(200, STEP_B, DIR_B, EN_B);
GStepper<STEPPER2WIRE> stepperC(200, STEP_C, DIR_C, EN_C);
GStepper<STEPPER2WIRE> stepperD(200, STEP_D, DIR_D, EN_D);
void setup() {
Serial.begin(9600);
Serial.println("Start");
// мотор A,B,C будет перемещаться в заданную позицию
stepperA.setRunMode(FOLLOW_POS);
stepperA.setMaxSpeed(2000);
stepperA.setAcceleration(2000);
stepperA.autoPower(true);
stepperA.enable();
stepperB.setRunMode(FOLLOW_POS);
stepperB.setMaxSpeed(2000);
stepperB.setAcceleration(1000);
stepperB.autoPower(true);
stepperB.enable();
stepperC.setRunMode(FOLLOW_POS);
stepperC.setMaxSpeed(2000);
stepperC.setAcceleration(1000);
stepperC.autoPower(true);
stepperC.enable();
stepperD.setRunMode(FOLLOW_POS);
stepperD.setMaxSpeed(2000);
stepperD.setAcceleration(1000);
stepperD.autoPower(true);
stepperD.enable();
}
void move_A(int steps){stepperA.setTarget(steps);}
void move_B(int steps){stepperB.setTarget(steps);}
void move_C(int steps){stepperC.setTarget(steps);}
void move_D(int steps){stepperD.setTarget(steps);}
void move_X(int steps)
{
stepperA.setTarget(-steps);
stepperB.setTarget(steps);
stepperC.setTarget(-steps);
stepperD.setTarget(steps);
stepperA.tick();
stepperB.tick();
stepperC.tick();
stepperD.tick();
}
void move_clock(int steps)
{
move_A(-steps);
move_B(-steps);
move_C(-steps);
move_D(-steps);
stepperA.tick();
stepperB.tick();
stepperC.tick();
stepperD.tick();
}
void move_Y(int steps)
{
move_A(steps);
move_B(steps);
move_C(-steps);
move_D(-steps);
stepperA.tick();
stepperB.tick();
stepperC.tick();
stepperD.tick();
}
void loop() {
int purp = 10000;
move_Y(purp);
Serial.println(stepperA.getCurrent());
}
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(800, D8, D7, D6);
char auth[] = "...";
char ssid[] = "...";
char pass[] = "...";
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
stepper.setRunMode(FOLLOW_POS);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(1000);
}
BLYNK_WRITE(V1)
{
int pinValue = param.asInt();
stepper.setTarget(pinValue);
}
void loop()
{
Blynk.run();
}
void loop() {
Blynk.run();
// просто крутим туды-сюды
if (!stepper.tick()) {
static bool dir;
dir = !dir;
stepper.setTarget(dir ? -400 : 400);
}
Да, действительно, его там не было.А гдеstepper.tick()
в скетче с блинком?
#define DRIVER_STEP_TIME 4
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
#include <Button.h>
#include <Click.h>
Button BUTTON_01; //Кнопка Вкл,выкл режимов оборотов X+
Button BUTTON_06; //Кнопка Вкл,выкл режимов оборотов X-
Button BUTTON_02; //Переключатель оборотов режим 1
Button BUTTON_03; //Переключатель оборотов режим 2
Button BUTTON_07; //Переключатель оборотов режим 3
Button BUTTON_08; //Переключатель оборотов режим 4
Button BUTTON_09; //Переключатель оборотов режим 5
Button BUTTON_010; //Переключатель оборотов режим 6
Button BUTTON_011; //Переключатель оборотов режим 7
Button BUTTON_012; //Переключатель оборотов режим 8
Button BUTTON_013; //Переключатель оборотов режим 9
Button BUTTON_04; //Кнопка режим ручной
Button BUTTON_05; //Кнопка режим автомат
int ggg = 0; //Переменная кнопки X+
int ggg2 = 0; //Переменная кнопки X-
int kkk = 0; //Переменная переключения режимов ручной или автомат вращение +
int kkk2 = 0; //Переменная переключения режимов ручной или автомат вращение -
int latchPin = 10;
int clockPin = 12;
int dataPin = 11;
int led1 = B00000000; //-Х B00000010 прав
int led2 = B00000000; //+Х B00000100
int led3 = B00000000; //Ручной режим B10000000
int led4 = B00000000; //Авто режим B01000000
void setup ()
{
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
stepper.setRunMode(KEEP_SPEED);
BUTTON_01.button(6);
BUTTON_02.button(8); //Режим оборотов 1
BUTTON_03.button(9); //Режим оборотов 2
BUTTON_07.button(16); //Режим оборотов 3
BUTTON_08.button(17); //Режим оборотов 4
BUTTON_09.button(18); //Режим оборотов 5
BUTTON_010.button(19); //Режим оборотов 6
BUTTON_011.button(2); //Режим оборотов 7
BUTTON_012.button(5); //Режим оборотов 8
BUTTON_013.button(13); //Режим оборотов 9
BUTTON_04.button(14);
BUTTON_05.button(15);
BUTTON_06.button(7);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST,led1 | led2 | led3 | led4);
digitalWrite(latchPin, HIGH);
BUTTON_01.read();
BUTTON_02.read();
BUTTON_03.read();
BUTTON_04.read();
BUTTON_05.read();
BUTTON_06.read();
BUTTON_07.read();
BUTTON_08.read();
BUTTON_09.read();
BUTTON_010.read();
BUTTON_011.read();
BUTTON_012.read();
BUTTON_013.read();
//Кнопки перемещения X-
if (BUTTON_01.event_click_Dn()&& kkk == 2) //вкл,выкл режимов оборотов автомат
{
ggg = !ggg;
if (!ggg)stepper.stop();
ggg2 = 0;
}
if (ggg == 1) {led1 = B10000000;}
if (ggg == 0) {led1 = B00000000;}
if (ggg2 == 1) {led2 = B01000000;}
if (ggg2 == 0) {led2 = B00000000;}
if (BUTTON_01.event_click_Dn() && kkk == 1) //вкл режимов оборотов ручной
{
ggg = 1;
ggg2 = 0;
}
if (BUTTON_01.event_click_Up() && kkk == 1)//выкл режимов оборотов ручной
{
ggg = 0;
stepper.stop();
}
//Кнопки перемещения X+
if (BUTTON_06.event_click_Dn()&& kkk2 == 2) //вкл,выкл режимов оборотов автомат
{
ggg2 = !ggg2;
if (!ggg2)
stepper.stop();
ggg = 0;
}
if (BUTTON_06.event_click_Dn() && kkk2 == 1) //вкл режимов оборотов ручной
{
ggg2 = 1;
ggg = 0;
}
if (BUTTON_06.event_click_Up() && kkk2 == 1)//выкл режимов оборотов ручной
{
ggg2 = 0;
stepper.stop();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Кнопки выбора режима. Ручной или Автомат.
if (BUTTON_04.event_click_Dn()){kkk = 1; kkk2 = 1; led3 = B00000100; led4 = B00000000;} //кнопка ручной режим
if (BUTTON_05.event_click_Dn()){kkk = 2; kkk2 = 2; led4 = B00000010; led3 = B00000000;} //кнопка авто режим
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//переключатель оборотов
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1 +
//....
if (BUTTON_013.state_button() && ggg == 1){ motor_s9(); } //переключатель оборотов режим 9 +
if (BUTTON_02.state_button() && ggg2 == 1) { motor_s11(); } //переключатель оборотов режим 1 -
// ....
if (BUTTON_013.state_button() && ggg2 == 1){ motor_s19(); } //переключатель оборотов режим 9 -
stepper.tick();
}
void motor_s1() {
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
stepper.setSpeed(1000);
}
//...
void motor_s9() {
//stepper.setRunMode(KEEP_SPEED);
stepper.setAcceleration(200);
stepper.setSpeed(1000);
}
void motor_s11() {
//stepper.setRunMode(KEEP_SPEED);
stepper.setAcceleration(200);
stepper.setSpeed(-1000);
}
//...
void motor_s19() {
//stepper.setRunMode(KEEP_SPEED);
stepper.setAcceleration(200);
stepper.setSpeed(-1000);
}
Спасибо за совет! Почитал, освоил немного.Для мотора что главное ? равномерность! Пробуй освоить библиотеку гайвера ГайверТаймер(с) и вызывать тик мотора внутри обработчика таймера.
#include <GyverTimers.h>
//#define DRIVER_STEP_TIME 1
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
#include <Button.h>
#include <Click.h>
Button BUTTON_01;
Button BUTTON_02;
Button BUTTON_03;
Button BUTTON_04;
Button BUTTON_05;
int ggg = 0;
int kkk = 0;
int kkk2 = 0;
void setup ()
{
Timer2.setPeriod(stepper.getMinPeriod() / 2);
Timer2.enableISR();
stepper.setRunMode(KEEP_SPEED);
BUTTON_01.button(6);
BUTTON_02.button(8);
BUTTON_03.button(9);
BUTTON_04.button(14);
BUTTON_05.button(15);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
}
ISR(TIMER2_A) {
stepper.tick();
}
void loop() {
BUTTON_01.read();
BUTTON_02.read();
BUTTON_03.read();
BUTTON_04.read();
BUTTON_05.read();
//Кнопки перемещения X-
if (BUTTON_01.event_click_Dn()&& kkk == 1) //вкл,выкл режимов оборотов автомат
{
ggg = !ggg;
if (!ggg)stepper.stop();
}
if (BUTTON_01.event_click_Dn() && kkk2 == 1) //вкл режимов оборотов ручной
{
ggg = 1;
}
if (BUTTON_01.event_click_Up() && kkk2 == 1)//выкл режимов оборотов ручной
{
ggg = 0;
stepper.stop();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Кнопки выбора режима. Ручной или Автомат.
if (BUTTON_04.event_click_Dn()){kkk2 = 1; kkk = 0;} //кнопка ручной режим
if (BUTTON_05.event_click_Dn()){kkk = 1; kkk2 = 0;} //кнопка авто режим
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//переключатель оборотов
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1
if (BUTTON_03.state_button() && ggg == 1) { motor_s2(); } //переключатель оборотов режим 2
}
void motor_s1() {
stepper.setMaxSpeed(3000);
stepper.setAcceleration(2000);
stepper.setSpeed(1000);
}
void motor_s2() {
stepper.setMaxSpeed(3000);
stepper.setAcceleration(2000);;
stepper.setSpeed(3000);
}
Приблизительно методом тыка Timer2.setPeriod(130); на оба режима, но это методом тыка, больше или меньше сбои сильные.Частота таймера в 2 раза выше периода мотора. Может надо период таймера менять при изменении скорости мотора ? По идее тикер мотора должен сам понять. Попробуй сделать период таймера раз в 10-20 короче.
#include <GyverButton.h>
#include <GyverTimers.h>
#include <GyverStepper.h>
#define BTN_PIN1 6
#define BTN_PIN2 14
#define BTN_PIN3 15
#define BTN_PIN4 8
#define BTN_PIN5 9
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
GButton butt1(BTN_PIN1,LOW_PULL,NORM_OPEN);
GButton butt2(BTN_PIN2,LOW_PULL,NORM_OPEN);
GButton butt3(BTN_PIN3,LOW_PULL,NORM_OPEN);
GButton butt4(BTN_PIN4,LOW_PULL,NORM_OPEN);
GButton butt5(BTN_PIN5,LOW_PULL,NORM_OPEN);
int ggg = 0;
int kkk = 0;
int kkk2 = 0;
void setup ()
{
Timer2.setPeriod(stepper.getMinPeriod() / 2); //stepper.getMinPeriod()
Timer2.enableISR();
stepper.setRunMode(KEEP_SPEED);
stepper.setMaxSpeed(3000);
stepper.setAcceleration(2500);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
}
ISR(TIMER2_A) {
stepper.tick();
}
void loop() {
butt1.tick();
butt2.tick();
butt3.tick();
butt4.tick();
butt5.tick();
//Кнопка вкл. выкл
if (butt1.isSingle()&& kkk == 1)
{
ggg = !ggg;
if (!ggg)stepper.stop();
}
if (butt1.isHolded() && kkk2 == 1)
{
ggg = 1;
}
if (butt1.isRelease() && kkk2 == 1)
{
ggg = 0;
stepper.stop();
}
//Кнопки выбора режима. Ручной или Автомат.
if (butt2.isSingle()){kkk2 = 1; kkk = 0;} //кнопка ручной режим
if (butt3.isSingle()){kkk = 1; kkk2 = 0;} //кнопка авто режим
//переключатель оборотов
if (butt4.state() && ggg == 1) { motor_s1();} //переключатель оборотов режим 1
if (butt5.state() && ggg == 1) { motor_s2();} //переключатель оборотов режим 2
}
void motor_s1() {
stepper.setSpeed(200);
}
void motor_s2() {
stepper.setSpeed(3000);
}
#include "ESP32TimerInterrupt.h"
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(1, 32, 33);
void IRAM_ATTR TimerHandler0(void)
{
static bool toggle0 = false;
digitalWrite(22, toggle0);
toggle0 = !toggle0;
}
/*
void IRAM_ATTR TimerHandler1(void)
{
stepper.tick();
}
*/
// Instantiate ESP32 timer0 and 1
ESP32Timer ITimer0(3);
//ESP32Timer ITimer1(1);
void setup()
{
// режим следования к целевй позиции
stepper.setRunMode(FOLLOW_POS);
// установка макс. скорости в шагах/сек
stepper.setMaxSpeed(400);
// установка ускорения в шагах/сек/сек
stepper.setAcceleration(500);
//ITimer1.attachInterruptInterval(stepper.getMinPeriod(), TimerHandler1);
ITimer0.attachInterruptInterval(100000, TimerHandler0);
pinMode(22, OUTPUT);
}
void loop()
{
// просто крутим туды-сюды
if (!stepper.tick()) { // тут всё равно вызываем для смены направления
static bool dir;
dir = !dir;
stepper.setTarget(dir ? -400 : 400);
}
// задержка, чтобы показать работу степпера в прерывании
delay(100);
}