Маленькая и быстрая библиотека для энкодера: elchupanibrei — LiveJournal
?- Литература
- Техника
- Cancel
Первый самый примитивный. Использует тонны if-else и програмный debounce на millis(). Работает медленно. Вот скриншот такой копипасты.
счетчик энкодера у курильщика с ардуино головного мозга
С переходными процессами в этом примере разбираются без таймера. Тупо ждут микросекунду. Шах и мат перфекционисты. Вторая особенность — вешают функцию onA() на первое прерывание, а onB() на второе. Зачем? Никто не запрещает читать encoder_A_Pin вместе с encoder_B_Pin при срабатывании внешнего прерывания на onA(). Освободившийся interrupt можно использовать для кнопки или второго энкодера.
таблица состояний энкодера
Самый продвинутый — это доработанный второй. Из 16 состояний удаляются бесполезные. Какая нам польза от знания где крутилка до/после клика? На основе оставшихся 4-х комбинаций с помощью булевой алгебры и switch-case делается простейший счетчик. Все! Правда есть нюанс. Функция digitalRead() оказалась настолько медленной, что ATmega328 не успевал читать значения pinA и pinB при срабатывании внешнего прерывания с условием CHANGE на pin A. Поэтому для AVR пришлось использовать прерывание по Timer1. Каждые 0.01 секунд срабатывает таймер и AVR не спеша читает состояние пинов и обновляет счетчик энкодера. Для быстрых STM32 и ESP8266 все работает на внешнем прерывании — как только энкодер начинает крутиться, срабатывает внешнее прерывание на pinA, считываются значения pinA и pinB и обновляется позиция энкодера.
счетчик энкодера здорового человека
Библиотека подсчитывает только физические клики, оставляя все лишнее за бортом. Внутренняя подтяжка включена и доплнительные резисторы не нужны. У популярного шилда KY-040 10КОм уже есть на плате и подключать их НЕ НАДО.
Чтобы подавить дребезг и избежать пропуск кликов нужно добавить конденсаторы:
— 100nF/0.1μF между A и землей
— 100nF/0.1μF между B и землей
— 100nF/0.1μF между кнопкой и землей
БЕЗ КОНДЕНСАТОРОВ БИБЛИОТЕКА РАБОТАТЬ НЕ БУДЕТ!!!
железный debounce
С теорией по методам устранения дребезга можно ознакомится здесь. Калькулятор для подбора гасящего конденсатора тут. Чем больше емкость конденсаторов, тем выше износ контактов энкодера.
расшифровка контактов KY-040
UDP: Переписал код. Теперь еще быстрее, меньше в размере и винарнее. Для кого-то недостаток, для кого-то достоинство, но теперь без аппаратных прерываний не работает. Спасибо товарищу kotyamba за консультацию и знания.
UDP3: Воспользовался ООП и путем наследования сделал тяжелый класс с float — «RotaryEncoderAdvanced». В нем можно прописывать количество шагов на клик, минимальное и максимальное значение. Получился законченный велосипед. Естественно легкий класс «RotaryEncoder» никуда не делся и работает без изменений.
UDP4: Переделал «RotaryEncoderAdvanced» на template, прощай float. Библиотека может занимать меньше памяти — все зависит от типа используемых переменных. Добавил возможность на лету менять — step per click, minimum value и maximum value. Управляем множеством различных значений с помощью одного энкодера!!!
UDP5: Тормозной digitalRead() для ATmega328 заменен на быстрый, теперь все работает без костыля Timer1.
Забирать как всегда тут.
Tags: #arduino, arduino
Когда кроилово ведет к попадалову, один ремонт стиральной машины
Была у меня очень старая стиральная машина-автомат (еще на командаппарате, олды помнят) и вот месяц назад начала прыгать при отжиме. Ремонтировать…
Ремонт автомобильного колпака
В понедельник менял колеса на зимние и сломал пластиковый колпак. Рабочий способ ремонта под катом. Клейл с сзади, армировав хлопчатобумажной…
Если переключатель скоростей велосипеда хандрит
Если на велосипеде начались проблемы с переключением задних скоростей не спешите настраивать тросик. Дело скорее всего в изношенном направляющем…
Photo
Hint http://pics.livejournal.com/igrick/pic/000r1edq
Когда кроилово ведет к попадалову, один ремонт стиральной машины
Была у меня очень старая стиральная машина-автомат (еще на командаппарате, олды помнят) и вот месяц назад начала прыгать при отжиме. Ремонтировать…
Ремонт автомобильного колпака
В понедельник менял колеса на зимние и сломал пластиковый колпак. Рабочий способ ремонта под катом. Клейл с сзади, армировав хлопчатобумажной…
Если переключатель скоростей велосипеда хандрит
Если на велосипеде начались проблемы с переключением задних скоростей не спешите настраивать тросик. Дело скорее всего в изношенном направляющем…
Как подключить энкодер к Ардуино
Для начала разберёмся детальнее, что такое энкодер.
Энкодер – это устройство, предназначенное для определения угла поворота и преобразующее данные в электрический сигнал. Другое название энкодера – «датчик угла поворота».
По выходному сигналу различают:
- Инкрементные энкодеры — на выходе формируется две последовательности импульсных сигналов (нулей и единиц), при этом каждая «единица» соответствует фиксированному углу (зависит от точности датчика). Отслеживание полного поворота происходит по специальному сигналу (программному), а направление вращения определяется по смещению второй последовательности относительно первой. Для понимания принципа работы инкрементных датчиков угла лучше всего изучить изображение ниже.
Рис. 1. Изображение выходного сигнала инкрементного энкодера
С анимацией.
Рис. 2. Схема инкрементного энкодера
- Абсолютные энкодеры – на выходе формируются не просто «единицы», а сразу последовательности фиксированной длины (зависит от точности измерения), которые явно говорят о конкретном угле, то есть значение угла поворота специальным образом кодируется (код Грея). Понять принцип его работы лучше поможет следующая схема.
Рис. 3. Схема принципа работы абсолютного энкодера
Или эта.
Рис. 4. Схема принципа работы абсолютного энкодера
Конструктивно (в зависимости от технологии измерения) экодеры могут быть:
- Оптическими;
- Магнитными;
- Резисторными.
Подключение и работа с энкодерами в Arduino в первую очередь зависит от способа кодирования угла.
Начнём с инкрементных датчиков.
Подключение инкрементных энкодеров
Чтобы притянуть контакты датчика к логической единице, необходимо использовать резисторы (10кОм). Типовая схема выглядит следующим образом (плата выбрана для примера, входные контакты на Ардуино могут быть изменены на другие).
Рис. 5. Типовая схема
Здесь приведён пример с использованием энкодера с кнопкой (есть и такие модели, кнопкой служит сама ручка).
При использовании Atmega можно просто включить встроенные резисторы микроконтроллера специальной командой.
Если вы сталкиваетесь с дребезгом датчика (довольно частое явление для замыкающихся контактов, а именно они используются в инкрементных энкодерах), можно аппаратно решить проблему путём сборки следующей схемы.
Рис. 6. Типовая схема
Существует и программный способ сглаживания дребезга за счёт использования логики прерываний (смотри скетч во вложениях к материалу). Но подключение прибора следует выполнять только на 2 и 3 пины.
Простейший код для обработки данных с датчика выглядит следующим образом.
Для более сложных задач можно использовать готовые библиотеки, например:
- https://github.com/GreyGnome/AdaEncoder
- https://github.com/PaulStoffregen/Encoder
- https://github.com/mathertel/RotaryEncoder
- и другие.
Во вложении можно найти готовый скетч (см. здесь) с подробными комментариями для работы с меню (часто используемый функционал для энкодеров с кнопкой).
Отрабатывается перемещение по иерархии меню и выбор между доступными пунктами.
Подключение абсолютных энкодеров
Абсолютные энкодеры не так распространены, как инкрементные. И схема подключения во многом зависит от требований производителя. Так, например, высокоточный 128-битный датчик Bourns ACE-128 легко подключается к Ардуино или Raspberry Pi. Производитель предлагает свои собственные библиотеки для работы с энкодером и даже типовую схему для тестирования функционала.
Схема соединения выглядит так.
Рис. 7. Схема соединения энкодеров
А схема для тестирования с выводом числового показателя угла поворота на дисплей, так.
Рис. 8. Схема для тестирования с выводом числового показателя угла поворота на дисплей
Готовая библиотека для Arduino, подробные инструкции и примеры скетчей можно найти на ГитХабе: https://github.com/arielnh56/ACE128
Аналогично и с изделиями других производителей – необходимо изучать их рекомендации.
Автор: RadioRadar
Использование энкодеров с библиотекой Arduino
Введение
RoboClaw обычно использует энкодеры в схеме автоматического управления с обратной связью для поддержания скорости и положения. Однако бывают ситуации, когда требуется более настраиваемый контроль от микроконтроллера. В этих рекомендациях по применению рассматривается использование Arduino для считывания, установки и сброса энкодеров с помощью библиотеки BasicMicro Arduino.
Материалы
(1) Контроллер двигателя RoboClaw
(1) Arduino Uno
(1) мотор-редуктор Pololu с квадратным энкодером * **
(3) кабель-перемычка 0,1″ (мама-папа)
(1) компьютер с установленной программой BasicMicro Motion Studio
(1) кабель micro USB для RoboClaw
(1) USB-кабель для Arduino
(1) небольшая отвертка
* Ссылка на мотор-редуктор Pololu с энкодером
** Обратите внимание, что для этого можно использовать любой двигатель со встроенным квадратным энкодером Примечание по применению
Приступим Начато
1. Следуйте этим примечаниям к приложению до шага 17, чтобы настроить RoboClaw и Arduino.
Использование функций библиотеки Arduino
Ниже приведен список всех функций энкодера, доступных в библиотеке Arduino. Обратите внимание, что все функции вызываются для существующего объекта RoboClaw, созданного ранее. Примечание к приложению об основах использования библиотеки, включая создание объекта RoboClaw, доступно здесь.
Чтение энкодеров
Для считывания текущих значений энкодера используются две функции. Согласно их названию, один используется для чтения канала 1, а другой — канала 2. Этим функциям необходимо передать только адрес RoboClaw.
ReadEncM1(адрес)
ReadEncM2(адрес)
Пример кода:
как единственный аргумент функции. Возвращенное значение сохраняется в переменной «motor_1_count».
int motor_1_count = roboclaw.ReadEncM1(0x80)
Скорость чтения
Эти две функции используются для считывания скорости двигателя в отсчетах энкодера, для каждого канала имеется по одной функции. Единственным аргументом этих функций является адрес RoboClaw.
ReadSpeedM1(адрес)
ReadSpeedM2(адрес)
Пример кода:
В этом примере «ReadSpeedM1» вызывается на объекте RoboClaw для считывания скорости двигателя 1 в счетчиках энкодера. Единственным аргументом, передаваемым функции, является адрес RoboClaw.
int motor_1_speed = roboclaw.ReadSpeedM1(0x80)
Настройка энкодеров
Эти функции устанавливают счетчик энкодера соответствующего канала на заданное значение. Адрес RoboClaw и устанавливаемое значение должны быть переданы им.
SetEncM1(адрес,значение)
SetEncM2(адрес,значение)
Пример кода:
В этом примере счетчик энкодера канала 1 установлен на 10000 отсчетов. Адрес RoboClaw передается, а также счетчик для установки.
roboclaw.SetEncM1(0x80,10000)
Сброс энкодеров
Передача адреса RoboClaw этой функции и ее вызов приводит к обнулению обоих каналов энкодера.
ResetEncoders(address)
Пример кода:
В этом примере счетчики энкодеров для обоих каналов обнуляются вызовом «ResetEncoders» с адресом RoboClaw, переданным в функцию.
motor_1_count = roboclaw. ResetEncoders(0x80)
Команды положения
Эти функции используются для установки двигателя для данного канала в определенное положение в счетчиках энкодера. Адрес RoboClaw, значение ускорения, значение замедления, скорость, положение и значение флага должны быть переданы в функции. Значение флага определяет, выполняется ли команда немедленно или сохраняется для последующего выполнения. Значение «0» сохраняет команду, а значение «1» немедленно запускает команду позиционирования. Версия этих функций «M1M2» позволяет позиционировать оба двигателя независимо и одновременно.
SpeedAccelDeccelPositionM1(address, accel, speed, deccel, position, flag)
SpeedAccelDeccelPositionM2(address, accel, speed, deccel, position, flag)
SpeedAccelDeccelPositionM1M2(address, accel1, speed1, deccel1, position1 , ускорение2, скорость2, замедление2, положение2, флаг)
Пример кода:
В этом примере положение двигателя 1 установлено на 15000 отсчетов. Адрес RoboClaw передается в качестве первого аргумента функции. Значения ускорения и замедления установлены на 10000, а значение скорости установлено на 2000. Аргумент флага установлен на «1», чтобы команда выполнялась немедленно.
motor_1_count = roboclaw.SpeedAccelDeccelPositionM1(0x80,10000,2000,10000,15000,1)
Выполнение примера кода
Доступен пример кода для демонстрации использования функций, описанных в этом примечании к приложению. Следуйте приведенным ниже инструкциям, чтобы получить код и протестировать его с помощью Arduino и RoboClaw, настроенных на шаге 1.
1. Загрузите библиотеку RoboClaw Arduino отсюда.
2. Добавьте библиотеку RoboClaw Arduino в Arduino IDE. Обратите внимание на место, куда была загружена библиотека RoboClaw, а затем откройте среду разработки Arduino IDE. В верхнем меню нажмите «Эскиз» и перейдите к «Включить библиотеку», а затем «Добавить библиотеку .Zip». В открывшемся диалоговом окне выберите загруженный ZIP-файл и нажмите «Открыть». Теперь библиотека добавлена в установку Arduino, и на нее можно ссылаться из скетчей.
Рисунок 1
Диалоговое окно для добавления библиотек .zip в установку Arduino IDE.
3. Загрузите или скопируйте пример кода для этого указания по применению отсюда.
Если Git установлен на используемом компьютере, его можно клонировать, введя следующую команду в терминале.
git clone https://github.com/basicmicro/using_encoders_arduino.git
4. Откройте код примера в среде разработки Arduino IDE и загрузите его на плату Arduino.
5. Теперь Arduino должен быть занят выполнением примера кода и работой с присоединенным RoboClaw.
Объяснение примера кода
Пример кода начинается со считывания значения энкодера, подключенного к каналу 1, и вывода значения на последовательный монитор. Затем он переходит к установке счетчика энкодера канала 1 на 10000 отсчетов, считывает значение и распечатывает его, чтобы продемонстрировать, что установка значения работает. Оттуда он запускает двигатель 1, работающий на половинной скорости, а затем считывает и печатает значение скорости, после чего двигатель останавливается. Затем оба энкодера обнуляются вызовом «ResetEncoders», а значение энкодера считывается и печатается. Наконец, вызывается команда положения, чтобы перевести двигатель 1 в положение 15000 отсчетов.
Устранение неполадок в примере
Если RoboClaw не отвечает на команды, которые отправляет Arduino, необходимо проверить несколько вещей. Сначала убедитесь, что между Arduino и RoboClaw есть заземляющее соединение, без него две платы не смогут нормально взаимодействовать. Наконец, убедитесь, что соединения RX и TX между Arduino и RoboClaw не перепутаны. Контакт 10 Arduino должен быть подключен к сигнальному контакту S2 RoboClaw, а контакт 11 Arduino — к сигнальному контакту S1 RoboClaw.
arduino uno — Чтение нескольких поворотных энкодеров
Библиотека и схемы находятся по адресу https://github.com/maxgerhardt/rotary-encoder-over-mcp23017.
Для считывания поворотного энкодера (т. е. обнаружения изменений состояния ручки) есть две возможные реализации:
- опрос состояния двух выходных контактов и проверка изменений
- настроить прерывание, которое будет вызываться при изменении выходного контакта, затем проверить изменения
Использование прерываний более эффективно, чем постоянный опрос контактов, потому что действие выполняется только тогда, когда происходит фактическое изменение.
Для каждого поворотного энкодера вам потребуется два контакта на микроконтроллере. Однако мы можем использовать расширители GPIO, например. I2C или SPI, например
- Microchip 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 и библиотеку Rotary. Библиотека Rotary также обрабатывает устранение дребезга, используя для декодирования подход на основе конечного автомата. Библиотека представляет собой простой заголовочный файл, который определяет
Объект C++, с помощью которого можно легко описать и управлять поворотным энкодером, подключенным к устройству MCP23017. В нем есть пример для метода опроса и метода прерывания.
Для 1 энкодера можно записать схему вида: (на основе прерываний)
Поскольку один MCP23017 имеет 16 портов, мы можем подключить до 8 энкодеров к одному такому устройству.