Управление ШД
- Войдите на сайт для отправки комментариев
Пнд, 02/12/2019 - 22:26
Здравствуйте, я новичок, плату Arduino использую первый раз. Мне нужно управлять шаговым двигателем, нужно только менять направление и подключить концевики, схему я собрал, написал программу, ШД работает, но при срабатывании концевика или отпускании кнопки ШД вращается еще 5 сек. Почему?
int b1 = 4; int l1 = 5; int b2 = 6; int l2 = 7; int f1 = 9; int f2 = 10; int f3 = 11; int f4 = 12; int buttonState = 0; void setup() { pinMode(b1, INPUT); pinMode(b2, INPUT); pinMode(l1, INPUT); pinMode(l2, INPUT); pinMode(f1, OUTPUT); pinMode(f2, OUTPUT); pinMode(f3, OUTPUT); pinMode(f4, OUTPUT); } void loop() { if (digitalRead(b1) == HIGH && digitalRead(l1) == HIGH) { digitalWrite(f4, LOW); digitalWrite(f1, HIGH); delay(10); digitalWrite(f1, LOW); digitalWrite(f2, HIGH); delay(10); digitalWrite(f2, LOW); digitalWrite(f3, HIGH); delay(10); digitalWrite(f3, LOW); digitalWrite(f4, HIGH); delay(10); } else { digitalWrite(f1, LOW); digitalWrite(f2, LOW); digitalWrite(f3, LOW); digitalWrite(f4, LOW); } if (digitalRead(b2) == HIGH && digitalRead(l2) == HIGH) { digitalWrite(f1, LOW); digitalWrite(f4, HIGH); delay(10); digitalWrite(f4, LOW); digitalWrite(f3, HIGH); delay(10); digitalWrite(f3, LOW); digitalWrite(f2, HIGH); delay(10); digitalWrite(f2, LOW); digitalWrite(f1, HIGH); delay(10); } else { digitalWrite(f1, LOW); digitalWrite(f2, LOW); digitalWrite(f3, LOW); digitalWrite(f4, LOW); } }
b-кнопки, l-концевики, плата Arduino Uno
не уверен ( сам только учусь) , но думаю проблема в том , что , допустим, после строки 27,28 стаботал концевик , а скетч будет выполняться до 45 строки. Не нравится конструкция в 25 и 55 строке ( возможный дребезг). Кроме того, а как подключены концевики и кнопки ( с подтяжкой или без ) ?
Концевики и кнопки подключены через резисторы 2,4 кОм.
Через ?
Судя по скетчу надо от пина ардуины , к которому поднлючены концевики и кнопки на минус поставить резисторы 10-20 кОм. Или включить программную пдтяжку.
Т.е от 4-х пинов 4 резистора на минус
Пин 5В соединен через резистор и кнопку, последовательно, с пинами 4,5,6,7
Концевики и кнопки подключены через резисторы 2,4 кОм.
К чему? Приведите схему подключения кнопок. Сдается мне, что когда кнопка не нажата, то пин просто болтается в воздухе и ловит наводки. Вот мотор и крутится.
Так и есть, пин просто отключается при отжатой кнопке. я думал о наводках, но меня смутила то, что двигатель работает всегда именно 5 сек.
Пробуй. И переделай строки 25 и 55
Как переделать?
Как переделать?
Подключить кнопки и концевики между пинами и землей. И включить внутреннии подтягивающие резисторы.
Ну и поменять в скетче проверку пинов с HIGH на LOW
Избавиться от дребезга. Я опрашиваю кнопку( концевик ) через 50 мсек. Если результат одинаковый- это и будет состояние кнопки.
нет
Пин 4 через кнопку на +5 В, пин 4 через резистор 10-20 к на минус. Остальные -по аналогии
Да, именно ТАК !!!
Резисторы 2,4 к - убрать
http://arduino.ru/forum/apparatnye-voprosy/pullup-vmesto-rezistora-dlya-knopki
или так
Т.е. если pinMode(b1, INPUT_PULLUP), то включается внутренний резистор?
да. Но насколько я понимаю это подтяжка к + , соответственно в коде надо поменять статусы кнопок и концевиков
Т.е. если pinMode(b1, INPUT_PULLUP), то включается внутренний резистор?
Да, а кнопку/концевик надо подключить между пином и землей безо всяких резисторов. Тогда когда кнопка не нажата на пине будет HIGH, а когда нажата - LOW
В случае подключения внутренних резисторов пины не будут ловить наводки?
наодок не будет 100 %. Дребезг будет
наодок не будет 100 %. Дребезг будет
Не надо так категорично, чуть длиннее провод, чуть мощнее рядом стоящий двигатель, чуть поганее проводка и все поимеете. У пуллапов весьма высокое сопротивление.
То astral_ , здесь тема есть "Работа с кнопками.В помощь новичку", почитайте начало, идеологию. Не постите там ничего.
наодок не будет 100 %. Дребезг будет
Не надо так категорично, чуть длиннее провод, чуть мощнее рядом стоящий двигатель, чуть поганее проводка и все поимеете. У пуллапов весьма высокое сопротивление.
примерно год назад обсуждали его номинал и цифры были не просто высокие - еще и очень разные чуть ли не на порядок разбег.
Я подключил внутренний резистор (подключил?), но двигатель вообще не работал, когда, ничего не меняя в программе последовательно кнопкам включил резисторы 10к, стало все норм, никаких задержек.
Поздравляю, но не понимаю как это работает ?
Секрет в том, что нужно выход 5в соединить с землей, номинал резистора не особо важен.
А резистор зачем? В представленной схеме он только нагружает БП.
Без резистора не работает, и насколько он нагружает БП? Даже если не подключен внутренний резистор, ток будет 0.5 мА.
Вот три правильных варианта подключения кнопок к Ардуино
Вариант 3 у меня не работал, 1,2 не знаю как применить для четырех входов.
Вариант 3 у меня не работал.
А ты в своем коде при этом
if
(digitalRead(b1) == HIGH && digitalRead(l1) == HIGH)
на
if
(digitalRead(b1) == LOW && digitalRead(l1) == LOW)
поменял?
Точно так же как и нарисовано, только подключаешь к 4-м пинам 4 кнопки. Каждую к своему пину.
Поменял, если к каждому входу подключить, то потенциал по идее будет присутствовать на всех. Попробую завтра, хотя и так работает.
что-то здесь не так... да и номинал если будет слишком маленький - это НАГРУЗКА и в итоге пробой ( или КЗ )
Лишний раз убеждаюсь , что привычка- вторая натура. Всегда пользуюсь внешними и результат стремится к 100 % .
Стесняюсь переспросить ,а чем первые два варианта отличаются от #5 ? А третий вариант не работал из-за того , что пин надо опрашивать в аналоге. Поправьте если не прав.
1 = #5;
2 = !#5;
3 = !#5, но менее помехоустойчив из-за высокого сопротивления внутреннего резистора, зато снижаем количество дискретных элементов. Читать, как и предыдущие - HIGH/LOW || true/false.
Нельзя прочитать четыре кнопки с одним внешним резистором. На каждую кнопку нужен свой.
Нельзя прочитать четыре кнопки с одним внешним резистором. На каждую кнопку нужен свой.
Так?
Так?
Нет
Да. Так. И проверять - если кнопка нажата, то на ноге уровень LOW. Вот как делают кнопки на фирменных платах
Нет
почему нет? - внешняя подтяжка, вроде все верно
ну и бредовая схема....
ну и бредовая схема....
При этом рабочая
ну и бредовая схема....
При этом рабочая
Ню, ню.
P/S А если резистор и БП помощнее, да омов поменьше, еще и зимой греться можно.
ну и бредовая схема....
При этом рабочая
рабочая до поры до времени. Стоит случайно подать на пины 4-7 HIGH и замкнуть кнопку - ардуина сгорит. Если поставить резистор поменьше - тоже.
А вот как раз для работы кнопки этот резистор абсолютно бесполезен
Нет
почему нет? - внешняя подтяжка, вроде все верно
Я почему- то подумал, что надо несколько кнопок к 1 аналоговому входу прицепить. Абознался.