© 2017 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. Пробуем скетч из комплекта библиотеки.

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
/* 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);
}
}

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

Комментарии