IOT ENTERPRISE ©
Отличный пример кода для управления двумя шаговыми моторами. Для осей X и Y.
Поддерживает несколько команд в сериал:
RESETX - установить текущее положение как ноль для оси X
RESETY - установить текущее положение как ноль для оси Y
Управление положением шагового мотора:
X=value - Значение для оси Х
Y=value - Значение для оси Y
/*
Автор: Дмитрий Витальевич Мельник
Почта: urbannova@yandex.ru
*/
#include "GyverStepper2.h"
GStepper2<STEPPER4WIRE> stepperX(64, 2, 4, 3, 5); // in1 in2 in3 in4
GStepper2<STEPPER4WIRE> stepperY(64, 6, 8, 7, 9); // in1 in2 in3 in4
#define VERSION "0.03"
uint32_t Timer0 = 0;
uint32_t Timer1 = 0;
char command[64];
int CountBuf = 0;
void setup()
{
Serial.begin(115200); // Иницилизация сериала
Serial.setTimeout(10); // Ограничиваем время конца приема
stepperX.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги
stepperY.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги
//stepper.setSpeed(64); // Скорость врещения
}
void loop()
{
// здесь происходит движение моторов, вызывать как можно чаще
stepperX.tick(); //Вертим пока есть куда
stepperY.tick(); //Вертим пока есть куда
if (millis() - Timer0 >= 1000)
{
Timer0 = millis();
Serial.print("X: ");
Serial.print(stepperX.pos);
Serial.print(" Y: ");
Serial.println(stepperY.pos);
}
if (millis() - Timer1 >= 50)
{
Timer1 = millis();
UART0();
}
}
void UART0()
{
if (Serial.available() > 0)
{
CountBuf = Serial.readBytes(command, 64);
for(int i = 0; i < CountBuf; i++)//Принудительно переводим все в нижний регистр
{
if(command[i]<= 0x5a && command[i] >= 0x41)
{ //Проверяем большая ли буква
command[i] = command[i] + 32; //Переводим в нижний регистр
}
}
if(strncmp(command, "resetx", 6) == 0) //Устанавливаем позицию в ноль
{
stepperX.reset();
Serial.println("RESET OK!");
}
else if(strncmp(command, "resety", 6) == 0) //Устанавливаем позицию в ноль
{
stepperY.reset();
Serial.println("RESET OK!");
}
else if(strncmp(command, "x=", 2) == 0)
{
int32_t val = myatol(command, 2);
Serial.println(val);
stepperX.setTarget(val);//Задаем позицию куда двигаться
}
else if(strncmp(command, "y=", 2) == 0)
{
int32_t val = myatol(command, 2);
Serial.println(val);
stepperY.setTarget(val);//Задаем позицию куда двигаться
}
}
}
int32_t myatol(char * arr, int count)
{
int32_t val;
char Temp[10] = {0};
for(int i = 0; i < 10; i++)
{
if(arr[i+count] <= 0x39 && arr[i+count] >= 0x30 || arr[i+count] == '-')
{
Temp[i] = arr[i+count];
}
else
{
Temp[i] = 0x00;
break;
}
}
val = atol(Temp);
return val;
}
//stepper.setSpeed(val);//задаем скорость вращения на сколько позиций
//stepper.reset();//Обнуляем позицию
//stepper.setTarget(val);//Задаем позицию куда двигаться