| Ваш IP: 3.230.119.106 | Online(15) - гости: 9, боты: 6 | Загрузка сервера: 0.75 ::::::::::::

KY-040 Arduino

KY-040

Энкодеры KY-040 часто применяют в различных проектах Arduino. KY-040 как правило выполнен в виде модуля, который состоит из небольшой платы в которую установлен энкодер и 3 подтягивающих (к +5 В) резистора номиналом 10 кОм. При вращении ручки модуля мы получаем два сигнала (A и B), которые противоположны по фазе.  Каждый раз, когда сигнал А переходит от положительного уровня к нулю, мы считываем значение выхода В. Если В в этот момент находится в положительном состоянии, значит энкодер вращается по часовой стрелке, если В нуль, то энкодер вращается против часовой стрелки. Считывая оба выхода, можно определить направление вращения, и при помощи подсчета импульсов с А выхода — угол поворота.

Что бы безошибочно определять угол поворота и направление вращения необходимо постоянного опрашивать (считывать) состояние выходов A и B  (CLK и DT) энкодера, при этом содержимое скетча не должно влиять на период опроса. Этого можно добиться двумя путями, использовать внешние прерывания или при помощи таймера.

Ниже показан скетч который использует Timer2  для постоянного опроса выходов  CLK и DT энкодера.

#define CLK 8
#define DT  9

bool enc_a,enc_b,enc_old_a;
int enc_data, enc_data_old;

void setup(){
  Serial.begin(9600);
  TCCR1B |= (1 << WGM22)|(1 << CS20)|(1 << CS21); 
  TIMSK2 |= (1 << OCIE2A); 
  OCR2A = 250; // 1 ms
  pinMode(CLK,INPUT);
  pinMode(DT,INPUT);
}

void loop(){
  if(enc(1) != enc_data_old){enc_data_old = enc(1);
  Serial.println(enc(1));
  }
  }

int enc(bool byte_s){
  enc_a = digitalRead(CLK); 
  _delay_us(500); 
  enc_b = digitalRead(DT);
  
   if((!enc_a) && (enc_old_a)){
    if(enc_b) {enc_data++;}   
     else {enc_data--;}}   
    enc_old_a = enc_a;
 if(byte_s == 0){enc_data = 0;}
    return enc_data;
}

ISR (TIMER2_COMPA_vect){enc(1);}

Период опроса выходов CLK и DT 1 мс. При при вращении ручки энкодера в монитор порта выводится значение функции enc(1). Для обнуления значения функции используйте выражение enc(0).

Для удобства использования можно использовать библиотеку ENC (созданную на основе скетча показанного выше).

Пример использования:

#include <ENC.h> // https://rcl-radio.ru/wp-content/uploads/2020/08/ENC-1.zip

int data_old;

ENC enc(8,9); // D8, D9 / DT, CLK

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

void loop(){
  if(enc.data(1) != data_old){
    data_old = enc.data(1);
    Serial.println(enc.data(1));
// enc.data(0); // обнуление функции
  }
}

ISR (TIMER2_COMPA_vect){enc.data(1);}

При использовании библиотеки можно использовать цифровые входы D2 … D13 (Arduino Nano)

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=196

Комментарии

  • TolikN:

    Александр, библиотека ENC.h вступает в конфликт с IRremote.h версии 2.2.3 (взял с вашего сайта, но есть более новая). Проблема в том, что при нажатии на одну и ту же кнопку в мониторе порта получаю совершенно разные хаотичные коды. Отключаю (комментирую) ENC.h пульт начинает нормально работать, отдельно ENC.h работает замечательно. Что делать?

    • liman28:

      Библиотека энкодеоа и IR (скаченная с моего сайта) используют один и тот же таймер. Скачайте библиотеку IR не с моего сайта, она должна работать на таймере1, библиотека энкодера использует таймер2.

  • TolikN:

    Скачал IRremote.h с гитхаба, всё то же самое… А есть возможность сделать два варианта ENC.h на Timer1 и Timer2 ?

    • liman28:

      В библиотеке IRemote найдите файл boarddefs.h. Далее найдите строчки:
      // Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
      // ATmega48, ATmega88, ATmega168, ATmega328
      #define IR_USE_TIMER1 // tx = pin 9
      //#define IR_USE_TIMER2 // tx = pin 3

      #endif

      таймер 2 должен быть закомментирован.

      Так же в скетче нужно подключать этот файл:
      #include «boarddefs.h»

  • TolikN:

    Александр, всё заработало! Спасибо за компактную, неглючную, понятную в работе и быстродействующую библиотеку для обработки команд с энкодера!
    Пошёл учить регистры портов (Arduino)… :-))

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Простое зарядное уст-во с регулируемым током зарядки

    Простое зарядное уст-во с регулируемым током зарядки

    На рисунке показана схема простого зарядного уст-ва автомобильных аккумуляторов с регулируемым током зарядки. Зарядное уст-во основано на стабилизаторе L200 регулятора. Основные параметры стабилизатора L200CV: Максимальное входное напряжение 40В Максимальная разница напряжений «вход-выход» 32В Выходное напряжение 2,8..36В Выходной ток до 2А Минимальное падение напряжения «вход-выход» (dropout) <2,5В Ток потребления (по выводу …Подробнее...
  • УНЧ на TDA1558Q

    УНЧ на TDA1558Q

    Напряжение питания 6…18В Максимальный ток нагрузки 4А Выходная мощность при Uп=14,4В и Rн=4Ом: КНИ=0,5% — 5Вт КНИ=10% — 6Вт Ток покоя 80мАПодробнее...
  • Недорогой узкополосный FM-приемник на 68…88МГц

    На рисунке показана схема простого приемника FM-диапазона, настройка на станцию осуществляется потенциометром Р2. Полевой транзистор Т1 обеспечивает усиление входного радиосигнала на 18дБ, запитывая входную цепь TDA7000 через разделительный конденсатор С5. Ряд конденсаторов вокруг микросхемы предназначен для формирования полосы пропускания около 70 кГц. Перестраиваемый генератор строится на базе варикапа D1. Напряжение …Подробнее...
  • Полицейская сирена на LM324

    Полицейская сирена на LM324

    Данная схема издает звук напоминающий полицейскую сирену. Схема основана на ОУ LM324 представляющий собой генератор ЗЧ. При нажатии на кнопку SA1 начнет быстро заряжаться С1, сирена начнет издавать звук. При размыкании контактов SA1  сирена будет работать до тех пор пока не разрядится через R2 конденсатор С1. Источник — http://www.eleccircuit.com/police-bicycle-siren-circuits/Подробнее...
  • Простой тестер проверки радиоэлементов

    При регулировке и настройке электронной аппаратуры применяют вспомогательные устройства: индикаторы состояний, «прозвоночные” приборы и тестеры, с помощью которых выполняют различные операции: от простейшей – по проверке целостности цепей до сложной – по измерению параметров радиоэлементов. Сложные тестеры необходимы, когда выполнена проверка работоспособности радиоэлемента и необходимо уточнить значения его параметров. Оценку …Подробнее...