Господа, подскажите. Как реализовать следующую проект.
- Войдите на сайт для отправки комментариев
Пт, 06/06/2014 - 00:49
Суть примерно в следующем.
Есть шаговик. Он управлятеся ардуиной через драйвер на а4980, step, dir и все дела.
Есть вращающийся вал с оптическим энкодером.
Нужно сделать, чтобы шаговик полностью повторял движение вала. Т.е. вал повернулся на определенный угол, ардуина считала и повернула шаговик. Такой себе электронный редуктор.
В идеале должна быть возможность менять передаточное число этого редуктора.
Идеи есть как это реализовать, но может быть есть подобные проекты, зачем изобретать велосипед?
а как задающий вал сибя ведёт ? постоянно вращается - +/- дельта к скорости вращения ? или может ускоряться, замедляться, менять направление вращения ?
Один в один положение задающего вала хорошо отрабатывает двухканальная система СинхронноСледящегоПривода. ССП - сельсин-датчик + сельсин-приёмник + опорное напряжение.... Сложнова-то по железу...
Отследить положение задающего вала, его скорость вращения, ускорение и ускорение ускорения - можно. И восстановить эти параметры поведения вала - тоже можно - НО при вялотекущих изменениях поведения задающего вала....
При некоторых условиях - Ардуино не справится :(
Изучайте классику жанра и вам всё станет понятно: "0" активных компонентов!
https://www.youtube.com/watch?v=HeILJPjSQ_Y
Нет, в том то и дело что он вращается периодически. ускорение не так у ж и важно.
Спасибо.
дык, сообщите уж параметры вращения задающего вала....
Изучайте классику жанра и вам всё станет понятно: "0" активных компонентов!
https://www.youtube.com/watch?v=HeILJPjSQ_Y
...кажися, ещё ни чо не ясно ! нет ?
\
Нет, в том то и дело что он вращается периодически. ускорение не так у ж и важно.
задающий вал вращается с какой частотой ? девиация - скока составляет ?
задающий вал вращается с какой частотой ? девиация - скока составляет ?
Частота максимальная 5об/сек. Частота импульсов с энкодера 4,5кгц.
Нет, в том то и дело что он вращается периодически. ускорение не так у ж и важно.
Ускорение НЕ ТАК УЖ ВАЖНО ? Т.е. не важно, но желательно??
Скорее всего, шаговик Вам не подойдет. Нужно взять точно такой-же оптический энкодер и двигатель с подобными характеристиками (ну кроме мощности), как на измеряемой стороне, и сделать обратную схему. Это будет правильный подход.
Пытаться шаговиком дублировать переменные обороты не совсем корректно.
кабина РЛС вращается со скоростью 1 оборот за 10 сек
цифровой ССП организован так
- от станции на АСУ передаются импульсы "Север" и "МАИ" ( 4096 за оборот )
- приёмная сторона - счётчик МАИ ( 12-ти разрядный ), обнуление счётчика - или по переполнению, или по сигналу Север, если переполнение и Север разбежались по времени
- код со счётчика = текущий азимут ( положение кабины РЛС ) - от него и формируется вращающаяся развёртка на индикаторах
в авто - тоже самое
- каждый зуб маховика через индуктивный датчик формирует импульс N ( как в РЛС МАИ ), пардон - МАИ масштабные азимутальные импульсы
- один зуб маховика "спилен" - из последовательности импульсов N можно выделить расширенный импульс = ВМТ ( в РЛС - Север ), ВМТ = верх. мёртв. точка положения коленвала
- в мозгах управления двигателем тоже есть счётчик ( т.е. мозги в каждый момент могут вычислить текущее положение коленвала )
не знаю пока как управлять шаговиком :( , щас пойду изучать....
как далеко вторичный вал будет находиться от первичного ( задающего ) ?
Второй вариант
- на задающем валу поставить абсолютный энкодер
- код с него будет более точно определять положение первичного вала ( но проводов будет больше )
Дело в том, что узнать какая там схема проблематично. Будем считать что это черный ящик. В принципе оно так и есть.
Идеи есть как это реализовать, но может быть есть подобные проекты, зачем изобретать велосипед?
Два сельсина и никакой сложной и глючной электроники.
Сельсины не подойдут однозначно.
https://www.youtube.com/watch?v=aMIDNipYLho
Нашел вот такое кино. Собрал. Работает медленно,если быстрее крутнуть энкодер шаги пропускаются.
Немного продвинулся в решении проблемы. 1 к 1 синхронизировать энкодер и ШД удалось. Поступает 1 на прерывание, определяем направление, и делаем шаг ШД. Можно сделать два шага, три и тд. (зависит от скорости вращения). Таким образом имеем "редуктор" с определенным передаточным числом. Теперь задача получить дробное передаточное число. Чтоы точно подорать отношение вращения валов.
На лазерном гравере, например, это делается при помощи ввода значения, кол-ва миллиметров за которое каретка пройдет за один шаг ШД. Как это реализовано программно не понимаю. Но факт:) Драйвер двигаетеля при помощи джамперов настроен на микрошаги определенной кратности.
Может у кого есть идея? Может быть сделано ввиде своеобразного стека, в который поступает управляющая информация о вращении (число шагов), но выполняется по появлению свободного времени у МК. Или как-то так.
Понять бы алгоритм, программу написать не проблема.
Господи, какие стеки? Какая программная реализация? Ну ведь это же "пропорция", примерно из 5-того класса школы.
Если Вася за сожрал A яблок, а Петя, за это же время, успел счавкать B яблок, то сколько яблок успеет ухрупать Петя пока Вася схрумает D яблок?
A<--->B
D<--->x
A,B,D - известы. А и B, сотоносятся как D и x. Задача: найти x
Умножаем "известную диагональ", и делим на известное число в диагонали с X-сом.
x=(D*B)/A;
В вашем случае A/B - желаемое передаточное число. D - на сколкьо повернулся вал. x - на сколько нужн повернуть шаговик.
Шаговик - можно использовать в режиме "микрошагов" (что-бы сами шаги были "более мелкие". естествено с потерей мощьности/скорости).
Если, в итоге x получает дробным, ну округлить его да и все.
Ну или, если пропорции забылись.
предатавим что у нас есть функция от f(x) которая возвращает сколько нужно шагов сделать если энкодер вернул x-тиков.
Так как мы уже использовали термин "передаточное число", то не трудно догадатся что она будет иметь вид f(x)=k*x;
Осталоль только найти k - то самое передаточное число. Что-бы его найти, нам нужно хотя-бы иметь хотя-бы одну "известную пару". Скажем мы знаем, что при A тиках энкодера, нужно сделать B шагов.
Подставляем в нашу функцию: B=k*A; Находим неизветсное k=B/A;
В итоге имеем функцию: f(x)=(B/A)*x
Что, удивительным образом напоимание "формулу", из прошлого сообщения.
Если же передаточное число у нас заранее известно, то вообщем-то и k искать нам не нужно. Просто умножаем тики энкодера, на передаточное - и сразу знаем сколько шагов нужно сделать.
А если вообще не хочется голову забивать, то можно просто посмотреть в раздел "Программироние" и ознакомится какие уже есть готовые функции. Если при знакомстве с ардуиной и разбирательством с analogRead(), нам не попадалась фунция map . Которая, по сути и реализует то самое нахождение неизвестного члена пропорции.
А если вообще не хочется голову забивать, то можно просто посмотреть в раздел "Программироние" и ознакомится какие уже есть готовые функции. Если при знакомстве с ардуиной и разбирательством с analogRead(), нам не попадалась фунция map . Которая, по сути и реализует то самое нахождение неизвестного члена пропорции.
Угу. Я там в другой ветке про функции заикнулся. Круг нарисовать....
Впечатление что они скоро и цифры не будут учить. Ибо нафига, жми похожие кнопки на кплькуляторе и все.
Тоска
Это все ясно. Но вы предлагаете считать порциями. А мне такой вариант не подходит. Если за минимально перемешение мы берем один шаг ШД то что делать если с энкодера пишел один импульс, а для одного шага ШД нужно их 2, 54
Отсюда и появилась идея. На преывании висит энкодер, функция прерывания определяет направление увеличивает или уменьшает переменную moved на нужное число мм. В loop функция, которая которая проверяет изменение moved, если уменьшилось, то вращает ШД на один шаг и увеличивает значение moved на свое кол-во миллиметров. Не велосипед?
А если вообще не хочется голову забивать, то можно просто посмотреть в раздел "Программироние" и ознакомится какие уже есть готовые функции. Если при знакомстве с ардуиной и разбирательством с analogRead(), нам не попадалась фунция map . Которая, по сути и реализует то самое нахождение неизвестного члена пропорции.
Хе-хе. Стареем? "Раньше трава была зеленее..." :)
Хотя, объективонсти ради, в области образования - таки "зеленее". Причем даже не сколько "конкретные знания", сколько отношения/ценности стиль мышления.
В в институте, преподаватель нам показывал задачки, которые были на вступительных в 80-тых. Из категории "простые". Для нас, в 90-тых, они уже были даже не "средней сложности", а "задачи повышенной сложности"/бонусные (либо вообще не решались). А у нас, на тот момент, была лучшая мат. подготовка по стране. На обычные школы мы смотрели "свысока" (их "сложные", мы решали в уме).
Так что, то что "трава зеленее" - это объективно. Когда смотришь на задачу мозги закипают, а ты видишь, что она взята из вступительного билета на какой-то "не престижный факультет" (где мат. вообще не профильное), только 10-15 летней давности.
Глядя на тех кто "на три/четыре года младше" - было страшно.
Так что про "функции" - это фигня. Когда это в домашнем роботостроении - все нормально (более того, раз человек этим занимается, значит, все-таки есть желание шевелить мозгами, пусть и есть пробелы). А вот как представишь что подобный специалист где-то на атомной станции... Или расчет конструкций развлекательного центра, с бассейном на 3-тьем этаже, делает.... Или, не дай бог, врач...
P.S. Ну и объективности ради, вы там про функцию "так упомянули", что.... трудно было заметить полезное в вашем посте. Хотя сам этим болею. Чем дальше тем труднее сдерживать раздражение.... стареем :)
Это все ясно. Но вы предлагаете считать порциями. А мне такой вариант не подходит. Если за минимально перемешение мы берем один шаг ШД то что делать если с энкодера пишел один импульс, а для одного шага ШД нужно их 2, 54
Округлить и сделать нужно число шагов.
Отсюда и появилась идея. На преывании висит энкодер, функция прерывания определяет направление увеличивает или уменьшает переменную moved на нужное число мм. В loop функция, которая которая проверяет изменение moved, если уменьшилось, то вращает ШД на один шаг и увеличивает значение moved на свое кол-во миллиметров. Не велосипед?
Велосипед. Только в хорошем смысле этого слова. Что же делать если, в данном случае, вам нужен велосипед? ;) Помоему нормальная и очевидная логика.
Только в реализации нужно учесть пару нюансов:
Первое:
прерывание должно отрабатся как можно быстрее. Поэтому не нужно в него запихивать никаких вычислений, миллиметров и т.п. Там только сохранение в переменную "сколько и в какую сторону шагнули". В тиках энкодера. Сырые данные.
Все вычисление/переводы - уже в Loop().
Второе:
Я бы, навреное, по крайней мере для шаговика, пользовался скорее понятием position. Вернее currentPosition и targetPosition.
Вообщем, в loop(), вначале тики энкодера пересчитываем "на сколько вал повернулся". Эту цифру переводим в "на сколько нужно поменять позицию шаговика". И вот эту дельту - добавляем к targetPosition (направление получится "само собой". положительная дельта - в одну сторону, отрицательная - в другую).
Затем сравниваем currentPosition и targetPosition. Если не совпадают, делаем шаг в нужном направлении (смотря кто больше) и обновляем currentPosition.
Это разделение "на сколько повернулся энкодер" и "куда и сколько крутим шаговик" нужно потому что - они не всегда могут совпадать. Ситации когда скажем нужно было сделать 10-шагов по часовой, успели сделать, три, а в это время, от энкодера пришло "5-ть шагов против часовой"... в итоге нужно сделать еще два шага по часовой и остановится.
Кстати... не забудте, что кроме стандартной либы Stepper (или самому ноги дергать) есть еще продвинутая либа AccelStepper. Где все эти targetPosition/currentPosition/moveTo - уже реализованы. Плюс ускорения и т.п. Возможно даже микрошаги (не уверен, не помню).
И, в отличие от стандартного Stepper - она не блокирующая. То есть паралельно можно еще чем-то заниматся в Loop() .
Все плюшки - не беслатно. Тяжеловесная (скажем когда пихал преокт в ATMEGA8 пришлось отказаться от нее, и писать упрощенный вариант самому).
Но даже в этом случае - имеет смысл "подсмотреть", как в ней все это реализованно (да вообще смотреть исходиники библиотек - очень классный обучающий материал. Можно найти и "как нужно делать" и "как не нужно" ;)
Огромное спасибо. Все получилось. Не понял только зачем нужна библиотека stepper если есть железный драйвер ШД. Ему нужен только step и dir.
P.S. Ну и объективности ради, вы там про функцию "так упомянули", что.... трудно было заметить полезное в вашем посте. Хотя сам этим болею. Чем дальше тем труднее сдерживать раздражение.... стареем :)
Дык обьективности ради, что бы человек оценил, нужно что бы он понял суть что и как и почему. Разобрался в элементарном. А если он не понимает что круг это куча точек позиция которых считается по элементарной формуле. Или что редуктор это обычное уравнение с одним неизвестным..
IMHO. Ардуино хороший конструктор для ТВОРЧЕСТВА, а не для глупого копирования всякой фигни. А творчество не возможно без понимания элементарных процессов. Так народ скоро начнет квадратные колеса лепить, потому что в инструкции так написано..
P.S. Ну и объективности ради, вы там про функцию "так упомянули", что.... трудно было заметить полезное в вашем посте. Хотя сам этим болею. Чем дальше тем труднее сдерживать раздражение.... стареем :)
Вроде бы суть обьяснил. Все равно считаете, что мне нужно обьяснять как посчитать редуктор?
Угу. Считаю.
Мне интересно просто 2.54 импульса, это как? Я себе вижу прмерно как то из серии 2.5 землекопа. :)
Опять же, никто толком так и не понял что вы там сооружаете. Поэтому гадать почему у вас импульсы в сотых частях и шаг у двигателя. Может имеет смысл взять другой двигатель или редуктор к нему что привести к целым значениям. И увеличить скорость работы..
Так народ скоро начнет квадратные колеса лепить, потому что в инструкции так написано..
НЕ начнёт ! :) оне уже рассчитаны.... тока дорга под них - дороговатая будет.... :)
Если за минимально перемешение мы берем один шаг ШД то что делать если с энкодера пишел один импульс, а для одного шага ШД нужно их 2, 54
нууууу, пристройте от задающего вала на вал энкодера передачу из двух шестерёнок с К = 2,54 ( или 5,08 лучше )
один тик энкодера - один шаг ШД ( два тика - один шаг )
Так народ скоро начнет квадратные колеса лепить, потому что в инструкции так написано..
дорОга - дорогА :)
Это костыль. Должно все работать без механики.
Это костыль. Должно все работать без механики.
не понял - КОСТЫЛЬ :(
опять про Котельникова-Найквиста..... в Вашей задаче точьность энкодера должна быть не менее чем в два раза больше точьности ШД.... по другому - только апроксимация ( с потерей точности ) !
что такое - костыль ? это же не из ЖД слэнга ?
Костыль это как нога, но не совсем. :)
Народ помогите пожалуйста. Сделал робота паука на конкурсе за пару дней на ардуино леонардо и тупо два серво мне его подарили. Могу забить программу что бы он двигался по нужной траектории, но никак не пойму как сделать банальное управление с компа через USB шнур. Подсказали почитать про сериал но там все примеры с светодиодами так и не разобрался.
Если не сложно набросайте примерный скеч хотябы для одного серва что бы кнопка вперед назад стоп или как лучше даже не представляю.
Народ помогите пожалуйста. Сделал робота паука на конкурсе за пару дней на ардуино леонардо и тупо два серво мне его подарили. Могу забить программу что бы он двигался по нужной траектории, но никак не пойму как сделать банальное управление с компа через USB шнур. Подсказали почитать про сериал но там все примеры с светодиодами так и не разобрался.
Если не сложно набросайте примерный скеч хотябы для одного серва что бы кнопка вперед назад стоп или как лучше даже не представляю.
Нужно срочно учиться создавать темы на форуме.
Я не знал в какую тему написать, но примерно такой реакции и ожидал!
Я не знал в какую тему написать, но примерно такой реакции и ожидал!
Вы внедрились в чужую тему... Просто создайте свою :) , не надо ни в какую писать ( можно - но родственную Вашему вопросу )
....и будет совершенно другая реакция, скорее всего :)
Народ помогите пожалуйста. Сделал робота паука на конкурсе за пару дней на ардуино леонардо и тупо два серво мне его подарили.
Судя по дальнешему, не "сделал", а "собрал". По чужим рецептам и чужим скетчам.
Могу забить программу что бы он двигался по нужной траектории, но никак не пойму как сделать банальное управление с компа через USB шнур.
Что значит "забить"? Взять и залить чужой скетч? Теперь чужой не делает "что хочется" и нужно что-бы кто-то написал другой, который "хочется"?
Подсказали почитать про сериал но там все примеры с светодиодами так и не разобрался.
Правильно подсказали. Если со светодиодами не разобрались... значит рано еще читать про сериал. Еще на ступеньку ниже спускаться. Начинать с мигания светодиодом, delay() и без. Разбиратся переменными, if-фами и т.п.
Потом уж с сериал. Вначале просто принимать/опознавать букву, потом уже и числа читать в переменные, внале одну цифру, потом число целиком,
Потом на основании этих переменных светики включать. Вначале просто "влючить/выключить". Потом яркость задавать. Вначале один, потом несколько.
потом разбиратся досконально, до каждой буквы кода как же ваш паук работает. что там есть, зачем, почему и что на что влияет.
К этом моменту как применить знания "включать любой светик на нужную яркостЬ" к задаче "включать сервы" (задавать траекторию и т.п.) - станет самоочевидно.
Естественно по чужим чертежам потому как это конкурс был и роботы у всех одинаковые. И скеч тоже по примеру потому как я вообще ничего не программировал никогда, я просто разобрался что в нем значит и подогнал задержки под траекторию трассы. В общем я нуб в этом деле. А паук работает элементарно два двигателя двигают две боковых рамы с лапами. Банально крутишь в разные стороны он разворачивается, в одну сторону едет прямо. Вот и хочу просто сделать уплавление.
Естественно по чужим чертежам потому как это конкурс был и роботы у всех одинаковые. И скеч тоже по примеру потому как я вообще ничего не программировал никогда, я просто разобрался что в нем значит и подогнал задержки под траекторию трассы. В общем я нуб в этом деле.
Нуб - это поправимо. При достаточном желании и потраченом времени.
Но для нуба ваша хотелка "слишком сложна", что-бы он мог сделать ее самостоятельно. Даже с чужой помощью (именно сделать, а не упросить кого-то "сделайте мне, мою хотелку").
Так что нужно либо переставать быть нубом, либо развивать навыки манипулировния окружающими ;) В любом случае прийдется учится ;) Начать учебу, можно, как уже заметили - с заведения тем. Только ради бога, придумайте теме какой-то внятно/уникальное название. Не нужно "помогите новичку", "нужна помощь со скетчем" и т.п.
Но лучше то делать, когда уже хоть чуть-чуть перестанете быть нубом, когда освоите составные части вашего робота по отедльности в существующих темах (в теме про кнопки - разбирайтесь с кнопками, в теме про сервы - с сервами, в теме про передачу данных - с Serial и т.п.) А уж потом, будете все это собирать в единого "робота с управлением по USB".
Иначе это будет "сделайте мне2" и велик шансы что вместо помощи получите килограмм "тро-ло-ло" Впрочем, "тро-ло-ло" можно получить в любом случае, как звезды и настроение форумчан сложится. Нужно и к этому быть готовым ;)
Благо есть добрые люди и теперь у меня все работает. Спасибо за советы я просто банальн не знал где и что искать)
Дадада. Мы тут не добрые. Мы тут садисты, хотим что бы люди научились думать, а не копировать.
давайте будем ШД крутить.... паукист уже в другой ветке....
http://arduino.ru/forum/obshchii/pomogite-sdelat-samoe-prostoe-upravleni...