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

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

Энкодер Ардуино (модуль KY-040) ► рассмотрим схему подключения, представим примеры скетчей с энкодером Arduino для изменения яркости светодиода и вращения серво.

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

Модуль энкодер Ардуино: схема, распиновка

Энкодер служит для преобразования угла поворота в электрический сигнал. При вращении ручки модуля мы получаем два сигнала (A и B), которые противоположны по фазе. Сигналы A и B зависят друг от друга при вращении энкодера Ардуино по часовой или против часовой стрелки. Для считывания сигнала A и B с энкодера можно использовать, как цифровые, так и аналоговые порты микроконтроллера.

Распиновка и принципиальная схема модуля энкодера
Распиновка и принципиальная схема модуля энкодера

Каждый раз, когда сигнал A переходит от положительного уровня к нулю, мы считываем значение сигнала B (смотри диаграмму выше). Если сигнал B находится в этот момент в положительном состоянии, значит энкодер вращается по часовой стрелке, если B равен нулю, то энкодер вращается против часовой стрелки. Считывая оба выхода при помощи Ардуино, можно определить направление и угол поворота.

Как подключить энкодер к Ардуино

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль энкодер ky-040;
  • беспаечная макетная плата;
  • светодиоды и резисторы;
  • микро сервопривод;
  • провода «папа-папа», «папа-мама».

Для работы с энкодером потребуется установить библиотеку RotaryEncoder.h, скачать архив можно здесь. Если у вас возникли трудности с установкой библиотеки для энкодера, то рекомендуем ознакомиться с информацией, как установить библиотеку в Arduino IDE. Для подключения KY-040 к Arduino можно использовать цифровые и аналоговые пины микроконтроллера, в наших примерах используются пины A1-A3.

Скетч. Пример Ардуино энкодер прерывание

Схема подключения энкодера к Ардуино
Схема подключения энкодера к Ардуино (модуль KY-040)

Разберем для начала самый простой пример управления энкодером от Ардуино с помощью прерываний, где вся черновая работа по определению положения ручки энкодера выполняется с помощью библиотеки RotaryEncoder.h. Мы лишь выводим данные на монитор порта Arduino IDE. Соберите схему с энкодером, как показано на картинке выше и загрузите в микроконтроллер Arduino следующую программу.

#include "RotaryEncoder.h"          // библиотека для энкодера
RotaryEncoder encoder(A2, A3);  // пины подключение энкодера (DT, CLK)

static int pos = 0;  // задаем начальное положение энкодера
int newPos;

void setup() {
  Serial.begin(9600);
  Serial.println(pos);  // выводим на монитор начальное значение
}

void loop() {
   // проверяем положение ручки энкодера
   encoder.tick();
   newPos = encoder.getPosition();

   // если положение изменилось - выводим на монитор
   if (pos != newPos) {
      Serial.println(newPos);
      pos = newPos; 
   }
}

Пояснения к коду:

  1. начальное положение ручки равно нулю static int pos = 0; и это значение выводится на мониторе порта в процедуре void setup в начале программы;
  2. в примере программы для энкодера нет ограничения по положению рукоятки датчика KY-040, положение может быть положительным и отрицательным.

Скетч. Управление энкодером Ардуино светодиодом

Как подключить энкодер с кнопкой
Как подключить энкодер для управления светодиодами

Следующий пример позволит управлять яркостью светодиода с помощью ШИМ сигнала, а также включать и выключать второй светодиод с помощью нажатия кнопки энкодера. Для этого соберите схему, размещенную выше. Обратите внимание, что порт SW энкодера подключен к пину 2 Arduino, а светодиоды к 12 и 11 пину. После сборки схемы загрузите следующий код управления светодиодами на Arduino с энкодером.

#include "RotaryEncoder.h"          // библиотека для энкодера
RotaryEncoder encoder(A2, A3);  // пины подключение энкодера (DT, CLK)

