Управление шаговым двигателем с помощью Arduino
- Войдите на сайт для отправки комментариев
Сб, 06/08/2016 - 15:43
Нужна помощь добрых людей. Я в этом пока еще не силен. Загружал готовые примеры из библиотеки AcceStepper, Но дальше тупик. Я изменял там скорость вращения, крутил то в одну то в другую сторону. Но что делать дальше?!
Вот кстати комплектующие:
Шаговый двигатель - 17HS8401;
Адуино - Mega 2560;
Драйвер ШД - DVR8825
Задача такая:
- Надо чтобы ШД двигался определенное количество шагов с заданной скоростью, после чего замедлился до нужной скорости, дошел до заданной отметки и вернулся в исходное положение. И так циклично. Вроде не много требую...но для меня и это сложно. У вас, профи, займет это не более 20 минут. А у меня недели или месяцы изучения этого вопроса. Очень надеюсь на вашу помощь.
Я правильно понял - вы подключили мотор и примеры из библиотеки нормально работают, вопрос только в алгоритме?
Использование этой библиотеки - это обязательное требование?
P.S. Вам какой-то профи сказал по секрету, что это займет не более 20 минут?
По мне так....лишь бы работало после заливки скетча в ардуино.
А по поводу того, что это не займет много времени у понимающих людей, мне дали понять на другом форуме. Мне советовали взять скетч готовый(со своими параметрами) и переделать его под себя. Но для меня это....как попросить родителей установить винду. Был вариант предложен управлять непосредственно обмотками двигателя.
// Управление Моторедуктором распределения воздушного потока 2170-8127100
// (или другим двухфазным биполярным шаговым двигателем)
// обязтелен драйвер ШД!
#define A 8 //пины для управления обмотками (А-крайний левый контакт)
#define B 9
#define C 10
#define D 11
#define BUTTON_R 6 // кнопка вперед
#define BUTTON_L 7 // кнопка назад
// задержка между шагами, для моторедуктора 2170 максимум это примерно 4мс (скорость штока 10 мм/сек)
// для замедления - увеличить, ускорять не рекомендуется
int delStep = 4;
byte counter = 0;
unsigned long timerBut;
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(BUTTON_R, INPUT_PULLUP);
pinMode(BUTTON_L, INPUT_PULLUP);
for (int i = 0; i < 41; i++) rotateR();
counter = 0;
Serial.begin(9600);
}
void loop()
{
if (!digitalRead(BUTTON_R)) {
delay(10);
if (!digitalRead(BUTTON_R)) {
if (counter < 40) {
rotateL();
stopStep();
counter++;
Serial.println(counter);
timerBut = millis() + 1000;
while (!digitalRead(BUTTON_R) and (timerBut > millis()));
if (timerBut <= millis()) {
for (counter; counter < 41; counter++) rotateL();
}
}
}
}
if (!digitalRead(BUTTON_L)) {
delay(10);
if (!digitalRead(BUTTON_L)) {
if (counter > 0) {
rotateR();
stopStep();
counter--;
Serial.println(counter);
timerBut = millis() + 1000;
while (!digitalRead(BUTTON_L) and (timerBut > millis()));
if (timerBut <= millis()) {
for (counter; counter > 0; counter--) rotateR();
}
}
}
}
}
// +++++ ОСНОВНЫЕ ФУНКЦИИ +++++
void stopStep() { // выключение двигателя
Step(0, 0, 0, 0);
}
void rotateR() // 24 шага по часовой стрелке = 1 оборот оси = 1 мм движения штока вниз
{
for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
Step(1, 0, 1, 0); // один такой шаг сдвигает шток на 1/24 мм
Step(0, 1, 1, 0);
Step(0, 1, 0, 1);
Step(1, 0, 0, 1);
}
}
void rotateL() // 24 шага по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
{
for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
Step(1, 0, 0, 1); // один такой шаг сдвигает шток на 1/24 мм
Step(0, 1, 0, 1);
Step(0, 1, 1, 0);
Step(1, 0, 1, 0);
}
}
void Step(boolean a, boolean b, boolean c, boolean d) // один шаг
{
digitalWrite(A, a);
digitalWrite(B, b);
digitalWrite(C, c);
digitalWrite(D, d);
delay(delStep);
}
// +++++++ ЗКЗОТИКА ++++++
void rotateRH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
{
for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
StepH(1, 0, 1, 0); // один такой шаг сдвигает шток на 1/48 мм
StepH(0, 0, 1, 0);
StepH(0, 1, 1, 0);
StepH(0, 1, 0, 0);
StepH(0, 1, 0, 1);
StepH(0, 0, 0, 1);
StepH(1, 0, 0, 1);
StepH(1, 0, 0, 0);
}
}
void rotateLH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
{
for (byte i = 0; i < 6; i++) { // один такой блок сдвигает шток на 1/6 мм
StepH(1, 0, 0, 1); // один такой шаг сдвигает шток на 1/48 мм
StepH(0, 0, 0, 1);
StepH(0, 1, 0, 1);
StepH(0, 1, 0, 0);
StepH(0, 1, 1, 0);
StepH(0, 0, 1, 0);
StepH(1, 0, 1, 0);
StepH(1, 0, 0, 0);
}
}
void StepH(boolean a, boolean b, boolean c, boolean d) // один шаг
{
digitalWrite(A, a);
digitalWrite(B, b);
digitalWrite(C, c);
digitalWrite(D, d);
delay(delStep / 2);
}
Управление обмотками и ваш драйвер DVR8825 - это как бы взаимоисключающие параграфы.
На этом форуме полно готовых решений или рекомендаций (в том числе и моих) по управленрию ШД с помощью подобных драйверов - можете их взять за основу и внести нужные изменения. Если хотите, чтобы вам дали готовое решение - предложите вознаграждение - от желающих помочь отбоя не будет.
P.S. На каком именно форуме вам дали такой совет? Почему, если не секрет, вы не попросили о помощи там?
Управление обмотками и ваш драйвер DVR8825 - это как бы взаимоисключающие параграфы.
Ну не совсем, drv8825 тоже управляет обмотками, только это драйвер (если так можно сказать) более высокого уровня, или просто драйвер, а то даже повторители на дарлингтонах тоже (причем обычно, даже наиболее часто) называют "драйверами", не говоря уже о чипах Н-мостов и плат на этих чипах.
2 ТС
Вам нужно или код менять, или драйвер .
p.masyukov@gmail.com -- обсудим..
Ну не совсем, drv8825 тоже управляет обмотками, только это драйвер (если так можно сказать) более высокого уровня, или просто драйвер, а то даже повторители на дарлингтонах тоже (причем обычно, даже наиболее часто) называют "драйверами", не говоря уже о чипах Н-мостов и плат на этих чипах.
Это вы сейчас с кем разговаривали?