Трабла с Энкодером

mrDobryj
Offline
Зарегистрирован: 15.02.2015

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

Залил вот такой скетч:

/* Пины, к которым подключен энкодер */
enum { ENC_PIN1 = 2, ENC_PIN2 = 3 };

void setup()
{
 pinMode(ENC_PIN1, INPUT);
 pinMode(ENC_PIN2, INPUT);
 
 Serial.begin(9600);
}

/* Функция декодирования кода Грея, взятая с Википедии.
* Принимает число в коде Грея, возвращает обычное его представление.
*/
unsigned graydecode(unsigned gray)
{
 unsigned bin;

 for (bin = 0; gray; gray >>= 1)
    bin ^= gray;

 return bin;
}

void loop()
{
 static uint8_t previous_code = 0; // предыдущий считанный код
 
 /* gray_code - считанное с энкодера значение
  * code - декодированное значение
  */
 uint8_t gray_code = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1),
         code = graydecode(gray_code);
 
 /* Если считался нуль, значит был произведён щелчок ручкой энкодера */
 if (code == 0)
 {
   /* Если переход к нулю был из состояния 3 - ручка вращалась
    * по часовой стрелке, если из 1 - против.
    */
   if (previous_code == 3)
     Serial.println("->");
   else if (previous_code == 1)
     Serial.println("<-");
 }
 
 /* Сохраняем код и ждём 1 мс - вполне достаточно опрашивать энкодер
  * не более 1000 раз в секунду.
  */
 previous_code = code;
 delay(1);
}

 

mrDobryj
Offline
Зарегистрирован: 15.02.2015

У энкодера 3 вывода. Проблема в том что они не подписаны. Хорошо хоть провода цветные - черный, красный, зеленый.

Красный подключаю на 27 контакт (+5V).

Черный на 4 контакт (GND)

А далше самое интересное: Вешаю зеленый на D2 и на мониторе показывает направление всё время влево, хотя кручу энкодер в разные стороны. Затем перевешываю зеленый на D3 и стрелка теперь показывает всё время вправо.

 

Не могу разобраться где неправильно делаю. Контакты не так подключил или скетч неверный. Может то и другое.

Я пока новичек.

mrDobryj
Offline
Зарегистрирован: 15.02.2015

А может быть что этот энкодер не может распозновать направление движения, а только угол наклона?

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Дальнейшая задача этого энкодера запоминать последнее положение и восстанавливать из памяти в прошлое состояние. А пока только тест.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

у энка три вывода - GND , канал1 , канал2 - анализировать нужно одновременно каналы 1 и 2

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

mrDobryj пишет:

А может быть что этот энкодер не может распозновать направление движения, а только угол наклона?

он и придуман для распознования направления вращения.... 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

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

mrDobryj
Offline
Зарегистрирован: 15.02.2015

При одновременной посадке всех выводов то же происходит.

Хорошо. Может тогда подскажете на какие выводы на НАНО обычно садят энкодер?

Мотор вращает набор шестерен. На одной из них стоит датчик и энкодер.

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

Попробуйте вот такой код:

/* Пины, к которым подключен энкодер */
#define ENC_PIN1 2
#define ENC_PIN2 3
int code = 10;
bool encod;
bool encodTemp;

void setup()
{
 pinMode(ENC_PIN1, INPUT);
 pinMode(ENC_PIN2, INPUT);

 Serial.begin(9600);
}

void loop()
{
 if(digitalRead(ENC_PIN1)==1)encod=1;
 else encod=0, encodTemp=0;

  if(encod > encodTemp)
  {
    switch (digitalRead(ENC_PIN2))
    {
      case 1:
      ++code;
      Serial.println(code);// или наоборот
      break;
      case 0:
      --code;
      Serial.println(code);
      break;
    }
    encodTemp = 1; 
  }
}

 

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Друзья. Попробовал представленный скетч. Не работает. Видео дальше.

https://youtu.be/15uNQENN6S8

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

Фото. соединения и энкодера:

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mrDobryj, какой скетч вы считаете "представленным"? Тут упоминалось как минимум 3. Потом про свой энкодер вы ровным счётом ничего не рассказали, что это? Механика, оптика, Холла? Нужен лог срабатываний . Глупо просто перебирать все варианты скетчей под непонятный энкодер, нужно понимать как работает именно ваш.

