Управление ШД

astral_
Offline
Зарегистрирован: 02.12.2019

Здравствуйте, я новичок, плату 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

Calmness
Offline
Зарегистрирован: 29.10.2019

 не уверен ( сам только учусь) , но думаю проблема в том , что , допустим, после  строки  27,28 стаботал концевик , а скетч будет выполняться до 45 строки.  Не нравится конструкция в 25 и 55 строке ( возможный дребезг). Кроме того, а как подключены концевики и кнопки  ( с подтяжкой или без ) ?

astral_
Offline
Зарегистрирован: 02.12.2019

Концевики и кнопки подключены через резисторы 2,4 кОм. 

Calmness
Offline
Зарегистрирован: 29.10.2019

Через ?

 

Calmness
Offline
Зарегистрирован: 29.10.2019

Судя по скетчу  надо от пина ардуины , к которому поднлючены концевики и кнопки  на минус поставить резисторы 10-20 кОм. Или включить программную пдтяжку.

 

Calmness
Offline
Зарегистрирован: 29.10.2019

Т.е от 4-х пинов 4 резистора на минус

astral_
Offline
Зарегистрирован: 02.12.2019

Пин 5В соединен через резистор и кнопку, последовательно, с пинами 4,5,6,7

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

astral_ пишет:

Концевики и кнопки подключены через резисторы 2,4 кОм. 

 

К чему? Приведите схему подключения кнопок. Сдается мне, что когда кнопка не нажата, то пин просто болтается в воздухе и ловит наводки. Вот мотор и крутится.

astral_
Offline
Зарегистрирован: 02.12.2019

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

Calmness
Offline
Зарегистрирован: 29.10.2019

Пробуй. И переделай строки 25 и 55

 

 

astral_
Offline
Зарегистрирован: 02.12.2019

Как переделать?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

astral_ пишет:

Как переделать?

Подключить кнопки и концевики между пинами и землей. И включить внутреннии подтягивающие резисторы.

Ну и поменять в скетче проверку пинов с HIGH на LOW

Calmness
Offline
Зарегистрирован: 29.10.2019

Избавиться от дребезга. Я опрашиваю кнопку( концевик ) через 50 мсек. Если результат одинаковый- это и будет состояние кнопки. 

 

astral_
Offline
Зарегистрирован: 02.12.2019

Calmness
Offline
Зарегистрирован: 29.10.2019

нет

 

Calmness
Offline
Зарегистрирован: 29.10.2019

Пин 4 через кнопку на +5 В, пин 4 через резистор 10-20 к на минус. Остальные -по аналогии

Calmness
Offline
Зарегистрирован: 29.10.2019

Да, именно ТАК !!!

 

Calmness
Offline
Зарегистрирован: 29.10.2019

Резисторы 2,4 к - убрать

 

Calmness
Offline
Зарегистрирован: 29.10.2019
Calmness
Offline
Зарегистрирован: 29.10.2019

или так

 

astral_
Offline
Зарегистрирован: 02.12.2019

Т.е. если pinMode(b1, INPUT_PULLUP), то включается внутренний резистор?

Calmness
Offline
Зарегистрирован: 29.10.2019

да. Но  насколько я понимаю это подтяжка к + , соответственно в коде надо поменять статусы кнопок и концевиков

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

astral_ пишет:

Т.е. если pinMode(b1, INPUT_PULLUP), то включается внутренний резистор?

 

Да, а кнопку/концевик надо подключить между пином и землей безо всяких резисторов. Тогда когда кнопка не нажата на пине будет HIGH, а когда нажата - LOW

astral_
Offline
Зарегистрирован: 02.12.2019

В случае подключения внутренних резисторов пины не будут ловить наводки?

Calmness
Offline
Зарегистрирован: 29.10.2019

наодок не будет 100 %. Дребезг будет

 

bwn
Offline
Зарегистрирован: 25.08.2014

Calmness пишет:

наодок не будет 100 %. Дребезг будет

Не надо так категорично, чуть длиннее провод, чуть мощнее рядом стоящий двигатель, чуть поганее проводка и все поимеете. У пуллапов весьма высокое сопротивление.

То astral_ , здесь тема есть "Работа с кнопками.В помощь новичку", почитайте начало, идеологию. Не постите там ничего.

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

Calmness пишет:

наодок не будет 100 %. Дребезг будет

Не надо так категорично, чуть длиннее провод, чуть мощнее рядом стоящий двигатель, чуть поганее проводка и все поимеете. У пуллапов весьма высокое сопротивление.

