Вопрос по скетчу. Управление шаговым мотором по кнопке.
- Войдите на сайт для отправки комментариев
Всем привет.
Пытаюсь реализовать идею по управлению заслонками воздуховода по датчику СО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); //тушим диод } }
Подскажите, пожалуйста, что не так?
Кнопка напрямую подключена к 5-му пину и к земле.
Пятому аналговому пину? Или цифровому?
Допустим. что пин правильный, если она подключена "напрямую к 5-му пину и к земле", и инициализируется в строке №13, то объясните мне: когда, где и при каких обстоятельствах на ней может появиться HIGH?
Пятому аналговому пину? Или цифровому?
К аналоговому.
когда, где и при каких обстоятельствах на ней может появиться HIGH
Блин, сори, через кнопку не к земле, а к +5в подключен.
И сверху еще присоединен MotorShield.
когда, где и при каких обстоятельствах на ней может появиться HIGH
Блин, сори, через кнопку не к земле, а к +5в подключен.
В таком случае, аналогичный вопрос: когда, где и при каких обстоятельствах на ней может появиться LOW?
Если Вы думаете, что при ненажатой кнопке там будет LOW, то таки нет - там будет случайное значение (это же верно и если бы кнопка у Вас была на землю заведена). При разорванном контаке в кнопке, на пине будет случайное значение, которое будет меняться, например, оттого, что Вы поднесёте руку к пину или включите утюг на соседнем столе.
Огромное спасибо.
Заведу пин на землю через резистор до кнопки. Надеюсь поможет.
Но сомнения есть все равно, т.к. макет реагирует на кнопку - при разомкнутой кнопке мотор елозит туда/сюда, как только нажимаю - мотор уходит в конечное положение (х==1) и останавливается. Но вечером попробую с резистором.
Ку да Вы там резистор собрались заводить? В общем, не порите горячку.
Кнопку заводите на землю, а в строке 13 вместо INPUT пишете INPUT_PULLUP и никакой резистор не нужен.
В результате при НЕнажатой кнопке на пине будет HIGH, при нажатой - LOW.
А то там случайное значение, вот он у Вас и "елозит".
Евгений, спасибо большое, все получилось!
Не за что
Добрый день.
Можно программу предложенную Levch запустить на Ардуино нано?
Можно программу предложенную Levch запустить на Ардуино нано?
Вам требуется разрешение на это? Ну, ладно, я разрешаю, запускайте.
За разрешение спасибо (:
Но я имел в виду техническую сторону.
У меня сплошные ошибки в ардуино нано.
Наврядли эти ошибки связаны с формфактором Arduino.
У меня сплошные ошибки в ардуино нано.
Бывает, чё ...
Мда, Вы, что код прямо в браузере выделяли и копировали? Так не делается. Если Вы не умеете корректно копировать код, то либо научитесь, либо, набивайте его руками. Так просто - выделить в браузере и стянуть - не работает.
код правильно скопируйте, там кнопка для этого есть
код правильно скопируйте, там кнопка для этого есть
Ну, не может человек. Пусть руками набивает. А там и селёдка действовать начнёт.
Я именно этой кнопкой и копировал.
Ну, я же и говорю - набивайте руками. Никому ведь на самом деле неинтересно это Вы не уеете копировать или Levch вставлять. Результат на табло. Так что у Вас два варианта - или научиться нормально копировать, или вбить руками как я Вам уже писал.
Чего набросились не посмотрев даже? Не в копировании тут дело. Там просто знак комментария потерян в строке №37.
alvmd932, восстанови его и всё будет пучком.
Ну, тогда "сорри". А симптоматика действительно как от криворукого копирования.
Можно конечно и руками набить, но я сравниваю в блокноте то что я скопировал и то что есть в сообщении Levch и не вижу разницы, кроме наличия нумерации строк. Это важно? Я далеко не программист и поэтому просил совета. Кстати копировал точно также кнопкой с сайта https://arduinomaster.ru/ и таких проблем не было.
Ну, Вам же уже сказали в посте #20, что дело не копировании. Да, я ошибся - невнимательно посмотрел. Извините. Вопрос о копировании закрыт, надеюсь?
Ну, Вам же уже сказали в посте #20, что дело не копировании. Да, я ошибся - невнимательно посмотрел. Извините. Вопрос о копировании закрыт, надеюсь?
О! а я и не смотрел!!! Увидел, что компилятор на UTF-8 ругаеццо и, предположил )))
Восстановил //
Теперь красные строки с ошибками пропали, но появилось сообщение:
появилось сообщение:
Ужас!
Ну, засунь его в гугл-переводчик, прочитай хоть.
Сделал уже(:
Вопрос как победить? Я же писал что я не программист
Ничего побеждать не надо, всё нормально.
А как программа узнает к каким выводам ардуино нано подключен драйвер?
В другой программе, которая работала была такая строка:
Stepper myStepper(stepsPerRevolution, 4,5,6,7)
А как программа узнает к каким выводам ардуино нано подключен драйвер?
В другой программе, которая работала была такая строка:
Stepper myStepper(stepsPerRevolution, 4,5,6,7)
видимо посмотреть библиотеку
#include <AFMotor.h>
А как программа узнает к каким выводам ардуино нано подключен драйвер?
Вопрос не в том, как узнает программа, а в том как Вы узнаете, куда подключать :-)
В файле AFMotor.h есть строки №№ 138-141
А вообще, если у Вас возникают вопросы о том, как победить сообщение из #25, может Вам пока светодиодом помигать? Не лезть пока в навороченные и не особо хорошо документированные адафрутовские библиотеки?
Я бы и не влазил в такие дебри, но меня заинтересовало введение кнопки (концевого выключателя в моем случае) для возврата в исходное положение. А как это сделать в комплектной с ардуино программе stepper не знаю.
Кстати светодиод у меня в этой программе отрабатывает, а в моторе слышен писк но нет движения.
А если я скопирую с 21 по 59 строку несколько раз (допустим 5) добавлю пины с А0 по А5 и привяжу разные количества шагов на каждый пин. Т.е. нажал на первую он передвигается на 100мм, на вторую уже добавлят 5 мм- итого 105 мм, третью 100+6 далее..
Нужно будет в конце кода возврат в начало ставить?
Нет никакой разницы - есть в конце неработающего кода возврат или нет. Лично я бы не ставил - меньше по клавиатуре бить придется, ее надольше хватит.
По какой клавиатуре?) у меня будет 5 кнопок по пинам
По какой клавиатуре?)
Вашего компьютера
По какой клавиатуре?)
Вашего компьютера
Лучше тут ей поклацать, чем в программе))
попробовал, все работает нормально.