Позиция сервопривода
- Войдите на сайт для отправки комментариев
Привет. Пишу курсовую работу по теме стабилизатор для камеры. Есть два сервопривода MG90S, ардуино уно, датчик GY-521. Появилась мысль "А как бы поменять положение камеры?". Сразу же пришла идея со стиком такого вот плана:
Но вот возник вопрос: как задать текущий поворот вала на сервоприводе как начальное положение? То есть, оба сервопривода в положении 90 градусов. Мне приспичило поменять немного угол, я, используя переключатель, отключаю в коде датчик и подключаю джойстик. Меняю, скажем, на 40 градусов положение одного сервопривода. Стало быть, один в положении 90 градусов, другой 130. Потом снова переключателем перехожу с джойстика на датчик.
И как можно задать эти положения "нулевыми" для датчика, чтобы камера стабилизировалась на этих положениях? Это решается через код или надо что-то другое добавлять? Или это вообще изначально будет сохраняться, при переподключении датчика в то время, пока поменялся угол вала сервопривода? Сейчас кнопки при себе нету и нет возможности проверить это.
(И добавление 3 сервопривода не вариант)
1) Через код;
2) Само собой никуда не сохраняется. Хоть изначально, хоть потомошно.
Ну хорошо. На хабре видел пост, как юзер запоминал значения с сервопривода через замерения напряжения на плате сервопривода (микроконтроллера или микросхемы, не помню какой сервопривод использовался). Очень подробно расписано.
Допустим, как там описано:
01
// предельные уровни сигнала с сервы
02
#define A_VMIN 0.43
03
#define A_VMAX 2.56
04
05
/*
06
* Возвращает текущий угол поворота сервы исходя
07
* из сигнала с его потенциометра
08
*/
09
int
realAngle()
10
{
11
return
map(
12
analogRead(A5),
13
A_MAX * A_VMIN / A_VREF,
14
A_MAX * A_VMAX / A_VREF,
15
0, 180);
16
}
Это всё понятно, если не ошибаюсь, по длине импульса также можно сделать. Но проблема в том, что в посте сервопривод в одном направлении используется, что из функции map'a тоже понятно. А как можно сделать, чтобы он положение то использовал как начальное, и смог вернуться обратно при необходимости?
Или, если всё должно работать с кодом выше, то объясните пожалуйста почему, я не совсем догоняю.
В качестве ремарки: я каждый Ваш пост перечитываю дважды или трижды, потому что они написаны языком образов, а не техники.
Что такое "юзер запоминал через замерение напряжения?". Что можно сделать по длине импульса? Чьего импульса? При какой необходимости сервоприводу нужно куда-то вернуться?
И, поймите сразу, это не нам нужно объяснять Вам, как сделать что-то. Это Вам нужно свои мысли перевести в доступный микроконтроллеру алгоритм. Без осознания этого факта тут будет открыто собрание умнейших людей, которыми представляются себе все, кто начинает после третьего стакана обсуждать проблемы вселенского масштаба - произнося слова умные, в тему, но отчего-то непонимаемые окружающими мерзавцами.
Девелоперы тоже исходники чужие смотрят и часами не могут понять что за ахинея там происходит.
Я не могу придумать такой алгоритм, не знаю за что зацепиться.
1
Что такое
"юзер запоминал через замерение напряжения?"
. Что можно сделать по длине импульса? Чьего импульса? При какой необходимости сервоприводу нужно куда-то вернуться?
Юзер разобрал сервопривод, посмотрел на плате куда припаян потенциометр. Снял значения напряжения с места припоя при 0 градусов и при 180 градусов, и вставил значения в код в виде переменных A_VMIN и A_VMAX. Здесь есть мысль, чтобы вместо этих значений напряжения (A_VMIN и A_VMAX) поставить пороговые значения импульса с сигнального провода, идущий к сервоприводу, при которых шестерня сервопривода стоит в крайних положениях.
Суть агоритма: Включаю весь прибор. Включается ардуинка, включаются сервоприводы и датчик. Положения сервоприводов, скажем, 90 градусов у каждого. Покрутив немного датчиком, крутятся сервоприводы. Через время я хочу сменить угол стабилизации с 90 градусов у одного сервопривода на 130. Переключаю питание на джойстик, тем самым в коде отключаю от пина на ардуинке датчик. Меняю угол, снова переключаюсь на датчик, отключая от пина джойстик. И уже стабилизация будет происходить на угле в 130 градусов у одного сервопривода и 90 градусов у второго.
Я не знаю, как объяснить датчику, что именно 130 градусов у первого сервопривода - начальная точка. С поста хабра я просто взял запоминание положения сервопривода. Но как впихнуть его так в датчик, чтобы он принимал 130 градусов как начальное положение, но И ещё чтобы сервопривод вращался 130 градусов в одну сторону, и 50 в другую.
Надеюсь, более менее понятно объяснил суть.
Девелоперы тоже исходники чужие смотрят и часами не могут понять что за ахинея там происходит.
Я не могу придумать такой алгоритм, не знаю за что зацепиться.
1
Что такое
"юзер запоминал через замерение напряжения?"
. Что можно сделать по длине импульса? Чьего импульса? При какой необходимости сервоприводу нужно куда-то вернуться?
Юзер разобрал сервопривод, посмотрел на плате куда припаян потенциометр. Снял значения напряжения с места припоя при 0 градусов и при 180 градусов, и вставил значения в код в виде переменных A_VMIN и A_VMAX. Здесь есть мысль, чтобы вместо этих значений напряжения (A_VMIN и A_VMAX) поставить пороговые значения импульса с сигнального провода, идущий к сервоприводу, при которых шестерня сервопривода стоит в крайних положениях.
Очень интересно, честно. А какая библиотека позволяет так управлять сервоприводом? Или есть способ без библиотеки?
Здесь есть мысль, чтобы вместо этих значений напряжения (A_VMIN и A_VMAX) поставить пороговые значения импульса с сигнального провода, идущий к сервоприводу, при которых шестерня сервопривода стоит в крайних положениях.
Хорошо.
Схожая задача: человек умеет бегать со скоростью от 0 до 18,5км/ч. Получится ли у него переставлять ноги, достигнув 50 км/ч, в том случае, если его сильнее бьют (дают импульс подлиннее).
Т.е. имеет ли прикладной смысл экстраполяция соотношения длина импульса/градус поворота при стремлении первого к бесконечности?
Через время я хочу сменить угол стабилизации с 90 градусов у одного сервопривода на 130.
Никак. Датчик просто выдаёт показания, никаких объяснений он понять не в состоянии.
Почитал ссылку ТС. Всё равно не ясно почему нельзя читать значение выставленного угла, это ж не забивания гвоздей?
Остановитесь на этом: как Вы видите алгоритм стабилизации при значении угла N градусов ?
Вот в этом и проблема. Необходимо задать в коде, что эти 130 градусов начальное положение и относительно его работать. Но чтобы не выходил за пределы 180 градусов.
Почитал ссылку ТС. Всё равно не ясно почему нельзя читать значение выставленного угла, это ж не забивания гвоздей?
Если поставим, скажем, на 130 градусов(условно), то разве мы сможем потом его поворотом на -100 градусов повернуть? То есть, не будет ли ардуино думать, что сервопривод сейчас в положении 90 градусов?
У сервопривода ограничение поворота в 180 градусов.
Остановитесь на этом: как Вы видите алгоритм стабилизации при значении угла N градусов ?
Ну так и храните в переменной этот угол, ворочая относительно его качалку сервы на +- сколько хотите градусов в пределах 0-180.
В вашей ссылке товарищ придумал себе такой режим эксплуатации для сервы, оправдав его молотком. У вас же другая песня.
Остановитесь на этом: как Вы видите алгоритм стабилизации при значении угла N градусов ?
Проблема у Вас одна: нежелание понять, что никакая ардуина и датчики запоминать углы, килограммы и что-либо ещё, и, тем более, думать за Вас - не будут.
Так же я вижу желание запрограммировать микроконтроллер смартфонным методом - куда-то пальцем тыкнуть, что-то просвайпить, заскроллить и в продакшн немедля.
Так что выхода два: меняете или подход к решению задачи или тему курсовой.
Остановитесь на этом: как Вы видите алгоритм стабилизации при значении угла N градусов ?
Проблема у Вас одна: нежелание понять, что никакая ардуина и датчики запоминать углы, килограммы и что-либо ещё, и, тем более, думать за Вас - не будут.
Так же я вижу желание запрограммировать микроконтроллер смартфонным методом - куда-то пальцем тыкнуть, что-то просвайпить, заскроллить и в продакшн немедля.
Так что выхода два: меняете или подход к решению задачи или тему курсовой.
Я это прекрасно понимаю. Мне всего нужно знать как снять угол поворота вала у сервопривода, чтобы в дальнейшем использовать как нулевую точку датчика. Стедикам этому пример, когда стиком повернули шестерню и относительно положения стабилизируется весь прибор.
Как снять угол поворота, т.е. текущую позицию - написано в той самой статье. Он прямо пропорционален напряжению, снимаемому с подвижного контакта потенциометра сервомеханизма. На джойстик свой переключились, покрутили его, значение считали, в переменную xDefault занесли. Переключились на автоматику. Постоянно подгоняете алгоритмом выравнивания снимаемое напряжение к xDefault.
Так понятно?
Как снять угол поворота, т.е. текущую позицию - написано в той самой статье. Он прямо пропорционален напряжению, снимаемому с подвижного контакта потенциометра сервомеханизма. На джойстик свой переключились, покрутили его, значение считали, в переменную xDefault занесли. Переключились на автоматику. Постоянно подгоняете алгоритмом выравнивания снимаемое напряжение к xDefault.
Так понятно?
Вот сейчас понятно, спасибо.
Хотя, я вот тут порисовал - снимать положение с потенциометра вроде как и не обязательно. В процессе калибровки занести в переменную "нулевой" градус сервы, который соответсвует нулевому градусу датчика пространственного положения и потом уже относительно его вычислять компенсирующий обратный поворот. Поставили платформу в 0 град., на джойстик переключили, покрутили им, нажали кнопку "Set", по ней в xDefault занесли последнее значение, переданное на серву. В режиме автоматики от xDefault отнимаем угол, считанный с датчика положения.
Хотя, по механике серв у нас тут leks больше спец.
А разве можно безнаказанно сервы руками крутить? Они ж могут сломаться. Неужели нельзя джойстиком вращать и запоминать значения углов, зачем эта механическая переделка?
Хотя, я вот тут порисовал - снимать положение с потенциометра вроде как и не обязательно. В процессе калибровки занести в переменную "нулевой" градус сервы, который соответсвует нулевому градусу датчика пространственного положения и потом уже относительно его вычислять компенсирующий обратный поворот. Поставили платформу в 0 град., на джойстик переключили, покрутили им, нажали кнопку "Set", по ней в xDefault занесли последнее значение, переданное на серву. В режиме автоматики от xDefault отнимаем угол, считанный с датчика положения.
Хотя, по механике серв у нас тут leks больше спец.
Да, не. Я просто понять хочу в чём принципиальная необходимость подключения внутрь сервы? Просто если это учебное задание, то переделка комплектующих в минус должно идти. Ведь можно механически к "валам" извне присобачить потенциометры и тот же молоток на гвоздь ронять, но без вмешательства в серву.
Да, не. Я просто понять хочу в чём принципиальная необходимость подключения внутрь сервы? ....
Серва не имеет датчика положения. Если после включения на серву ничего не подавать, то её положение не определено. Есть два пути установить её в нужное положение - принудительно загнать в ноль и повернуть на нужный угол или влезть внутрь и с резистора взять сигнал текущего положения и от него повернуть на нужный угол. Измерять импульс смысла нет, так как он генериться процессором и всегда известен.
Да, не. Я просто понять хочу в чём принципиальная необходимость подключения внутрь сервы? ....
Серва не имеет датчика положения. Если после включения на серву ничего не подавать, то её положение не определено. Есть два пути установить её в нужное положение - принудительно загнать в ноль и повернуть на нужный угол или влезть внутрь и с резистора взять сигнал текущего положения и от него повернуть на нужный угол. Измерять импульс смысла нет, так как он генериться процессором и всегда известен.
Ну это всё вроде как понятно. Включаем серву, ставим угол как хотим, измеряем и запоминаем угол ("он же длина импульса" ), выключаем- включаем, а угол уже знаем. Или пока выключили - серву скрутили с положения? Но тогда просто вернули в исходное которое знаем. Я всё в толк не возьму зачем ещё провод или два внутрь тянуть. Если бы было безвыходно, то наверное китайцы уже делали бы готовые и ТС мог бы их использовать. Ведь механика в серве "жёсткая" и не позволяет качалке потеряться или стать не туда.
Да просто на алиэкспрессе сервы для других задач, в которых точное позиционирование и обратная связь не нужна.
Да просто на алиэкспрессе сервы для других задач, в которых точное позиционирование и обратная связь не нужна.
Вот и я о том же, добавка информации о положении ротора резистора, а я так понимаю именно его считывает внутренняя микросхема ровным счётом ничего не меняет в возможности позиционирования указанной ТС сервы.
Я чего залип: делал рисовалку-карябалку на 3 сервах. Линии получались с искажениями. Задал вопрос, сказали надо сервы подороже и проскользнула мысль, там же об организации обратной связи с переменника. Сам идею не проверил, подтверждений от других - не нашёл.
"Подороже" - это абстракция. Металлический редуктор вставили - подороже. Движок помощнее сунули - подороже. Другую МС использовали в контроллере - подороже. Точность-то от этого не изменится. Тяга, скорость - да, но не точность. Пот как шумел, так и шумит - т.е. движок будет микроёрзаньем заниматься.
...Сразу же пришла идея со стиком такого вот плана:
Мне приспичило поменять немного угол, я, используя переключатель, отключаю в коде датчик и подключаю джойстик.
Лично я уже запутался.
Не лучше было для начала привести схему подключения, чтобы мы знали, что куда подключено, и вообще - сколько всего есть, и как Вы его называете.
...Сразу же пришла идея со стиком такого вот плана:
Мне приспичило поменять немного угол, я, используя переключатель, отключаю в коде датчик и подключаю джойстик.
Лично я уже запутался.
Не лучше было для начала привести схему подключения, чтобы мы знали, что куда подключено, и вообще - сколько всего есть, и как Вы его называете.
Переключатель для подачи питания, картинка ниже:
Сначала думал использовать переключатель по типу:
1 состояние - питание ардуино, сервоприводов и акселерометра
2 состояние - питание ардуино, сервоприводов и джойстика.
Но подумал, что идея так себе, можно использовать attach() и detach() в коде по нажатию Z-кнопки на джойстике.
Вот примерная схема того, что должно выйти. Называется двухосевой стабилизатор для камеры.
Джойстик не конкретно такой будет использоваться, в нем будет ещё один разъём для Z координаты (нажатие кнопки). Белый провот от джойстика - координата X, серый - Y.
Вот млин замутили то как) Ну что, рассуждаем логически. Надо чтобы ардуино приняла на ноль что, что нам надо... А ардуино это зачем. В общем, пусть ардуино работает как работала, со стандарнтной библиотекой. Не нужно заставлять железо работать непонятно как. А пользователю мы покажем что ему надо. Вот для пользователя пусть будет подкорректирован ввод на экран на 30 градусов влево, если там дисплей будет. Одно математическое выражение, сложение, и все. Ардуино работает с нулем, минус 90, плюс 90, пользоватеь видит 0 градусов, плюс 30, минус 150, и рад очень.
Дальше размышляем дальше. А зачем нам вообще библиотека. Открываем гугл, разбираемся как работает серва. Удивляется, кто еще не читал, выкидываем все электронное кроме переменного резистора, и двигателя. Берем в магазине пару мосфетов, или аналоговый драйвер для биполярного двигателя шаговика, сейчас какой не помню, самый примитивный, к нему еще можно два обычных подключить, и крутить куда надо. Два моста нам надо. и управляем тем же шимом. Алгоритм примерно такой, две переменные от 0 до 1023, одна с резистора получена, где находится наша серве, другая, куда ее надо повернуть, это наша хотелка. Если отличается не более чем на пару тройку, пятерку, ничего не делаем (иначе дребезжать будет). Если меньше более чем на 5, но менее чем на 30, крутим медленно в лево, пока не сравняется. Если менее чем на на 31 и дальше, крутим быстро в лево, пока не сравняется. Если больше на 5-30 крутим медленно вправо, если больше чем на 31 и далее, крутим быстро вправо. В общем, чтобы быть сервой, нужно думать как серва. А у меги 328 мозгов хватит на любую серву.
Вот, придумал еще один метод смещения нуля, самый простой. Берем ставим серву в среднее положение, которое для ардуино считается нулевым. Откручиваем коромысло. или колесико, или что там будет прикручено, ствим его так, чтобы камера была в нашем нулевом положении, прикручиваем обратно. Все, даже с электроникой не пришлось мучаться.... Если его не надо часто менять, то способ идеальный.
аналоговый драйвер для биполярного двигателя шаговика
Не подскажешь что это за зверь такой ?
Вопрос: как сделать ... на сервах
Ответ: выкидываешь сервы, берёшь два транзистора.
Можно было сразу ответить - берешь стедикам, реверсишь его и делаешь как уже всё сделано профессионалами.
аналоговый драйвер для биполярного двигателя шаговика
Не подскажешь что это за зверь такой ?
Я спросил про -> биполярного двигателя шаговика
Вопрос: как сделать ... на сервах
Ответ: выкидываешь сервы, берёшь два транзистора.
Можно было сразу ответить - берешь стедикам, реверсишь его и делаешь как уже всё сделано профессионалами.
У нас не будет особо большой разницы, будем ли мы сами управлять двигателем, либо еще через один микроконтроллер. Если мы уж сделали серву с обратной свзью. то не вижу необходимости в таком посреднике. Ну правда ног у нас побольше станет задействовано. Но появятся возможности новые, самая интересная, мы сможем сами регулировать скорость в зависимости от угла расхождения. Можно чуть угол будет добавить, ближе к предельным, главное не вылететь за пределы резистора. Можно поставить многооборотный резистор, и получить серву оборотов на 5..
Я спросил про -> биполярного двигателя шаговика
Дико извиняюсь, но в 4 почти ночи иногда бывает сложновато выражать свои мысли, которые бегут побыстрее текста, несмотря на на навык слепого набора.
Драйвер биполярного шагового двигателя. Имея ввиду что драйвер униполярного подойдет не всякий, т.к. там просто мощные ключи. А под аналоговый, я имел ввиду, что это должен быть мост. Который подойдет и для упрваления аналогового двигателя с реверсом.
Вот! Надеюсь поправляться не придется)
А ты знаешь что твой двигатель (с картинки) не разу не шаговый, и более того он вообще не похож на биполярный транзистор
У нас не будет особо большой разницы, будем ли мы сами управлять двигателем, либо еще через один микроконтроллер.
...
Вот я и пишу - раз уж вообще ломать желание топикстартеру что-то изобрести самостоятельно в рамках курсовой, то уж сразу стедикам отреверсить и делу конец.
А ты знаешь что твой двигатель (с картинки) не разу не шаговый, и более того он вообще не похож на биполярный транзистор
L298N вполне себе допускает подключение шагового двигателя, но только Current Voltage Stepper Motor, а не вообще любого.
Знаю. Это обычный коллекторные двигатели. Причем тут биполярный транзистор. Есть биполярные и униполярные шаговые двигатели. Этот драйвер мы можем использовать для упрваления одним биполярным шаговым двигателем, подключив к каждому мосту по обмотке, либо можно два обычных коллекторных двигателя, которые стоят в сервоприводах. Вот это то, что нам надо. Мы при помощи этого драйвера управляем двумя двигателями отдельно, получая при этом с переменного резистора сервы аналоговый сигнал, который говорит о том, в каком положении находится серва.
А ты знаешь что твой двигатель (с картинки) не разу не шаговый, и более того он вообще не похож на биполярный транзистор
L298N вполне себе допускает подключение шагового двигателя, но только Current Voltage Stepper Motor, а не вообще любого.
Я не про драйвер спросил а про (биполярного двигателя шаговика)
Знаю. Это обычный коллекторные двигатели.
Браво, почему не написать с первого раза правильно?
А... у меня автокоррекция в голове сработала "двигатель"->"драйвер".
Еще раз отвечу, умел ввиду биполярный шаговый двигатель, только нам нужен не сам двигатель, а драйвер, который подойдет к такому двигателю. Есть двигатели шаговые биполярные и униколярные. И кстати, шаговый двигатель бы тоже подошел, но колхозить в зелезе придется много.
Sadman41, согласен, стедикам использовать будет проще, и я бы взял как запасной вариант. Когда делал диплом несколько переоценил тоже свои силы, делал я правда трассоискатель. Сделать я его сделал, но одну функцию пришлось оставить опцией, а на защите прибор даже не посмотрели, ибо все было быстро. 5 минут о приборе, 5 минут вопросы, и все на том. При том, что сделать можно было все, главное было во времени.
Знаю. Это обычный коллекторные двигатели.
Браво, почему не написать с первого раза правильно?
Смотреть нужно на суть. Если написано что драйвер такогото не нужного устройства, к которому подключить другое, то это значит что на ненужное устройство обращать внимания совсем не надо. Постарайтесь восмользоваться таким предметом, как логика. Не креативность, а логика.