mrDobryj
Offline
Зарегистрирован: 15.02.2015

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

Как лог срабатываний вытащить может подскажете?

Потому и прошу помощи у опытных

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Судя по это статье http://robocraft.ru/blog/technology/734.html у меня одинарный оптический энкодер

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mrDobryj, если действительно одиночный -значит счёт только в одну сторону объясним.  По-хорошему нужно было зарисовать схему, почётче сфотографировать нечто с 4-мя выводами, описать материал блестящих секторов шестерёнки что вы держите. Но раз уже определились, то теперь, конечно не актуально.

mrDobryj
Offline
Зарегистрирован: 15.02.2015

материал блестящий сектор и не блестящий т.е.отражающий и нет.

Как я писал выше вывода только 3 на схеме энкодера. и какое значение из них каждый имеет тоже не могу понять. Известны только цвета проводов. Четче не снять. там все прекрасно видно. каждую цифру.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mrDobryj, а как же вы его подключали, если не разобрались с концами? Ведь  счёт инкрементов шёл на видео. Выводы у вас подписаны. Над красным проводом виднеется Vcc, чёрный не видно откуда ползёт, но вероятно земля. И зелёный получается -данные. Без схемы я бы не вынес окончательный приговор, что это одиночный энкодер. PS: хотя да, похоже, что он. Транзистор усиливает сигнал с фото-чего-то там, вывод CP получается подтянутым к единице.

mrDobryj
Offline
Зарегистрирован: 15.02.2015

щас подробнее попробую его отснять. И чуть позже выложу

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Вот еще фоточки:

mrDobryj
Offline
Зарегистрирован: 15.02.2015

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mrDobryj, да, очень похож на одинарный. Стало быть практического применения, кроме как считать обороты  у него нет...  А вы что хотели от него добится?

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

На него бы осцелографом глянуть, там резисторы, кондеры, диод. Я думаю с импульсом там не все так однозначно.

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

Датчик отражения.  А ваш "энкодер" - это просто счётчик импульсов...... В любую сторону .... 4 импульса на оборот

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Ну чтож. Думаю мне и такой подойдет. Только внесу небольшую корректировку в задумку.

Что же я хочу сделать?

Хочу в авто установить поворотный экран на ардуино.

Вот принцип работы экрана:

  1. При включении зажигания поднимается панель с экраном и включается экран
  2. При выключении зажигания опускается панель, экран выключается
  3. Должна быть возможность регулировки угла наклона панели с экраном. Кроме того, положение должно запоминаться. При включении зажигания панель должна вставать именно в тоже положение в которое была отрегулирована. Для это впринципе и нужен был энкодер.
  4. Система должно быть оборудована 4-мя кнопками:

- принудительное включение/выключение экрана

- принудительное закрывание /открывание панели

- наклон экрана от водителя

- наклон экрана к водителю

А теперь как будет выполняться работа с таким энкодером. Энкодер будет просто запоминать положение, в котором будет открыт монитор. И соответственно выводить его в тоже положение из eeprom. Также в системе будут встроенны 2 концевика. Один в раскрытый монитор (чтобы не сломать). А на закрытое положение другой концевик.

Теперь самое сложное это написать скетч. За сим прошу помощи.

Управлять всем этим театром будет ардуино нано.

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Кстати вот нашел про мой фотоэлемент http://robocraft.ru/shop/index.php?route=product/product&path=38&product_id=143

mrDobryj
Offline
Зарегистрирован: 15.02.2015

При разработке скетча столкнулся с проблемой.

Из видео видно что в какую бы сторону не крутил, значения либо растут либо падают в одном направлении. Не могу понять как мне осуществить запоминание угла положения манитора, если после регулировки данные всегда растут или падают. И к ним потом никак не вернуться.

 

mrDobryj
Offline
Зарегистрирован: 15.02.2015

https://youtu.be/h0aDQ9Psfds

http://pixs.ru/showimage/shemamotor_7779304_17186882.jpg

В настоящий момент реализовал только это. Освоение Ардуино снуля. Поэтому медленно.

vvadim
Offline
Зарегистрирован: 23.05.2012

mrDobryj пишет:

А теперь как будет выполняться работа с таким энкодером. Энкодер будет просто запоминать положение, в котором будет открыт монитор. И соответственно выводить его в тоже положение из eeprom. 

Как работает энкодер разобрались?
Ваш показывает направление вращения?
Сколько значений на оборот?

mrDobryj
Offline
Зарегистрирован: 15.02.2015

Разбираться начал с ним только сейчас. Судя по всему направления движения не показывает. Буду дальше его пытать либо прийдется заменять чем то другим.

Но непонятно вот что - У КИТАЙЦЕВ ТО РАБОТАЛ!

mrDobryj
Offline
Зарегистрирован: 15.02.2015

От энкодера отказываюсь. Этот не позволяет использовать в данной задумке. Предлагают потенциометр на вал посадить. Буду думать как реализовать данную схему.

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

Как вы думаете: Зачем были придуманы всякие безконтактные ( магнитные и оптические) энкодеры?
Правильно - чтобы ничто не могло "протереться"

mrDobryj
Offline
Зарегистрирован: 15.02.2015

trembo пишет:

Как вы думаете: Зачем были придуманы всякие безконтактные ( магнитные и оптические) энкодеры?
Правильно - чтобы ничто не могло "протереться"

Я не понял о чем вы говорите.

Другой энкодер туда не воткнуть. Мало места. Придется полностью переделывать схему.

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

Я про ваш "потенциометр" высказался. У вас есть безконтактный потенциометр?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Другой энкодер туда не воткнуть. Мало места. Придется полностью переделывать схему.

подъём/опускание  экрана - по количеству импульсов с одиночного энкодера ? ( направление ему не нужно - его задаёт моторчик )...
концевики положений "сложена" и "полностью поднята" есть ?
на видео не видно - панель изменяет положение по однократному нажатию кнопки или пока она ( кнопка ) удерживается

положение угла и надо считать с одиночного энкодера - только декр или инкр положения делать взависимости от направления вращения ( т.е. от нажатой кнопки )
в коде определить переменную положения панели, при подъёме/опускании гонять её от 0 до макс, макс значение определить подсчётом тиков энкодера от крайнего до крайнего положения панели.... при выключении писать положение в EEPROM

от края до края пусть 135 тиков энка ( градусов ) - вкл - панель ушла на 135, в переменной = 135 - жмёмь "уменьшить угол" до желаемого визуально, моторчик крутит, энк тики выдаёт, а ПЕРЕМЕННАЯ положения в коде уменьшается с каждым тиком - стало на 25 тиков меньше, угол = 110 - выкл - ардуинка запоминает position=110 - панель складывается

снова вкл - панель поднимается до положения 110 и ардуинка выключает моторчик....

кататак....
 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

SU-27-16 пишет:

у энка три вывода - GND , канал1 , канал2 - анализировать нужно одновременно каналы 1 и 2

надо исправиться :)
у этого одиночного энка 1 - VCC , 2 - GND , 3 - сигнальный ( 0 или 1 , засвечен или незасвечен ) и скорее всего ещё с открытым коллектором ( нужна будет подтяжка читающего пина к VCC )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

хватит и три кнопки :
принудительное вкл/выкл в триггерном режиме , -угол , +угол

