Официальный сайт компании Arduino по адресу arduino.cc
Управление шаговым мотором
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 01/02/2018 - 18:19
Приветствую.
Решил сделать управление крышкой бардачка с помощью моторо шагового NEMA17. Используя Arduino NANO, драйвер A4988, кнопку.
Суть такова. при нажатии на кнопку (фиксируемая) на вход A0 посупает 5 вольт и мотор должен крутится на определенное количество шагов влево. При пропадании сигнала с А0 мотор должен крутится вправо.
У меня же мотор крутится всегда вправо не зависимо от того что на входе A0.
Вот скетч, который сделал
#include <Arduino.h> #include <AccelStepper.h> #define RPM_1 97400 #define ACC_1 97400 #define M0 0 AccelStepper *mtr[1]; const double rel[1] = {66.6666}; const byte mtrPins[5][3] = {{5,4}}; // step, dir const byte mtrEnPin = 6; //enb byte trigger = 0; void setup() { Serial.begin(9600); mtr[M0] = new AccelStepper(AccelStepper::DRIVER, mtrPins[M0][0], mtrPins[M0][1]); pinMode(mtrEnPin, OUTPUT); pinMode(A0, INPUT); pinMode(13, OUTPUT); mtr[M0]->setMaxSpeed(RPM_1); mtr[M0]->setAcceleration(ACC_1); digitalWrite(mtrEnPin, LOW); delay(1000); } void loop() { int v = digitalRead(A0); if( v ){ digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } if( !trigger && v ){ mtr[0]->move(19000); trigger = 1; } if( trigger && !v ){ mtr[0]->move(-19000); trigger = 0; } mtr[0]->run(); }
Если загрузить пример с интернета то мотор крутится и влево и вправо. При том рукой его не остановить, как в моем примере.
int Index; void setup() { pinMode(6, OUTPUT); //Enable pinMode(5, OUTPUT); //Step pinMode(4, OUTPUT); //Direction digitalWrite(6,LOW); } void loop() { digitalWrite(4,HIGH); for(Index = 0; Index < 2000; Index++) { digitalWrite(5,HIGH); delayMicroseconds(500); digitalWrite(5,LOW); delayMicroseconds(500); } delay(1000); digitalWrite(4,LOW); for(Index = 0; Index < 2000; Index++) { digitalWrite(5,HIGH); delayMicroseconds(500); digitalWrite(5,LOW); delayMicroseconds(500); } delay(1000); }
Подскажите пожалуйста что не так проиходит ?
Разбираться с библиотекой лень, но поверхностно взглянув не увидел, где вы переключаете пин DIR, который отвечает за направление движения.
Не уверен что в 34 строке можно получить ноль.
а зачем этот бред в строке 11 - массив 5Х3, если в итоге нужны только два одиночных байта?
Кроме того, если у вас есть готовый и довольно простой код, который крутит моторы как надо (скетч 2) - зачем вам в вашем коде какая-то левая библиотека? Вставьте код для моторов из второго скетча в первый.
Не совсем понимаю, что в 11 строке не так.
Скетчи пытался соединить, не получилось
С 40 цикл, который должен это делать
вы вообще язык хорошо знаете? Что означает запись
const byte mtrPins[5][3] = {{5,4}};
Это массив из 5 строк по 3 элемента в каждом, то есть
Зачем он нужен, если потом вы используете из него только 2 первых элемента, вызывая их как mtrPins[0][0] и mtrPins[0][1] - то есть как два константных байта?
вы вообще язык хорошо знаете? Что означает запись
const byte mtrPins[5][3] = {{5,4}};
Это массив из 5 строк по 3 элемента в каждом, то есть
Зачем он нужен, если потом вы используете из него только 2 первых элемента, вызывая их как mtrPins[0][0] и mtrPins[0][1] - то есть как два константных байта?
Тут обозначают пины к которым драйвер подключения. Из библиотеки пример был взял.
Можете подсказать как правильно сделать, чтоб работало по заданным условиям
Можете подсказать как правильно сделать, чтоб работало по заданным условиям
Попробуйте библиотеку AccelStepper выкинуть вовсе, вместо строки 41 подставить строки с 14 по 22 второго скетча, а вместо строки 45 - соответсвенно строки 25-33 .
Сделаете - покажите код. И не забудьте пины описать правильно в сетап
Каша получится мне кажется. Но попробую
Можете подсказать как правильно сделать, чтоб работало по заданным условиям
Попробуйте библиотеку AccelStepper выкинуть вовсе, вместо строки 41 подставить строки с 14 по 22 второго скетча, а вместо строки 45 - соответсвенно строки 25-33 .
Сделаете - покажите код. И не забудьте пины описать правильно в сетап
Сделал но сыпется ошибка по скобкам }
Исправил. Но пока на железе не проверял.
Исправил. Но пока на железе не проверял.
Хорошо.
Погодите пока в железо пихать, я вам чуть погодя код немного "причешу". А то сейчас только на работу пришел, надо изобразить деятельность :)
Исправил. Но пока на железе не проверял.
Хорошо.
Погодите пока в железо пихать, я вам чуть погодя код немного "причешу". А то сейчас только на работу пришел, надо изобразить деятельность :)
спасибо
Вот так не проще (на моторе не смотрел)?
P.S. Избавление о delay() - домашняя работа для ТС
Вот так не проще (на моторе не смотрел)?
P.S. Избавление о delay() - домашняя работа для ТС
Как тогда задать количество шагов вперед и назад ? Или это кусок
Суть такова. при нажатии на кнопку (фиксируемая) на вход A0 посупает 5 вольт и мотор должен крутится на определенное количество шагов влево. При пропадании сигнала с А0 мотор должен крутится вправо.
В условии написано - должен крутится влево на N шагов - это задается в начале скетча, при пропадании - вправо. Где написано про K шагов вправо?
вот так получилось. Число шагов в каждом направлении - Step_to_move - надо будет подобрать.
вот так получилось. Число шагов в каждом направлении - Step_to_move - надо будет подобрать.
Спасибо большое. Вечером в железе попробую
забыл сказать - не компилировал, могут быть мелки опечатки. Нет ардуины под рукой сейчас.
и еще - не знаю что за параметр rel[1] - строка 3. На всякий случай оставил, но в скетче он не используется.
забыл сказать - не компилировал, могут быть мелки опечатки. Нет ардуины под рукой сейчас.
и еще - не знаю что за параметр rel[1] - строка 3. На всякий случай оставил, но в скетче он не используется.
Проверил мотор крутится в оду и туже сторону. Может ускорения не хватает ?
Проверил мотор крутится в оду и туже сторону. Может ускорения не хватает ?
при чем тут ускорение?
Опишите, как вы работаете с кнопкой и как при этом реагирует мотор и светодиод на пине 13
Проверил мотор крутится в оду и туже сторону. Может ускорения не хватает ?
при чем тут ускорение?
Опишите, как вы работаете с кнопкой и как при этом реагирует мотор и светодиод на пине 13
кнопка подключена к пину А0. Через нее на пин поступает логическая 1 т.е. 4.8 вольта. Кнопка с фиксацией.
При нажатии на А0 поступает лог 1 и светодиод на 13 пине загорается. Мотор начинает крутится влево на задонное количество шагов.
При повторном нажатии с пина А0 проподает лог 1, светодиод на пине 13 гаснет и мотор должен крутится вправо на задонное количество шагов. Но этого не происходит.
Схема включения драйвера универсальная,взята с инета
кнопка подключена к пину А0. Через нее на пин поступает логическая 1 т.е. 4.8 вольта. Кнопка с фиксацией.
При нажатии на А0 поступает лог 1 и светодиод на 13 пине загорается. Мотор начинает крутится влево на задонное количество шагов.
При повторном нажатии с пина А0 проподает лог 1, светодиод на пине 13 гаснет и мотор должен крутится вправо на задонное количество шагов. Но этого не происходит.
не пишите "как должно быть", напишите как оно на самом деле. Типа "нажимаю кнопку - она фиксируется - зажигается светодиод - мотор крутится...
кнопка подключена к пину А0. Через нее на пин поступает логическая 1 т.е. 4.8 вольта. Кнопка с фиксацией.
При нажатии на А0 поступает лог 1 и светодиод на 13 пине загорается. Мотор начинает крутится влево на задонное количество шагов.
При повторном нажатии с пина А0 проподает лог 1, светодиод на пине 13 гаснет и мотор должен крутится вправо на задонное количество шагов. Но этого не происходит.
не пишите "как должно быть", напишите как оно на самом деле. Типа "нажимаю кнопку - она фиксируется - зажигается светодиод - мотор крутится...
Все правильно. Нажал кнопку она зафиксировалась. Мотор крутится влево и светодиод горит. Нажал кнопка разомкнула цепь мотор крутится влево светодиод погас
теперь загрузите в МК скетч номер 2 из первого сообщения и проверьте - мотор крутится в разные стороны? Ничего не переподключайте, все пины в двух скетчах одинаковые
теперь загрузите в МК скетч номер 2 из первого сообщения и проверьте - мотор крутится в разные стороны? Ничего не переподключайте, все пины в двух скетчах одинаковые
с тестовым скетчем из первого поста мотор крутится вперед и назад. Рукой его не остановить.
Сейчас управляя с кнопки мотор идет только в одну сторону и рукой можно остановить мотор
с тестовым скетчем из первого поста мотор крутится вперед и назад. Рукой его не остановить.
Сейчас управляя с кнопки мотор идет только в одну сторону и рукой можно остановить мотор
вы точно пробуете один и тот же мотор на одной и той же плате?
просто того, что вы пишете выше - не может быть, код управления мотором абсолютно одинаков.
с тестовым скетчем из первого поста мотор крутится вперед и назад. Рукой его не остановить.
Сейчас управляя с кнопки мотор идет только в одну сторону и рукой можно остановить мотор
вы точно пробуете один и тот же мотор на одной и той же плате?
просто того, что вы пишете выше - не может быть, код управления мотором абсолютно одинаков.
Все спаяно уже на постояннку. Мотор и ардуина та же. Драйвер тот же. Почему так сам не понимаю
вы точно пробуете один и тот же мотор на одной и той же плате?
просто того, что вы пишете выше - не может быть, код управления мотором абсолютно одинаков.
Да вставьте ему уже в начало лупа того скетча, что работает, while(LOW==digitalRead(A0)) {;} и что-то подобное перед степом возврата. Это же бесконечно будет - работает/не работает/не нравится.
Да вставьте ему уже в начало лупа того скетча, что работает, while(LOW==digitalRead(A0)) {;}
вставляй ты - твоя очередь :)
Мне почему-то кажется, что у меня результат будет тем же, что и сейчас.
Ради интереса - можешь попробовать найти ошибку в моем скетче, может и правда что-то проглядел. Я не вижу разницы в моем коде работы с мотором и в том, что, по отзывам ТС. работает
Да у меня уже есть такой товарищ, мне хватает ;) Два вечера дистанционно ошибку в коде искали, а оказалось что провод не контачит и мотор токо вибрирует, но не крутит.
сижу пробую. пока ни как
Мотор перестал менять напровление вообще. теперь только в одну сторону идет
Не надо сидеть, надо думать и пытаться понять, как драйвер работает. Берете мультиметр и смотрите, что на входе DIR происходит...
Не надо сидеть, надо думать и пытаться понять, как драйвер работает. Берете мультиметр и смотрите, что на входе DIR происходит...
4.8 вольта. Светодиод горит. 0 вольт светодиод погас. Мотор постоянно влево.
Драйвер менял
Проверяйте правильность подключения обмоток. Если на драйвере есть степ и меняется дир - скетч уже непричем.
Всем спасибо. Заменил мотор и все заработало