Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Сб
  • Датчик вращения енкодер KY-040

Енкодер вращения KY-040 - это поворотный датчик, который индицирует степень поворота оси и в каком направлении она вращается.

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


Описание работы енкодера Поворотный энкодер имеет фиксированное число позиций на оборот. Эти позиции легко ощущаются руками как небольшие щелчки при повороте оси энкодера. Данный модуль энкодера имеет тридцать таких позиций. Количество таких позиций характеризует чувствительность датчика вращения.


У отдельного датчика имеются три вывода. Они обычно обозначаются как A, B и C. В случае KY-040, они ориентированы так, как показано на рисунке. Внутри энкодера есть два переключателя. Первый переключатель соединяет вывод А с выводом С, а второй соединяет вывод B с выводом C. В каждом фиксированном положении датчика, оба переключателя или открыты или закрыты. Каждый клик означает переключение состояния переключателей следующим образом: Если оба переключателя замкнуты, поворачивая ось по часовой стрелке или против часовой стрелки на одну позицию переведет оба переключателя на размыкание Если оба разомкнуты, поворачивая ось по часовой стрелке или против часовой стрелки на одну позицию переведет оба переключателя в закрытое состояние. На приведенном ниже рисунке показано расположение переключателей.


Как вы можете видеть, угловое положение контакта A и контакта B такое, что: вращающаяся пластинка по часовой стрелке соединит контакты А и С. Вращающаяся пластина против часовой стрелки соединит контакты В и С. Представим на графике переходные характеристики контактов при равномерном вращении пластины.


Определив то, какая пара контактов изменяет свое состояние первой, узнаем направление вращения вала. Если контакт А изменяет состояние первым, то вал вращается в направлении по часовой стрелке. Если же контакт B изменяет свое состояние первым, то вал энкодера вращается в направлении против часовой стрелки.


Выводы KY-040

На следующем рисунке показано назначение выводов данного ротационного энкодера.


Модуль сконструирован таким образом, что низкий логический уровень появляется, когда контакты замкнуты, и высокий, когда контакты разомкнуты. Низкий сигнал генерируется путем замыкания контакта C на общий провод, а так же ноль подается в это время и на выводы CLK и DT, когда переключатель замкнут. Высокий уровень генерируется подачей напряжения питания 5В через подтягивающий резистор. При этом на выходах CLK и DT будут единицы, когда контакты энкодера разомкнуты. Так же у данного енкодера имеется кнопка, расположенная в начале вала, и она является его неотемлемой частью. Если нажать на вал, то нормально открытый контакт кнопки замкнется. Это может быть полезно для программного увеличения или уменьшения чувствительности датчика, а так же для выбора пунктов меню, если использовать енкодер как устройство ввода настроек меню.


Схема ротационного енкодера

Схема рассматриваемого модуля приведена ниже. R2 и R3 на схеме выполняют функцию подтягивающих резисторов.



Схема подключения енкодера KY-040

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

Очень медленно вращайте вал датчика угла поворота как по часовой стрелке так и против часовой стрелки. И следите за переключением светодиодов реагирующих на вращение вала.

Подключение модуля к Arduino

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


Пример программы для Arduino

int pinA = 3;  // номер вывода, подключенный к CLK енкодера
 int pinB = 4;  // номер вывода контроллера, подключенный к DT енкодера
 int encoderPosCount = 0; 
 int pinALast;  
 int aVal;
 boolean bCW;
 void setup() { 
   pinMode (pinA,INPUT);
   pinMode (pinB,INPUT);
   /* Считываем значение на выводе A и запоминаем его как последнее значение на этом выводе */
   pinALast = digitalRead(pinA);   
   Serial.begin (9600);
 } 
 void loop() { 
   aVal = digitalRead(pinA);
   if (aVal != pinALast){ // проверка на изменение значения на выводе А по сравнению с предыдущим запомненным, что означает, что вал повернулся
     // а чтобы определить направление вращения, нам понадобится вывод В.
     if (digitalRead(pinB) != aVal) {  // Если вывод A изменился первым - вращение по часовой стрелке
       encoderPosCount ++;
       bCW = true;
     } else {// иначе B изменил свое состояние первым - вращение против часовой стрелки
       bCW = false;
       encoderPosCount--;
     }
     Serial.print ("Вращение: ");
     if (bCW){
       Serial.println ("по часовой стрелке");
     }else{
       Serial.println("против часовой стрелки");
     }
     Serial.print("Положение енкодера: ");
     Serial.println(encoderPosCount);
   } 
   pinALast = aVal;
 } 

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

int pinA = 2;  // номер вывода, подключенный к CLK енкодера
int pinB = 3;  // номер вывода контроллера, подключенный к DT енкодера
int encoderPosCount = 0; 
int pinALast;  
void setup() {
  Serial.begin (115200);
  pinMode (pinA,INPUT);
  pinMode (pinB,INPUT);
  pinALast = digitalRead(pinA);
  attachInterrupt(0, doEncoderA, CHANGE); //прерывание по изменению пина №2(для Arduino UNO)
}
void loop() {
  //ваша программа, использующая значение положения енкодера encoderPosCount
}
void doEncoderA() {
  // следим за переходом low-to-high на контакте A
  if (pinALast != digitalRead(pinA)){
  if (digitalRead(pinA) == HIGH) {
    // проверяем контакт B для определения направления вращения
    if (digitalRead(pinB) == LOW) {
      encoderPosCount ++;         // CW
    }
    else {
      encoderPosCount--;         // CCW
    }
  }
  else   // следим за переходом high-to-low на выводе A
  {
    // проверяем вывод B для определения направления вращения
    if (digitalRead(pinB) == HIGH) {
      encoderPosCount ++;          // CW
    }
    else {
      encoderPosCount--;        // CCW
    }
  }
 
  Serial.println (encoderPosCount);
  }
 pinALast = digitalRead(pinA);
}

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо

Датчик вращения енкодер KY-040

  • Модель KY-040
  • Наличие Есть в наличии
  • 36.41грн.


<< Проекты << Все товары >> Статьи, уроки >>