Оптический энкодер

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Тяжко мне работать с энкодерами, не даются они мне.

Имеется такая конструкция:

Шестерня" может крутиться в обе стороны. Красная и синяя полосы это оптические датчики, если зуб шестерни не заслонил датчик, на выходе 1, если заслонил - 0. (конструкция готовая, переделать её нет возможности).

В каком положении остановится шестерня неизвестно.

Мне нужно чтобы при вращении по часовой стрелке переменная увеличивалась, против - уменьшалась.

Помогите реализовать логику работы.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

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

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

Надо сразу определится с режимом 1 зуб 1 шаг переменой или же 1 зуб 2 шага с переменой. Отличие в том что у зуба шестерни 2 стороны.  А значит один датчик при движении в одну сторону фиксирует 1 фронт и 1 спад. Сложность энкодеров в том что бы не пропустить это измение уровня из-за нагрузки на мощность вычислительной системы. А в случае механического энкодера еще и подавить дребезг. Что на больших скоростях вращения проблематично так как время прохода зуба может оказаться больше времени защиты от дребезга. Из-за чего переходят на оптику.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Всего в шестерне 90 зубьев.

Соответственно переменная должна быть от 0 до 90

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Главное понимать в какую сторону он крутится, а сколько там зубьев не важно-может его несколько оборотов решили крутить в одну сторону ...

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

С этим у меня и сложность, узнать в какую сторону крутится.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В #1 я описал принцип.

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

Irinka пишет:

С этим у меня и сложность, узнать в какую сторону крутится.

Фронт и 1 это в одну сторону; Фронт и 0 в другую это 1 шаг один зуб.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Печатаю и ламинирую шестерню, скоро отпишусь

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

PS...

Я чего подзатупила то...смотрю на свой рисунок из первого сообщения, и думаю. ведь зуб шестеренки закрывает оба датчика...а по факту то он закрывает только один, зубчик узкий, как раз между датчиками помещается и закрывает их по очереди...

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Значит надо раздвинуть датчики на разные зубья.

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

Ширина зуба должна уметь закрыть и открыть оба датчика одновременно . Иначе энкодер не выйдет

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

qwone пишет:

Ширина зуба должна уметь закрыть и открыть оба датчика одновременно . Иначе энкодер не выйдет

Сейчас узнаю точно, закрывает или нет.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Зуб закрывает оба датчика, всё правильно.


​if (!A_Read && !B_Read && !FlagPrer){
  FlagPrer=true;
}


if (FlagPrer && A_Read){
  FlagPrer=false;
  i++;
}
if (FlagPrer && B_Read){
  FlagPrer=false;
  i--;
}

A_Read и B_Read это чтение пинов ардуино (соответственно первый и второй оптический датчик)

Правильное решение?

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

Запустите пример из библиотеки.
Тот что на прерываниях.
Только кондерчики поставьте 10-100 нан.
И вам сразу станет ясно работает ли ваше размещение датчиков.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

trembo пишет:
Запустите пример из библиотеки. Тот что на прерываниях. Только кондерчики поставьте 10-100 нан. И вам сразу станет ясно работает ли ваше размещение датчиков.

Датчики работают, это я проверила, зуб закрывает оба датчика, промежуток между зубами - открывает оба датчика

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

{
  static bool old_A;
  if (old_A && !A_Read && B_Read)i++;
  if (old_A && !A_Read && !B_Read)i--;
  old_A = A_Read; //<- перенести в конец
}

 A - B // 0-0;0-1;1-1;1-0 ну и так далее 90 раз за весь оборот шестерни в одном направлении

sadman41
Offline
Зарегистрирован: 19.10.2016

Так, вроде, попроще будет?

if (old_A && !A_Read) {
    i += B_Read ? +1 : -1;
}

 

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

Irinka пишет:

trembo пишет:
Запустите пример из библиотеки. Тот что на прерываниях. Только кондерчики поставьте 10-100 нан. И вам сразу станет ясно работает ли ваше размещение датчиков.

Датчики работают, это я проверила, зуб закрывает оба датчика, промежуток между зубами - открывает оба датчика


Я же вам советую не проверить то что они работают,
а то что они работают по правилам работы инкрементального энкодера.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Сделала шестерню из картона, 20 зубьев.

qwone пишет:


{
  static bool old_A;
  if (old_A && !A_Read && B_Read)i++;
  if (old_A && !A_Read && !B_Read)i--;
  old_A = A_Read; //<- перенести в конец
}

 A - B // 0-0;0-1;1-1;1-0 ну и так далее 90 раз за весь оборот шестерни в одном направлении

Результат за 1 оборот шестерни - 12 или 13 

Мой скетч показывает 19-20

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

trembo пишет:
Irinka пишет:

trembo пишет:
Запустите пример из библиотеки. Тот что на прерываниях. Только кондерчики поставьте 10-100 нан. И вам сразу станет ясно работает ли ваше размещение датчиков.

Датчики работают, это я проверила, зуб закрывает оба датчика, промежуток между зубами - открывает оба датчика

Я же вам советую не проверить то что они работают, а то что они работают по правилам работы инкрементального энкодера.

Не поняла какой библиотеки

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

Я про энкодер.
https://github.com/PaulStoffregen/Encoder
А вы о чем?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

trembo пишет:
Я про энкодер. https://github.com/PaulStoffregen/Encoder А вы о чем?

Работает.

80 прерываний на оборот (20 зубьев)

