Сервопривод и энкодер

Paradox-2012
Offline
Зарегистрирован: 02.08.2018

Всем привет, новичек и хочу для начала энкодером покрутить сервопривод. Как подключить энкодер и сервопривод по отдельности научился (понял). А вот как в скетче связать положение сервопривода и ручки энкодера не могу сообразить. Поискал по интренту, ничего не нашел. Крутят только потенциометрами.

Энкодер сервопривод 

ардуино 

подскажите пожалуйст где раздобыть скетч? 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Paradox-2012 пишет:

подскажите пожалуйст где раздобыть скетч? 

Написать - не вариант?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Paradox-2012 пишет:

подскажите пожалуйст где раздобыть скетч? 

«На море на океане есть остров, на том острове дуб стоит, под дубом сундук зарыт, в сундуке — заяц, в зайце — утка, в утке — яйцо, в яйце — нужный скетч».

bwn
Offline
Зарегистрирован: 25.08.2014

qwone пишет:

«На море на океане есть остров, на том острове дуб стоит, под дубом сундук зарыт, в сундуке — заяц, в зайце — утка, в утке — яйцо, в яйце — нужный скетч».

Так, что ли?))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Paradox-2012 пишет:

Всем привет, новичек и хочу для начала энкодером покрутить сервопривод. Как подключить энкодер и сервопривод по отдельности научился (понял). А вот как в скетче связать положение сервопривода и ручки энкодера не могу сообразить. Поискал по интренту, ничего не нашел. Крутят только потенциометрами.

подскажите пожалуйст где раздобыть скетч? 

Раздобыть можно здесь: http://arduino.ru/forumy/ishchu-ispolnitelya

Только, прежде, чем писать туда, Вы бы сформулировали поточнее, что именно Вы подразумеваете под словом "связать". И возможно ли в принципе осуществить то, что Вы задумали. Ведь не просто так "Крутят только потенциометрами".

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

andriano пишет:
Вы бы сформулировали поточнее, что именно Вы подразумеваете под словом "связать".
А чё тут формулировать, всё понятно - https://drive.google.com/open?id=0B9r7cRXQ4DU4dHVBNTN1U3FQSUU

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ворота пишет:

andriano пишет:
Вы бы сформулировали поточнее, что именно Вы подразумеваете под словом "связать".
А чё тут формулировать, всё понятно - https://drive.google.com/open?id=0B9r7cRXQ4DU4dHVBNTN1U3FQSUU

И какой из 150 вариантов следует выбрать?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Энкодэр - это дэвайс не имеющий понятия "положение ручки"
Его выходные "понятия" это направление и скорость вращения.
Энкодэром лучше крутить шаговик.
Там вообще процессор не нужен если у вас step-dir контроллер.

Paradox-2012
Offline
Зарегистрирован: 02.08.2018

Я имею ввиду перевести энкодер в скетче так, чтобы его первым 180 "позициям" можно было присвоить угол поворота от 0 до 180 градусов, а все остальные градусы (позиции энкодера) были игнорированы. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

У энкодера не первых позиций.

Вторых - тоже.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

andriano пишет:

У энкодера не первых позиций.

Вторых - тоже.

Есть у энкодера позиции- положишь энкодер в коробку ,то будет позиция "энкодер в коробке", а на столе то "энкодер на столе". Но энкодер не может самостоятельно определить в какой позиции он находится. Так что надо датчики к энкодеру синей изолентой прикрутить.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Но, Вы можете самостоятельно назначить ему некие "позиции" и от них крутить серву.

Просто в момент запуска скетча считаете текущую позицию энкодера нулем, а её изменение право/влево, отслеживаете самостоятельно в переменной (+-) и, тупо ставите серву в текущую "позицию" этой переменной, пересчитывая её в угол места положения. Можно даже добавить кнопку "это ноль", нажатие на которую будет устанавливать серву (и переменную) в нулевое положение.

Не вижу ничего сложного (как у остальных писателей), как заменить резистор энкодером. :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhat109-2 пишет:

Но, Вы можете самостоятельно назначить ему некие "позиции" и от них крутить серву.

Просто в момент запуска скетча считаете текущую позицию энкодера нулем, а её изменение право/влево, отслеживаете самостоятельно в переменной (+-) и, тупо ставите серву в текущую "позицию" этой переменной, пересчитывая её в угол места положения. Можно даже добавить кнопку "это ноль", нажатие на которую будет устанавливать серву (и переменную) в нулевое положение.

