Вопрос по скетчу. Управление шаговым мотором по кнопке.

Levch
Offline
Зарегистрирован: 03.04.2018

Всем привет. 

Пытаюсь реализовать идею по управлению заслонками воздуховода по датчику СО2. Для этого собрал макет, на котором пытаюсь управлять шаговым мотором по кнопке.

Скетч суперпростой, но работает не так, как я предполагаю. Просто не понимаю, в чем коосяк. Помогите, пожалуйста:

Алгоритм такой:

Нажимаю кнопку (пришел сигнал с датчика), двигатель должен сделать какое-то кол-во шагов (пусть 1000) и остановиться (открыл заслонку).

Отпускаю кнопку - те же 1000 шагов назад и остановиться.

 

А на практике получается, что при нажатой кнопке ничего не происходит, а при отжатой мотор ходит туда-сюда в цикле.

Кнопка напрямую подключена к 5-му пину и к земле. Для проверки даже повесил диод, отображающий состояние переменной x. Он синхронно с мотором включается (в одну сторону) и выключается (в другую сторону).

Скетч:

#include <AFMotor.h>

// Motor with 200 steps per rev (1.8 degree) to motor port #2 (M3 and M4)

AF_Stepper motor(200, 2);

int x=0; //смысл переменной, 0-начальное положение мотора, 1-конечное положение

void setup() {

motor.setSpeed(600); // 600 rpm

pinMode(A5, INPUT);

pinMode(13, OUTPUT);

}

void loop()

{

int button = digitalRead(A5); //переменная со значением кнопки (High, low)

  if ((button == HIGH) && (x==0)) { //И кнопка нажата и мотор в начальном положении

      motor.step(1000, FORWARD, DOUBLE); //покрутить 1000 шагов

      motor.release(); //снять напряжение с обмоток

      x=1; //конечное положение мотора 

      delay(1000);

      }

   if ((button == LOW) &&  (x==1)) { кнопка отпущена и мотор в конечном положении

      motor.step(1000, BACKWARD, DOUBLE); //возвращаем мотор в начальное положение

      motor.release(); //снять напряжение с обмоток

      x=0; //зафиксировали начальное положение мотора

      delay(1000);

 }

 if (x==1) {  

  digitalWrite (13, HIGH); //зажигаем диод при конечном положении мотора

 }

 else {

 digitalWrite (13, LOW); //тушим диод 

 }

 }

Подскажите, пожалуйста, что не так?

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

Levch пишет:

Кнопка напрямую подключена к 5-му пину и к земле. 

Пятому аналговому пину? Или цифровому?

Допустим. что пин правильный, если она подключена "напрямую к 5-му пину и к земле", и инициализируется в строке №13, то объясните мне: когда, где и при каких обстоятельствах на ней может появиться HIGH?

Levch
Offline
Зарегистрирован: 03.04.2018

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

Пятому аналговому пину? Или цифровому?

К аналоговому.

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

когда, где и при каких обстоятельствах на ней может появиться HIGH

Блин, сори, через кнопку не к земле, а к +5в подключен.

 

И сверху еще присоединен MotorShield.

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

Levch пишет:

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

когда, где и при каких обстоятельствах на ней может появиться HIGH

Блин, сори, через кнопку не к земле, а к +5в подключен.

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

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

Levch
Offline
Зарегистрирован: 03.04.2018

Огромное спасибо. 

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

Levch
Offline
Зарегистрирован: 03.04.2018

Но сомнения есть все равно, т.к. макет реагирует на кнопку - при разомкнутой кнопке мотор елозит туда/сюда, как только нажимаю - мотор уходит в конечное положение (х==1) и останавливается. Но вечером попробую с резистором.

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

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

Кнопку заводите на землю, а в строке 13 вместо INPUT пишете INPUT_PULLUP и никакой резистор не нужен. 

В результате при НЕнажатой кнопке на пине будет HIGH, при нажатой - LOW. 

А то там случайное значение, вот он у Вас и "елозит".

Levch
Offline
Зарегистрирован: 03.04.2018

Евгений, спасибо большое, все получилось!

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

Не за что

alvmd932
Offline
Зарегистрирован: 12.02.2020

Добрый день.

Можно программу предложенную Levch запустить на Ардуино нано?

 

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

alvmd932 пишет:

Можно программу предложенную Levch запустить на Ардуино нано?

Вам требуется разрешение на это? Ну, ладно, я разрешаю, запускайте.

alvmd932
Offline
Зарегистрирован: 12.02.2020

