Шаговый двигатель + LCD
- Войдите на сайт для отправки комментариев
Доброе время суток!
В программировании новичок, только начал осваивать язык arduino (или правильно С/C+). Нужна помощь в корректировке кода для управления ШД с выводом информации на LCD. Имеется биполярный шаговый двигатель, драйвер шагового двигателя на микросхеме А4988, LCD дисплей WH1602B и Arduino UNO.
Принцип работы такой - имеется некоторый диапозон скоростей, из которого необходимо выбрать нужный и затем запустить в работу ШД.
Кнопка В - "вверх" (выбор большего значения из диапозона скоростей);
Кнопка С - "вниз" (выбор меньшего значения из диапозона скоростей);
Кнопка А - "принять" (назначаем выбранную скорость для работы двигателя и включаем двигатель);
Кнопка D - "стоп" (останавливаем двигатель).
Искал на форуме информацию по этой теме, взял для основы скетч пользователя maksim, немного изменил и получилось следующее:
#include <AccelStepper.h> #include <LiquidCrystal.h> #define button_A A0 #define button_B A1 #define button_C A2 #define button_D A3 LiquidCrystal lcd(12, 11, 10, 9, 8, 7); AccelStepper stepper(1, 3, 2); int speeds[7] = {350, 300, 250, 200, 150, 100, 50}; int Speed = 0; void setup() { pinMode(14, OUTPUT); pinMode(15, OUTPUT); pinMode(16, OUTPUT); pinMode(17, OUTPUT); digitalRead(button_A); digitalRead(button_B); digitalRead(button_C); digitalRead(button_D); stepper.setAcceleration(1000.0); stepper.setMaxSpeed(1000); lcd.begin(16, 2); lcd.print("Speed: "); } void loop() { if(digitalRead(button_B) == HIGH) { Speed++; if(Speed == 7) Speed = 0; delay(200); } if(digitalRead(button_C) == HIGH) { Speed--; if(Speed == -1) Speed = 6; delay(200); } static int SpeedPrev; if(Speed != SpeedPrev) { lcd.setCursor(7, 0); lcd.print(speeds[Speed]); SpeedPrev = Speed; } if(digitalRead(button_A) == HIGH) { stepper.setSpeed(speeds[Speed]); } if(digitalRead(button_D) == HIGH) { stepper.stop(); } stepper.run(); }
При включении на экранее появляется "Speed: ", выбираю нужную скорость - далее нажимаю принять, но ШД крутится только при удержании кнопки, когда отпускаю - ШД останавливается и возвращается с максимальной скоростью в исходное положение.
В чём может быть проблема?
Спасибо! Теперь код заработал.
Появилась проблема - при изменении скорости (в момент нажатия на кнопку "вверх"/"вниз") ШД останавливается, после отпускания кнопки он продолжает выполнять программу. Я читал на форуме, про подобные проблемы с использование ШД + LCD, но ответов не нашёл. Это как-то решается?
Уберите задержки, но тогда скорость будет быстро меняться.
Действительно, без задержек скорость выбора не контролируема. Решил это благодаря мануалу Работа с кнопка. В помощи новичку. Использовал переменную для сохранения изменения кнопки в виде 1 или 0. Вот что получилось:
а зачем в setup прописаны digitalRead?
Это 4 лишних строчки кода, их нужно убрать. Спасибо что указали.
Продолжил дополнять код нужными мне функциями, но остановился на следующем. Необходимо отсчитывать пройденный путь точки, расположенной на расстоянии R от оси шагового двигателя (ШД будет работать в приборе, который работает по аналогии с протяжными механизмами проволоки в сварочных полуавтоматах). Другими словами - нужно выводить на дисплей длину протянутой "проволоки". Эта длина равна линейной скорости умноженной на время, т.е. классическое S=V*t. Все математические формулы представил в коде:
Принцип работы - выбираем скорость кнопками B и C, далее запускаем ШД кнопкой А - пошёл отсчёт, выводим его на дисплей. Останавливаем работу кнопкой D - остановка отсчёта. При зажатии кнопки D более чем на 3 секунды - сброс счётчика.
Грамотно вставить это в код не выходит.
Исходник:
А почему бы просто не считать шаги ШД?
Спасибо, попробую сделать через эту функцию.
Написал код используя функцию stepper.currentPosition().
Вопрос появился, возможно не по теме. Как определить загруженность процессора в контроллере? Например, если каждый новый цикл выводить на дисплей любое изменение/или не изменение дистанции без остановки, то ШД заметно теряет скорость. А если еще это значение увеличивается на порядок, то скорость ШД на глазах стремится к нулю.
Нужно выводит на дисплей данные только при их изменении
Поищите тему на форуме, я топикстартер, название не помню, maksim всё объяснил.
Нужно выводит на дисплей данные только при их изменении
Это я и реализовал в своём коде.
Я хочу узнать закономерность загрузки ЦП, чтобы в будущем писать код с учётом этого. Спасибо, поищу на форуме.
Ох и намудрили с удержанием...
Так как digitalRead() медленная функция, выставляйте флаги в начало условий.
Можно и я вмешаюсь в тему?
Подскажите как правильно сделать чтоб ШД сначала сделал moveTo на столько сколько установленно а потом пошла дальше программа.
Потому что при таком раскладе видно что ШД крутит с прерываниями и очень медленно.
Пробовал через switch...case ...
пока что наверное недорос знаниями((( не получилось