и покажите свой крайний код :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#define pinOnOff 5
#define pinZaghig 4
#define pinAnglPlus 7
#define pinAnglMinus 6
#define pinEnc 2
#define pinDrivMinus 8
#define pinDrivPlus 9
volatile unsigned long posAnglCurrent = 0;  // или покороче тип - зависит от макс количества тиков энка
unsigned long posAnglSet = 0;               // или покороче тип - зависит от макс количества тиков энка
boolean statePower = 0;
//==========================================================================================
void setup()
{
// лучше прямое управление портами
  pinMode( pinOnOff, INPUT );   digitalWrite( pinOnOff, HIGH );
  pinMode( pinZaghig, INPUT );   digitalWrite( pinZaghig, HIGH );
  pinMode( pinAnglPlus, INPUT );   digitalWrite( pinAnglPlus, HIGH );
  pinMode( pinAnglMinus, INPUT );   digitalWrite( pinAnglMinus, HIGH );
  pinMode( pinEnc, INPUT );   digitalWrite( pinEnc, HIGH );
  pinMode( pinDrivMinus, OUTPUT );   digitalWrite( pinDrivMinus, HIGH );
  pinMode( pinDrivPlus, OUTPUT );   digitalWrite( pinDrivPlus, HIGH );
  attachInterrupt( 0, Encoder, CHANGE );
}
//==========================================================================================
void Encoder()
{
  if( LOW == digitalRead( pinAnglPlus ) )
    {
      posAnglCurrent++;
    }
  if( LOW == digitalRead( pinAnglMinus ) )
    {
      posAnglCurrent--;
    }
}
//==========================================================================================
void loop()
{
// включение - поднятие панели
  if( LOW == digitalRead( pinOnOff ) && !statePower )        // осторожно - дребезг
    {
      posAnglSet = 135;                        // или считать из EEPROM
      statePower = 1;
      digitalWrite( pinDrivMinus, HIGH );      // запуск мотора на поднятие панели
      digitalWrite( pinDrivPlus, LOW );        // запуск мотора на поднятие панели
      while( posAnglCurrent != posAnglSet );   // ждать поднятия панели на 135
      digitalWrite( pinDrivMinus, HIGH );      // стоп мотор
      digitalWrite( pinDrivPlus, HIGH );       // стоп мотор
    }
    
// выключение - опускание панели
  if( LOW == digitalRead( pinOnOff ) && statePower )         // осторожно - дребезг
    {
      posAnglSet = posAnglCurrent;
      // сохранить posAnglSet в EEPROM
      statePower = 0;
      digitalWrite( pinDrivMinus, LOW );       // запуск мотора на опускание панели
      digitalWrite( pinDrivPlus, HIGH );       // запуск мотора на опускание панели
      while( posAnglCurrent != 0 );            // ждать опускания панели на 0
      digitalWrite( pinDrivMinus, HIGH );      // стоп мотор
      digitalWrite( pinDrivPlus, HIGH );       // стоп мотор
    }

// уменьшение текущего угла
  if( LOW == digitalRead( pinAnglMinus ) && statePower )         // осторожно - дребезг
    {
      digitalWrite( pinDrivMinus, LOW );       // запуск мотора на опускание панели
      digitalWrite( pinDrivPlus, HIGH );       // запуск мотора на опускание панели
      while( !digitalRead( pinAnglMinus ) );   // ждать опускания кнопки
      digitalWrite( pinDrivMinus, HIGH );      // стоп мотор
      digitalWrite( pinDrivPlus, HIGH );       // стоп мотор
    }
    
// увеличение текущего угла
  if( LOW == digitalRead( pinAnglPlus ) && statePower )         // осторожно - дребезг
    {
      digitalWrite( pinDrivMinus, HIGH );      // запуск мотора на поднятие панели
      digitalWrite( pinDrivPlus, LOW );        // запуск мотора на поднятие панели
      while( !digitalRead( pinAnglPlus ) );    // ждать опускания кнопки
      digitalWrite( pinDrivMinus, HIGH );      // стоп мотор
      digitalWrite( pinDrivPlus, HIGH );       // стоп мотор
    }

  delay(50);
}
//==========================================================================================

так, по быстрому делал :(

mrDobryj
Offline
Зарегистрирован: 15.02.2015

подъём/опускание  экрана - по количеству импульсов с одиночного энкодера ? ( направление ему не нужно - его задаёт моторчик )...

Вы облегчили эту часть для моего понимания.

концевики положений "сложена" и "полностью поднята" есть ?

Да конечно есть. Концевики будут кнопочные.

на видео не видно - панель изменяет положение по однократному нажатию кнопки или пока она ( кнопка ) удерживается

Пока удерживается кнопка.

у этого одиночного энка 1 - VCC , 2 - GND , 3 - сигнальный ( 0 или 1 , засвечен или незасвечен ) и скорее всего ещё с открытым коллектором ( нужна будет подтяжка читающего пина к VCC )

Как делается подтяжка читающего пина в VCC?

Спасибо за очень понятный алгоритм работы.

К сожалению у меня 2 экзамена на носу по специальности. Ещё работаю. Сейчас на недельку, две буду занят насущными проблемами. А после продолжу изготовление.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mrDobryj, подтяжка вам не нужна. Выход платы уже подтянут к питанию через коллекторный резистор 470ком.