За разрешение спасибо (:

Но я имел в виду техническую сторону.

У меня сплошные ошибки в ардуино нано. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Наврядли эти ошибки связаны с формфактором Arduino.

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

alvmd932 пишет:

У меня сплошные ошибки в ардуино нано. 

Бывает, чё ...

alvmd932
Offline
Зарегистрирован: 12.02.2020
Вот последние строки.
 
stepper_speedControl5:32: error: stray '\' in program
stepper_speedControl5.ino: In function 'void loop()':
stepper_speedControl5:22: error: 'x' was not declared in this scope
stepper_speedControl5:32: error: 'x' was not declared in this scope
stepper_speedControl5:32: error: 'u043a' was not declared in this scope
stepper_speedControl5:32: error: expected ';' before 'u043d'
stepper_speedControl5:41: error: expected '}' at end of input
stepper_speedControl5:41: error: expected '}' at end of input
stray '\' in program
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

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

alvmd932 пишет:

Вот последние строки.
 
stepper_speedControl5:32: error: stray '\' in program
stepper_speedControl5.ino: In function 'void loop()':
stepper_speedControl5:22: error: 'x' was not declared in this scope
stepper_speedControl5:32: error: 'x' was not declared in this scope
stepper_speedControl5:32: error: 'u043a' was not declared in this scope
stepper_speedControl5:32: error: expected ';' before 'u043d'
stepper_speedControl5:41: error: expected '}' at end of input
stepper_speedControl5:41: error: expected '}' at end of input
stray '\' in program
 

код правильно скопируйте, там кнопка для этого есть

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

ua6em пишет:

код правильно скопируйте, там кнопка для этого есть

Ну, не может человек. Пусть руками набивает. А там и селёдка действовать начнёт.

alvmd932
Offline
Зарегистрирован: 12.02.2020

Я именно этой кнопкой и копировал.

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

Ну, я же и говорю - набивайте руками. Никому ведь на самом деле неинтересно это Вы не уеете копировать или Levch вставлять. Результат на табло. Так что у Вас два варианта - или научиться нормально копировать, или вбить руками как я Вам уже писал.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Чего набросились не посмотрев даже? Не в копировании тут дело. Там просто знак комментария потерян в строке №37. 

alvmd932, восстанови его и всё будет пучком.

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

Ну, тогда "сорри". А симптоматика действительно как от криворукого копирования.

alvmd932
Offline
Зарегистрирован: 12.02.2020

Можно конечно и руками набить, но я сравниваю в блокноте то что я скопировал и то что есть в сообщении Levch и не вижу разницы, кроме наличия нумерации строк. Это важно? Я далеко не программист и поэтому просил совета. Кстати копировал точно также кнопкой с сайта https://arduinomaster.ru/  и таких проблем не было.

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

Ну, Вам же уже сказали в посте #20, что дело не копировании. Да, я ошибся - невнимательно посмотрел. Извините. Вопрос о копировании закрыт, надеюсь?

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

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

Ну, Вам же уже сказали в посте #20, что дело не копировании. Да, я ошибся - невнимательно посмотрел. Извините. Вопрос о копировании закрыт, надеюсь?

О! а я и не смотрел!!! Увидел, что компилятор на UTF-8 ругаеццо и, предположил )))

alvmd932
Offline
Зарегистрирован: 12.02.2020

Восстановил //

Теперь красные строки с ошибками пропали, но появилось сообщение:

Sketch uses 2 774 bytes (9%) of program storage space. Maximum is 30 720 bytes.
Global variables use 43 bytes (2%) of dynamic memory, leaving 2 005 bytes for local variables. Maximum is 2 048 bytes.
Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alvmd932 пишет:

появилось сообщение:

Sketch uses 2 774 bytes (9%) of program storage space. Maximum is 30 720 bytes.
Global variables use 43 bytes (2%) of dynamic memory, leaving 2 005 bytes for local variables. Maximum is 2 048 bytes.

Ужас!

Ну, засунь его в гугл-переводчик, прочитай хоть.

alvmd932
Offline
Зарегистрирован: 12.02.2020

Сделал уже(:

Вопрос как победить? Я же писал что я не программист

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ничего побеждать не надо, всё нормально.

alvmd932
Offline
Зарегистрирован: 12.02.2020

 А как программа узнает к каким выводам ардуино нано подключен драйвер?

В другой программе, которая работала была такая строка:

Stepper myStepper(stepsPerRevolution, 4,5,6,7)

RG22EM
Offline
Зарегистрирован: 27.08.2016

alvmd932 пишет:

 А как программа узнает к каким выводам ардуино нано подключен драйвер?

В другой программе, которая работала была такая строка:

Stepper myStepper(stepsPerRevolution, 4,5,6,7)

видимо посмотреть библиотеку #include <AFMotor.h>

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

alvmd932 пишет:

 А как программа узнает к каким выводам ардуино нано подключен драйвер?

Вопрос не в том, как узнает программа, а в том как Вы узнаете, куда подключать :-)

В файле AFMotor.h есть строки №№ 138-141

#define MOTORLATCH 12
#define MOTORCLK 4
#define MOTORENABLE 7
#define MOTORDATA 8

А вообще, если у Вас возникают вопросы о том, как победить сообщение из #25, может Вам пока светодиодом помигать? Не лезть пока в навороченные и не особо хорошо документированные адафрутовские библиотеки?

alvmd932
Offline
Зарегистрирован: 12.02.2020

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

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

AlexSam
Offline
Зарегистрирован: 06.04.2018

А если я скопирую с 21 по 59 строку несколько раз (допустим 5) добавлю пины с А0 по А5 и привяжу разные количества шагов на каждый пин. Т.е. нажал на первую он передвигается на 100мм, на вторую уже добавлят 5 мм- итого 105 мм, третью 100+6 далее..

Нужно будет в конце кода возврат в начало ставить?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

AlexSam
Offline
Зарегистрирован: 06.04.2018

По какой клавиатуре?) у меня будет 5 кнопок по пинам

 

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

AlexSam пишет:

По какой клавиатуре?) 

Вашего компьютера

AlexSam
Offline
Зарегистрирован: 06.04.2018

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

AlexSam пишет:

По какой клавиатуре?) 

Вашего компьютера

Лучше тут ей поклацать, чем в программе))

попробовал, все работает нормально.