Arduino Nano, Шаговый двигатель и библиотека AccelStepper
- Войдите на сайт для отправки комментариев
Пнд, 14/09/2015 - 16:01
Доброго времени суток!
Собственно, имеется Arduino nano, драйвер ШД TB6600 и библиотека: http://www.airspayce.com/mikem/arduino/AccelStepper/
Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.
У меня получается такая картинка, я могу с ускорением запустить двигатель например на N оборотов. А вот запустить с ускорением и оставить работать без указания точки остановки - не выходит.
Запуск сразу на нужных оборотах так же не возможен из за их количества (высоких оборотов получается достичь только с ускорением).
К примеру запуск с ускорением и конечной точкой:
#include <LiquidCrystal.h> #include <AccelStepper.h> enum { LCD_WIDTH = 20, LCD_HEIGHT = 4 }; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); AccelStepper motor(1, 9, 8); // pin 9 = step, pin 8 = direction long rpm=2000; long maxSpeed=2000; // MAX RPM long maxAccel=100; // RPM accel per second long stepRevo=400; // steps per revolution (1:2=400) void setup() { lcd.begin(LCD_WIDTH, LCD_HEIGHT); motor.setMaxSpeed(stepRevo*maxSpeed/60); // setMaxSpeed(stepsPerSecond) motor.setAcceleration(stepRevo*maxAccel/60); //setAcceleration(stepsPerSecondSquared) } void loop() { motor.runToNewPosition(0); motor.runToNewPosition(stepRevo*10000); motor.runToNewPosition(0); delay(2000); }
В какую сторону копать? :(
1- управляйте им сами , без библиотек
2- перепиливайте библиотеку
попробуйте уйти от конкретики и задайте ему дофига шагов
я так делаю, работает
Ладно, допустим, задали мы ему 2 миллиарда шагов (делитель 1:2, 400 шагов на оборот, неделя работы).
Теперь возникла следующая проблема. При выводе чего то на экран - скорость падает.
Вообще суть устройства такова, крутить ШД по циклу через отрезки времени, по таймеру или просто нон стопом. Все с определенными оборотами.
Вот исходник. Если закомментировать вызов displayClock - все отлично. Но если он не закоментирован то каждую секунду (при выводе на экран) проседают обороты, сбивается шаг и двигатель встает.
lcd.clear (); всё тормозит.
Уберие совсем и используйте только один раз в сэтапе.
Если надо чистить - выводите пробелы
lcd.clear (); всё тормозит.
Закоментил, прошил, тоже самое Т_Т
в связке шаговик-дисплей на дисплей выводите информацию только при её изменении
на форуме тема была по этому поводу, поищите если не лень
Доброго времени суток!
Собственно, имеется Arduino nano, драйвер ШД TB6600 и библиотека: http://www.airspayce.com/mikem/arduino/AccelStepper/
Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.
В какую сторону копать? :(
У меня была такая же задача. Только еще и скорость по ходу менять.
Я долго мучался с AccelStepper, пока не выловил из нее много багов. В итоге написал свою библиотеку, на базе прерывания.https://github.com/achest/stepperQ
Вот код:
У меня работает. Если не работает пиши, исправлю ошибки. И вообще приглашаются Beta-Tester ;-)
Код с accestepper ничем не будет отличаться, кроме вызова run() в лупе.
в связке шаговик-дисплей на дисплей выводите информацию только при её изменении
на форуме тема была по этому поводу, поищите если не лень
Ну так по изменению и выводится, в данном случае часы тикают раз в секунду. Могу снять видео, "запор" в работе двигателя происходит именно при обновлении дисплея
У меня была такая же задача. Только еще и скорость по ходу менять.
Я долго мучался с AccelStepper, пока не выловил из нее много багов. В итоге написал свою библиотеку, на базе прерывания.https://github.com/achest/stepperQ
Спасибо, буду пробовать, с несколькими шаговыми работает? 3шт например, но уже на Mega 2560, так же с дисплеем. Хотя сначала на nano бы завести.
Спасибо, буду пробовать, с несколькими шаговыми работает? 3шт например, но уже на Mega 2560, так же с дисплеем. Хотя сначала на nano бы завести.
Нет В Ардуино очень мало Таймеров/Прерываний, Актуально используется Timer1, соответсвенно оно не маштабируется. Я ищу решение ( см мою другую тему про моргание светодиодами). Требуемую(похожую) Библиотеку я видел, но не могу найти...
С другой стороны все не совсем просто. Обсчитать шаг шаговика занимает порядка 100 мкс. Это соответвуюет 8000 шагам в секунду. Реально, с учетом потерь/запаса - 4000 шагов. Если ты хочешь управлять 3 шаговиками, то мы будем говорить о 1200 шагов в секунду у каждого, не больше... Пока ты медленно двигаешь декорации по сцене - все ок. Но как только хочешь что-то более динамичное , то все. Надо переходить на более производительый процессор, на пример Stm32, у него и с прерываниями по проще...
Кстати, с выводом на экран у меня были такие же проблемы с AccelStepper. После 3-х месяцев мытарств, я все переделал так:
Есть функция вывода на экран.
Есть функция программа. В программе While ( stepper.distanceToGo() >0 ) {stepper.run();} .
Вызывается либо одна, либо другая. т.е. либо мы едем, или пишем на экран, реагируем и тп.
С моей новой библиотекой таких проблем нет. правда и вывод на экран я сильно сократил. Он только скорость/шаги выводит и до 1000-1500 шагов в секунду точно не сбивается. При 4000, уже были проблемы... Но только 1 раз, не могу повторить тест.
Доброго времени суток!
Собственно, имеется Arduino nano, драйвер ШД TB6600 и библиотека: http://www.airspayce.com/mikem/arduino/AccelStepper/
Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.
вообще то ваша задача совсем не требует использования этой библиотеки
используйте функцию разгона и крутите мотор через прерывания
achest, возникла такая проблема, задана макс скорость 100RPM, и несметно длинный путь для ШД, ШД начинает бесконечно разгоняться. А с дисплеем теперь все хорошо.
achest, возникла такая проблема, задана макс скорость 100RPM, и несметно длинный путь для ШД, ШД начинает бесконечно разгоняться. А с дисплеем теперь все хорошо.
Спасибо за участие. Бета тестеры мне действительно нужны!.
1. 200*100 это 20000 шагов в секунду. ( а не минуту). Реально оно работает до 8-9 т шагов. Теоретически возможно до 16-18т. Там нет защиты от не правильного использования. Она будет стоить "процессорного времени".
2. Не понял суть твоей проблемы. Он разгоняется медленно. Все правильно. ты ставишь всего 2*200. У меня там стоит 800 или 19000, для не нагруженного мотора.
3.
stepperq.moveTo(400000L);
33
stepperq.start();
не надо вызывать из лупа. Первое потому, что переменная переполнится, второе потому, что бесмысленно.
Короче пойду писать доку...
1. 200*100 это 20000 шагов в секунду. ( а не минуту).
А ларчик просто открывался, чуть выше ты писал что от accelStepper у тебя минимум отличий в работе, а там RPM а не RPS.
Поэтому и возникла моя проблема (Двигатель разгонялся пока просто не вставал).
Achest, попробовал ваш StepperQ, хорошо он разгоняет, проверил на одной конфигурации (мотор PL57Р56, полушаг, драйвер на 4А, БП 30 вольт) разгон и максимальную скорость: AccelStepper не более 6 об/мин, ваш SQ 12 об/сек. Дальше не имеет смысла, кривая зависимости ШД момента на валу от частоты начинает падать. Еще поиграюсь. Вообщем положительное впечатление. Спасибо.
Пардон! Опечатка! У Асселя разумеется 6 об/сек
Возникла следующая проблема.
Не могу скомпилировать под Atmega8.
Можешь что ни будь подсказать?
у меня драйвер L298N, Nano V3, NEMA17, напряжение 9В -12В и максимум, что accelstepper, что stepperQ дают - это 6 (шесть) оборотов в секунду... причем при 12В кажется чуть хуже чем при 9В. что не так делаю? как выжать 12-15 об/сек ?
Кстати на небольших оборотах обе библиотеки так разогревают драйвер что яйца на них жарить можно... аж подгарают ... )
http://arduino.ru/forum/programmirovanie/biblioteka-timerone#comment-135631
Deamont у меня NEMA17 подключен к 27 вольт в одном станочке и драйвер на всякий случай на 3 А и крутится он (ШД) шустро, 12 вольт маловато будет. А драйвер L298 мне кажется слабеньким, лучше уж TB6600 купить http://ru.aliexpress.com/item/High-Quality-TB6600-DC12-45V-Two-Phase-Hybrid-Stepper-Motor-Driver-Controller/32608542477.html?spm=2114.14010208.99999999.267.ljwwmx.
Я на всякий случай поясню, для вращательного движения увеличение частоты вращения требует повышения крутящего момента, а он в данном случае является функцией напряжения и тока, ну и кое чего еще, обойдемся без формул и теории. Вам банально не хватает "мощи".
Для nema17 нужно 12В и примерно по 1.7А на двигатель, т.е. БП должен быть приличным. Драйвер L298N слабоват, лучше взять специализированный драйвер для ШД, я использовал TB6600 но только потому что у меня Nema23, тебе сойдет a4988 например
Добрый день, вопрос к специалистам, поставил на принтер драйвера TB6600 через рампс 1.4 (прошивка Марлин), и в итоге движки только греются блокируя движение вала, никакого движения нет.
Пробовал прямое подключение драйвера к ардуинке (как указано в форуме выше без рампса и марлина) с помощью библиотек AccelStepper и stepperQ - все работает, с последней библиотекой даже живее движки работают, но через рампс и с Марлином ни в какую.
Как я понимаю, прошивка Марлин так же может быть изменена под данные драйвера? или настолько глубоко в нее залезть нереально?
Я - пас, относительно RAMPS1.4, у меня его нет. Мне личный 3D принтер пока не нужен. Увы.
частота - это же не частота вращения вращения вала, это частота импульсов?
для nema17 200шагов на оборот. получается он может работать на скорости 10000/200=50об/сек,
если на него подать 30В 2,5А. Верно я понимаю?
На 12В a4988 работает точно так же, как L298N. также чудовищно греется на малых оборотах. Опять же с использованием любой библиотеки. Я временно сделал такой выход: библиотеки не использую, в случае малых оборотов (например задержка между шагами 3мс) подаю управляющие импульсы только на 1мс, потом все нули на протяжении 2мс (не подаётся напряжение на обмотки). и т.д следующие шаги. при этом удержание конечно не высокое, но достаточное. А драйвер не дымит...
а есть более грамотное решение?
после конфигурации прошивки 3д принтера Марлин установил рампс 1.4 (по ошибки в дефолте был 1.3) и о чудо - движок через драйвер tb6600 заработал! плавно четко..... но беда в другом, из трех осей заработал только один, и что еще более непонятно - заработал наполовину, т.е. в одну сторону только крутится, ну и соответственно, если поменять фазы обмотки, то в другую
какие у кого мысли? где и что поправить чтобы все три драйвера работали на полную (пробовал вместо каждой оси подставить драйвер a4988 и двигатель nema17 - все работает без глюков)
Deamount, я эту картинку разместил, но комментарий куда то выпал. NEMA 17 бывают разные, т.е с "лица" они одного размера, а вот в профиль разные, т.е. длина разная, поэтому и моменты и напряжения разнятся. Вот у PURELOGIC такие, т.е. достаточно мощные для этого типоразмера. Что касается частоты, то там указан полушаг, т.е. не 200 импульсов на оборот , а 400. И соответственно, подсчитанные вами 50 об/сек "плавно превращаются" в 25 об/сек. Но на таких оборотах ШД свой ротор только крутит. Что касается ваших драйверов, черт их знает чего они так "горячатся", могу лишь вам сказать, что у меня моторы работающие на приличную нагрузку очень горячие, руку долго не удержишь и это нормально для них. Драйвера тоже греются, но я каждому драйверу вентилятор (40 мм) вешаю.
Вот кстати, Е2Е4, а у вас а4988 сильно греются?
vladimir62. все зависит от того, с какой нагрузкой двигатель работает это во первых, какой он сам мощности, это во вторых, какую силу тока (подстроечным резистором) выставляем, ну и если блокировку ставим, когда обе обмотки в противофазе блокируют вал - то в этом случае можно и обжеч руку, но это 17 нема, а если брать те что помощнее... и драйвера мощные - то и задымиться движки могут, я в свое время парочку BAUTZ хороших движков спалил, аналог NEMA 42 где то....
Да это ясно, у Deamounta эти драйвера греются, а с ними дел не имел и вообще сомневаюсь, что у них подстройка есть. У вас то на холостую, на полушаге, на 2-3 об/сек он греются работая на Nema 17?
я просто сейчас не с 17 работаю, вожусь с 66 драйверами, но 17 сам двигатель при небольших нагрузках греется только в простое, а так слегка теплый
у меня драйвер L298N, Nano V3, NEMA17, напряжение 9В -12В и максимум, что accelstepper, что stepperQ дают - это 6 (шесть) оборотов в секунду... причем при 12В кажется чуть хуже чем при 9В. что не так делаю? как выжать 12-15 об/сек ?
Кстати на небольших оборотах обе библиотеки так разогревают драйвер что яйца на них жарить можно... аж подгарают ... )
Е2Е4 я про яйца на ваших драйверах А4988 хотел узнать :о).
есть такое, это же по теории то элементарно: что такое маленькие обороты? это две обмотки на высоких токах друг друга поджаривают чтоб сохранить момент, и если радиатор не обдувать, то горят драйвера как пирожки, потому на мощных драйверах и ставят радиаторы во всю плату
кстати, по поводу моей проблемы с рампсом только что наконец то разобрался, оказалось что прошивка Марлин хитромудро думала что все оси за пределами, т.е. барахлили концевики, и если софтом вернуть все координаты в ноль - то все три оси работают вполне прекрасно.
так что проблема решена
Успокоил Deamonta!
Мне не очень нужен 3D принтер, я заказываю детали, когда требуется. А зачем TB6600 для 3D принтера?
у меня не совсем обычный принтер, во первых размеры больше, а во вторых пытаюсь поднять скорость в 1.4 раза по сравнению с обычными 3д принтерами
Интригуете? Что значит не совсем и почему в 1.4? Если не секрет , конечно.
И мне интересно, принтер наверное и как минифрезер используется..
2achest
ОРОМНЕЙШЕЕ СПАСИБО за StepperQ !!!
Наконец то удалось реализовать и управление ШД и вывод на экран информации без "заиканий!
Теперь и для меня вопрос актуален.
У меня данный код работает без ускорения. В чем может быть проблема. Может загвоздка в комманде run();? Эти команды есть еще и stepper.runSpeedToPosition(); и stepper.runToNewPosition(); и еще наверное какието. Скажите в чем разница?
Почитайте AccelStepper.h , там каждая функция расшифрована. Могу предположить, что runTo.. блокирующие функции. То есть есть, если их вызвать, то управление вернется только после полной отработки движения (пока мотор не доедет до нужной точки, программа будет "висеть"), как delay().
Точно. пишет что run() блокирует. stepper.runToNewPosition(); тоже блокирует. а runSpeedToPosition() не блокирует, но не поддержывает ускорение/замедление.
Тогда на главный вопрос темы
Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.
никто так и неответил, неужели нет решения??
В вашей простейшей задаче используйте функцию tone(), разгон - поднимпйте тон плавненько, а дальше просто на долгое время tone заряжаете. Тут уже так делали, это не я придумал. Дешево и онкелю назло :)
День добрый форумчанам.
Вопрос на засыпку: библиотека stepperQ позволяет управлять 2-мя (и более) шаговыми двигателями?
Блин, что за магия... почему иногда мотор разгоняется без ускорения (т.е. моментально на нужные обороты выходит) и тормозит так же. а иногда меееелдленно разгоняется и не быстрее останавливается......
над кодом как только не извращался. уже везде втыкаю ускорение. было подозрение что драйвер успевает "забыть" заданное ускорение.
сдается мне, я упускаю что то очень важное :/
Вопрос на засыпку: библиотека stepperQ позволяет управлять 2-мя (и более) шаговыми двигателями?
Нет, это технически не возможно. Используется 1 прерывание. Для управления 2-м двигателем надо использовать другое прерывание., т.е переписывать библиотеку..
Количество прерываний ограниченно. Переписывать не буду, буду разбираться с RTOS.
На stepperQ отлично работает аксель и обороты раза в три выше чем в AccelStepper, спасибо achest!
Я понял что собрана на тс и два не зависимых драйвера шд работать не будут. Можно подключить два драйвера шд при одинаковом режиме работы, дублировать step на второй драйвер? К примеру два драйвера шд, 5 режимов скоростей, по две кнопки на шд туда сюда, индивидуальное управление не меняя сигнал с тс или в этом случае аксель работать не будет? Или делать чтоб работал только один шд, потом переключаться на второй? Две оси станка X Y, ручной режим.
Или сделать еще проще, поставить две ардуинки.
На stepperQ отлично работает аксель и обороты раза в три выше чем в AccelStepper, спасибо achest!
Я понял что собрана на тс и два не зависимых драйвера шд работать не будут. Можно подключить два драйвера шд при одинаковом режиме работы, дублировать step на второй драйвер? К примеру два драйвера шд, 5 режимов скоростей, по две кнопки на шд туда сюда, индивидуальное управление не меняя сигнал с тс или в этом случае аксель работать не будет? Или делать чтоб работал только один шд, потом переключаться на второй? Две оси станка X Y, ручной режим.
Cпасибо за спасибо.
Есть такая программа GRBL . стоит в 90% 3д принтеров. Там все работает, на моторы подаются правильные рампы/учитываются ускорения и 4 мотора она поддерживает. При этом надо подавать команды через последовательный порт. Кинуть туда строчку может любая ардино, язык простой, программируется за 5 минут.
готовый коммандер с кнопками и слотом для СД карты продается на али до 30 евро.
Я бы думал в эту сторону, потому, что уже готовое решение, работающее и проверенное. Свое время дороже.
То, что ты описываешь можно без проблем реализовать. Начни думать с другой стороны. Нарисуй меню, подключи клавиатуру, дисплей, подумай, как это сделать удобно и эргономично. 1 шаг на нажатие? Или сразу 10? или ??? Прибавь к этому Safety. т.е. полную остановку станка по отдельной кнопке без потери положение в пространстве... Сколько %% процессорного времени у тебя осталось? Хватит еще 40% на управление моторами?
Я писал свою библиотеку именно что бы ускорить мотор, потому что AccelStepper и любая коммуникация (дисплей) не дружат вместе. А мне нужно было что бы мотор более менее стабильно работал на 1000+ шагов в секунду. На общет одного шага у ардуино занимает 120 мкс. У AccelStepper там еще долгое вычисление квадратного корня в цикле... Я убрал все лишние проверки с оптимизировал библиотеку под быструю работу.
Короче - 1 ардуинка с обоими задачами (мотор+ клавиатура/дисплей )одновременно не справится.
stepperQ на малый оборотах все же отказывается работать стабильно, остановки быстрой нету. На малых оборотах работает, но при учете что работаешь только на этих оборотах, а при смене оборотов с высоких на малые не останавливается.