Не вижу ничего сложного (как у остальных писателей), как заменить резистор энкодером. :)

Пусть для определенности 1 шаг - 18 градусов.

Какой сигнал надо подать на серву, если энкодер зафиксировал один шаг по часовой?

 

Сложность здесь - принципиальная: интеграл можно вычислить лишь с точностью до константы.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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дить. :)

Paradox-2012
Offline
Зарегистрирован: 02.08.2018

Arhat109-2, спасибо за правильные мысли! Буду пробовать это осуществить...если полчится, выставлю сюда рабочий скетч.  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Архат, если серва находится в положении 90 градусов, то требуется перевести ее в положение 91 градус, а если в положении 60 градусов - то в положение 61. Ваш же код из любого положения переводит серву в положение 1 градус. Это совершенно не то же самое.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Строка 26, написана явно не для ВАС, andriano. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

Строка 26, написана явно не для ВАС, andriano. :)

Андриано, тащемта, прав: при включении дуньки чему у вас равен posEncoder, ась? Правильный ответ, судя по скетчу - 0. А если серва при включении питалова стоит в положении 90 градусов, ась?

Я, конечно, понимаю, что сейчас начнутся жёсткие отбуцкивания вида "для идиотов поясняю, что надо на старте гнать серву в нулевое положение", или "в EEPROM пишем положение сервы", или "ну это уже не ко мне - пусть тот, кто задал вопрос, и додумывает", но - Андриано, тащемта, прав: код не отвечает требованиям.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Код приведен исключительно как ОБРАЗЕЦ на подумать. Как будет синхронизироваться положение сервы и переменной в коде - тут просто не указано. Об этом написано в самом верху пример: "не вдаваясь в детали работы энкодера и настройку сервы"

Выделил для нечитателей..

P.S. И ещё напомню всем чукчам в танке: мне не интересно следить за вашими ляпами в темах, поэтому ожидать напоминаний от меня Вам о них - будет ошибкой. Но, те кто тщательно следит за таковыми .. могут взять эти посты "себе на вооружение" в дальнейшем. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Архат - красавчик, полностью соответствует ожиданиям: если я написал, что он отбрыкается - он таки отбрыкался. Правильно, на минном поле надо быть осторожным :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да читать надо вдумчиво, а не торопиться постить фигню "о, я у Архата нарыл косяк" .. дурни беспонтовые.. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

Да читать надо вдумчиво, а не торопиться постить фигню "о, я у Архата нарыл косяк" .. дурни беспонтовые.. :)

Да там тех косяков - что на гуталиновой фабрике, смысл в том г-не рыться-то? Тебе, хитрожопому,  ссы в глаза - всё божья роса. Вы там с логиком, случайно, не бахаетесь по вечерам?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Лоханулся, так обтекай смирно, не разбрызгивай, дятел.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

Лоханулся, так обтекай смирно, не разбрызгивай, дятел.

Сказал убогий в зеркало :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhat109-2 пишет:

Код приведен исключительно как ОБРАЗЕЦ на подумать. Как будет синхронизироваться положение сервы и переменной в коде - тут просто не указано. Об этом написано в самом верху пример: "не вдаваясь в детали работы энкодера и настройку сервы"

В: Как избежать травм при падении?

О: Нужно подстелить соломку в том месте, где упадешь.

В: А как узнать, где упадешь?

О: Ну, это уже детали реализации...

 

Не следует относить прнинципиально неразрешимые проблемы к деталям реализации.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Что там "принципиально неразрешимого" для Вас, сидящих в лужах? Откройтен секрет полишинеля.. :)

Ещё раз: код приведен КАК ПРИМЕР имитации резистора в переменной .. всего лишь. Об чем там и написано ПО-РУССКИ (надо было как-то ишо?)

Вам ещё и разжевать как синхронизировать значение переменной с реальным положением сервы в пространстве?!? ну .. ваще..

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhat109-2 пишет:

Вам ещё и разжевать как синхронизировать значение переменной с реальным положением сервы в пространстве?!? ну .. ваще..

Вот в этом и разница между потенциометром и энкодером, что для потенциометра проблемы синхронизации нет.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Бли-и-ин .. ну ваще, в отпаде. Ловите.

