Accelstepper мелкие вопросы
- Войдите на сайт для отправки комментариев
Всем добрый вечер!
Добрался таки до шаговика 28byj-48 с драйвером ULN2003 и, соответственно, до библиотеки Accelstepper. Решил разобрать ее с нуля, но моей "квалификации" не хватило, чтобы добраться до истины в некоторых вопросах.
Например, как определяется переменная _targetPos. Как я понял, она измеряется в шагах и определяет то положение, к которому будет стремиться двигатель с максимальной скоростью, ускорением и замедлением. Но до конца не совсем понятно, как она определяется. Т.е. предположим, что ее значение 5000, что будет происходит дальше? Как Ардуино посчитает и определит, что ей нужно делать? Или _currentPos. Где то хранится информация о местоположении двигателя в данный момент? От чего она отсчитывается? Этот момент в библиотеке не прописан и эти переменные просто постулируются.
на сайте автора библиотеки всё расписано, ещё раз внимательно почитайте.
currentPos() это положение шаговика в данный момент. подали питание - равно нулю, прошли сто шагов по ч. с. 100, триста против часовой - 200, пятьсот по ч.с. 300.
думаю понятно.
Accelstepper - достойным образом документированная библиотека, надо просто читать.
Текущее и целевое положение можно обнулить в любой момент:
Можете привести цитату из библиотеки по поводу "подали напряжение - равно нулю", в файлах h и сср я не вижу строчку, которую так можно интерпретировать, может я просто чего то не понимаю.
Вы можете привести пример расчёта этой переменной?
Что программа будет делать с введённым значением этой переменной? Как она понимает, что нужно сделать, чтобы выполнить данное условие?
Можете привести цитату из библиотеки по поводу "подали напряжение - равно нулю", в файлах h и сср я не вижу строчку, которую так можно интерпретировать, может я просто чего то не понимаю.
"Подали напряжение" - скорее всего имелась ввиду инициализация всей системы. В конструкторе класса AccelStepper эта самая текущая позиция обнуляется.
Бамп темы ещё вопросом.
После выполнения moveTo() на драйвере шаговика остаётся гореть один светодиод, т.е. ток на одной катушке остаётся, что приводит к дополнительному нагреву обмоток. Есть ли функция в этой библиотеке, которая "полностью" останавливала бы шаговик, приводя все напряжения на выходных пинах в ноль?
а это уже не библиотека, это уже работа с драйвером шаговика.
А сам драйвер тут при чем? Если что, речь о uln2003, не уточнил сразу. Это просто сборка из ключей. Сигнал на него идёт с дуины и вся обработка шагов заключена исключительно в дуине и исходит из синтаксиса библиотеки.
Должно пойти, спасибо
По задумке движок должен крутиться 1 секунду и вставать, но
1. Программа не выходит из оператора if спустя секунду и продолжает выводить на экран количество милисекунд
2. Движок делает один шаг и встает, не смотря на то, что цикл продолжает выполняться
Что я делаю не так
(0 - 0) < 1000 будет всегда.
нет, значение переменной ms обновляется внутри
Для проверки этого я вывожу в монитор порта разницу, которая, как и ожидается, растёт, т.е. на экран грубо говоря выводится время с начала старта проги в милисекундах
Не обновляется. Вынесите ваш println() из if() {...} и проверьте.
Если я вынесу его из if, то он ничего не покажет, т.к. прога в if зацикливается и не выходит из {...}
Ладно, давайте так. После прохода всех заданий внутри if, этот оператор должен заново проверить условие?
Если я вынесу его из if, то он ничего не покажет, т.к. прога в if зацикливается и не выходит из {...}
Не зацикливается.
Ладно, давайте так. После прохода всех заданий внутри if, этот оператор должен заново проверить условие?
С чего вы это взяли?
Если я вынесу его из if, то он ничего не покажет, т.к. прога в if зацикливается и не выходит из {...}
Ладно, давайте так. После прохода всех заданий внутри if, этот оператор должен заново проверить условие?
Сделал, правда не обновлялось значение и вне if {...} ms показывало ноль. Как так? В if {...} одно, а вне другое? Да и millis() должно работать довольно таки однозачно, разве нет?
Тем не менее само условие ms - ms_servo должно работать верно, то есть я вывожу его вне if и оно в течении секунды становится больше 1000, но в if все равно заходит. Почему?
Сделал, правда не обновлялось значение. Но почему?
Потому что, в общем случае, все объявленные внутри блока {} переменные уничтожаются при его завершении.
А объявление переменной внутри этого блока с тем же именем, что и переменная вышестоящего (по области видимости) уровня, маскирует последнюю.
На самом деле вы присваиваете значение millis() переменной, которую сразу же и уничтожаете.
Ладно, спасибо Вам, допустим я разобрался с if посмотрев как работают простые примеры
Но Шаговик всё ещё не работает, делает один шаг и встаёт, хотя тело if прогоняется постоянно в течении секунды
А вы ему сказали, куда степать-то ? Например через .moveTo(500) в setup()?
Я как раз хотел от этого уйти, чтобы он просто стэпал, грубо говоря пока его не остановит условие (но не приход куда то, а, например как в данном случае, прошествие 1 секунды, или нажатие кнопки). Из описания библиотеки самое подходящее на мой взгляд - run(). Как я понял, один раз вызвали - один шаг. Пока вызываем в цикле - идём, условие нарушилось - встали. Но чтото пошло не так)
Ну, возможно вам просто нужно поэкспериментировать с другими функциями: http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html
Я, честно, говоря, степаю сам, без библиотеки - поэтому сильно в аксельстеппере не ориентируюсь.