// задаем шаг энкодера и макс./мин. значение
#define STEPS  5
#define POSMIN 0
#define POSMAX 255

int lastPos, newPos;

void setup() {
   pinMode(2, INPUT_PULLUP);  // пин подключения кнопки энкодера (SW)
   pinMode(11, OUTPUT);           // пины для подключения светодиодов
   pinMode(12, OUTPUT);

   Serial.begin(9600);
   encoder.setPosition(10 / STEPS);
}

void loop() {
   // проверяем положение ручки энкодера
   encoder.tick();
   newPos = encoder.getPosition() * STEPS;

   if (newPos < POSMIN) { 
   encoder.setPosition(POSMIN / STEPS); 
   newPos = POSMIN;
   }
   else if (newPos > POSMAX) { 
   encoder.setPosition(POSMAX / STEPS); 
   newPos = POSMAX; 
   }
   // если положение изменилось - выводим на монитор
   if (lastPos != newPos) {
      Serial.println(newPos);
      lastPos = newPos;
   }

   // включаем первый светодиод с установленной яркостью
   analogWrite(11, lastPos);

   // включаем второй светодиод с помощью нажатия кнопки
   if (digitalRead(2)==HIGH) { digitalWrite(12, LOW);  }
   if (digitalRead(2)==LOW)  { digitalWrite(12, HIGH); }
}

Пояснения к коду:

  1. для пина 2 используется конфигурация INPUT_PULLUP, так как кнопка энкодера подключена к GND и при ее нажатии на цифровом входе будет сигнал LOW;
  2. в программе можно изменить максимальное и минимальное значение поворота энкодера, а также шаг вращения ручки датчика ky-040.

Скетч. Управление серво мотором от энкодера

Управление серво от энкодера
Управление микро серво от энкодера Ардуино Уно

Следующий скетч демонстрирует подключение серво с энкодером. Логический провод микросерво (желтый или оранжевый цвет) подключается к ШИМ порту 11 микроконтроллера. В программе задается угол поворота серво с помощью поворота ручки модуля ky-040. Работа программы похожа на управление потенциометром серво, но в случае с энкодером, можно задавать максимально точный угол поворота.

#include "RotaryEncoder.h"          // библиотека для энкодера
RotaryEncoder encoder(A2, A3);  // пины подключение энкодера (DT, CLK)

#include <Servo.h>          // библиотека для сервопривода
Servo servo;

// задаем шаг энкодера, макс./мин. значение поворота
#define STEPS  10
#define POSMIN 0
#define POSMAX 180

int lastPos, newPos;

void setup() {
   servo.attach(11);    // пин для подключения серво
   Serial.begin(9600);
   encoder.setPosition(10 / STEPS);
}

void loop() {
   // проверяем положение ручки энкодера
   encoder.tick();
   newPos = encoder.getPosition() * STEPS;

   if (newPos < POSMIN) { 
   encoder.setPosition(POSMIN / STEPS); 
   newPos = POSMIN;
   }
   else if (newPos > POSMAX) { 
   encoder.setPosition(POSMAX / STEPS); 
   newPos = POSMAX; 
   }
   // если положение изменилось - выводим на монитор
   if (lastPos != newPos) {
      Serial.println(newPos);
      lastPos = newPos;
   }
   // устанавливаем угол поворота микросерво
   servo.write(lastPos);
}

Пояснения к коду:

  1. шаг поворота качалки серво Ардуино составляет 10 градусов. Шаг поворота и максимальный угол поворота можно изменить в программе.

Заключение. Мы рассмотрели несколько вариантов подключения модуля энкодера к Arduino: пример с прерыванием и управлением светодиодом, пример с управлением мотором серво. Также модуль можно использовать для управления меню на дисплее 1602 LCD Ардуино. Мы использовали библиотеку RotaryEncoder.h, но есть еще несколько библиотек энкодера для Ардуино, которые в одном обзоре не уместить.

1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 5,00 out of 5)
Загрузка...

Похожие записи по теме:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *