Считывание нескольких поворотных энкодеров

У меня есть предстоящий проект, где пользовательский ввод будет основан на вращении большого винтика, и у меня есть несколько доступных UNO

Поскольку поворотные энкодеры нуждаются в двух контактах, только Мега сможет справиться с необходимыми 7-8 энкодерами. Если только нет лучшего способа их прочитать?

Стоит ли использовать ATtiny85 на кодер и передавать все эти данные в mega через 1 вывод каждый? Таким образом, я мог бы расширить проект дальше 7-8 позже?

Или эта идея выброшена из окна, потому что есть гораздо более простой способ?

, 👍10

Обсуждение

[Arduino Mega](https://store.arduino.cc/arduino-mega-2560-rev3) имеет 54 входных контакта, что дало бы колоссальные 27 энкодеров? Кроме того, считывание поворотных энкодеров [может быть выполнено с помощью прерываний](https://github.com/brianlow/Rotary/blob/master/examples/Interrupt/Interrupt.ino), что практически нулевые накладные расходы (нет опроса, процессор прерывается только на короткое время, когда происходит действие, т. Е. CLK имеет восходящее преимущество). Я хочу сказать: 1. Arduino Mega имеет достаточно контактов, 2. используя расширитель I2C GPIO с поддержкой прерываний (например, 16-битный MCP23017), вы также можете сделать это более эффективно. Уверен, что вопрос правильный?, @Maximilian Gerhardt

Я имел в виду UNO, когда писал Mega, думая, что, может быть, mega. Фантастический должен выйти для MCP23017 - я обновлю вопрос, чтобы отразить, @Andrew Lazarus

поворотные энкодеры нуждаются в двух выводах ... не все ... какой вид у вас есть?, @jsotola

У меня есть поворотный энкодер и MCP23017, я создам доказательство концепции и вернусь с ответом позже в этот день., @Maximilian Gerhardt

См. https://hackaday.com/2018/04/15/rotary-encoders-become-i2c-devices/ . Этот человек использовал один чип на каждый поворотный энкодер. Затем эта позиция будет получена Arduino с помощью I2C. Таким образом, используя только 2 контакта, вы можете подключить до 127 энкодеров. Еще одним преимуществом является то, что устройство может выполнять деблокировку, так что ваш основной Arduino должен иметь дело с этим., @Gerben


1 ответ


Лучший ответ:

17

Библиотека и схемы находятся по адресу https://github.com/maxgerhardt/rotary-encoder-over-mcp23017.

Для считывания поворотного энкодера (т. Е. Обнаружения изменений состояния ручки) существуют две возможные реализации:

  • опросите состояние двух выходных контактов и проверьте наличие изменений
  • настройте прерывание, которое будет вызываться при изменении выходного вывода, а затем проверьте наличие изменений

Использование прерываний более эффективно, чем постоянный опрос контактов, поскольку действие выполняется только тогда, когда происходит фактическое изменение.

Для каждого поворотного энкодера вам понадобятся два контакта на вашем микроконтроллере. Однако мы можем использовать расширители GPIO, например, над I2C или SPI, например

  • Микрочип MCP23017 (16 бит, I2C)
  • Texas Instruments PCF8575 (16 бит, I2C), PCF8574 (8 бит, I2C)

Использование расширителя портов по сравнению с I2C имеет то преимущество, что шина использует только 2 контакта. Это означает, что на шине I2C может быть несколько (до 127) устройств, и каждое устройство I2C может, например, предоставлять 16 выводов GPIO.

Использование ATtiny85 на кодер и, возможно, соединение их через шину I2C также возможно, однако дороже и сложнее.

Я выбрал MCP23017 здесь, потому что он способен прерывать, имеет 16-битный код, и он у меня валялся. PCF8574 также отлично работал бы, так как у него те же возможности.

Испытания проводились с использованием MCP23017 и KY-040.

Письменная библиотека использует модифицированную библиотеку Adafruit MCP23017 и Ротационную библиотеку. Роторная библиотека также обрабатывает деблокирование, используя для декодирования подход, основанный на конечных автоматах. Библиотека представляет собой простой заголовочный файл, который определяет объект RotaryEncOverMCP C++, с помощью которого можно легко описать и управлять поворотным энкодером, подключенным к устройству MCP23017. В нем есть пример метода опроса и метода прерывания.

Для 1 кодера можно записать схему, например: (на основе прерываний)

schem

Поскольку один MCP23017 имеет 16 портов, мы можем подключить к одному такому устройству до 8 поворотных энкодеров.

Однако MCP23017 также имеет три адресных контакта, с помощью которых можно выбрать его адрес I2C. Это означает, что мы можем иметь 2^3 = 8 таких устройств на одной и той же шине I2C (т. Е. Подключенных к одним и тем же линиям SDA и SCL).

Таким образом, с одной шиной I2C, которая использует 2 контакта, мы можем иметь максимум 8xMCP23017 и 64 поворотных энкодера (при условии, что прерывания не используются, для чего потребуется 1 вывод для любого количества поворотных энкодеров). За счет еще 2 контактов на микроконтроллере мы можем создать еще одну программную битную шину I2C, каждая из которых снова добавляет максимум 64 поворотных энкодера.

Предполагая, что D2-D13 и A0-A5 свободны, на этих 18 контактах мы можем иметь 9 шин I2C с общим количеством 72 устройств MCP23017, содержащих в общей сложности 576 поворотных энкодеров. Для чего бы это ни понадобилось.

Я протестировал эту библиотеку с одним поворотным энкодером и MCP23017, но код структурирован таким образом, что добавление большего количества энкодеров - это просто добавление записи в массив.

,

Фантастика. Это именно та информация, которую я искал – Я заказал несколько MCP23017, чтобы начать работу. Я действительно ценю глубину, в которую вы здесь углубились, @Andrew Lazarus

Начал работать над этим сегодня, и у меня есть настройка, которая точно соответствует спецификациям схемы, но ничего не читается на консоли – испытывали ли вы подобную проблему при написании ответа? и если да, то какую часть я должен проверить, @Andrew Lazarus

@AndrewLazarus сначала запустите сканер I2C scetch, чтобы убедиться, что вы можете добраться до MCP23017. Если нет, убедитесь, что линии I2C, power и RST подключены правильно, @Maximilian Gerhardt

Спасибо! Это была хорошая информация!, @mlom