Віримо в перемогу ЗСУ!
Працюємо з 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грн.


<< Проекти << Усі товари >> Статті, уроки >>