Проблемы в связке Arduino Nano + DRV8825 + шаговик
- Войдите на сайт для отправки комментариев
Зравствуйте!
Возникла проблема при подключение шагового двигателя к ардуино. Аппаратная конфигрурация следующая: 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 В. Что это может быть? Неисправности драйвера, шаговика? Или я где то очень сильно недопонимаю и неправильно делаю?
Спасибо!
не вижу вообще что вы нашли в этом не правильного?
200 шагов поворачивают на 1/4 оборота в 1 скече
и во втором у вас получается 800 шагов полный оборот...
что именно вас не устраивает?
А разве 200 шагов не должны повернуть вал на 360 град?
А разве 200 шагов не должны повернуть вал на 360 град?
вы меня спрашиваете?
посмотрите свои скечи....
200 Х 4 = 800
все сходиться
какая вам разница то по большому счету? хоть 5000 шагов на полный круг.... просто учитывайте это в своих расчетах
Однако постойте!. Хочется разобраться, движок на 200 оборотов, самый обыкновенный, коих полно. Подумал было, что там редуктор 1 к 4, но нет, самый что ни на есть стандартный 200 шаговый движок. Поэтому дефолтный скетч ардуино называется oneRevolution - один оборот, поэтому там так и написано для таких стандартных движков.
constintstepsPerRevolution = 200;Вообще встречал макисмум 400 шагов/оборот в ширпотреб сегменте привод, больше не видел. Так что, в то что мне за 20$ попался 800 полных шагов я не верю. К тому же я привел полное наименование шаговика, там ясно написано самый классический 200 шагов, 1.8 град.
Однако постойте!. Хочется разобраться, движок на 200 оборотов, самый обыкновенный, коих полно. Подумал было, что там редуктор 1 к 4, но нет, самый что ни на есть стандартный 200 шаговый движок. Поэтому дефолтный скетч ардуино называется oneRevolution - один оборот, поэтому там так и написано для таких стандартных движков.
constintstepsPerRevolution = 200;Вообще встречал макисмум 400 шагов/оборот в ширпотреб сегменте привод, больше не видел. Так что, в то что мне за 20$ попался 800 полных шагов я не верю. К тому же я привел полное наименование шаговика, там ясно написано самый классический 200 шагов, 1.8 град.
вот вы нарываетесь на классичейкий вопрос. И ЧЁ?
мне что хрустальный шар доставать что бы узнать какие библиотеки вы там используете и где вы их там нашли..
тут есть вон ардуино ИДЕ на русском языке скачивают и библиотеки такие же кривые как ятаган...
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); } }Попробуйте - должно работать
пост №6
собственно код со строки 32 по 36
и есть задание вращения, а все остальное библиотека
пост №6
собственно код со строки 32 по 36
и есть задание вращения, а все остальное библиотека
Чукча писатель?
Gippopotam
Огромное спасибо за разъяснение вопроса! Предложенный код сработал безупречно.
Здравствуйте,а подскажите пожалуйста.Плата Ардуино,сначала комп ее видел была как и полагается на третьем СОМ порте.А потом после моих разговоров с Ардуинкой и несколькими шаговичками,перестала видеться.После загрузки кода пишет что нету соединения.Могла ли сгореть сама плата? Драйвера портов обновлял,втыкал Ардуинку в другие порты *Юсби*-не работает,пробовал мышь на место Ардуинки-мышь работает.Боюсь плату спалил.
Ребят подскажите как отключить защиту от пропусков шагов.