IOT ENTERPRISE ©
Для загрузки доступна 4 версия прошивки. Пока не реализовано подключение оси Z.
Для оси Z есть закоментированный код, но не тестировалось подключение.
Какие поддерживает команды:
RESETX
RESETY
RESETZ
- Данные команды сбрасывают положение мотора в ноль, в конце подписана какая ось сбрасывается.
X=VALUE
Y=VALUE
Z=VALUE
- Команда для установки двигателя в определенный шаг, полный оборот это 2048 шагов, можно использовать для более точного позиционирования шагового мотора.
SIZESTEPX=VALUE
SIZESTEPY=VALUE
SIZESTEPZ=VALUE
- Команда для установки размера шага, нужно для того, чтобы например высчитать сколько шагов равно 1 мм на вашем станке, и далее задавать шаги не самого моторая, а например к привязке к сетке в 1 мм.
GETSIZESTEP
- Команда получения размера шага, для всех осей.
STEPX=VALUE
STEPY=VALUE
STEPZ=VALUE
- Команда указывает сколько сделать шагов двигателю, с учетом размера установленного шага.
/*
Автор: Дмитрий Витальевич Мельник
Почта: urbannova@yandex.ru
*/
#define VERSION "0.04"
#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
//GStepper2<STEPPER4WIRE> stepperZ(64, 6, 8, 7, 9); // in1 in2 in3 in4
uint32_t Timer0 = 0;
uint32_t Timer1 = 0;
char command[64];
int CountBuf = 0;
int32_t SizeStepX = 4; //Размер шага для оси ИКС
int32_t SizeStepY = 4; //Размер шага для оси ИГРИК
int32_t SizeStepZ = 4; //Размер шага для оси ЗЕТ
int32_t StepX = 0; //Количесво шагов по оси
int32_t StepY = 0; //Количесво шагов по оси
int32_t StepZ = 0; //Количесво шагов по оси
void setup()
{
Serial.begin(115200); // Иницилизация сериала
Serial.setTimeout(10); // Ограничиваем время конца приема
stepperX.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги
stepperY.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги
//stepperZ.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги
}
void loop()
{
// здесь происходит движение моторов, вызывать как можно чаще
stepperX.tick(); //Вертим пока есть куда
stepperY.tick(); //Вертим пока есть куда
//stepperZ.tick(); //Вертим пока есть куда
if (millis() - Timer0 >= 1000)
{
Timer0 = millis();
//Выводим сырые данные по позициям мотора
Serial.print("Position 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 X OK!");
}
else if(strncmp(command, "resety", 6) == 0) //Устанавливаем позицию в ноль
{
stepperY.reset();
Serial.println("RESET Y OK!");
}
/*else if(strncmp(command, "resetz", 6) == 0) //Устанавливаем позицию в ноль
{
stepperZ.reset();
Serial.println("RESET Z 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);//Задаем позицию куда двигаться
}
/*else if(strncmp(command, "z=", 2) == 0)
{
int32_t val = myatol(command, 2);
Serial.println(val);
stepperZ.setTarget(val);//Задаем позицию куда двигаться
}*/
else if(strncmp(command, "sizestepx=", 10) == 0) //Устанавливаем размер шага по оси ИКС
{
int32_t val = myatol(command, 10);
SizeStepX = val;
Serial.print("Set size step X: ");
Serial.println(val);
}
else if(strncmp(command, "sizestepy=", 10) == 0) //Устанавливаем размер шага по оси ИГРИК
{
int32_t val = myatol(command, 10);
SizeStepY = val;
Serial.print("Set size step Y: ");
Serial.println(val);
}
else if(strncmp(command, "sizestepz=", 10) == 0) //Устанавливаем размер шага по оси ЗЕТ
{
int32_t val = myatol(command, 10);
SizeStepZ = val;
Serial.print("Set size step Z: ");
Serial.println(val);
}
else if(strncmp(command, "getsizestep", 11) == 0) //Получить размеры всех шагов
{
Serial.print("SIZE STEP - X:");
Serial.print(SizeStepX);
Serial.print(" Y:");
Serial.print(SizeStepY);
Serial.print(" Z:");
Serial.println(SizeStepZ);
}
else if(strncmp(command, "stepx=", 6) == 0) //Сделать шаг с размером
{
int32_t val = myatol(command, 6);
val = val * SizeStepX;
stepperX.setTarget(stepperX.pos + val);//Задаем позицию куда двигаться
}
else if(strncmp(command, "stepy=", 6) == 0) //Сделать шаг с размером
{
int32_t val = myatol(command, 6);
val = val * SizeStepY;
stepperY.setTarget(stepperY.pos + val);//Задаем позицию куда двигаться
}
/*else if(strncmp(command, "stepz=", 6) == 0) //Сделать шаг с размером
{
int32_t val = myatol(command, 6);
val = val * SizeStepZ;
stepperZ.setTarget(stepperZ.pos + val);//Задаем позицию куда двигаться
}*/
else if(strncmp(command, "help", 4) == 0)
{
Serial.println("АВТОР: Мельник Д.В.");
Serial.println("ПОЧТА: urbannova@yandex.ru");
}
}
}
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);//Задаем позицию куда двигаться