Драйвер A4988 + Nema 17

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Доброго всем дня!!! Прошу помощи исправить ошибку... В чем она заключается...

месяц назад, создал скетч для работы ШД 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);  
}

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Как же нет работы, если мотор крутится. Просто кнопку закоротило.

23 и 24 - это на какой плате пины?

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Mega 2580!

Кнопки отключил, все равно, такая же картина!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так у Вас кнопки в воздухе болтаются! Притяните их к земле (а лучше поменять уровни в программе и притянуть к питанию - на два резистора меньше).

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Хорошо, а почему тогда при отключении кнопок, он все равно крутит?

а поменять как, подскажите?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Именно потому, то кнопки у Вас болтаются в воздухе. Потому и крутит. Более того, попробуйте подносить руки к пинам, где дожны быть кнопки, трогать их, или просто рядом руками водить - узнаете много интересного.

Чjо касается "как менять" - там много менять надо. Но, оставаяь в Вашей парадигме, просто поменяйте в строках 28 и 41 LOW на HIGH, а в строках 22 и 23 INPUT на INPUT_PULLUP. Конпки же будете подклюяать одним концом к пину, другим - к земле.

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

а можете тогда объяснить КАК надо написать скетч, что тут надо менять, или дать ссылку?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Vitali-71
Offline
Зарегистрирован: 25.04.2017

Ребята, а вопрос такой, можно ли здесь подключить матричную клавиатуру???

 

vvadim
Offline
Зарегистрирован: 23.05.2012

конечно. подключайте, кто запретил (говорил шёпотом)....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vitali-71 пишет:

Ребята, а вопрос такой, можно ли здесь подключить матричную клавиатуру???

Если бы Вы не поленились ввести "Подключение матричной клавиатуры" в окне поиска в правом верхнем углу, то даже узнали бы как именно это делается.

А так-то, можно не только матричную - можно и полную от компьютера - никаких проблем.

См. стр. 19 и стр.24

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Спасибо за каталог!!!

Евгений, такой вопрос! если я, допустим, подключаю 12 кнопок, мне нужно их подтянуть 12 резисторами (1 рез на каждую кнопку). А если подключаю матричную клаву, тонадо всего 4 диода! Правильно?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Обещяю, никому не скажу!!! (смеюсь)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, почему? Можно любые кнопки через диоды включать, тем более, если их так много - сэкономите некоторое количество пинов. Например, Ваши 12 кнопок можно запросто через диоды подключить на 8 пинов. Посмотрите вот в этой теме схему подключения рулевого колеса (раздел 4.4), там 8 кнопок на 6 пинов подключены через диоды. Ниже там даётся описание, как для этого добра скетч писать.

P.S. Только сдаётся мне, Вы меня немного троллите. Ну, да Бог Вам судья :)

Vitali-71
Offline
Зарегистрирован: 25.04.2017

ЕвгенийП пишет:

Ну, почему? Можно любые кнопки через диоды включать, тем более, если их так много - сэкономите некоторое количество пинов. Например, Ваши 12 кнопок можно запросто через диоды подключить на 8 пинов. Посмотрите вот в этой теме схему подключения рулевого колеса (раздел 4.4), там 8 кнопок на 6 пинов подключены через диоды. Ниже там даётся описание, как для этого добра скетч писать.

P.S. Только сдаётся мне, Вы меня немного троллите. Ну, да Бог Вам судья :)

Поверьте на слово, не троллю!!!

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Евгений, еще один вопрос, не пойму куда подключать диоды в общий вывод номер 2! это на земля или что?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы про какую схему говорите?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

См. стр. 19

вот про эту!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Этот вывод подключается к пину 2 (потому он и обозначен как 2), кстати, можно и к пину 3. На пин навешивается прерывание по FALLING. Тогда при каком либо событии на клавиатуре, произойдёт прерывание. Это избавляет от необходимости постоянного сканирования клавиатуры, как сделано в библиотеке keypad.h и разгружает контроллер. При таком подходе можно контроллер в сон погрузить, чтобы батарею не жрал, а по прерыванию он проснётся.

Есть другое решение, без диодов  и без использования дополнительного пина. Оно основано на использовании прерываний PCINT. Пример кода и ссылка на скачивание соответствующей библиотеки есть у Гэммона.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

То есть в моем варианте вывод 2 - это 4 вывод на самой клавиатуре?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, я не понимю о чём Вы. Если о схеме на стр. 19 справа, то он присоедёинён через диоды сразу к четырём выводам клавиатуры, четвёртому, пятому, шестому и седьмому

Vitali-71
Offline
Зарегистрирован: 25.04.2017

См. стр. 19

там идет подключение на Arduino к 3,1,5 и 2,7,6,4!

как быть с выводом 2? он уже используется? его я так понимаю изменить надо на другой...

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Vitali-71 пишет:

там идет подключение на Arduino к 3,1,5 и 2,7,6,4!

как быть с выводом 2? он уже используется? его я так понимаю изменить надо на другой...

