Проблемы в связке Arduino Nano + DRV8825 + шаговик

ArduSerg
Offline
Зарегистрирован: 16.07.2015

Зравствуйте!

Возникла проблема при подключение шагового двигателя к ардуино. Аппаратная конфигрурация следующая: Arduino Nano v3, Pololu DRV8825 в качестве драйвера, SY35ST26-0284A - сам шаговик (Nema 14, 200 шагов на оборот, 1.8 град). Подключал по следующей схеме:

Схема подключения

При этом стандартный пример из библиотеки Stepper - stepper_oneRevolution поворачивает вал ровно на 1/4 оборота, затем настолько же обратно:

#include <Stepper.h>

const int stepsPerRevolution = 200;

Stepper myStepper(stepsPerRevolution, 5, 6);            

void setup() {
  myStepper.setSpeed(60);
  Serial.begin(9600);
}

void loop() {
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);
  
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500); 
}

При этом используется режим полного шага. Дело в том, что у DRV8825 есть пины MODE0, MODE1, MODE2, комбинацией уровней на которых можно добиваться различного дробления шага, но по умолчанию они все подтянуты к земле и драйвер находится в режиме полного шага.

All three selector inputs have internal 100kΩ pull-down resistors, so leaving these three microstep selection pins disconnected results in full-step mode.

https://www.pololu.com/product/2132

Другой пример - stepper_oneStepAtATime в мониторе порта показывает отсылку шагов каждые 500 мс, но шаговик реагирует только на каждый четвертый такой "шаг".

#include <Stepper.h>

const int stepsPerRevolution = 200;  

Stepper myStepper(stepsPerRevolution, 5, 6);            

int stepCount = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  myStepper.step(1);
  Serial.print("steps:" );
  Serial.println(stepCount);
  stepCount++;
  delay(500);
}

Кстати, если начать манипулировать пинами MODE[X] драйвера, то, как положено, происходит дробление шага, НО относительно этого диапазона в 1/4 поворота. В итоге складывается такое впечатление, что движок на 800 шагов, но это бред. 

Движок на 7.4 В, драйвер на 8.2 В минимум. Запитываю от лаборатрного блока 8.2-10 В. Что это может быть? Неисправности драйвера, шаговика? Или я где то очень сильно недопонимаю и неправильно делаю?

Спасибо!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

не вижу вообще что вы нашли в этом не правильного?

200 шагов поворачивают на 1/4 оборота в 1 скече

и во втором у вас получается 800 шагов полный оборот...

что именно вас не устраивает?

ArduSerg
Offline
Зарегистрирован: 16.07.2015

А разве 200 шагов не должны повернуть вал на 360 град?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ArduSerg пишет:

А разве 200 шагов не должны повернуть вал на 360 град?

вы меня спрашиваете?

посмотрите свои скечи....

200 Х 4 = 800

все сходиться

какая вам разница то по большому счету? хоть 5000 шагов на полный круг.... просто учитывайте это в своих расчетах

ArduSerg
Offline
Зарегистрирован: 16.07.2015

Однако постойте!. Хочется разобраться, движок на 200 оборотов, самый обыкновенный, коих полно. Подумал было, что там редуктор 1 к 4, но нет, самый что ни на есть стандартный 200 шаговый движок. Поэтому дефолтный скетч ардуино называется oneRevolution - один оборот, поэтому там так и написано для таких стандартных движков.

const int stepsPerRevolution = 200;

Вообще встречал макисмум 400 шагов/оборот в ширпотреб сегменте привод, больше не видел. Так что, в то что мне за 20$ попался 800 полных шагов я не верю. К тому же я привел полное наименование шаговика, там ясно написано самый классический 200 шагов, 1.8 град.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ArduSerg пишет:

Однако постойте!. Хочется разобраться, движок на 200 оборотов, самый обыкновенный, коих полно. Подумал было, что там редуктор 1 к 4, но нет, самый что ни на есть стандартный 200 шаговый движок. Поэтому дефолтный скетч ардуино называется oneRevolution - один оборот, поэтому там так и написано для таких стандартных движков.

const int stepsPerRevolution = 200;

