Меню

Arduino датчик положения вала

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Подключение оптического энкодера к Arduino

Сегодня оптические энкодеры (датчики положения вала) широко используются во многих областях электроники и робототехники. Они применяются в устройствах для определения положения вала двигателя, системах управления скоростью, принтерах, станках с ЧПУ и т.д.

Плату Arduino также можно научить работать с оптическим энкодером, что позволит реализовать больше интересных и практичных устройств.

Основным элементом простого оптического энкодера является оптопрерыватель (фотопрерыватель), состоящий из инфракрасного светодиода и фототранзистора, которые размещены друг напротив друга в пластмассовом корпусе. При блокировании непрозрачной частью диска света, излучаемого светодиодом, проводимость фототранзистора меняется. Это изменение может быть определено дискретными компонентами или микроконтроллером.

Поскольку нам нужно создавать импульсы на входе фототранзистора, то необходим диск с прозрачными частями или вырезами. Такой диск можно сделать из прозрачного акрила, наклеив на него распечатанный на принтере рисунок, который представлен ниже. Также можно вырезать соответствующую фигуру из непрозрачного акрила.

Следует заметить, что ширина щели и ширина непрозрачных частей являются важными параметром диска. Для каждой модели оптопрерывателя желательно подобрать рекомендуемую ширину соответствии с документацией на это прерыватель. При этом ширину лучше взять с запасом. Например, если рекомендуемая ширина 1 мм, то ширину непрозрачных полос и щелей лучше сделать 2 мм. Если частота вращения диска составляет 60 оборотов в минуту, то за одну секунду диск повернется на один оборот. Если диск имеет 36 полос, то частота импульсов составит 36 Гц, что может быть легко обработано фотопрерывателем.

Для начала нужно собрать представленную ниже схему, которая состоит из Arduino и оптопрерывателя с обвязкой. Резистор R2 является подтягивающим. Значение резистора R1 зависит от того, какой прерыватель вы используете. К выводу D13 подключается светодиод, который срабатывает при прерывании луча. D12 представляет собой вспомогательный выход, который может быть использован для мониторинга сигнала энкодера на экране осциллографа.

После подключения электроники и прошивки Arduino вставьте диск в выемку оптопрерывателя. Подключите осциллограф к D12 и вращайте диск. Если нет под рукой осциллографа, то наблюдайте за подключенным к D13 светодиодом. В данном случае вращайте диск медленно, чтобы импульсы были визуально заметны.

Возможности улучшения кода

Есть два основных способа считывать сигнал с цифрового входа микроконтроллера: по опросу и по прерыванию. В первом случае система считывает сигнал каждый раз внутри основного цикла программы (как в данном примере). Основным недостатком этого метода является то, что трудно вести обработку других сигналов во время опроса. Но с использованием прерываний основной цикл освобождается от части кода с опросом, и система может спокойно заниматься другими делами, пока на вход не придет сигнал. С поступлением сигнала, основные работы будут приостановлены, система войдет в прерывание для считывания импульса, затем выйдет, восстановив предыдущую работу. Так что, если вам не хватает быстродействия, то воспользуйтесь прерываниями.

Источник

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Arduino и модуль фотоимпульсного датчика скорости вращения двигателя

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

Как правило, датчики измеряют величину благодаря регистрации определённых событий, затем количество событий соотносится с периодом времени, за которые они произошли.

Так в данном случае измеряется скорость – под событиями здесь понимаются импульсы, полученные в результате срабатывания оптического датчика во время вращения диска с прорезями. Датчик состоит из светодиода и фототранзистора, который воспринимает наличие или отсутствие излучения светодиода.

Представленная схема может быть использована для отправки зарегистрированных импульсов в микроконтроллер. Основой схемы является оптический датчик OS25B10 (OC1) со светодиодом и фототранзисторным выходом.

Читайте также:  Что такое оптический датчик пламени