/**
 * функция синхронизации переменной и положения серводвигателя в пространстве.
 * устанавливает серводвигатель в 0* и переменную потенциометра
 *
 * вызывать в конце setup() после всех настроек. Можно и в другом месте
 */

void initServo()
{
    analogWrite(pinServo, POS_0);
    posEncoder=0;
}

2(ДВЕ!) строчки кода. Самый примитивный вариант, ваша "неразрешимая задача". Ну Вы даете.. ;)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Панеслось! 

Хорошо, что я вчера попкорном затарился.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не протух ещё, попкорн-то? :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhat109-2 пишет:

Бли-и-ин .. ну ваще, в отпаде. Ловите.

/**
 * функция синхронизации переменной и положения серводвигателя в пространстве.
 * устанавливает серводвигатель в 0* и переменную потенциометра
 *
 * вызывать в конце setup() после всех настроек. Можно и в другом месте
 */

void initServo()
{
    analogWrite(pinServo, POS_0);
    posEncoder=0;
}

2(ДВЕ!) строчки кода. Самый примитивный вариант, ваша "неразрешимая задача". Ну Вы даете.. ;)

Архат, Вы меня просто умиляете.

Не нужно устанавливать серву в 0. Нужно сдвинуть ее на 1 градус от текущего положения.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

andriano, перечитайте ТС-а с самого начала. И вопрос что нужно, а что нет - у Вас отпадет. Есть 2 момента в его задаче:

1. Двигать серву энкодером = насколько повернул энкодер, настолько градусов ушла серва от текущего положения. Прекрасно решается строкой 26, на которую указал Вам раньше, но Вы - явно не поняли в ней НИЧЕГО. Там как раз ответ на ваш вопрос: серва (и переменная) стоят в 60* энкодер выдал +2 .. поворачиваем к 62*.

2. Начальная установка позиции. Решение и банальное. Привести серву И переменную в соответствие. Приведено выше. Дальше они изменяются СИНХРОННО, согласно коду. Как правило, начальную установку производят в блоке setup() на Ардуино. Но, никто не мешает реализовать вызов, скажем по кнопке "заново" ..

Как догадываюсь, что допереть до совмещения п.1 и п.2 в рамках задачи ТС-а у вас так и не хватило тяму .. перечитывайте, не позорьтесь. :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhat109-2, читаем ТС дословно: " А вот как в скетче связать положение сервопривода и ручки энкодера не могу сообразить. Поискал по интренту, ничего не нашел. Крутят только потенциометрами."

Вот имеется у нас такой потенциометр. Со шкалой. 

Ну, для простоты, пусть точно так же выглядит и серва - тоже со шкалой. 

Поворачиваем потенциометр на отметку "20" - серва поворачивается на отметку "20". 

Поворачиваем потенциометр на отметку "70" - серва поворачивается на отметку "70". 

Теперь, внимаение: выключаем питание.

Поворачиваем потенциометр на отметку "40", а серва не поворачивается - питания то нет!

Теперь включаем питание.

Потенциометр не трогаем - он у нас стоит на "40", а серва со значения "70" переходит в положение "40".

Вот это и называется "связать положение сервопривода и ручки энкодера".

Именно поэтому и "Крутят только потенциометрами". Потому как энкодер на такое не способен.

Будете спорить?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

Будете спорить?

Обязательно, иначе что это за архат? :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

DIYMan пишет:

andriano пишет:

Будете спорить?

Обязательно, иначе что это за архат? :)

Не. не буду. С дураком спорить, сам таковым станешь. А вас тут и так как собак нерезанных, целая свора .. меж собой, плиз. ТС уже давно все понял и сделал как надо.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

DIYMan пишет:

andriano пишет:

Будете спорить?

Обязательно, иначе что это за архат? :)

Не. не буду. С дураком спорить, сам таковым станешь. 

Стареет наш дурилка-то, сдувается быстро :) Видимо, подгузники уже не держат такого кол-ва обсёров за короткие промежутки времени :)

Gigaster
Offline
Зарегистрирован: 11.03.2019

Тоже такая проблема, но я всё-таки придумал как её исправить. Например:

я хочу управлять двигателем через 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");
}
 
Всё проверено и работает)
Пользуйтесь))
Думаю принцип понятен)))
Skobar
Offline
Зарегистрирован: 06.05.2020

Спасибо добрый человек.