Подключение абсолютного энкодера

JSinx
Offline
Зарегистрирован: 19.10.2012

Добрый день.

Стоит задача подключить 2 абсолютных энкодера к ардуино Мега. Думал никаких проблем не будет, просто воткну энкодер в цифровые входы и буду читать состояние. Но не тут то было, не хочет так работать :(

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

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

P.S. Выходы на энкодере NPN. 

JSinx
Offline
Зарегистрирован: 19.10.2012

Ссылка на иструкцию

http://www.prst.ru/catalog/EP50S8_rus.pdf

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Какие проблеммы? Просто включите подтягивающие резисторы в контроллере. 

JSinx
Offline
Зарегистрирован: 19.10.2012

Как их включить?
 

JSinx
Offline
Зарегистрирован: 19.10.2012

Нашел в инструкции

pinMode( pinEncoder1 [ i ] , INPUT);
digitalWrite(pinEncoder1 [ i ],  <уровень>);  

Попробовал и LOW и HIGH. Результата нет, видимо придется через резисторы все делать.

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Так, а какая разница внешний резистор или внутрений?

Если с внешним работает, а с внутреним - нет, то либо у вас подтяжка, все-таки, не питанию, а к земле (внутрение только к питанию умеют тянуть), либо внутренний 20k "слишком сильно", либо подключаете "как-то не так", либо с кодом "что-то не то творите".

А вообще - попробуйте по форуму поискать. Несколько недель назад, как раз была длинная ветка про энкодеры (и логичней там было спрашивать, а не новую сосзадавать).

Там, в итоге и скетчи есть. Работающие. Которые как раз с помощью внутреннего резистора и работают (по крайней мере у меня).

>Попробовал и LOW и HIGH.

А можно было просто прочитать доку на digitalWrite() или просто про входы почитать: Цифровые выводы 

Тогда гадать, что там нужно LOW или HIGH - не пришлось-бы.

maksim
Offline
Зарегистрирован: 12.02.2012

Если вы не ошиблись и у вас именно выход NPN, то все должно работать с внутренней подтяжкой, если конечно у диода обратное сопротивление не меньше, скажем, 50 кОм. Вы внешние резисторы какого номинала подключаете?

Попробуйте померить сопротивление между 0V и Выход, причем так что бы измерить обратное сопротивление диода.
И покажите ваш код.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

 И если у Вас среда версии 1.0, то можно пользоваться 

pinMode( pinEncoder1[i], INPUT_PULLUP);

 

JSinx
Offline
Зарегистрирован: 19.10.2012

leshak пишет:

 Так, а какая разница внешний резистор или внутрений?

Если с внешним работает, а с внутреним - нет, то либо у вас подтяжка, все-таки, не питанию, а к земле (внутрение только к питанию умеют тянуть), либо внутренний 20k "слишком сильно", либо подключаете "как-то не так", либо с кодом "что-то не то творите".

 

Подтяжка идет к +5В. Внешние резисторы поставил 1КОм.

Сейчас код читает состояние одного выхода с энкодера и зажигает/гасит светодиод. С внешними резисторами все работет, с внутренними нет.  Как бы  в коде ошибится тут трудно, добавив строчку digitalWrite(pin, HIGH);

 

 

leshak пишет:

А вообще - попробуйте по форуму поискать. Несколько недель назад, как раз была длинная ветка про энкодеры (и логичней там было спрашивать, а не новую сосзадавать).

Там, в итоге и скетчи есть. Работающие. Которые как раз с помощью внутреннего резистора и работают (по крайней мере у меня).

Беглый поиск нашел только инкрементальные энкодеры :( поищу потщательней.

leshak пишет:

>Попробовал и LOW и HIGH.

А можно было просто прочитать доку на digitalWrite() или просто про входы почитать: Цифровые выводы 

Тогда гадать, что там нужно LOW или HIGH - не пришлось-бы.

Инструкцию читал,  про LOW это я уже сам придумал :)

JSinx
Offline
Зарегистрирован: 19.10.2012

maksim пишет:

Если вы не ошиблись и у вас именно выход NPN, то все должно работать с внутренней подтяжкой, если конечно у диода обратное сопротивление не меньше, скажем, 50 кОм. Вы внешние резисторы какого номинала подключаете?

Попробуйте померить сопротивление между 0V и Выход, причем так что бы измерить обратное сопротивление диода.
И покажите ваш код.

В финальной схеме светодиода нет (он был в отладочных целях подключен), т.е. остаются одни резисторы. Внешние резисторы 1КОм. 
 

maksim
Offline
Зарегистрирован: 12.02.2012

Это вы с чего взяли, что диода (не светодиода, а именно диода) там нет??? Вы энкодер разбирали? На схеме четко нарисован диод, защищающий транзистор, который находится внутри энкодера, на схему еще раз посмотрите. И еще раз повторюсь нужно померить сопротивление между 0V и Выход, причем так что бы измерить обратное сопротивление диода и во время измерений отключите внешние резисторы.

JSinx
Offline
Зарегистрирован: 19.10.2012

Я подумал вы про светодиод говорили, про который я в первом посте говорил. Про устройство энкодера я вообще ничего не говорил!
 
 

maksim
Offline
Зарегистрирован: 12.02.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

 А 56 кОм куда пропали?

JSinx
Offline
Зарегистрирован: 19.10.2012

Мерял без питания энкодера - сопротивление 1.5 МОм.

С питанием 56КОм.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну если 1.5 МОм, то должно работать с внутренней подтяжкой. Покажите код.

JSinx
Offline
Зарегистрирован: 19.10.2012

int pinEncoder1 [] = { 35, 37, 39, 41, 43, 45, 47, 49, 51, 53 };

void setup() {
// Настройка Энкодера 1

  for (int i = 0; i < 10; i++ )
  {
    pinMode( pinEncoder1 [ i ] , INPUT);
    digitalWrite(pinEncoder1 [ i ], HIGH);
  }
}

void loop()
{
  int val = digitalRead( pinEncoder1 [ 5 ] );
  digitalWrite( 13, val );
}

 

JSinx
Offline
Зарегистрирован: 19.10.2012

maksim пишет:

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

Померял - в одну стороноу 40 кОм, в другую 33 кОм.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Наиболее информативно будет измерить напряжение на входе при включенном внутреннем и отключенном внешнем подтягивающем резисторе соответственно при 2х состояниях выхода энкодера. Чтобы транзисторы так сильно "текли" я с советстких времен не встречал (был транзистор П210 - тёк страшно...).

По-идее оно ДОЛЖНО работать с внутренней подтяжкой, если там на выходе действительно открытый коллектор, нет никаких обратных связей и т.д. 

JSinx
Offline
Зарегистрирован: 19.10.2012

"Текли" транзисторы - это хорошо или плохо? :))

Раз не заработало с внутренними подтягивающими резисторами, спаял на монтажной плате 20 штук резисторов для обоих энкодеров.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Чего же хорошего? Ты его закрываешь, а он не закрывается. Это как текущий кран! 

JSinx
Offline
Зарегистрирован: 19.10.2012

Я гдето потерял нить рассуждений. Про какие транзисторы идет речь? 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Текли советские мощные транзисторы П210. Ну и П214 тоже текли, хоть и меньше.

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

JSinx
Offline
Зарегистрирован: 19.10.2012

Все, понял :)

Как бы узнать, почему ток утекает. Может у меня не настоящая ардуино, и там ченить китайцы намудрили? :(