Далее идет микросхема сдвоенного компаратора LM393 (IC1), настроенная в качестве простого триггера Шмита. Зелёный светодиод (LED1) показывает наличие приложенного к схеме напряжения, а красный светодиод (LED2) контролирует выход модуля датчика скорости двигателя. Рекомендуемое рабочее напряжение модуля составляет от 4.5 до 5.5 В.

Обратите внимание, что резистор R1 (180 Ом) используется здесь для ограничения рабочего тока светодиода внутри оптического датчика OS25B10 (OC1). При необходимости вы можете изменить его номинал для вашего прототипа. Также вы можете подкорректировать значение резистора R2 (10 КОм) для получения необходимого напряжения для вашей схемы. Резистор R7 (10 КОм) является опциональным подтягивающим резистором.

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

Энкодерный диск имеет несколько слотов или отверстий. Вы можете легко изготовить свой собственный диск из листа нержавеющей стали или жесткого пластика. Если вам нужно измерять только скорость, а не положение, то диска с парой отверстий будет достаточно. При желании можно проделать большое количество отверстий, но не перестарайтесь с этим. Важно, чтобы закрытые обрасти были достаточной толщины, чтобы обеспечить возможность счета импульсов с помощью фотодатчика.

Источник

Подключение энкодера к Ардуино и полнофункциональный код обработки для него

Энкодер — это устройство преобразования механического перемещения или угловых изменений положения в цифровой сигнал. В статье рассматривается самый популярный в DIY сообществе инкрементальный энкодер EC11 с кнопкой. При его вращении на выходах A и B формируются TTL сигналы в виде импульсов сдвинутые между собой по фазе на 90 градусов. Таким образом с его помощью, можно определить направление и скорость вращения, а так же рассчитать угол поворота. В отличие от потенциометров, энкодер KY-040 гораздо надежней и долговечный.

Немного подробностей

Собирая один из проектов с использованием encoder. Я не смог найти код для Ардуино выполняющий все мои условия. Так как для проекта нужно обрабатывать следующие команды: «Вращение без нажатия», «Вращение с нажатием», «Нажатие» и «Длинное нажатие», а так же требуется стабильная работа энкодера. Скетчи использующие один пин с прерыванием INT0 или INT1, работают отвратительно и при вращении вала энкодера вылетает очень много ошибок. Код без использования прерываний работает стабильно, но он не работает в фоновом режиме, его нужно встраивать в тело основной программы, что в свою очередь приводит к не своевременному срабатыванию обработчика и пропускам при вращении энкодера. Еще хуже обстоят дела с обработкой нажатия с вращением вала энкодера и обычным с нажатием. Пришлось написать свой код обработки, который исключает описанные выше проблемы. С дребезгом контактов я не стал бороться программно, так как это приводит к задержкам обработки. Проще и надежней использовать керамические конденсаторы.

Схема подключения энкодера к Ардуино

Для считывания сигналов с выходов EC-11, нужно использовать три цифровых входа Arduino. В схеме подключения я использовал редко используемые мной в своих проектах выводы Arduino(A1, A2 и A3). Внешние подтягивающие резисторы отсутствуют, так как я использовал внутреннюю подтяжку микроконтроллера. Конденсаторы нужны для гашения импульсов дребезга контактов. Если у вас новый и хороший энкодер, то можно обойтись и без них. Но на кнопку в любом случае потребуется конденсатор, так как ее дребезг неизбежен.

Используемые в схеме компоненты:

Скетч для Ардуино