Вообще встречал макисмум 400 шагов/оборот в ширпотреб сегменте привод, больше не видел. Так что, в то что мне за 20$ попался 800 полных шагов я не верю. К тому же я привел полное наименование шаговика, там ясно написано самый классический 200 шагов, 1.8 град.

вот вы нарываетесь на классичейкий вопрос. И ЧЁ?

мне что хрустальный шар доставать что бы узнать какие библиотеки вы там используете и где вы их там нашли..

тут есть вон ардуино ИДЕ на русском языке скачивают и библиотеки такие же кривые как ятаган...

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

ArduSerg, проблема в том, что вы скрещиваете ежа с ужом.

Стандартная библиотека заточена под прямое управление обмотками мотора, а у вас драйвер, который поворачивает мотор на один шаг, когда его дергают за _один_ пин - Step, в направлении заданном пином Dir.

В библиотеке Stepper есть вариант подключение и мотора по двум проводам, но судя по конструктору в классе - точно не под ваш драйвер заточен. Один раз из четырех функция дергает за правильный пин - вот и получается 1/4 оборота.

 

Вот код от Easy Driver:

//////////////////////////////////////////////////////////////////
//©2011 bildr
//Released under the MIT License - Please reuse change and share
//Using the easy stepper with your arduino
//use rotate and/or rotateDeg to controll stepper motor
//speed is any number from .01 -> 1 with 1 being fastest - 
//Slower Speed == Stronger movement
/////////////////////////////////////////////////////////////////



#define STEPPER_MICROSTEPS 8

//nema 17 0.5A 7.5 deg:
#define STEPPER_PAUSE 120
#define STEPPER_DEGREES_PER_STEP 3.75



#define DIR_PIN 2
#define STEP_PIN 3

void setup() { 
  pinMode(DIR_PIN, OUTPUT); 
  pinMode(STEP_PIN, OUTPUT); 
  Serial.begin(9600);
} 

void loop(){ 

//  rotate a specific number of degrees 
  rotateDeg(360, 0.01); 
  delay(2000);

 rotateDeg(-360, 0.1);  //reverse
 delay(2000); 


  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  //Serial.println(millis());
  //rotate(38400, 1.0); 
  //Serial.println(millis());
  //delay(5000); 

//  rotate(-1600, 0.25); //reverse
//  delay(1000); 
}



void rotate(int steps, float speed){ 
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN,dir); 

  float usDelay = (1/speed) * STEPPER_PAUSE;

  for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  
} 
} 

void rotateDeg(float deg, float speed){ 
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN, dir); 

  int steps = abs(deg) / (STEPPER_DEGREES_PER_STEP / STEPPER_MICROSTEPS);
  float usDelay = (1/speed) * STEPPER_PAUSE;

  for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  } 
  
}

 

Попробуйте - должно работать

Гриша
Offline
Зарегистрирован: 27.04.2014

пост №6

собственно код со строки 32 по 36

  rotateDeg(360, 0.01); //(float deg, float speed)
  delay(2000);

 rotateDeg(-360, 0.1);  //(float deg, float speed)
 delay(2000); 

 

и есть задание вращения, а все остальное библиотека

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Гриша пишет:

пост №6

собственно код со строки 32 по 36

  rotateDeg(360, 0.01); //(float deg, float speed)
  delay(2000);

 rotateDeg(-360, 0.1);  //(float deg, float speed)
 delay(2000); 

 

и есть задание вращения, а все остальное библиотека

Чукча писатель?

ArduSerg
Offline
Зарегистрирован: 16.07.2015

Gippopotam

Огромное спасибо за разъяснение вопроса! Предложенный код сработал безупречно.

eduardOS
Offline
Зарегистрирован: 01.02.2016

Здравствуйте,а подскажите пожалуйста.Плата Ардуино,сначала комп ее видел была как и полагается на третьем СОМ порте.А потом после моих разговоров с Ардуинкой и несколькими шаговичками,перестала видеться.После загрузки кода пишет что нету соединения.Могла ли сгореть сама плата? Драйвера портов обновлял,втыкал Ардуинку в другие порты *Юсби*-не работает,пробовал мышь на место Ардуинки-мышь работает.Боюсь плату спалил.

wanek1667
Offline
Зарегистрирован: 21.01.2018

Ребят подскажите как отключить защиту от пропусков шагов.