14 авг. 2025

ARDUINO NANO управление двумя шаговыми моторами 28BYJ-48

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

Craftum Конструктор сайтов Craftum