Для того что бы отслеживать изменение положения энкодера в фоновом режиме, я использую прерывание PCINT1. Обработка всех функций происходит в прерывании, обработчик в зависимости от произошедшего действия изменяет переменную enc_state. Если значение переменной enc_state=0 — ничего не произошло, enc_state=1 — экодер вращался без нажатия, enc_state=2 — экодер вращался с нажатием, enc_state=3 — было нажатие на кнопку, enc_state=4 — было длинное нажатие на кнопку, Прерывание будет срабатывать каждый раз по изменению состояния входов, как с высокого уровня на низкий, так и наоборот. То есть при одном щелчке энкодера прерывание сработает 4 раза. Или по 2 раза для каждого из входов. Но обработчик выдаст сигнал поворота только 1 раз на все 4 прерывания.
Код обработчика при каждом срабатывании записывает в переменную lastcomb состояние входов, к которым подключен энкодер. И ждет состояние когда выходы A и B будут замкнуты на GND, это гарантированный сигнал того, что энкодер вращается. После того как этот сигнал получен, обработчик проверяет в какую сторону было вращение. Для этого он сравнивает его предыдущее значение из переменной lastcomb и в зависимости от фазы сдвига определит в какую сторону был поворот ротора. Как я писал ранее, сложнее всего отслеживать нажатие кнопки.
Так как использовать определенные тайминги я не планировал, потому, что они неизбежно приводят длительным задержкам работы обработчика и основной программы, или требуют использование таймера, которых в микроконтроллере всего 3 шт. их, как правило никогда не хватает. Собственно проблема состояла в том, чтобы разделить «нажатие с последующим вращением» от простого нажатия. В итоге как вы уже можете убедиться, я решил эту задачу. Оптимизацией кода я не стал заниматься, потому как все работает и меня все устраивает. Для наглядности в коде все действия с энкодером, отображаются в Serial мониторе программы Adruino IDE.

Читайте также:  Датчик движения для включения светодиодных прожекторов

Заключение

Результат работы кода меня порадовал и теперь я могу продолжить работу над своим новым проектом, который скоро здесь выложу. Надеюсь эта короткая статья вам понравилась и вы сможете воспользоваться моей наработкой в своих самоделках.

Если у Вас остались вопросы и замечания, пишите их в комментариях. Я с удовольствием на них отвечу.

Источник

Подключение энкодера к Arduino. GyverEncoder v4.9

ОБНОВЛЕНИЯ

  • v4.7: Исправлен случайный нажатый поворот в BINARY_ALGORITHM
  • v4.8: увеличена производительность для AVR Arduino
  • v4.9: быстрый поворот отключен если кнопка удерживается

ТЕОРИЯ

Энкодер (от англ. encode – преобразовывать) – это устройство для преобразования угловых положений или линейных перемещений в цифровой сигнал, т.е. энкодер – это датчик угла или линейного перемещения, соответственно есть крутильные и линейные энкодеры. Принцип работы энкодера заключается в преобразовании механического перемещения в электрические сигналы, у обычного инкрементального энкодера, который мы будем рассматривать, этот сигнал представляет собой два квадратных сигнала (при равномерном вращении), сдвинутых по фазе на 90 градусов.

Самым хорошим модулем с энкодером на Aliexpress является вот такой, на круглой плате:

ПОДКЛЮЧЕНИЕ

Подключается модуль энкодера очень просто: питание на питание (GND и VCC), логические пины CLK, DT (тактовые выводы энкодера) и SW (вывод кнопки) на любые пины Arduino (D или A). У круглых модулей выводы энкодера подписаны как S1 и S2, а вывод кнопки как Key, подключаются точно так же. От порядка подключения тактовых выводов энкодера зависит “направление” его работы, но это можно поправить в программе.

У модулей энкодера тактовые выводы подтянуты к питанию и дают низкий сигнал при срабатывании, также на них стоят RC цепи для гашения дребезга. Вывод кнопки никуда не подтянут! Промышленный энкодер подключается точно так же, чёрный и красный провода у него питание, остальные – тактовые выходы.

Читайте также:  Срабатывает датчик тяги в газовой колонке

