Сервопривод и энкодер
- Войдите на сайт для отправки комментариев
Чт, 02/08/2018 - 20:13
Всем привет, новичек и хочу для начала энкодером покрутить сервопривод. Как подключить энкодер и сервопривод по отдельности научился (понял). А вот как в скетче связать положение сервопривода и ручки энкодера не могу сообразить. Поискал по интренту, ничего не нашел. Крутят только потенциометрами.
Энкодер
сервопривод 
ардуино 
подскажите пожалуйст где раздобыть скетч?
подскажите пожалуйст где раздобыть скетч?
Написать - не вариант?
подскажите пожалуйст где раздобыть скетч?
«На море на океане есть остров, на том острове дуб стоит, под дубом сундук зарыт, в сундуке — заяц, в зайце — утка, в утке — яйцо, в яйце — нужный скетч».
«На море на океане есть остров, на том острове дуб стоит, под дубом сундук зарыт, в сундуке — заяц, в зайце — утка, в утке — яйцо, в яйце — нужный скетч».
Так, что ли?))))

Всем привет, новичек и хочу для начала энкодером покрутить сервопривод. Как подключить энкодер и сервопривод по отдельности научился (понял). А вот как в скетче связать положение сервопривода и ручки энкодера не могу сообразить. Поискал по интренту, ничего не нашел. Крутят только потенциометрами.
подскажите пожалуйст где раздобыть скетч?
Раздобыть можно здесь: http://arduino.ru/forumy/ishchu-ispolnitelya
Только, прежде, чем писать туда, Вы бы сформулировали поточнее, что именно Вы подразумеваете под словом "связать". И возможно ли в принципе осуществить то, что Вы задумали. Ведь не просто так "Крутят только потенциометрами".
И какой из 150 вариантов следует выбрать?
Энкодэр - это дэвайс не имеющий понятия "положение ручки"
Его выходные "понятия" это направление и скорость вращения.
Энкодэром лучше крутить шаговик.
Там вообще процессор не нужен если у вас step-dir контроллер.
Я имею ввиду перевести энкодер в скетче так, чтобы его первым 180 "позициям" можно было присвоить угол поворота от 0 до 180 градусов, а все остальные градусы (позиции энкодера) были игнорированы.
У энкодера не первых позиций.
Вторых - тоже.
У энкодера не первых позиций.
Вторых - тоже.
Но, Вы можете самостоятельно назначить ему некие "позиции" и от них крутить серву.
Просто в момент запуска скетча считаете текущую позицию энкодера нулем, а её изменение право/влево, отслеживаете самостоятельно в переменной (+-) и, тупо ставите серву в текущую "позицию" этой переменной, пересчитывая её в угол места положения. Можно даже добавить кнопку "это ноль", нажатие на которую будет устанавливать серву (и переменную) в нулевое положение.
Не вижу ничего сложного (как у остальных писателей), как заменить резистор энкодером. :)
Но, Вы можете самостоятельно назначить ему некие "позиции" и от них крутить серву.
Просто в момент запуска скетча считаете текущую позицию энкодера нулем, а её изменение право/влево, отслеживаете самостоятельно в переменной (+-) и, тупо ставите серву в текущую "позицию" этой переменной, пересчитывая её в угол места положения. Можно даже добавить кнопку "это ноль", нажатие на которую будет устанавливать серву (и переменную) в нулевое положение.
Не вижу ничего сложного (как у остальных писателей), как заменить резистор энкодером. :)
Пусть для определенности 1 шаг - 18 градусов.
Какой сигнал надо подать на серву, если энкодер зафиксировал один шаг по часовой?
Сложность здесь - принципиальная: интеграл можно вычислить лишь с точностью до константы.
andriano, я понимаю что Вы уже давно не "читатель". ТС прямо указал 180 делений вправо и столько же влево, т.е. по 1* на щелчок энкодера. Что сложного-то?
// не вдаваясь в детали работы энкодера и настройку сервы.. // readEncoder() -- как-то получаем изменение энкодера: 0 - не крутили // сервой управляем через analogWrite(), предварительно настроив таймер правильно: // setTimer() -- настройка таймера на режим "серва" (ШИМ 50гц) // крайние положения серво в попугаях analogWrite() #define POS_LEFT 150 // положение -90 градусов для моей сервы SG-90 #define POS_RIGHT 600 // положение 90 градусов для неё же. #define POS_0 (POS_LEFT+POS_RIGHT)/2 // положение 0* #define pinServo ... // подставить что требуется.. int posEncoder = 0; // текущее положение "резистора" +-180 void setup(){ // настройка пинов куда надо.. setTimer(); } void loop() { int encData = readEncoder(); if( encData != 0 ){ // есть чиселко с энкодера .. имитируем "резистор": posEncoder += encData; // ограничиваем энкодер: if( posEncoder > 180 ){ posEncoder = 180; } if( posEncoder < -180 ){ posEncoder = -180; } // пересчитываем и крутим серву: analogWrite(pinServo, map(posEncoder, -180, 180, POS_LEFT, POS_RIGHT) ); } }Собственно и все. В переменной имитируем "резистор", изменяя его значения на величину смещения энкодера. Делов-то.
P.S. Для "дурошлепов": код приведен исключительно как образец имитации резистора энкодером. Конечно же он - не рабочий. Для подумать, а не с3.14дить. :)
Arhat109-2, спасибо за правильные мысли! Буду пробовать это осуществить...если полчится, выставлю сюда рабочий скетч.
Архат, если серва находится в положении 90 градусов, то требуется перевести ее в положение 91 градус, а если в положении 60 градусов - то в положение 61. Ваш же код из любого положения переводит серву в положение 1 градус. Это совершенно не то же самое.
Строка 26, написана явно не для ВАС, andriano. :)
Строка 26, написана явно не для ВАС, andriano. :)
Андриано, тащемта, прав: при включении дуньки чему у вас равен posEncoder, ась? Правильный ответ, судя по скетчу - 0. А если серва при включении питалова стоит в положении 90 градусов, ась?
Я, конечно, понимаю, что сейчас начнутся жёсткие отбуцкивания вида "для идиотов поясняю, что надо на старте гнать серву в нулевое положение", или "в EEPROM пишем положение сервы", или "ну это уже не ко мне - пусть тот, кто задал вопрос, и додумывает", но - Андриано, тащемта, прав: код не отвечает требованиям.
Код приведен исключительно как ОБРАЗЕЦ на подумать. Как будет синхронизироваться положение сервы и переменной в коде - тут просто не указано. Об этом написано в самом верху пример: "не вдаваясь в детали работы энкодера и настройку сервы"
Выделил для нечитателей..
P.S. И ещё напомню всем чукчам в танке: мне не интересно следить за вашими ляпами в темах, поэтому ожидать напоминаний от меня Вам о них - будет ошибкой. Но, те кто тщательно следит за таковыми .. могут взять эти посты "себе на вооружение" в дальнейшем. :)
Архат - красавчик, полностью соответствует ожиданиям: если я написал, что он отбрыкается - он таки отбрыкался. Правильно, на минном поле надо быть осторожным :)
Да читать надо вдумчиво, а не торопиться постить фигню "о, я у Архата нарыл косяк" .. дурни беспонтовые.. :)
Да читать надо вдумчиво, а не торопиться постить фигню "о, я у Архата нарыл косяк" .. дурни беспонтовые.. :)
Да там тех косяков - что на гуталиновой фабрике, смысл в том г-не рыться-то? Тебе, хитрожопому, ссы в глаза - всё божья роса. Вы там с логиком, случайно, не бахаетесь по вечерам?
Лоханулся, так обтекай смирно, не разбрызгивай, дятел.
Лоханулся, так обтекай смирно, не разбрызгивай, дятел.
Сказал убогий в зеркало :)
Код приведен исключительно как ОБРАЗЕЦ на подумать. Как будет синхронизироваться положение сервы и переменной в коде - тут просто не указано. Об этом написано в самом верху пример: "не вдаваясь в детали работы энкодера и настройку сервы"
В: Как избежать травм при падении?
О: Нужно подстелить соломку в том месте, где упадешь.
В: А как узнать, где упадешь?
О: Ну, это уже детали реализации...
Не следует относить прнинципиально неразрешимые проблемы к деталям реализации.
Что там "принципиально неразрешимого" для Вас, сидящих в лужах? Откройтен секрет полишинеля.. :)
Ещё раз: код приведен КАК ПРИМЕР имитации резистора в переменной .. всего лишь. Об чем там и написано ПО-РУССКИ (надо было как-то ишо?)
Вам ещё и разжевать как синхронизировать значение переменной с реальным положением сервы в пространстве?!? ну .. ваще..
Вам ещё и разжевать как синхронизировать значение переменной с реальным положением сервы в пространстве?!? ну .. ваще..
Вот в этом и разница между потенциометром и энкодером, что для потенциометра проблемы синхронизации нет.
Бли-и-ин .. ну ваще, в отпаде. Ловите.
/** * функция синхронизации переменной и положения серводвигателя в пространстве. * устанавливает серводвигатель в 0* и переменную потенциометра * * вызывать в конце setup() после всех настроек. Можно и в другом месте */ void initServo() { analogWrite(pinServo, POS_0); posEncoder=0; }2(ДВЕ!) строчки кода. Самый примитивный вариант, ваша "неразрешимая задача". Ну Вы даете.. ;)
Панеслось!
Хорошо, что я вчера попкорном затарился.
Не протух ещё, попкорн-то? :)
Бли-и-ин .. ну ваще, в отпаде. Ловите.
/** * функция синхронизации переменной и положения серводвигателя в пространстве. * устанавливает серводвигатель в 0* и переменную потенциометра * * вызывать в конце setup() после всех настроек. Можно и в другом месте */ void initServo() { analogWrite(pinServo, POS_0); posEncoder=0; }2(ДВЕ!) строчки кода. Самый примитивный вариант, ваша "неразрешимая задача". Ну Вы даете.. ;)
Архат, Вы меня просто умиляете.
Не нужно устанавливать серву в 0. Нужно сдвинуть ее на 1 градус от текущего положения.
andriano, перечитайте ТС-а с самого начала. И вопрос что нужно, а что нет - у Вас отпадет. Есть 2 момента в его задаче:
1. Двигать серву энкодером = насколько повернул энкодер, настолько градусов ушла серва от текущего положения. Прекрасно решается строкой 26, на которую указал Вам раньше, но Вы - явно не поняли в ней НИЧЕГО. Там как раз ответ на ваш вопрос: серва (и переменная) стоят в 60* энкодер выдал +2 .. поворачиваем к 62*.
2. Начальная установка позиции. Решение и банальное. Привести серву И переменную в соответствие. Приведено выше. Дальше они изменяются СИНХРОННО, согласно коду. Как правило, начальную установку производят в блоке setup() на Ардуино. Но, никто не мешает реализовать вызов, скажем по кнопке "заново" ..
Как догадываюсь, что допереть до совмещения п.1 и п.2 в рамках задачи ТС-а у вас так и не хватило тяму .. перечитывайте, не позорьтесь. :)
Arhat109-2, читаем ТС дословно: " А вот как в скетче связать положение сервопривода и ручки энкодера не могу сообразить. Поискал по интренту, ничего не нашел. Крутят только потенциометрами."
Вот имеется у нас такой потенциометр. Со шкалой.
Ну, для простоты, пусть точно так же выглядит и серва - тоже со шкалой.
Поворачиваем потенциометр на отметку "20" - серва поворачивается на отметку "20".
Поворачиваем потенциометр на отметку "70" - серва поворачивается на отметку "70".
Теперь, внимаение: выключаем питание.
Поворачиваем потенциометр на отметку "40", а серва не поворачивается - питания то нет!
Теперь включаем питание.
Потенциометр не трогаем - он у нас стоит на "40", а серва со значения "70" переходит в положение "40".
Вот это и называется "связать положение сервопривода и ручки энкодера".
Именно поэтому и "Крутят только потенциометрами". Потому как энкодер на такое не способен.
Будете спорить?
Будете спорить?
Обязательно, иначе что это за архат? :)
Будете спорить?
Обязательно, иначе что это за архат? :)
Не. не буду. С дураком спорить, сам таковым станешь. А вас тут и так как собак нерезанных, целая свора .. меж собой, плиз. ТС уже давно все понял и сделал как надо.
Будете спорить?
Обязательно, иначе что это за архат? :)
Не. не буду. С дураком спорить, сам таковым станешь.
Стареет наш дурилка-то, сдувается быстро :) Видимо, подгузники уже не держат такого кол-ва обсёров за короткие промежутки времени :)
Тоже такая проблема, но я всё-таки придумал как её исправить. Например:
я хочу управлять двигателем через L298N, и ещё 2 сервами.
Воспользовался библиотекой гайвера.
#include <Servo.h> #include "GyverEncoder.h" Encoder g(4, 3, 2); Encoder f(7 ,6 ,5); Servo k; Servo l; int n=90; int t=90; void setup() { g.setType(TYPE1); f.setType(TYPE1); Serial.begin(9600); k.attach(8); l.attach(9); pinMode(10, OUTPUT); pinMode(11, OUTPUT); } void loop() { g.tick(); if (g.isRight()) { Serial.println("Right"); n=n+10; if (n>180) { n=180; } if (n<180 and n>0){ k.write(n); } } if (g.isLeft()) { Serial.println("Left"); n=n-10; if (n<0){ n=0; } if (n<180 and n>0){ k.write(n); } } if (g.isRightH()){ Serial.println("Right holded"); // если было удержание + поворот digitalWrite(10, HIGH); delay(10); digitalWrite(10, LOW); } if (g.isLeftH()) { Serial.println("Left holded"); digitalWrite(11, HIGH); delay(10); digitalWrite(11, LOW); } f.tick(); if (f.isRight()) { Serial.println("Right"); t=t+10; if (t>180) { t=180; } if (t<180 and t>0){ l.write(t); } } if (f.isLeft()) { Serial.println("Left"); t=t-10; if (t<0){ t=0; } if (t<180 and t>0){ l.write(t); } } if (f.isRightH()) Serial.println("Right holded"); // если было удержание + поворот if (f.isLeftH()) Serial.println("Left holded"); }Спасибо добрый человек.