© 2023 DiyTronic

Работаем в Arduino с энкодерами

Решил тут на досуге поиграться с ардуинкой. Есть у меня кучка китайских энкодеров и вот руки наконец дошли их протестировать с Arduino и заодно разобраться с вопросом их подключения и использования.

Собственно очевидно, что получать состояние энкодера можно двумя способами. Это опрос порта и прерывание.

Периодический опрос порта

Подробно разобран вот тут http://cxem.net/arduino/arduino8.php
В общем-то не скажу, что мне этот способ интересен — греть воздух и тратить энергию опрашивая энкодер в большинстве случаев лишь пустая трата ресурсов поэтому останавливаться на нём не буду.

Прерывания

Вот это самое оно — контроллер спит и просыпается лишь для того, чтобы считать значение энкодера, выполнить какие-то действия и снова уснуть. Минусом является то, что не все входы контроллера могут генерировать прерывание.

Неплохой материал по теме нашёл тут http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino и уже было дело ломанулся попробовать живьём, но тут мне попалась на глаза библиотечка с нехитрым названием Encoder, в которой вся грязная работа уже сделана и к тому-же утверждается, что процедуры обработки прерываний написаны на ассемблере и таким образом можно ожидать достаточно высокой производительности.

Библиотека достаточно универсальна — подключенный энкодер может работать в следующих режимах

  • наилучшая производительность: оба сигнала генерируют прерывания.
  • хорошая производительность: один сигнал генерирует прерывание — второй нет (не совсем понял — видимо второй пин опрашивается)
  • низкая производительность: оба пина опрашиваются

В комплекте идут примеры кода в виде ардуино скетчей.

Пробуем

Для начала качаем библиотеку Encoder.zip (version 1.2), распаковываем её в папку для библиотек настроенную в IDE. Пробуем скетч из комплекта библиотеки.

/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(5, 6); // avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }
}

Библиотека прекрасно работает. Проверено!

Комментарии