ШД 28byj-48 измененние скорости кнопкой. Поршу помощи.
- Войдите на сайт для отправки комментариев
Вс, 24/06/2018 - 20:22
Никак не заставлю меняться скорость при нажатии кнопки. Строки 39-45. Двигатель вращается вперед-назад с медленнной скоростью и иногда его нужно поторопить нажатием кннопки. Нажал- ускорился, отпустил - продолжил вращаться на прежней медленнной скорости. Скорость при нажатии не меняется. Можете объяснить бестолковому, что конкретнно не правильно?
#include <CustomStepper.h> // Подключаем библиотеку CustomStepper CustomStepper stepper(3, 4, 5, 6); // Указываем пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов boolean rotate2 = false; // Переменная для смены режимов unsigned long currentTime; unsigned long loopTime = currentTime; char a = 1; //обороты void setup() { stepper.setRPM(a); //количество оборотов в минуту stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395 pinMode (9, OUTPUT); // фокус камеры pinMode (10, OUTPUT); // затвор камеры currentTime = millis(); // считываем время, прошедшее с момента запуска программы digitalWrite(12, HIGH); } void loop() { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // направление вращения (по часовой) stepper.rotate(19); //количество оборотов rotate1 = true; } if (stepper.isDone() && rotate1 == true && rotate2 == false) { stepper.setDirection(CW); //направление вращения (против часовой) stepper.rotate(19); //количество оборотов rotate2 = true; } if (stepper.isDone() && rotate2 == true )rotate1 = false; if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин { a = 1; } else { // кнопка нажата - 12 об.мин a = 12; } stepper.run(); // инициия работы двигателя camera(); } void camera() // Фокусировка и затвор { currentTime = millis(); if (currentTime >= (loopTime + 2500)) // интервал (мс*2) { digitalWrite(9, !digitalRead(9)); loopTime = currentTime; if (currentTime >= (loopTime + 500)) { digitalWrite(10, !digitalRead(10)); } loopTime = currentTime; digitalWrite(10, !digitalRead(10)); digitalWrite(9, !digitalRead(9)); } }
Вопрос #1: какой функцией задается скорость?
кнопка подключена к какому пину? Сделай его как вход. 19 строка pinMode (12, INPUT);
Скорость задается
stepper.setRPM(a); //количество оборотов в минуту
Строку 19 исправил, результат-0. Как был 1 оборот в минуту, так и остается не реагируя на кнопку.
stepper.setRPM(a); //количество оборотов в минуту
Вопрос #2: почему не задается скорость при обработке состояния кнопки?
Можно посмотреть схему подключения кнопки к пину 12.
Ну по поводу "Вопрос #2", я думал что достаточно будет указать что при нажатии переменная "а" с таким значением, при не нажатой кнопке с другим. Не получилось.
Схема подключения кнопки: 12 пин на землю. digitalWrite(12, INPUT_PULLUP);
Сильно не ругайте. Ардуино на руках недели 2. Пока все такими дебрями кажется
Переменная а =1, в сетупе у вас stepper.setRPM(a); количество оборотов , переместите ее в луп.
Ну по поводу "Вопрос #2", я думал что достаточно будет указать что при нажатии переменная "а" с таким значением, при не нажатой кнопке с другим. Не получилось.
Это тут так не работает. Хотите изменить что-то - вызывайте функцию.
строки 7 и 14. Так тоже не работает
Посмотрите это http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
второй рисунок
...а обработка нажатия кнопки где происходит?
строка 20
Подключение кнопки как на 2 рисунке.
Добрый вечер! Дико извиняюсь на поздний ответ. Огромное спасибо всем откликнувшимся. Исправленный скетч работает. Статью по ссылке прочитал и приведеннные примеры вдохнновили на небольшие изменения. Теперь кнопкой несколько скоростей переключать буду.
Дальше доколдую с кнопкой старт-стоп и дисплеем. Еще раз огромное спасибо!
Дребезг подавляется не совсем корректно. Вам нужно повторно проверять состояние кнопки не только по флагу, а и через некоторое время, когда дребезг успокоится. Начнем с минимума 8 мс. Способ проверки у вас уже реализован в стр.65. Сделайте по тому же принципу, только условие более правильно изображать как (millis() - lastCheckTime > interval). Инкремент переменной menu и установку скорости более продуктивно делать при повторной проверке состояния кнопки.
А можете просто конденсатор паралелльно контактам подсадить.
Добрый день. Не получается с дисплеем наколдовать. При выводе текущего значения скорости на дисплей проблемы начинаются. Двигатель останавливается при включении 12 об/мин. Кнопка работает, скорость переключается, на дисплее показания меняются, камера щелкает, а двигатель стоит до сброса платы.
Пробовал сделать так:
Сдается мне, что LSD тут непричем, просто алгоритм написан неправильно и задержка при выводе на дисплей ломает всё.
Поставьте вместо lcd.print-ов loop() скажем что-то типа delay(5);
Попробуй с дисплеем перед тем как выводить информацию очищай его.
Очистка дисплея не помогла. Результат то же. Этот же эффект достигается и delay(5) вместо lcd.print-ов в loop(), но уже гораздо чаще (на любом нажатии может остановиться). "Вылечилось" так:
Перед каждым lcd.print нужно подпинывать двигатель командой run(). Стоит убрать любую из них и опять остановка на последнем положении. Пробовал последнюю скорость задать однозначным числом, менял тип переменной, выносил lcd.print просто в loop() и все равно остановка именнно на последнем значении. С delay(5) останавливатся произвольно.
Значится проблема в алгоритме. Нужно сесть и еще раз подумать, написать все с чистого листа.
Всем добрый вечер и удачного продолжения выходных!
Все равно подозрение что дело в дисплее.
Уже эмпирическим путем установил, что если максимальная скорость 10 оборотов и интервал 9 секунд, то все нормально работает. Стоит вывести на экран 11 (оборотов) или 10 (секунд) и опять остановка.
Согласен, что мне до полной оптимизации алгоритма еще далеко, но вот совсем простой пример:
Двигатель вообще не стартанет, пока не убрать строку 28. Что единичка выводится, что любая буква. Пробовал выводить число по ннажатию кнопки. Доходит до двухзначного числа и остановка. Вывод информации на дисплей останавливает двигатель. Есть вообще разница в скорости работы и вывода символов от того, как он подключен? Шлейфом проводов или по i2c?
З даётся мне , что пока человек вообще не ведает, что творит, алгоритмы не при чем.
То есть, если оставить в лупе только run() - мотор будет крутится?
Да, если оставить только run() ,то крутится.
Если понизить скорость до 9 оборотов, то работает и с lcd.print. Все таки получается, что чем выше скорость вращения, тем чаще нужно отправлять stepper.run.
В моем скетче без дисплея на максимальной скорости в 12 оборотов можно выбрать любой интервал съемки. Хоть 2, хоть 10 секнд и все работает. Но при выводе двухзначного числа на дисплей при большой скорости вращения происходит остановка. Сейчас нашел компромисс с максимальной скоростью 10 оборотов и интервалом в 9 секунд. Пока работает, но это полумеры. Стоит вывести показания счетчика отснятых кадров, они дойдут скажем до трехзначного числа и все опять встанет.
если не секрет - что снимаете и чем?
Вобщем, все понятно. Вы выбрали неудачную библиотеку. Насколько я понимаю - их метод измерения задержек между степами несколько неудачен и шагание происходит, только если run() вызывается в некоторый промежуток времени после начала движения. Задержки выросли - в "окно шага" вызов функции не попадает, мотор не шагает. Калькуляция этого "окна шага" происходит внутри библиотеки и синхронизироваться с ней непросто (да и смысла нет). Странный, вобщем, этот CustomStepper. Или я чего-то не понимаю в алгоритме работы этой либы.
если не секрет - что снимаете и чем?
Таймлапсами загорелся. Снимаю обычной старой цифромыльницей. Разобрал корпус и подпаял проводки к кнопке затвора (нужной функции из коробки нет) и ардуино периодически кадры щелкает. Вот захотелость в движении поснимать. Интересный эффект получается.
а когда движение по двум осям так вообще круто будет)))))
Извините за нескромность: какого года у Вас Порш?
Извините за нескромность: какого года у Вас Порш?
наверно тему попутал)))))
Теперь мне даже интересно - кто тут из рукоделов на порше гоняет.
Данет же, в теме ясно написано "поршу"
поршу нет лр да.
можешь скинуть скетч с работающей кнопкой на почту ? Stepan163s@ya.ru
Никак не заставлю меняться скорость при нажатии кнопки. Строки 39-45. Двигатель вращается вперед-назад с медленнной скоростью и иногда его нужно поторопить нажатием кннопки. Нажал- ускорился, отпустил - продолжил вращаться на прежней медленнной скорости. Скорость при нажатии не меняется. Можете объяснить бестолковому, что конкретнно не правильно?
отпиши мне в вк https://vk.com/solovyovphotoshop