Конечно. Я почему то думал что у тебя 28byj с драйвером полного шага)Для больших скоростей могу просто уменьшить деление шага.
Конечно. Я почему то думал что у тебя 28byj с драйвером полного шага)Для больших скоростей могу просто уменьшить деление шага.
// драйвер STEP-DIR
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 2, 3, 4);
// 2 - STEP
// 3 - DIR
// 4 - EN
void setup() {
stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости
stepper.setSpeedDeg(50); // в градусах/сек
}
void loop() {
stepper.tick();
// сделаем таймер на 50 мс и будем опрашивать потенциометр
// менять скорость чаще нет смысла
static uint32_t tmr2;
if (millis() - tmr2 > 50) {
tmr2 = millis();
// ставим новую скорость (-512.. шагов в секунду)
// будет крутиться в разные стороны
stepper.setSpeed(-512 - analogRead(0));
}
}
-512 - analogRead(0)
stepper.setSpeed(map(analogRead(A0),0,1023,4,35))
#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);
}
#define SMOOTH_ALGORITHM
#include <GyverStepper.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
GStepper<STEPPER2WIRE> stepper(1000, 14, 15);
int flag = 0;
int c = 0;
int s = 0;
//char a;
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(169, 254, 170, 10);
unsigned int localPort = 6630;
EthernetUDP Udp;
char receivingBuffer[100]; // приемный буфер Udp-пакета
float floatVar; //float градуса
void setup() {
Ethernet.begin(mac, ip);
Udp.begin(localPort);
Serial.begin(9600);
stepper.setAcceleration(50);
pinMode (4, INPUT_PULLUP); //концевик
pinMode (5, INPUT_PULLUP); //кнопка homing
pinMode (16, OUTPUT); //лампочка homing
pinMode (6, INPUT_PULLUP); //кнопка по часовой
pinMode (7, INPUT_PULLUP); //кнопка против часовой
pinMode (8, INPUT_PULLUP); //вкл/выкл
pinMode (9, OUTPUT); //лампочка ethernet
digitalWrite(16, LOW);
}
bool btnState = false;
int i1 = 0;
int i2 = 0;
int i3 = 0;
int h = 0;
void loop() {
c = 0;
if (!digitalRead(8)) { //ЕСЛИ КНОПКА ETHERNET НЕ НАЖАТА
digitalWrite(9, LOW);
for (int i = 0; i <= 10 && !digitalRead(5); i++) { //ХОУМИНГ
//Serial.println(i);
i1++;
}
if (i1 >= 10) c = 1;
i1 = 0;
for (int i = 0; i <= 10 && !digitalRead(6); i++) { //ПО ЧАСОВОЙ
//Serial.println(i);
i2++;
}
if (i2 >= 10) c = 2;
i2 = 0;
for (int i = 0; i <= 10 && !digitalRead(7); i++) { //ПРОТИВ ЧАСОВОЙ
//Serial.println(i);
i3++;
}
if (i3 >= 10) c = 3;
i3 = 0;
}
else digitalWrite(9, HIGH);
//c = 1;
//Serial.println(c);
switch (c) {
case 1:
//int h = 0;
Serial.println(222);
break;
case 2:
Serial.println("HANDTURN CW");
digitalWrite(16, LOW);
stepper.setRunMode(KEEP_SPEED);
//stepper.reset();
stepper.setSpeed(100, SMOOTH);
stepper.setAcceleration(50);
while (stepper.getSpeed() != 0 || !digitalRead(6)) {
if (!digitalRead(6) && !btnState) {
btnState = true;
}
// кнопка отпущена
if (digitalRead(6) && btnState) {
btnState = false;
stepper.stop();
}
stepper.tick();
if (!stepper.getState()) {
c = 0;
break;
}
}
case 3:
Serial.println(333);
break;
}
}
if (5000 <= stepper.getCurrent() <= 30000) {
stepper.setMaxSpeed(1500);
} else {
stepper.setMaxSpeed(500);
if (stepper.getCurrent() <= 5000) {
stepper2.setSpeed(100);}
static bool lowCurrent = false; // флаг для определения условия позиции
static bool settedSpeed = false; // флаг для проверки, была ли установлена скорость
if (stepper.getCurrent() <= 5000) {
lowCurrent = true; // если условие по позиции выполняется, то флаг true
}
else {
lowCurrent = false; // если не выполняется, то false
}
if (lowCurrent != speedSetted) { // проверяем, равен ли флаг позиции флагу нужной скорости
speedSetted = lowCurrent; // если не равен, то присваеваем значение флага позиции
if (speedSetted) { // проверяем значение флага
stepper2.setSpeed(100); // если он true, то настраиваем скорость (это произойдет только 1 раз за проход первого шаговика по позиции от 0 к 5000)
}
else {
// если false - выполняем что-то другое (выполнится 1 раз, когда первый шаговик перешагнет за 5000)
}
}