22 авг. 2025

Управление шаговыми двигателями с помошью ARDUINO

Для загрузки доступна 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);//Задаем позицию куда  двигаться

Craftum Сайт создан на Craftum