В этой статье мы будем подключать инкрементальный энкодер к плате Arduino Uno. Инкрементальный энкодер используется для идентификации угла поворота оси двигателя или какого-нибудь другого устройства. Также он находит широкое применение в системах регулировки чего либо, например, уровня громкости в музыкальных центрах. Более подробную информацию об этом устройстве можно прочитать в статье про подключение углового кодера к микроконтроллеру AVR. Также на нашем сайте вы можете посмотреть более подробную статью про подключение инкрементального энкодера к плате Arduino.
Принципы работы инкрементального энкодера
Внешний вид инкрементального энкодера показан на следующем рисунке.
Инкрементальный энкодер имеет следующие контакты:
- земля;
- питание +5 В;
- выходной сигнал A;
- выходной сигнал B;
- контакт времени или общий контакт.
Предположим что инкрементальный энкодер запитан и его ось вращается. В этом случае он обеспечивает на своих выходах последовательность импульсов, показанную на следующем рисунке.
Как показано на рисунке при вращении оси энкодера по часовой стрелке сначала будет наблюдаться спад импульса на выходе A, а потом на выходе B. А при вращении оси энкодера против часовой стрелки сначала будет наблюдаться спад импульса на выходе B, а потом на выходе A.
Этот спад импульса для используемого нами инкрементального энкодера с 20 позициями будет случаться каждые 360/20 = 18 градусов. Если число позиций в инкрементальном энкодере будет больше, то и обеспечиваемая им точность измерений будет также выше.
То есть, исходя из представленных условий, мы можем получить данные о направлении вращения оси инкрементального энкодера и числе градусов, на которые повернулась его ось. Это все что нам нужно чтобы определить текущее положение его оси.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Инкрементальный энкодер (купить на AliExpress).
- Резистор 220 Ом (2 шт.) (купить на AliExpress).
- Резистор 1 кОм (купить на AliExpress).
- Светодиод (8 шт.) (купить на AliExpress).
- Конденсатор 100 нФ (2 шт.) (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Схема устройства представлена на следующем рисунке.
Конденсаторы на схеме предназначены для нейтрализации эффекта дребезга контактов инкрементального энкодера. Если их не будет, то возможны ошибки в определении позиции энкодера.
Когда ось инкрементального энкодера будет вращаться, то положение импульсов на его выходных контактах будет отличаться. Плата Arduino будет анализировать эти различия и определять в каком направлении вращается ось инкрементального энкодера.
Если вращение происходит по часовой стрелке, то значение двоичного счетчика в программе будет увеличиваться на единицу и это изменение будет показываться с помощью светодиодов на схеме. Если вращение происходит против часовой стрелки, то значение двоичного счетчика в программе будет уменьшаться на единицу.
Исходный код программы
Принцип работы программы пояснен с помощью комментариев к соответствующим командам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
int count =0; int x=0; int y=0; void setup() { DDRD = 0xFF; // контакты, к которым подключены светодиоды, переключаем в режим работы на вывод данных PORTD =0; //записываем в эти контакты 0V pinMode(8,INPUT); // pin8 на ввод данных pinMode(9,INPUT); // pin9 на ввод данных } void loop() { if ((digitalRead(8)==LOW)||(digitalRead(9)==LOW)) // если на каком-нибудь выходном контакте икрементального энкодера наблюдается спад импульса { delay(10); if (digitalRead(8)==LOW) // если PINB идет вторым в спаде импульса (на нем LOW) { if (count<255) { count++; // увеличиваем двоичный счетчик на единицу если его значение меньше 255 } } if (digitalRead(9)==LOW) // если PINA идет вторым в спаде импульса (на нем LOW) { if (count>0) { count--; // уменьшаем двоичный счетчик на 1 если его значение больше 0 } } delay(100); while ((digitalRead(8)==LOW)&&(digitalRead(9)==LOW)) // ждем пока позиция оси углового кодера не сбросится { } } PORTD = count; // показываем значение двоичного счетчика с помощью светодиодов } |