Шаговый двигатель и кнопки

Helluin
Offline
Зарегистрирован: 25.04.2019

Есть программа для управления ШД с кнопок, МК arduino nano, Шаговый двигатель 28BYJ-48 с драйвером ULN2003.

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

01#include <Stepper.h>
02#define STEPS 200 // Количество шагов
03Stepper stepper(STEPS, 12, 11, 10, 9);
04// клавиши
05int pinButtons1[]={4,7};
06int lastButtons1[]={0,0};
07int currentButtons1[]={0,0};
08int countButtons1=2;
09void setup()
10{
11stepper.setSpeed(50);
12}
13void loop()
14{
15// проверка нажатия кнопок
16for(int i=0;i<countButtons1;i++)
17{
18currentButtons1[i] = debounce(lastButtons1[i],pinButtons1[i]);
19if (lastButtons1[i] == 0 && currentButtons1[i] == 1)
20// если нажатие...
21{
22if(i==0)
23stepper.step(10*STEPS);
24else
25stepper.step(-10*STEPS);
26}
27lastButtons1[i] = currentButtons1[i];
28}
29}
30// Функция сглаживания дребезга
31int debounce(int last,int pin1)
32{
33int current = digitalRead(pin1); // Считать состояние кнопки
34if (last != current) // если изменилось...
35{
36delay(5); // ждем 5 м с
37current = digitalRead(pin1); // считываем состояние кнопки
38return current; // возвращаем состояние кнопки
39}
40}

 

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

похоже что кнопки без подтяжки (они даже в сетапе не описаны) и ловят из эфира случайные нажатия

Helluin
Offline
Зарегистрирован: 25.04.2019

Я установил резисторы на 10 кОм на соединение кнопки с землей. как правильно прописать что он не возращался на место?

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

Helluin пишет:

Я установил резисторы на 10 кОм на соединение кнопки с землей. как правильно прописать что он не возращался на место?

нарисуйте схему, пожалуйста. Я не понимаю что такое "резистор на соединение с землей"

svm
Offline
Зарегистрирован: 06.11.2016

Посмотрите стоки 22-25. Если кнопка нажата - вперед на 10 шагов. Если отпущена - назад. Что не так? Или нажать и держать или закомментировать строку 25.

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

svm пишет:

Посмотрите стоки 22-25. Если кнопка нажата - вперед на 10 шагов. Если отпущена - назад.

посмотрите внимательнее - там else относится к другому условию

Helluin
Offline
Зарегистрирован: 25.04.2019

вот таким образом кнопка подключена

-NMi-
Offline
Зарегистрирован: 20.08.2018

АчО, намана! Гвозди и палки + чуть-чуть клея.  :))      ЭтоЖ по-нашему :))

Helluin
Offline
Зарегистрирован: 25.04.2019

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

strarbit
Offline
Зарегистрирован: 12.06.2016

ответ #4 от господин svm. #5 от господин b707

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Helluin пишет:

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

Написать НОРМАЛЬНЫЙ алгоритм работы с кнопкой и перевести его на си++.

svm
Offline
Зарегистрирован: 06.11.2016

b707 пишет:

svm пишет:

Посмотрите стоки 22-25. Если кнопка нажата - вперед на 10 шагов. Если отпущена - назад.

посмотрите внимательнее - там else относится к другому условию

Пардон, погорячился.

Helluin
Offline
Зарегистрирован: 25.04.2019

mykaida пишет:

Написать НОРМАЛЬНЫЙ алгоритм работы с кнопкой и перевести его на си++.

 

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

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

Helluin пишет:

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

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Helluin пишет:

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

Еще раз говорю про алгоритм. Ну да Вы все лучше знаете...

Короче условия в строке 19 срабатывают при i=0 и i=1 - дальше объяснять?

А для проверки напишите простенькую программу

1void loop()
2{
3stepper.step(10*STEPS);
4stepper.step(-10*STEPS);
5}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

strarbit пишет:

ответ #4 от господин svm. #5 от господин b707

в русском языке слово господин подразумевается как ругательное, лучше говорить товарищ

а для невозврата закомментировать строку 25 (после else)

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

Не вводите иностранца в заблуждение =)) Это "Интеллегент" - слово ругательное во все времена, а господ сейчас развелось как грязи.

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

ua6em пишет:

в русском языке слово господин подразумевается как ругательное, лучше говорить товарищ

а для невозврата закомментировать строку 25 (после else)

оба утверждения неверны

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

в русском языке слово господин подразумевается как ругательное, лучше говорить товарищ

а для невозврата закомментировать строку 25 (после else)

оба утверждения неверны

1. если есть господин подразумевается, что есть и рабы, где там ваши плантации?

2. если закомментировать 25 строку, то по моему мнению не выполнится программа обратного осчёта 200 шагов шагового мотора, а по вашему мнению, что именно она не сделает?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Не вводите иностранца в заблуждение =)) Это "Интеллегент" - слово ругательное во все времена, а господ сейчас развелось как грязи.

я думал их в далёком 1918 ликвидировали, ан нет )))

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

 

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

ua6em пишет:

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


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

Вы ведь не поправляете продавцов на алиэкспрессе, когда величают "другом", а то и вовсе "дорогой", а выходцы из средней азии, часто братом считают? И шо, всех великому и могучему переучивать? Мы по ихнему, в большинстве случаев, совсем никак. ИМХО.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

По ихнему, это кто как, общался и с королём Иордании, Хусейном и с Радживом Ганди да и во время Сочинской олимпиады более чем с 20000 (Двадцатью тысячами) пообщался, так что это немножко больше - чем никак )))

Helluin
Offline
Зарегистрирован: 25.04.2019

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

01#include <Stepper.h>
02#define STEPS 200 // Количество шагов
03Stepper stepper(STEPS, 12, 11, 10, 9);
04// клавиши
05int pinButtons1[]={4,7};
06int lastButtons1[]={0,0};
07int currentButtons1[]={0,0};
08int countButtons1=2;
09void setup()
10{
11stepper.setSpeed(50);
12}
13void loop()
14{
15// проверка нажатия кнопок
16for(int i=0;i<countButtons1;i++)
17{
18currentButtons1[i] = debounce(lastButtons1[i],pinButtons1[i]);
19if (lastButtons1[i] == 0 && currentButtons1[i] == 1)
20// если нажатие...
21{
22if(i==0)
23stepper.step(10*STEPS);
24else
25stepper.step(-10*STEPS);
26}
27lastButtons1[i] = currentButtons1[i];
28}
29}
30// Функция сглаживания дребезга
31int debounce(int last,int pin1)
32{
33int current = digitalRead(pin1); // Считать состояние кнопки
34if (last != current) // если изменилось...
35{
36delay(5); // ждем 5 м с
37current = digitalRead(pin1); // считываем состояние кнопки
38return current; // возвращаем состояние кнопки
39}
40else
41{
42return last;
43}
44}

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Helluin пишет:

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

Поздравляю! Вас в это тыкали носом-тыкали, наконец Вы созрели.