Назад к списку

Пример программы управдения  двумя  шаговыми моторами

#define VERSION "0.05" 

#define ABORTX A0 //Пин прерывателя для оси ИКС 

#define ABORTY A1 //Пин прерывателя для оси ИГРИК 

#define ABORTZ A2 //Пин прерывателя для оси ЗЕТ 

#include "GyverStepper2.h"G


Stepper2<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; //Количесво шагов по оси 

bool calibx = false; //Переменная для калибровки по оси ИКС 

bool caliby = false; //Переменная для калибровки по оси ИГРИК 

bool calibz = false; //Переменная для калибровки по оси ЗЕТ 

void setup() 

StartConf(); 

void loop() 

{ // здесь происходит движение моторов, вызывать как можно чаще 

stepperX.tick(); //Вертим пока есть куда 

stepperY.tick(); //Вертим пока есть куда 

//stepperZ.tick(); //Вертим пока есть куда 

if(calibx || caliby || calibz) //Есть ли калибровка по какой либо оси 

{ Calibration(); } 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) { if(calibx || caliby || calibz) { Serial.println("Calibration is being performed!"); } else { int32_t val = myatol(command, 2); Serial.println(val); stepperX.setTarget(val);//Задаем позицию куда двигаться } } else if(strncmp(command, "y=", 2) == 0) { if(calibx || caliby || calibz) { Serial.println("Calibration is being performed!"); } else { int32_t val = myatol(command, 2); Serial.println(val); stepperY.setTarget(val);//Задаем позицию куда двигаться } } /*else if(strncmp(command, "z=", 2) == 0) { if(calibx || caliby || calibz) { Serial.println("Calibration is being performed!"); } else { 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) //Сделать шаг с размером { if(calibx || caliby || calibz) { Serial.println("Calibration is being performed!"); } else { int32_t val = myatol(command, 6); val = val * SizeStepX; stepperX.setTarget(stepperX.pos + val);//Задаем позицию куда двигаться } } else if(strncmp(command, "stepy=", 6) == 0) //Сделать шаг с размером 

if(calibx || caliby || calibz) 

Serial.println("Calibration is being performed!"); 

else 

{ int32_t val = myatol(command, 6); val = val * SizeStepY; stepperY.setTarget(stepperY.pos + val);//Задаем позицию куда двигаться } 

} /*

else if(strncmp(command, "stepz=", 6) == 0) //Сделать шаг с размером { if(calibx || caliby || calibz) { Serial.println("Calibration is being performed!"); } else { 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"); } else if(strncmp(command, "clbx", 4) == 0) //Калибровка оси ИКС { Serial.println("X-axis calibration has started."); calibx = true; } else if(strncmp(command, "clby", 4) == 0) //Калибровка оси ИГРИК { Serial.println("Y-axis calibration has started."); caliby = true; } else if(strncmp(command, "clbz", 4) == 0) //Калибровка оси ЗЕт { Serial.println("Z-axis calibration has started."); calibz = true; } else if(strncmp(command, "version", 7) == 0) //Калибровка оси ЗЕт { Serial.print("VERSION: "); Serial.println(VERSION); } }}void StartConf()//Выполняется стартовое конфигурирование системы{ Serial.begin(115200); // Иницилизация сериала Serial.setTimeout(10); // Ограничиваем время конца приема stepperX.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги stepperY.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги //stepperZ.setMaxSpeed(64); // Скорость шагов, более 512 начинает пропускать шаги pinMode(ABORTX, INPUT_PULLUP); //Устанавливаем пин в режим подтяжки для определения нуля оси pinMode(ABORTY, INPUT_PULLUP); //Устанавливаем пин в режим подтяжки для определения нуля оси pinMode(ABORTZ, INPUT_PULLUP); //Устанавливаем пин в режим подтяжки для определения нуля оси //Так как подключена подтяжка то на пине +5 вольт это ноль, подтяжка к земле будет еденицей.}void Calibration(){ if(calibx) { if(!digitalRead(ABORTX)) { calibx = false; Serial.println("Calibration of the X-axis is completed"); stepperX.brake(); stepperX.reset(); } else { stepperX.setTarget(stepperX.pos - 1); } } if(caliby) { if(!digitalRead(ABORTY)) { caliby = false; Serial.println("Calibration of the y-axis is completed"); stepperY.brake(); stepperY.reset(); } else { stepperY.setTarget(stepperY.pos - 1); } } /*if(calibz) { if(!digitalRead(ABORTZ)) { calibz = false; Serial.println("Calibration of the z-axis is completed"); stepperZ.brake(); stepperZ.reset(); } else { stepperZ.setTarget(stepperZ.pos - 1); } }*/}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);

//Задаем позицию куда двигаться 

Поиск информации по сайту мониторинга транспорта TREKBERRY
© TREKBERRY 2017-2026, Дмитрий В.М. Все права защищены.
Копирование материала без ссылки на источник запрещено. Информация размещенная на сайте не является публичной офертой. Часть текстов написано нейросетью, может содержать не точности. На сайте может быть реклама и иметь рекламные вставки. Если личный кабинет не активен более 6 месяцев подряд. Аккаунт может быть удален, а баланс потерян.