примерно год назад обсуждали его номинал и цифры были не просто высокие - еще и очень разные чуть ли не на порядок разбег. 

astral_
Offline
Зарегистрирован: 02.12.2019

Я подключил внутренний резистор (подключил?), но двигатель вообще не работал, когда, ничего не меняя в программе последовательно кнопкам включил резисторы 10к, стало все норм, никаких задержек.

Calmness
Offline
Зарегистрирован: 29.10.2019

 Поздравляю, но не понимаю как это работает ?

astral_
Offline
Зарегистрирован: 02.12.2019

Секрет в том, что нужно выход 5в соединить с землей, номинал резистора не особо важен.

astral_
Offline
Зарегистрирован: 02.12.2019

nik182
Offline
Зарегистрирован: 04.05.2015

astral_ пишет:

А резистор зачем? В представленной схеме он только нагружает БП. 

astral_
Offline
Зарегистрирован: 02.12.2019

Без резистора не работает, и насколько он нагружает БП? Даже если не подключен внутренний резистор, ток будет 0.5 мА.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Вот три правильных варианта подключения кнопок к Ардуино

astral_
Offline
Зарегистрирован: 02.12.2019

Вариант 3 у меня не работал, 1,2 не знаю как применить для четырех входов.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

astral_ пишет:

Вариант 3 у меня не работал.

А ты в своем коде при этом

if (digitalRead(b1) == HIGH && digitalRead(l1) == HIGH)

на

if (digitalRead(b1) == LOW && digitalRead(l1) == LOW)

поменял?

Цитата:
1,2 не знаю как применить для четырех входов.

Точно так же как и нарисовано, только подключаешь к 4-м пинам 4 кнопки. Каждую к своему пину. 

astral_
Offline
Зарегистрирован: 02.12.2019

Поменял, если к каждому входу подключить, то потенциал по идее будет присутствовать на всех. Попробую завтра, хотя и так работает.

Calmness
Offline
Зарегистрирован: 29.10.2019

 что-то здесь не так... да и номинал если будет слишком маленький - это НАГРУЗКА и в итоге пробой ( или КЗ )

Calmness
Offline
Зарегистрирован: 29.10.2019

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

Calmness
Offline
Зарегистрирован: 29.10.2019

 Стесняюсь переспросить ,а чем первые два варианта отличаются от #5 ? А третий вариант не работал из-за того , что пин надо опрашивать в аналоге. Поправьте если не прав.

bwn
Offline
Зарегистрирован: 25.08.2014

1 = #5;
2 = !#5;
3 = !#5, но менее помехоустойчив из-за высокого сопротивления внутреннего резистора, зато снижаем количество дискретных элементов. Читать, как и предыдущие - HIGH/LOW || true/false.

nik182
Offline
Зарегистрирован: 04.05.2015

Нельзя прочитать четыре кнопки с одним внешним резистором. На каждую кнопку нужен свой.  

astral_
Offline
Зарегистрирован: 02.12.2019

nik182 пишет:

Нельзя прочитать четыре кнопки с одним внешним резистором. На каждую кнопку нужен свой.  

Так?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

astral_ пишет:

Так?

 

Нет

nik182
Offline
Зарегистрирован: 04.05.2015

Да. Так. И проверять - если кнопка нажата, то на ноге уровень LOW. Вот как делают кнопки на фирменных платах 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Нет

почему нет? - внешняя подтяжка, вроде все верно

b707
Offline
Зарегистрирован: 26.05.2017

astral_ пишет:

ну и бредовая схема....

astral_
Offline
Зарегистрирован: 02.12.2019

b707 пишет:

astral_ пишет:

ну и бредовая схема....

При этом рабочая

bwn
Offline
Зарегистрирован: 25.08.2014

astral_ пишет:

b707 пишет:

astral_ пишет:

ну и бредовая схема....

При этом рабочая

Ню, ню.

P/S А если резистор и БП помощнее, да омов поменьше, еще и зимой греться можно.

b707
Offline
Зарегистрирован: 26.05.2017

astral_ пишет:

b707 пишет:

astral_ пишет:

ну и бредовая схема....

При этом рабочая

рабочая до поры до времени. Стоит случайно подать на пины 4-7 HIGH и замкнуть кнопку - ардуина сгорит. Если поставить резистор поменьше - тоже.

А вот как раз для работы кнопки этот резистор абсолютно бесполезен

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

DetSimen пишет:

Нет

почему нет? - внешняя подтяжка, вроде все верно

Я почему- то подумал, что надо несколько кнопок к 1 аналоговому входу прицепить. Абознался.