У модулей энкодеров тактовые выходы и кнопка подтянуты к питанию, у круглого модуля также стоят RC цепи для аппаратного подавления дребезга контактов, у KY-40 (прямоугольный) распаяна только подтяжка. Если нужно подключить “голый” энкодер к плате – в целом можно подключить напрямую без обвязки, как на схеме ниже, моя библиотека отработает и подтяжку средствами микроконтроллера (INPUT_PULLUP), и программный антидребезг. Но рекомендуется всё-таки делать RC цепи для кнопки и для тактовых выходов энкодера.

Источник

Энкодер (Trema-модуль)

Общие сведения:

Trema-модуль Энкодер — это датчик угла поворота, позволяющий дискретно (прерывисто) определять угол поворота вала и нажатие на него. Основным элементом данного модуля является инкрементальный (пошаговый) энкодер с тактовой (тактильной) кнопкой.

Видео:

Спецификация:

  • Входное напряжение питания модуля: 5 В
  • Ток потребляемый модулем:

Подключение:

  • Выводы A и B модуля являются выходами энкодера
  • Вывод S (Signal) модуля является выходом тактовой кнопки
  • Выводы V (Vcc) и G (GND) модуля являются входом питания

При использовании библиотеки iarduino_Encoder_tmr, все выходы модуля можно подключать к любым выводам Arduino, а к одной Arduino можно подключить до 8 модулей.

Модуль удобно подключать 2 способами, в зависимости от ситуации:

Способ — 1 : Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.

Способ — 2 : Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Питание:

Входное напряжение 5 В постоянного тока, подаётся на выводы V (Vcc) и G (GND) модуля.

Подробнее о модуле:

Полный оборот инкрементального энкодера (360°) разбит на дискретные участки (шаги), при прохождении которых энкодер формирует импульсы на своих выходах. Подсчитав количество импульсов, можно определить угол поворота относительно начального положения вала. У инкрементального энкодера имеется два выхода (третий вывод является общим входом, с которым импульсно соединяются выходы) и на обоих выходах формируется одинаковое количество импульсов, но в зависимости от направления поворота, импульсы на одном выводе будут опережать или отставать от импульсов на другом выводе (код Грея). Таким образом можно определить не только угол, но и направление поворота.

Полный оборот вала Trema-энкодера разбит на 20 дискретных участков по 18° на каждый, значит при полном обороте вала энкодера, на выходе каждого вывода модуля сформируется по 20 импульсов.

При неподвижном и не нажатом вале энкодера, на выходах модуля A и B присутствуют уровни логической «1», а на выходе S (Signal) уровень логического «0». При вращении вала энкодера на выходах A и B формируются отрицательные импульсы, а при нажатии на вал, на выходе S (Signal) устанавливается уровень логической «1».

Для работы с модулем предлагаем воспользоваться библиотекой iarduino_Encoder_tmr, которая позволяет работать с несколькими энкодерами используя второй аппаратный таймер. Библиотека постоянно считывает уровни сигналов на выходах A и B модулей, фиксируя наличие поворота и его направление. Получить состояние энкодера можно вызвав функцию библиотеки read, которая вернёт одно из трёх состояний: encLEFT(зафиксирован поворот влево), encRIGHT (зафиксирован поворот вправо), или false (повороты не зафиксированы).

ВАЖНО: библиотека использует второй аппаратный таймер,

НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!

Подробнее про установку библиотеки читайте в нашей инструкции..

Примеры:

Пример 1:

Пример 2:

Вывод состояния энкодера:

При каждом повороте энкодера, в мониторе будет отображаться его направление.

Вывод счетчика энкодера:

При повороте энкодера в мониторе будет отображаться значение счётчика, при повороте влево счётчик будет уменьшаться, а при повороте вправо — увеличиваться.

Описание основных функций библиотеки:

Подключение библиотеки:

Можно объявить несколько объектов, тогда каждый объект будет работать со своим энкодером.
Имена объектов должны отличаться. Библиотека позволяет подключить до 8 энкодеров.

Источник

Adblock
detector