1-7 это номера контактов на матричной клавиатуре, 2 на стрелочке - это 2-й вывод ардуино.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vitali-71 пишет:

См. стр. 19

там идет подключение на Arduino к 3,1,5 и 2,7,6,4!

как быть с выводом 2? он уже используется? его я так понимаю изменить надо на другой...

То, что нарисовано на рыжей стрелке - это не вывод клавиатуры - это пин ардуины (можно третий использовать, если второй занят).

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Все, Женя, понял спасибо за разьяснения!!! Удачи!

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Всем спасибо!

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Евгений, все заработало, еще раз спасибо! Вот такой еще есть вопро...

При включении ВСЕЙ системы Arduino, двигателей, идет 2-4 секундное дерганье двигателя. 

А это можно как-то убрать? Резисторы это не убрали...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Там еще и двигатели есть, не только клавиатура. Давайте схему подключения.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Вот она... правда кнопки подключены обычные пока, не матрица!


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);  
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Схема - это такая картинка, типа вот такой

или, на худой конец, вот такой

Только покрупнее, чтобы всё видно было.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

У меня матричная клава + Arduino MEGA 2580 --> драйвер A4988 -->ШД Nema 17

схема вот: https://a.pololu-files.com/picture/0J4069.1200x600.jpg?fb33c66a1952696461a6ca58613eeec9

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это не Ваша схема, тут нет клавиатуры. В общем, если Вам лень нарисовать схему, то угадывать что у Вас там и как я точно не буду.

Могу сказать, что дергания при включении чаще всего бывают оттого, что в момент включения есть период, когда на пинах неопределённые значение. Потом контроллер его установит, но в момент включеня может вылезти что угодно. Помогет обычно притяжка пинов к земле (или к питанию - что нейтрально) каким-нибудь резистором, который не повредит остальному. ну попробуйте притянуть к земле Ваши дир и степ, резистором килоом в 10-50, но без схему это всё пальцем в небо.

Vitali-71
Offline
Зарегистрирован: 25.04.2017
kalapanga
Offline
Зарегистрирован: 23.10.2016

"Ошибка доступа" там, а не схема...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Какой-то пароль требует - не пущает

А резисторы не помогли?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

понял в чем проблема, сейчас решим!!!

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Vitali-71
Offline
Зарегистрирован: 25.04.2017

вот вся cxема.

Питание самой Arduino MEGA 2580 идет от USB гнезда!

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто уточняю - земли ардуины и драйвера соединяли? А землю Vmot и ардуины разъединяли?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

+ к вопросу из поста #38. На Вашей схеме земли не соединены, а должны.

Так Вы попробовали резисторы на пины дир и степ? Не помогло?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Мерил тестером "массы" соединены! На всякий случай взял дополнительный провод и замкнул "массу" 5 В и "массу" 15 В. Результат 0! "Помехи" при включении все равно имеются!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Третий раз спрашиваю, резисторы ставили?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Евгений, только вчера добрался, да, забыл поставить! Теперь поставив, все работает!

Вот такой вопрос! почему теперь если нажать включение 1 двигателя, он работает на 100 %! а если включить сразу 2 двигателя то работают только по 50% каждый? Пробовал запитать и от 19 , и через кренки запитать каждый драйвер, и запитать каждый драйвер от отдельного блока питания -результат - 0, работают оба на 50%!

 

Да и ещё...

Мерил и ток и напряжение, просадки и при работе 1 двигателя и при 2-ух, нет !!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, правильно. Поставите 3 - юудут на 33% работать. У Вас же программа последовательная с задержками. Т.е. у Вас половину времени работает оди двигатель, а другой ждёт, а другую половину наоборот. У Вас так программа написана в посте #28

Vitali-71
Offline
Зарегистрирован: 25.04.2017

А как прописать чтобы работали паралельно?

вот весь скетч!

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);  
}
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала избавиться от всех delay*.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

то есть избавиться от


    delayMicroseconds(1000);
    digitalWrite(stepPin1,HIGH);
    delayMicroseconds(1000);  

этих строчек?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

От всех строк, где встречается delay, delayMicroseconds и их аналоги.

sadman41
Offline
Зарегистрирован: 19.10.2016

Внутренний еретик мне подсказывает, что если перегруппировать код, то и с делеями потянет. Ведь жалоба не на кнопки, а на моторы.

inspiritus
Offline
Зарегистрирован: 17.12.2012

По схеме надо бы явным образом энэйбл на плюс повесить, а мс- на землю.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Внутренний еретик мне подсказывает, что если перегруппировать код, то и с делеями потянет. Ведь жалоба не на кнопки, а на моторы.

Замучаешья с логикой.

Да и решение немасштабируемое.

Как бы каждый последующий мотор должен добавляться легко и непринужденно, а если оставить структуру программы, то нужно разбросать кучу новых операторов вперемешку с уже существующим кодом, при этом обернув их в правильные условия.

Переписать - дешевле.