Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Датчик вращения (энкодер)

Модуль KY-040 служит для ручного управления приборами. Управление происходит с помощью вращения рукоятки. В отличие от переменных резисторов, у которых угол поворота ограничен, датчиком можно делать непрерывный полный оборот. Это очень удобно и позволяет выполнять точную настройку регулируемого параметра. Под рукояткой расположена кнопка.

KY-040

На плате смонтирован валкодер PEC11-4220F-S0024. С нижней стороны платы резисторы 10 кОм. Соединитель содержит 5 штыревых контактов. Не обязательно использовать все контакты. Два контакта отвечают за кнопку, три – за выход импульсов энкодера.

На ножку+ подаём питание, на GND – землю. CLK - импульсы отсчёта, соединён с резистором, подключаем к цифровому пину. DT - импульсы направления, соединён с резистором, подключаем к цифровому пину. SW - контакт кнопки, контакты разомкнуты в ожидании нажатия, подключаем к цифровому пину.


KY-040 | Arduino
----------------
   GND | GND
     + | 5V	 
    SW | D
    DT | D
   CLK | D 

Скетч.


/* Define digital pins used to read the encoder */
#define DT 2
#define CLK 3
#define SW 4


void setup()
{
  Serial.begin(9600);
  pinMode(DT, INPUT);
  pinMode(CLK, INPUT);
  pinMode(SW, INPUT);
  digitalWrite(SW, HIGH);
}

void loop()
{
  int counter;
  byte dialPos;
  byte lastDialPos;

  /* Reset the counter */
  counter = 0;

  /* Continiouously read the state of the encoder */
  while (1)
  {
    /* Read the status of the dial */
    dialPos = (digitalRead(CLK) << 1) | digitalRead(DT);

    /* Is the dial being turned anti-clockwise? */
    if (dialPos == 3 && lastDialPos == 1)
    {
      counter--;
    }

    /* Is the dial being turned clockwise? */
    if (dialPos == 3 && lastDialPos == 2)
    {
      counter++;
    }

    /* Output the counter to the serial port */
    Serial.println(counter);

    /* Is the switch pressed? */
    if (!digitalRead(SW))
      Serial.println("Switch pressed!");

    /* Save the state of the encoder */
    lastDialPos = dialPos;
  }
}

Входит в состав набора Набор из 37 датчиков

Также имеется отдельная библиотека Encoder, доступная через менеджер библиотек.

Дополнительные материалы

Шаг 8. Изучаем функционал датчика KY-040(энкодер)

Подключение энкодера к Arduino

Реклама