Линейная интерполяция
- Войдите на сайт для отправки комментариев
Пнд, 18/01/2016 - 14:52
Доброго времени суток.
Прошу помочь в решении проблемы. У меня система из 2-х шаговых двигателей(ШД) и CNC Shield c драйверами. Смог сделать так. В COM-порт посылаю номер мотора и количество шагов. Он откручивает. Теперь надо сделать линейную интерполяцию (типа движение по диагонали). Т.о. работают два мотора одновременно. подскажите как сделать!
P.S. Видел в интернете hex файлы для прошивки 3 осей и одного лазера, которые работают с G - кодами для ЧПУ, но это не подходит.
надо сделать линейную интерполяцию (типа движение по диагонали).
Т.о. работают два мотора одновременно. подскажите как сделать!
Да. Правильно. По прямой. Один проезжает по X сколько-то шагов, другой по Y. При этом поподая в нужную точку. По теореме Пифагора? Это каким образом?
Да. Правильно. По прямой. Один проезжает по X сколько-то шагов, другой по Y. При этом поподая в нужную точку. По теореме Пифагора? Это каким образом?
Ну, Вы объясните что нужно. Про Пифагора я имел в виду, если Вы знаете две стороны треугольника, а надо посчитать третью. Но, теперь, мне кажется. что Вам нужно не это. А что - я никак не пойму. Ну, поехали по одной оси 5 см., а по друго 8, а что Вам надо-то? У Вас проблема с одновременностью работы моторов или с чем?
Мне нужно, чтобы работал 2 ШД работали, которые двигают платформу, как в ЧПУ станке т.е. дновременно ехали. Один столько, другой столько и попадали в нужную мне точку. Я пишу в COM порт этим движкам координаты в шагах. И они одновременн едут, продвигая мою подвижку по платформу. http://upload.akusherstvo.ru/image925489.jpg
Ну, Вы говорите, что по одной оси они у Вас ездят. Так? По любой ездят? И по и X и по Y - но тольео не одновременно. Правильно я понял? Так может хоть код покажете. как оно сейчас сделано?
Сейчас так: я в COM порт посылаю номер мотора и количество шагов и он делает. Потом выбираю другой и делаю тоже самое. А мне нужно, то , что я описал выше. Как я понял, интерполяция делается в ЧПУ станках так. Ты задал конечную точку, а он движет то одним мотором, то другим поочередно, сответственн приходя в нужную нам точку. http://postprocessor.su/linear_moves.html
Я Вам писал
может хоть код покажете, как оно сейчас сделано?
Вы же вместо кода
Сейчас так: я в COM порт посылаю номер мотора и количество шагов и он делает. Потом выбираю другой и делаю тоже самое.
Вы издеваетесь? Не хотите показывать код (боитесь, что я украду) - дело хозяйское, только тогда и разбирайтесь сами.
Да нет я его искал. Вот сейчас и кидаю. Слишком много скетчей у меня.
А где функция loop()? Давайте-ка работающий скетч, прямо копи-пастом из IDE.
Ну, понятно.
У Вас структура программы заточена по то, что пока мотор не отработает нужные шаги, программа не воспринимает никаких других команд. Чтобы иметь возможность гонять их параллельно, надо менять структуру программы - т.е. переписывать её.
Вы готовы на это? В принципе Вы ничего не выиграете - конечная скорость прибытия в нужную точку будет такой же. Просто ехать будет "вправо-вверх" как сейчас, а по диалоналям.
Если готовы, могу дать некую отправную точку, как переписать. Где-то через час-другой освобожусь и могу показать.
Только, по мне, так смысла в этом не вижу.
Я был бы рад, если бы помогли! Я тоже так думаю, но мне это нужно под проект, поэтому, если подскажите - будет здорово!
Ну, вот попробуйте вот такой скетч.
Сразу должен сказать:
1. я пока не понял что Вы хотели сделать с кнопками - у меня никаких кнопок нет, если надо - добавим, но мне надо понимать что они делают.
2. Команды я подавал из монитора порта не по одному числу, а сразу командой. Формат команд:
N S <символ новой строки>
где
N - номер мотора (1 или 2). Если 0 - то команда относится к обоим моторам сразу.
S - количество шагов. Если положительное, то (как было у Вас dir будет HIGH, иначе - LOW. Если S равно нулю, то команда немедленно останавливает мотор.
Значит так, по мере поступления команды мотор(ы) начинают движение. Если во время движения поступает новая команда - мотор забывает старую и выполняет указанное количество шагов из той точки в которой в данный момент находится. В случае если поступила команда на 0 шагов - мотор останавливается немедленно.
Я не испытывал на моторах - у меня их нет, я просто наблюдал за выводом в сериал. Управление моторами мне испытать не на чем. Само по себе управление я просто переписал у Вас - проверьте, не ляпнул ли чего, если ляпнул - поправим.
Вот скетч:
а вот протокол исполнения (то, что в Сериале напечаталось, я только комментарии добавил для Вас)
Ктстати, останавливать можно и по одному, разумеется.
Как видите.я завёл "тип дланных" Motor и определил две переменные этого типа. Чтобы отличать их друг от друга при печати, я добавил им имена. Никакой другой нагрузки имена не несут и их из окончательной версии можно выбросить.
Между числами в команде обязан быть хотя бы один пробел (или табуляция). Можно больше, но суммарная длина буфера команды - 16 символов. Если превысить, скетч ругнётся.
Вроде, всё. Код краткий и простой, но если есть вопросы - задавайте. Только испытайте сначала, не надо спрашивать "а что будет, если ..." На такие вопросы лучший ответ - попробовать.
До интерполяции не дотягивает.
Было красным, стало синим. Интерполяция зеленым. Почему бы не включать моторы одновременно - будет движение по диагонали.
Почему бы не включать моторы одновременно - будет движение по диагонали.
Я так понял задачу. Если нужно как-то по-другому, пусть ТС скажет.
Да, по диагонали. Под углом 45 градусов.
Чтобы изменить угол нужно хотя-бы по одной оси изменить скорость.
Да, по диагонали. Под углом 45 градусов.
Чтобы изменить угол нужно хотя-бы по одной оси изменить скорость.
В данном скетче нельзя - она static. Но если ТС скажет, что это ему нужно - поменяем.
А почему от G-кодов отказались? Ну или AccelStepper использовать.
Спасибо за скетч! Как вы правильно сказали нужно прверить всё. И сам скетч разберу и вам отпишусь. А кнопки - концевки, которыми я создаю ноль-пункт. Могу выслать как это у меня получилось.
Про интерполяцию мне было сказано, как писал выше Andy(зелёная линия, хотя и движение по синей линии может подойти).
Как в arduino использовать G - коды без лишних программ, типа grbl я не знаю! А ещё обязательно использование COM-порта, и мне кажется проще посылать шаги мотору, чем G- код. Хотя может я не прав.
С помощью библиотеки AccelStepper вы предлагаете использовать различные скорости моторов? Если - да, то данный вариант не очень подходит.
А что они (эти два ШД) делают то? Если стандартные и проверенные приемы управления ШД не подходят?
И еще, я посмотрел вашу программу, длительность периода между шагами у вас 2 миллисекунды. Предположим, что у вас стандартный мотор с шагом 1.8 градуса, т.е. 200 шагов на оборот. Вы упоминаете о шилде с драйверами, на драйверах всегда есть функция деления шага, зачем нужен микрошаг понаписано много. Я не знаю что у вас установлено на драйверах. ну допустим деления нет , т.е. 1:1. Следовательно ШД у вас вращается 2.5 оборота в секунду. А где разгон и торможение в вашей программе ? Я думаю вы пытались увеличить частоту вращения уменьшением переменной speedmotor и на каком значении происходит срыв? AccelStepper о котором я упомянул тоже имеет минусы. но разгоняет и тормозит он корректно. Насчет G-кодов согласен, с ними связываться надо при сборке 3D принтера или HomeCNC станка.
Да у ШД 200 шагов на оборот. Делений нет, пока не требуются, но на шилде они естественно есть. Срыв честно говоря не помню, надо проверить(я выставил её стандартно и всё). Разгонно-тормозную характеристику делать буду позже. Мне сейчас нужно разобраться с интерполяцией.
Да у ШД 200 шагов на оборот. Делений нет, пока не требуются, но на шилде они естественно есть. Срыв честно говоря не помню, надо проверить(я выставил её стандартно и всё). Разгонно-тормозную характеристику делать буду позже. Мне сейчас нужно разобраться с интерполяцией.
Я вчера ошибся у вас длительность сигнала Step 2 миллисекунды (обычно на порядок меньше), а период 4 миллисекунды,т.е. скорость вращения 1.25 об/сек. Вы так и не сказали, что делаете из движков, но судя по всему координатный стол, тогда в программировании вы кружным путем пошли. Если нет, то еще раз
Мне нужно, чтобы работал 2 ШД работали, которые двигают платформу, как в ЧПУ станке т.е. дновременно ехали. Один столько, другой столько и попадали в нужную мне точку. Я пишу в COM порт этим движкам координаты в шагах. И они одновременн едут, продвигая мою подвижку по платформу. http://upload.akusherstvo.ru/image925489.jpg
Для этой картинки операция интерполяции вырождается в одно деление 4/2=2. т.е. чтобы двум движкам прийти в эту точку одновременно, надо чтобы ШД Х сделал в два раза больше шагов чем ШД У и со скоростью в два раза большей чем у ШД У. Все!
Не буду цитировать ЕвгенияП, но он вам абсолютно верно пишет об одновременности работы движков, и программу он вам хорошую написал, если вы делаете манипулятор перередвижения для фигур на шахматной доске, только конем придется ходить в два приема.
ЕвгенийП, здравствуйте.
Изучил программу и опробовал её. Моторами не крутит и в COM порт ничего не выдаёт, кроме Input buffer OVERFLOWCommand not recognized если подать одно и тоже ( типа 1 700 несколько раз). Подумал из-за несовпадения скрости COM порта у вас 112500 и у меня 9600. Изменил - ничего не случилось. А вот подумал , что у вас не прописан 8 пин, который управляет разрешением мотора - двигаться или не двигаться(enable). Прписал его в
Тоже не помогло. Вот и не в чём тут дело. И кидаю код с кнопками и 3-им мотором.
ЕвгенийП, здравствуйте.
Изучил программу и опробовал её. Моторами не крутит и в COM порт ничего не выдаёт, кроме Input buffer OVERFLOWCommand not recognized если подать одно и тоже ( типа 1 700 несколько раз). Подумал из-за несовпадения скрости COM порта у вас 112500 и у меня 9600. Изменил - ничего не случилось. А вот подумал , что у вас не прописан 8 пин, который управляет разрешением мотора - двигаться или не двигаться(enable).
Так, нет, так не пойдёт. Если Вы хотите довести всё до ума и заставить её ездить по диагоналям и как-то там ещё, я готов Вам помогать, но давайте идти шаг за шагом и не мешать в одну кучу всех мух и котлеты.
Будь мы вместе за компьютером, мы бы дожали это за пару часов, но так придётся потратить неделю, но мы дожмём. Для этого Вы должны 1) чётко делать что я говорю, и 2) давать мне точно ту информацию, которуя я прошу.
Поехали. Про пин пока забудьте и про моторы тоже. Отключите их. Подключим позже. Пока же:
1. Возьмите мой скетч из поста №14.
2. в мониторе установите ту же скорость, что и у меня в коде
3. В выпадающем списке, что находится рядом с выбором скорости в мониторе установите "новая строка"
После этого перезапустите скетч и вводите (по одной!!!) команды
1 3
2 -4
0 3
Команды вводите по одной. После каждой команды давите Ентер.
В результате Вы должны получить примерно ту же печать, что и у меня в посте №14. Если получите то же. что и у меня, напишите мне об этом. Если получите что-то другое, то дайте мне следующее:
1. Копипасту того, что напечатано в мониторе
2. скриншот монитора. чтобы я видел настройки скорости и новой строки.
Это самое главное - это логика работы всей программы. Когда дожмём это, перейдём к движкам. Дожмём их, перейдём к диагонали. Дожмём её, подумаем над разными скоростями. давайте по порядку.
Жду информации.
Да. Всё получилось как у вас.
Я попробовал с моторами. Они крутятся. Поробовал команду 0 500 оба крутит. Единственное они оба 500 крутят. А если надо записать ) 500 200. Хотя я спешу наверное. И я не очень понял вы пишете на C++? Просто я не все строчки понимаю. Например 1-ую.
Я попробовал с моторами. Они крутятся. Поробовал команду 0 500 оба крутит. Единственное они оба 500 крутят. А если надо записать ) 500 200. Хотя я спешу наверное. И я не очень понял вы пишете на C++? Просто я не все строчки понимаю. Например 1-ую.
Отлично. Теперь, плавно переходим к "500 200".
Вам нужна единая команда типа 0 200 500? Не проблема. Сделаем.
Пока же её нет, делаем так:
1. вводим команду 1 500 <enter>
2. НЕ ДОЖИДАЯСЬ пока мотор остановится вводим 2 200 <enter>
Должны крутиться оба. Если 500 мало (не успеваете вторую команду ввести, а первый движок уже стал, введите в первой команде больше, 1000 там - сколько надо). Они должны крутиться оба но не совсем вместе. Должно быть так: один дёрнется, потом другой, потом снова первый и т.д.
Если это работает, перейдём одновременному кручению.
Пожалуйста
1) опишите что у Вас получилось и
2) Вы там добавляли какой-то пин. Выложите текущий скетч полностью, чтобы у нас одинаковые были.
Всё так и есть, запускаем сначал один 1 1500, птм второй 2 1500 и они ходят дёргано - шаг за шагом.
2 everlast
Вам поможет алгоритм Брезенхема:
https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
причем он работает без умножения и деления (для быстроты)
sva1509 Спасибо! Посмотрю!
Всё так и есть, запускаем сначал один 1 1500, птм второй 2 1500 и они ходят дёргано - шаг за шагом.
Всё здорово. Сегодня чуть попозже попробуем ходить н дёргано.
А пока, знаете, я в прошлый раз забыл - комадна для двух двигателей у нас ведь есть, только там нельзя разные дистанции задать. Попробуйте 0 1500 - должны также дёргано по диагонали ехать. Скажите мне работает ли.
Дерганность сегодня победим, надеюсь, чуть позже. Только скажите мне пожалуйста две вещи:
1. Имею ли я право занимать таймер(ы). Они у Вас для чего-то ещё используются? Или я могу занимать оба? Или один?
2. Нужно ли Вам будет делать задежку (которая сейчас 2000мкс) разной для разных двигателей или она всегда будет одинаковой для обоих?
У меня диапозон движения не такой большой, поэтому писал 0 500 и едут они диагонали. Дёрганость на самой платформе(когда едут два движка) не видно.
1. Я не пользовался таймерами и пока не знаю как ими работать;
2. Вы имеете ввиду вот это?Скорость моторов? Я пока не знаю.
Вот что я думаю по поводу скорости моторов.Получается так, если я задаю 0 500 он движется по диагонали, и оба мотора приходят в одну точку. А когда будет по прямугольнику, то один закончит движение раньше другого 0 500 100. Получается, чтобы они пришли одновременно в одну точку по диагонали прямоугольника нужно варьировать скорость или использовать https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма ?!
Ну и еще. Я не очень понимаю на каком языке вы написали? Мне просто надо прописать ноль-пункты для моторов и кнопки...Всё то, что описано в моём коде! Я пока не знаю как сделать с вашей переделанной программой!
Мне просто надо прописать ноль-пункты для моторов и кнопки...Всё то, что описано в моём коде! Я пока не знаю как сделать с вашей переделанной программой!
Доберёмся. Всё будет. Давайте дожмём, чтобы всё хорошо ездило.
Хорошо.
ЕвгенийП Нашёл ещё один интересный скетч, как раз для ЧПУ станка. Что думаете?
Ага, вот посмотрите. Они в строках 26-28 дёргают двигатесь на шаг.
Вы же в аналогичной ситуации делаете задержку - строки 19-21 нашего скетча.
Разница в том, что у них задержки (наша строка 20) нет. Вместо этого они делают единую задержку после "многократных дёргов" обоих двигателей в строке 92.
Вы можете объяснить для чего эта задержка? Она нам сильно нужна? Или можно без неё, но просто большее количество раз дёргать? Честно говоря, я как раз над ней думал, она сильно мешает и ради неё придётся "ногой до уха доставать". Если она Вам нужна. чтобы знать сколько именно проехал мотор, то может это сделать по-другому?
Попробуйте убрать (закомментировать) задержку в строке 20 и скажите, как получается. Должно быть более плавное движение по дигонали, а не рыскание то по одной оси, то по другой. Получается?
Закоментировал эту строку в нашем скетче. Стало дергаться сильно. А если раскоментировать, то нет.
Тогда попробуйте вот так и скажите что получится.
Да, явно лучше.Не чувствуются шаги.
Так, теперь скажите нам пора переходить к кнопкам или мы ещё будем движение улучшать.
К кнопкам переходим тогда, когда движение нам нравится и больше мы его менять не хотим. Поэспериментируйте и скажите. Если хотим, что чего хотим добиться.
До интерполяции не дотягивает.
Было красным, стало синим. Интерполяция зеленым. Почему бы не включать моторы одновременно - будет движение по диагонали.
Получается мне нужно как на рисунке зелёным. А сейчас получается что красным или синим. Еще получается нужно команду 0 200 500, чтобы платфрма ехала по прямоугольнику, а то 0 500 или 0 200 получается по квадрату, а нужно попадать в любую точку XY плоскости. Как я понял, к примеру, мы задаём 0 3 500, по X он едет 3, а по Y 500 т.е. он делает так: X-мотор проезжает 1 шаг , Y-мотор 165 шагов, и так три раз. И видимо остальные шаги по Y(165*3=495, 500-495=5) т.е. 5 шагов он доделывает сам.
А сейчас получается так если я задам 0 3 500, то получится так: по X сделает сразу 3 шага, а по Y будет крутить 500.
ЕвгениюП, с удовольствием читаю ваши этюды, хотя это требует усилий. Я хотел бы обратить внимание, что шаговый двигатель не просто "штучка" в которую через пины забиваются "единички" и "нули". Это сложное устройство, теорию ШД я вам не предлагаю читать, но думаю, что в силу вашей профессии вы ознакомитесь с материлом на http://avrdoc.narod.ru/index/0-7. А может и Everlast почитает.
Получается мне нужно как на рисунке зелёным. А сейчас получается что красным или синим.
Знаете, я тут сильно напрягся, даже попытался раздобыть движки для пробы. Дело в том, я ожидал что сейчас они будут ехать по диагонали. Пусть рывками, но по диагонали. Если это не так, то, боюсь, я что заочно мне это не отладить, а движков у меня нет. Извините, похоже я переоценил возможности заочной отладки. Простите.
ЕвгенийП
Ничего страшного. Вы мне и так очень сильно помогли! А по поводу движения. Они движуться. Только, как я писал, при 0 500 или 0 2000 и т.д.(они движуться по квадрату). А у меня должна быть возможность попасть в любую точку плоскости XY c тем движением моторов, как описано мною выше.
Спасибо за то, что откликнулись и помогли мне в решении данной проблемы!