Вопросы по энкодерам

Тема в разделе "Arduino & Shields", создана пользователем Alex19, 28 дек 2013.

  1. Alex19

    Alex19 Гуру

    Доброй ночи.

    Сегодня притащил с работы энкодер, подключил, все работает как часы.
    Появилось пару коротких вопросов.

    1. Mega 2560, достаточно производительности для обработки 3 энкодеров одновременно. Инкрементальный энкодер с разрешением 1000-2000?
    2. Может у кого-то был опыт, каких фирм лучше использовать с демократичным ценообразованием?
     
  2. Alex19

    Alex19 Гуру

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

    По первому вопросу, если не прокатит, буду использовать программируемые счетчики импульсов, без ардуины. Сам не разбираюсь в них, но меня убедили, что сделают.

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

    Есть забавная фирма YUMO, забавная она тем, что заботливо позаимствовала внешний дизайн 1 в 1 с энкодеров OMRON, а судя по документации и внутренности тоже.
    Если скопировали хорошо, то хорошие пром. энкодеры серии OMRON E6B2, который подключал вчера.

    В России YUMO стоит не сильно дешевле Autonics. Но этот только в России, кому интересно погуглите, вот к примеру их творение A6B2-CWZ3E-1024:).
     
  3. Alex19

    Alex19 Гуру

    Вдруг, кому-то будет интересно. Mega 2560 без проблем тянет 3 энкодера с разрешением 1000 импул.
    В режиме 1/4T, то есть с каждого энкодера получаю по 4000 импул.
     
  4. nkp

    nkp Нуб

    а какова скорость вращения энкодеров?(какая максимальная частота сигнала)
    есть такая http://www.pjrc.com/teensy/td_libs_Encoder.html библиотека
    может еще какими ссылками поделитесь...
     
  5. Alex19

    Alex19 Гуру

    Извините за задержку, много работы, сейчас выпускается ТПА на ардуине.

    Использую Omron E6B2CWZ6C в этом проекте, до 6000 r/min. Отображение движения стола фрезерного станка.

    Мой энкодер с NPN открытым коллектором. Для такого чтобы заработал, пришлось включить подтягивающий резистор, в настройках.
    Код (Text):

    // then the encoder inputs
      pinMode(encoder1PinA, INPUT);
      pinMode(encoder1PinB, INPUT);
      // enable pullup as we are using an open collector encoder
      digitalWrite(encoder1PinA, HIGH);
      digitalWrite(encoder1PinB, HIGH);
     
    По этой ссылке энкодеры другого типа, не такие как у меня. Их ни когда не использовал, увы не знаю. Но принцип, думаю у них одинаковый.

    Пользовался примерами от сюда
    http://playground.arduino.cc/Main/RotaryEncoders

    Вот код взятый из ссылки выше (после заголовка Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pin). На 1 энкодер используется 2 прерывания.
    Код (Text):

    #define encoder0PinA 2

    #define encoder0PinB 3

    volatile unsigned int encoder0Pos = 0;

    void setup() {

      pinMode(encoder0PinA, INPUT);
      pinMode(encoder0PinB, INPUT);
    // encoder pin on interrupt 0 (pin 2)

      attachInterrupt(0, doEncoderA, CHANGE);
    // encoder pin on interrupt 1 (pin 3)

      attachInterrupt(1, doEncoderB, CHANGE);
      Serial.begin (9600);
    }

    void loop(){ //Do stuff here }

    void doEncoderA(){

      // look for a low-to-high on channel A
      if (digitalRead(encoder0PinA) == HIGH) {
        // check channel B to see which way encoder is turning
        if (digitalRead(encoder0PinB) == LOW) {
          encoder0Pos = encoder0Pos + 1;        // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;        // CCW
        }
      }
      else  // must be a high-to-low edge on channel A                              
      {
        // check channel B to see which way encoder is turning
        if (digitalRead(encoder0PinB) == HIGH) {
          encoder0Pos = encoder0Pos + 1;          // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;          // CCW
        }
      }
      Serial.println (encoder0Pos, DEC);  
      // use for debugging - remember to comment out
    }

    void doEncoderB(){

      // look for a low-to-high on channel B
      if (digitalRead(encoder0PinB) == HIGH) {
      // check channel A to see which way encoder is turning
        if (digitalRead(encoder0PinA) == HIGH) {
          encoder0Pos = encoder0Pos + 1;        // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;        // CCW
        }
      }
      // Look for a high-to-low on channel B
      else {
        // check channel B to see which way encoder is turning
        if (digitalRead(encoder0PinA) == LOW) {
          encoder0Pos = encoder0Pos + 1;          // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;          // CCW
        }
      }
    }
     

    С ней не знаком, ни чего сказать не могу.

    Будут вопросы спрашивайте, интересный по ссылке энкодер, хотелось бы понять его возможности.
     
    Последнее редактирование: 16 фев 2014
    InterestedStudent нравится это.
  6. Alex19

    Alex19 Гуру

    Да принцип у них один.

    Мои Omron E6B2CWZ6C 1000 им/на оборот, есть режимы T/4, T/8 (минусы данных режимов пока не обнаружил), но они дороговаты.

    Узнал, про такие
    https://www.sparkfun.com/products/9117
    https://www.sparkfun.com/products/10984
    Плохое разрешение импульсов на оборот, плохая точность. Но очень вкусная цена.

    Тот что по вашей ссылке
    http://www.robot-italy.com/en/amt102-v-quadrature-encoder.html
    Очень интересный энкодер. Возможность выбора кол-во импульсов от 48 до 2048. До 30000 r/min при 512 им/ на оборот. До 15000 r/min при 1024 им/ на оборот. До 7500 r/min при 2048 им/ на оборот.

    Так, что выбирайте от требований, удачи:).
     
  7. Леонид

    Леонид Нуб

    Добрый день! У меня оказалось в руках два энкодера Omron E6-B2-CWZ6C 1000 p/r и arduino duo. Решил их подсоединить к плате и заставить работать при помощи кода из Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pin. Но вылетает ошибка: a function-definition is not allowed here before '{' token. Как я понимаю текст программы не полный и я его должен дописать сам? Так ли это или я что-то не то делаю?
    PS Я фактически только начал разбираться с контроллерами и имею только некоторые базовые навыки, так что не судите строго)
     
  8. Alex19

    Alex19 Гуру

    День добрый.
    Вот код работающий на Megа 2560 именно для Вашего энкодера E6B2-CWZ6C, в режиме 1/4T.

    Код (Text):

    #define encoder0PinA 2 //keep this on and interrupt pin
    #define encoder0PinB 3 //keep this on and interrupt pin

    volatile long encoder0Pos;

    void setup () {
      Serial.begin(9600);

      // then the encoder inputs
      pinMode(encoder0PinA, INPUT);
      pinMode(encoder0PinB, INPUT);
      // enable pullup as we are using an open collector encoder
      digitalWrite(encoder0PinA, HIGH);
      digitalWrite(encoder0PinB, HIGH);

      // encoder pin on interrupt 0 (pin 2)
      attachInterrupt(0, encoderPinChangeA, CHANGE);
      // encoder pin on interrupt 1 (pin 3)
      attachInterrupt(1, encoderPinChangeB, CHANGE);
      encoder0Pos = 0; //reseet the encoder position to 0
    }

    void loop() {
      //do stuff dependent on encoder position here
      //such as move a stepper motor to match encoder position
      //if you want to make it 1:1 ensure the encoder res matches the motor res by dividing/multiplying
      Serial.println(encoder0Pos);
      delay(100);
    }

    void encoderPinChangeA() {
    // look for a low-to-high on channel A
      if (digitalRead(encoder0PinA) == HIGH) {
        // check channel B to see which way encoder is turning
        if (digitalRead(encoder0PinB) == LOW) {
          encoder0Pos = encoder0Pos + 1;        // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;        // CCW
        }
      }
      else  // must be a high-to-low edge on channel A                                    
      {
        // check channel B to see which way encoder is turning
        if (digitalRead(encoder0PinB) == HIGH) {
          encoder0Pos = encoder0Pos + 1;          // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;          // CCW
        }
      }
    }

    void encoderPinChangeB() {
      // look for a low-to-high on channel B
      if (digitalRead(encoder0PinB) == HIGH) {
      // check channel A to see which way encoder is turning
        if (digitalRead(encoder0PinA) == HIGH) {
          encoder0Pos = encoder0Pos + 1;        // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;        // CCW
        }
      }
      // Look for a high-to-low on channel B
      else {
        // check channel B to see which way encoder is turning
        if (digitalRead(encoder0PinA) == LOW) {
          encoder0Pos = encoder0Pos + 1;          // CW
        }
        else {
          encoder0Pos = encoder0Pos - 1;          // CCW
        }
      }
    }
     
    Due у меня нет, чтобы проверить.
    Но на сколько я знаю, в due изменена функция attachInterrupt, сейчас попробую найдти
     
    InterestedStudent нравится это.
  9. Alex19

    Alex19 Гуру

    Да там небольшие изменения.
    http://arduino.ua/ru/prog/AttachInterrupt

    То есть разница, что для due нужно указывать ножку, а не номер прерывания.

    UPD. Попробуйте код выше, поменяв в нем attachInterrupt(первый параметр - номер порта, остальное оставьте как есть)
     
    Последнее редактирование: 13 мар 2014
  10. Alex19

    Alex19 Гуру

    Да чуть не забыл, будьте внимательны. Данный энкодер работает от 5 до 24 VDC.
    Можно ли питаться от Due у нее вроде только 3,3V.

    Лучше не рисковать, 1 блок на ардуину, 2 на исполнительные устройства.

    http://www.ia.omron.com/data_pdf/data_sheet/e6b2-c_dsheet_csm491.pdf

    Все, что знал рассказал:), отрывали по работе, поэтому не в 1 посте.

    UPD. Добрался до дома, ошибся по поводу раб. характеристик, подправил сообщение.
    У меня отдельное питание на энкодеры, фазы идут на ардуино.
     
    Последнее редактирование: 13 мар 2014
  11. Леонид

    Леонид Нуб

    Добрый день! Прошу прощения за долгий ответ, только сегодня дошли руки подключить и проверить) Все работает, Большое Спасибо! По поводу Due - у нее есть 5 вольтовый выход. Пробовал пока по 1 подключать для проверки работоспособности. Прикрепляю схему с обозначением портов для Due
    http://www.robgray.com/temp/Due-pinout-WEB.png
    Когда буду собирать окончательно, запитаю энкодеры отдельно от контроллера, от греха подальше)
    Еще раз спасибо!
     
  12. Alex19

    Alex19 Гуру

    Не за что, тут все, помогают, чем могут.

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

    Не знал. Уже стоит в списке покупок:).

    Правильно.
     
  13. Диман

    Диман Нуб

    Я не электронщик и не программист. Может по-простому, чтоб понятно было- схема подключения и скетч Заранее спасибо.