Драйвер A4988 + Nema 17
- Войдите на сайт для отправки комментариев
Втр, 27/02/2018 - 13:25
Доброго всем дня!!! Прошу помощи исправить ошибку... В чем она заключается...
месяц назад, создал скетч для работы ШД Nema 17 с помощью драйвера A4988. все работало, был доволен!
Принцип работы такой -
при включении стоит!
при нажатии на кнопку BUTTON1, двигатель крутится в одну сторону,
при нажатии на кнопку BUTTON1, двигатель крутится в другую сторону,
сейчас стал собирать, работы нет!
сейчас работает так, при включении работает сразу в одну сторону...
Вот скетч:
const int stepPin = 3;
const int dirPin = 2;
const int BUTTON1 = 23;
const int BUTTON2 = 24;
const int LED1 = 4;
const int LED2 = 5;
const int LED3 = 6;
const int LED4 = 7;
const int LED5 = 8;
const int LED6 = 9;
const int LED7 = 10;
const int LED8 = 11;
const int LED9 = 12;
const int LED10 = 13;
void setup() {
// put your setup code here, to run once:
pinMode (stepPin, OUTPUT);
pinMode (dirPin, OUTPUT);
pinMode (BUTTON1, INPUT);
pinMode (BUTTON2, INPUT);
}
void loop() {
if (digitalRead(BUTTON1)==LOW)
{
}
else
{
digitalWrite(dirPin,LOW);
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
if (digitalRead(BUTTON2)==LOW)
{
}
else
{
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
}
}
Как же нет работы, если мотор крутится. Просто кнопку закоротило.
23 и 24 - это на какой плате пины?
Mega 2580!
Кнопки отключил, все равно, такая же картина!
Так у Вас кнопки в воздухе болтаются! Притяните их к земле (а лучше поменять уровни в программе и притянуть к питанию - на два резистора меньше).
Хорошо, а почему тогда при отключении кнопок, он все равно крутит?
а поменять как, подскажите?
Именно потому, то кнопки у Вас болтаются в воздухе. Потому и крутит. Более того, попробуйте подносить руки к пинам, где дожны быть кнопки, трогать их, или просто рядом руками водить - узнаете много интересного.
Чjо касается "как менять" - там много менять надо. Но, оставаяь в Вашей парадигме, просто поменяйте в строках 28 и 41 LOW на HIGH, а в строках 22 и 23 INPUT на INPUT_PULLUP. Конпки же будете подклюяать одним концом к пину, другим - к земле.
а можете тогда объяснить КАК надо написать скетч, что тут надо менять, или дать ссылку?
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
Ребята, а вопрос такой, можно ли здесь подключить матричную клавиатуру???
конечно. подключайте, кто запретил (говорил шёпотом)....
Ребята, а вопрос такой, можно ли здесь подключить матричную клавиатуру???
Если бы Вы не поленились ввести "Подключение матричной клавиатуры" в окне поиска в правом верхнем углу, то даже узнали бы как именно это делается.
А так-то, можно не только матричную - можно и полную от компьютера - никаких проблем.
См. стр. 19 и стр.24
Спасибо за каталог!!!
Евгений, такой вопрос! если я, допустим, подключаю 12 кнопок, мне нужно их подтянуть 12 резисторами (1 рез на каждую кнопку). А если подключаю матричную клаву, тонадо всего 4 диода! Правильно?
Обещяю, никому не скажу!!! (смеюсь)
Ну, почему? Можно любые кнопки через диоды включать, тем более, если их так много - сэкономите некоторое количество пинов. Например, Ваши 12 кнопок можно запросто через диоды подключить на 8 пинов. Посмотрите вот в этой теме схему подключения рулевого колеса (раздел 4.4), там 8 кнопок на 6 пинов подключены через диоды. Ниже там даётся описание, как для этого добра скетч писать.
P.S. Только сдаётся мне, Вы меня немного троллите. Ну, да Бог Вам судья :)
Ну, почему? Можно любые кнопки через диоды включать, тем более, если их так много - сэкономите некоторое количество пинов. Например, Ваши 12 кнопок можно запросто через диоды подключить на 8 пинов. Посмотрите вот в этой теме схему подключения рулевого колеса (раздел 4.4), там 8 кнопок на 6 пинов подключены через диоды. Ниже там даётся описание, как для этого добра скетч писать.
P.S. Только сдаётся мне, Вы меня немного троллите. Ну, да Бог Вам судья :)
Поверьте на слово, не троллю!!!
Евгений, еще один вопрос, не пойму куда подключать диоды в общий вывод номер 2! это на земля или что?
Вы про какую схему говорите?
См. стр. 19
вот про эту!
Этот вывод подключается к пину 2 (потому он и обозначен как 2), кстати, можно и к пину 3. На пин навешивается прерывание по FALLING. Тогда при каком либо событии на клавиатуре, произойдёт прерывание. Это избавляет от необходимости постоянного сканирования клавиатуры, как сделано в библиотеке keypad.h и разгружает контроллер. При таком подходе можно контроллер в сон погрузить, чтобы батарею не жрал, а по прерыванию он проснётся.
Есть другое решение, без диодов и без использования дополнительного пина. Оно основано на использовании прерываний PCINT. Пример кода и ссылка на скачивание соответствующей библиотеки есть у Гэммона.
То есть в моем варианте вывод 2 - это 4 вывод на самой клавиатуре?
Простите, я не понимю о чём Вы. Если о схеме на стр. 19 справа, то он присоедёинён через диоды сразу к четырём выводам клавиатуры, четвёртому, пятому, шестому и седьмому
там идет подключение на Arduino к 3,1,5 и 2,7,6,4!
как быть с выводом 2? он уже используется? его я так понимаю изменить надо на другой...
там идет подключение на Arduino к 3,1,5 и 2,7,6,4!
как быть с выводом 2? он уже используется? его я так понимаю изменить надо на другой...
1-7 это номера контактов на матричной клавиатуре, 2 на стрелочке - это 2-й вывод ардуино.
там идет подключение на Arduino к 3,1,5 и 2,7,6,4!
как быть с выводом 2? он уже используется? его я так понимаю изменить надо на другой...
То, что нарисовано на рыжей стрелке - это не вывод клавиатуры - это пин ардуины (можно третий использовать, если второй занят).
Все, Женя, понял спасибо за разьяснения!!! Удачи!
Всем спасибо!
Евгений, все заработало, еще раз спасибо! Вот такой еще есть вопро...
При включении ВСЕЙ системы Arduino, двигателей, идет 2-4 секундное дерганье двигателя.
А это можно как-то убрать? Резисторы это не убрали...
Там еще и двигатели есть, не только клавиатура. Давайте схему подключения.
Вот она... правда кнопки подключены обычные пока, не матрица!
const int stepPin = 39; const int dirPin = 38; const int BUTTON1 = 23; const int BUTTON2 = 24; void setup() { // put your setup code here, to run once: pinMode (stepPin, OUTPUT); pinMode (dirPin, OUTPUT); pinMode (BUTTON1, INPUT); pinMode (BUTTON2, INPUT); } void loop() { if (digitalRead(BUTTON1)==LOW) { } else { digitalWrite(dirPin,LOW); digitalWrite(stepPin,HIGH); delayMicroseconds(1000); digitalWrite(stepPin,LOW); delayMicroseconds(1000); } if (digitalRead(BUTTON2)==LOW) { } else { digitalWrite(dirPin,HIGH); digitalWrite(stepPin,LOW); delayMicroseconds(1000); digitalWrite(stepPin,HIGH); delayMicroseconds(1000); } }Схема - это такая картинка, типа вот такой
или, на худой конец, вот такой
Только покрупнее, чтобы всё видно было.
У меня матричная клава + Arduino MEGA 2580 --> драйвер A4988 -->ШД Nema 17
схема вот: https://a.pololu-files.com/picture/0J4069.1200x600.jpg?fb33c66a1952696461a6ca58613eeec9
Ну, это не Ваша схема, тут нет клавиатуры. В общем, если Вам лень нарисовать схему, то угадывать что у Вас там и как я точно не буду.
Могу сказать, что дергания при включении чаще всего бывают оттого, что в момент включения есть период, когда на пинах неопределённые значение. Потом контроллер его установит, но в момент включеня может вылезти что угодно. Помогет обычно притяжка пинов к земле (или к питанию - что нейтрально) каким-нибудь резистором, который не повредит остальному. ну попробуйте притянуть к земле Ваши дир и степ, резистором килоом в 10-50, но без схему это всё пальцем в небо.
"Ошибка доступа" там, а не схема...
Какой-то пароль требует - не пущает
А резисторы не помогли?
понял в чем проблема, сейчас решим!!!
вот вся cxема.
Питание самой Arduino MEGA 2580 идет от USB гнезда!
Просто уточняю - земли ардуины и драйвера соединяли? А землю Vmot и ардуины разъединяли?
+ к вопросу из поста #38. На Вашей схеме земли не соединены, а должны.
Так Вы попробовали резисторы на пины дир и степ? Не помогло?
Мерил тестером "массы" соединены! На всякий случай взял дополнительный провод и замкнул "массу" 5 В и "массу" 15 В. Результат 0! "Помехи" при включении все равно имеются!
Третий раз спрашиваю, резисторы ставили?
Евгений, только вчера добрался, да, забыл поставить! Теперь поставив, все работает!
Вот такой вопрос! почему теперь если нажать включение 1 двигателя, он работает на 100 %! а если включить сразу 2 двигателя то работают только по 50% каждый? Пробовал запитать и от 19 , и через кренки запитать каждый драйвер, и запитать каждый драйвер от отдельного блока питания -результат - 0, работают оба на 50%!
Да и ещё...
Мерил и ток и напряжение, просадки и при работе 1 двигателя и при 2-ух, нет !!!
Ну, правильно. Поставите 3 - юудут на 33% работать. У Вас же программа последовательная с задержками. Т.е. у Вас половину времени работает оди двигатель, а другой ждёт, а другую половину наоборот. У Вас так программа написана в посте #28
А как прописать чтобы работали паралельно?
вот весь скетч!
const int stepPin1 = 39; const int dirPin1 = 38; const int stepPin2 = 41; const int dirPin2 = 40; const int BUTTON1 = 22; const int BUTTON2 = 23; const int BUTTON3 = 24; const int BUTTON4 = 25; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode (stepPin1, OUTPUT); pinMode (dirPin1, OUTPUT); pinMode (stepPin2, OUTPUT); pinMode (dirPin2, OUTPUT); pinMode (BUTTON1, INPUT); pinMode (BUTTON2, INPUT); pinMode (BUTTON3, INPUT); pinMode (BUTTON4, INPUT); } void loop() { //////////////////////////////// if (digitalRead(BUTTON1)==LOW) { } else { digitalWrite(dirPin1,LOW); digitalWrite(stepPin1,HIGH); delayMicroseconds(1000); digitalWrite(stepPin1,LOW); delayMicroseconds(1000); } if (digitalRead(BUTTON2)==LOW) { } else { digitalWrite(dirPin1,HIGH); digitalWrite(stepPin1,LOW); delayMicroseconds(1000); digitalWrite(stepPin1,HIGH); delayMicroseconds(1000); } ///////////////////////////////// if (digitalRead(BUTTON3)==LOW) { } else { digitalWrite(dirPin2,LOW); digitalWrite(stepPin2,HIGH); delayMicroseconds(1000); digitalWrite(stepPin2,LOW); delayMicroseconds(1000); } if (digitalRead(BUTTON4)==LOW) { } else { digitalWrite(dirPin2,HIGH); digitalWrite(stepPin2,LOW); delayMicroseconds(1000); digitalWrite(stepPin2,HIGH); delayMicroseconds(1000); } }Для начала избавиться от всех delay*.
то есть избавиться от
delayMicroseconds(1000); digitalWrite(stepPin1,HIGH); delayMicroseconds(1000);этих строчек?
От всех строк, где встречается delay, delayMicroseconds и их аналоги.
Внутренний еретик мне подсказывает, что если перегруппировать код, то и с делеями потянет. Ведь жалоба не на кнопки, а на моторы.
По схеме надо бы явным образом энэйбл на плюс повесить, а мс- на землю.
Внутренний еретик мне подсказывает, что если перегруппировать код, то и с делеями потянет. Ведь жалоба не на кнопки, а на моторы.
Замучаешья с логикой.
Да и решение немасштабируемое.
Как бы каждый последующий мотор должен добавляться легко и непринужденно, а если оставить структуру программы, то нужно разбросать кучу новых операторов вперемешку с уже существующим кодом, при этом обернув их в правильные условия.
Переписать - дешевле.