Библиотека не использует паузы? Остальные функции будут работать стабильно?

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

Один из примеров работает по прерываниям.
Я как-то этой библиотекой проверял энкодер 1024 импульса на оборот после ремонта.
Заменял заклинившие подшипники.
Разборка и сборка только в патроне токарного станка.
Потом пришлось постепенно пододвигать фотодиск к датчику пока не добился четкой работы.
Там зазор 0.3мм примерно
Крутил несколько сот оборотов в одну сторону и потом обратно.
.
Закреплённая стрелка-указатель чётко возвращалась на прежнее место.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
long position=0;
long newPos=0;


void loop() {
newPos = myEnc.read();
if (newPos != position) {
position = newPos;
Serial.println(position);
} 

 Я не поняла, как мне сбросить переменную position

Как сбросить myEnc.read()

К примеру, 

if (position>=20){

 position=0; 
}
alex_ivanoff_31
Offline
Зарегистрирован: 01.06.2019

Irinka пишет:

Тяжко мне работать с энкодерами, не даются они мне.

Имеется такая конструкция:

 

Шестерня" может крутиться в обе стороны. Красная и синяя полосы это оптические датчики, если зуб шестерни не заслонил датчик, на выходе 1, если заслонил - 0. (конструкция готовая, переделать её нет возможности).

 

В каком положении остановится шестерня неизвестно.

Мне нужно чтобы при вращении по часовой стрелке переменная увеличивалась, против - уменьшалась.

Помогите реализовать логику работы.

Ты не у тех спрашиваешь! Тут в основном тусуются кодеры теоретики, а не состоявшиеся программисты, которые способны что-то реальное сотворить!

Логика работы тут простая -

1 - Если энкодер вращается  по часовой стрелке, то первым ВСЕГДА будет изменять свое состояние синий датчик,  а потом красный.

2 - Если против часовой, то наоборот - первым ВСЕГДА будет изменять свое состояние красный датчик, а потом синий.

3 - Если один из датчиков (ЛЮБОЙ), ДВА раза ПОДРЯД, изменит свое состояние, а другой датчик останется в неизменном состоянии, то произошло изменение направления вращения энкодера. 

Программно сначала фиксируешь состояние обоих датчиков,  а потом смотришь какой датчик изменился. По этому изменению определяешь направление вращение энкодера, ну а дальше либо инкрементируешь рабочий счетчик, либо декрементируешь его. В подпрограмме обработки прерываний ловишь все фронты импульсов обоих датчиков, и как только обнаруживаешь  сбой очередности срабатывания датчиков, меняешь направление счета рабочего счетчика.

Если нужен "строгий" подсчет срабатываний датчков, то при каждом изменении направления подсчета, необходимо принудительно прибавлять(или вычитать) единицу в рабочий счетчик. Если этого не сделать, то при частых сменах направления вращения энкодера будет накапливаться системная ошибка!

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

alex_ivanoff_31 спасибо за разъяснения.

До сегодняшнего дня я не интересовалась аппаратной стороной работы энкодера.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Разобралась, всем спасибо.

Один (сдвоенный оптический датчик считает зубья), второй датчик,тот что на фото, обнуляет круг (такая конструкция, не я придумала).

https://youtu.be/eZbc9EriKHw

Green
Offline
Зарегистрирован: 01.10.2015

Иринка, а вот интересно. Только одному мне сдаётся что вы мужик? Давайте уж начистоту.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Что-то новое, конечно, интересное)

вконтакте

 

Гриша
Offline
Зарегистрирован: 27.04.2014

маленький довесок к

alex_ivanoff_31 пишет:

Логика работы тут простая -

ТУТа есть картинка и график и написано немного больше... за код в статье ничего не скажу, а за принцип работы "для чайникоф" 5+

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

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

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

Вообще-то на моей памяти три энкодера:
Инкрементальный, инкрементальный с Z каналом и абсолютный

Гриша
Offline
Зарегистрирован: 27.04.2014

trembo пишет:
Вообще-то на моей памяти три энкодера: Инкрементальный, инкрементальный с Z каналом и абсолютный

маловато будет... всю статью не читал и в ней не хватает механических... ниже источник и выдержка из текста

Типы и виды энкодеров

Различают следующие типы энкодеров:

Инкрементные энкодеры магнитные
Инкрементные энкодеры оптические
Абсолютные энкодеры магнитные
Абсолютные энкодеры оптические однооборотные
Абсолютные энкодеры оптические многооборотные
Аналоговые энкодеры магнитные
Аналоговые энкодеры оптические
Резольверы

Различия типов энкодеров по физическому принципу

Кроме того, энкодеры классифицируют по физическому принципу действия, а именно:
Оптические энкодеры
Магнитные энкодеры
Магнито-резистивные энкодеры
механические 

источник: <a data-cke-saved-href="http://servotechnica.ru/catalog/type/index.pl?id=118" </a> 

понравился отрывок:
Главное достоинство резольвера в том, что он не настолько "нежен" как оптический энкодер. 
Ведь для правильной работы энкодера исключительно важно соблюдать зазоры между 
источником - диском - приёмником. Эти зазоры уходят за свои допустимые границы обычно по двум причинам.

Сказанное не означает, что по резольверу можно стучать, а он будет работать и работать. Но, тем не менее, его неприхотливость и "дуракоустойчивость" существенно превышают аналогичные энкодерные показатели.

По этой причине у всех приличных производителей сервомоторов в линейке существует резольверная версия обратной связи.