Энкодер для мотора arduino

Подключение к ардуино датчика вращения енкодер KY-040

Описание работы енкодера Поворотный энкодер имеет фиксированное число позиций на оборот. Эти позиции легко ощущаются руками как небольшие щелчки при повороте оси энкодера. Данный модуль энкодера имеет тридцать таких позиций. Количество таких позиций характеризует чувствительность датчика вращения.

У отдельного датчика имеются три вывода. Они обычно обозначаются как A, B и C. В случае KY-040, они ориентированы так, как показано на рисунке. Внутри энкодера есть два переключателя. Первый переключатель соединяет вывод А с выводом С, а второй соединяет вывод B с выводом C. В каждом фиксированном положении датчика, оба переключателя или открыты или закрыты. Каждый клик означает переключение состояния переключателей следующим образом: Если оба переключателя замкнуты, поворачивая ось по часовой стрелке или против часовой стрелки на одну позицию переведет оба переключателя на размыкание Если оба разомкнуты, поворачивая ось по часовой стрелке или против часовой стрелки на одну позицию переведет оба переключателя в закрытое состояние. На приведенном ниже рисунке показано расположение переключателей.

Как вы можете видеть, угловое положение контакта A и контакта B такое, что: вращающаяся пластинка по часовой стрелке соединит контакты А и С. Вращающаяся пластина против часовой стрелки соединит контакты В и С. Представим на графике переходные характеристики контактов при равномерном вращении пластины.

Определив то, какая пара контактов изменяет свое состояние первой, узнаем направление вращения вала. Если контакт А изменяет состояние первым, то вал вращается в направлении по часовой стрелке. Если же контакт B изменяет свое состояние первым, то вал энкодера вращается в направлении против часовой стрелки.

Выводы KY-040

На следующем рисунке показано назначение выводов данного ротационного энкодера.

Модуль сконструирован таким образом, что низкий логический уровень появляется, когда контакты замкнуты, и высокий, когда контакты разомкнуты. Низкий сигнал генерируется путем замыкания контакта C на общий провод, а так же ноль подается в это время и на выводы CLK и DT, когда переключатель замкнут. Высокий уровень генерируется подачей напряжения питания 5В через подтягивающий резистор. При этом на выходах CLK и DT будут единицы, когда контакты энкодера разомкнуты. Так же у данного енкодера имеется кнопка, расположенная в начале вала, и она является его неотемлемой частью. Если нажать на вал, то нормально открытый контакт кнопки замкнется. Это может быть полезно для программного увеличения или уменьшения чувствительности датчика, а так же для выбора пунктов меню, если использовать енкодер как устройство ввода настроек меню.

Схема ротационного енкодера

Схема рассматриваемого модуля приведена ниже. R2 и R3 на схеме выполняют функцию подтягивающих резисторов.

Подключение энкодера к Ардуино. Управление мотором энкодер.

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

В примере я буду использовать энкодер собранный в виде модуля KY-040. А ещё нам понадобятся электрический моторчик, Транзистор, я взял МОСФЕТ и Ардуино, куда же теперь без неё.
Вот схема подключение, подробнее я расскажу позже.

Для питания моторчика нужен отдельный блок питания.
А также нам понадобятся 2 резистора, зачем, я расскажу чуть позже.

Для сегодняшнего примера управления скоростью мотора я подключил энкодер в виде модуля KY-040 и мотор на 12 вольт. Но я решил не просто плавно регулировать скорость, а сделать дискретное переключение. Я определил приблизительно при каком напряжении у меня начинает вращаться мотор, и присвоил это значение первому переключению энкодера. Все последующие переключения идут с приращиванием значений. И так до шестой скорости. Это можно видеть в мониторе порта. Количество скоростей и шаг вращения может быть любым.
Для первого движения, при сбрасывании в ноль, или при изменении скорости в другую сторону, счётчик меняется через один щелчок.

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

Что бы заполнить паузу, пока вы будете смотреть как управлять мотором, я расскажу как ещё можно использовать энкодер.
Очень часто его используют для отображения различных меню. В одном из следующих уроков, я обязательно такое сделаю. Как только получу дисплей, а то я все уже использовал.
Другое применение — это использовать его в настройке и установке часов. Это намного удобнее, чем устанавливать кучу кнопок, а потом запоминать для чего нужна каждая из них. Про это тоже будет видео.
При изготовлении различных моделей и роботов. И ещё много где.

Как работает скетч, я объясню чуть позже, а пока посмотрим с схему подключения.
Я подключил к Ардуино НАНО, но без проблем подойдёт любая Ардуино.
Сначала рассмотрим подключение энкодера.

  • Выход clock я подключил к пину D2
  • Data к пину D3,
  • а switch к пину D4.
  • Питание к +5 вольт ардуино.
  • Земля к земле

Так как я взял мотор работающий от 12 вольт, то для его управления нужен транзистор. Я использовал MOSFET, так как он намного лучше обычных биполярных транзисторов.
Меня часто спрашивают, зачем использовать два резистора, если и так всё работает.
Рассказываю.
Резистор на 10 ком нужен для того чтобы при отсутствии сигнала на входе транзистора было хоть какое-то напряжение, которое не даст ему ловить разные наводки и переключаться в разное состояние.
Установив этот резистор вы подаёте низкий уровень на вход, а так как сопротивление резистора большое, то при подаче на вход сигнала с Ардуино, оно никак не повлияет на работу.
А резистор на 100 ом нужен для предотвращения Ардуино от перегрузки по току. Он работает как обычный ограничитель тока. В момент открытия транзистора через него может пойти большой ток.
Ставить их или нет решать вам, но я бы советовал всё же их установить.
Это примерный список транзисторов которые можно подключать. Но их список гораздо больше. В основном они работают с приборами до 30 вольт, но есть и для большего напряжения и силы тока.

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

Работа скетча.
Для работы с энкодером надо установить вот эту библиотеку. Установить можно из диспетчера библиотек.
Дальше надо указать к каким контактам платы Ардуино вы будете подключать выводы data и clock. Я подключил их к выводам 3 и 2.
Мотор я подключил к контакту 9, но можно было бы подключить к любому контакту который может работать в режиме ШИМ.
Создаём переменную для хранения текущей позиции и присваиваем ей значение ноль.
Кнопку энкодера подключаем к контакту 4 платы, чтобы все провода были в одной кучке.
Дальше создаём переменные для хранения значений отвечающих за скорость вращения. У меня мотор начинает вращаться со значения 50.
Шестую скорость я установил в 120. Хоть это и является всего половиной от возможной скорости. Можно задать до 255. Остальные значения я просто плавно раскидал между оставшихся шагов.
А ещё я создал переменную для полной остановке мотора, со значением 0.
В переменную newpos будут попадать новые шаги при переключении энкодера.

Читайте также  Как проверить масло в лодочном моторе хонда

В setup ничего нового.
Объявляем скорость работы серийного порта.
9 пин Ардуино объявляем как выход, а 4 pin, к которому подключеня кнопка сделаем входом, да ещё подключим внутреннюю подтяжку. Так, что при не нажатой кнопке, там всегда будет высокий уровень.
Выводим значение начальной позиции энкодера. Она у нас равна нулю.

В loop постоянно проверяем положение энкодера, а здесь получаем позицию и сохраняем в переменную new pos.
Это условие проверки нажатия кнопки энкодера. Если кнопка нажата, то сбрасываем значение энкодера в ноль. Кстати можно эту строчку закомментировать и мотор остановится, но в ноль не сбросится. Получается как бы пауза и при следующих вращениях энкодера, значения будут продолжаться. Ну и небольшой делейчик. Не помешает.

В этом условии мы проверяем было ли изменение в экодере, тоесть было ли вращение. Ели было изменение, то новая позиция не будет равна старой, и условие будет верно и мы проваливаемся внутрь.
Там мы сразу изменим позицию на новую, и теперь пока не крутанёшь ручку, в это условие не попадёшь.

Чуть расскажу про Оператор множественного выбора switch.
Сначала он получает значение из переменной pos и ищет его среди своих кейсов.
Если значение было найдено, то выполняются все команды находящиеся внутри, до оператора break.
После этого происходит выход.
Если значение не было найдено, то выполняется default и выход из оператора.
Кстати в одном кейсе могут находится несколько, и все они будут выполнены.

Если вам нравятся мои видео, то вы можете помочь в развитии канала став его спонсором. Все ваши вклады пойдут на закупки новых модулей. Вам же за это будут предоставлены дополнительные бонусы, и они довольно интересные.
Вы видите ссылки на видео, которые, я думаю будут вам интересны. Перейдя на любое из этих видео вы узнаете что-то новое, а ещё поможете мне. Ведь любой ваш просмотр — это знак YOUTUBE, что это кому-то интересно и что его надо показывать чаще.
Спасибо.
А пока на этом всё.

Энкодер для мотора arduino

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

Различные дешевые четырехколесные платформы хороши для поделок с дистанционным управлением, при создании же автономных роботов они становятся не совсем подходящими. Во-первых, с четырьмя колесами, при движении по относительно неровной поверхности всегда есть вероятность того, что одно из колес может оказаться в воздухе, а следовательно появляется неопределенность в реализации управления с использованием этого колеса. Во-вторых, чтобы управлять с ожидаемым результатом четырехколесной тележкой нужна реализация принципа Аккермана для обеспечения корректного угла поворота рулевых колес при прохождении поворота или кривой. Это именно та схема, которая применяется в обычных автомобилях. Завязнуть в механике у меня особого желания нет, поэтому я решил реализовывать самую простую схему: два колеса с электромоторами и третьим колесом, служащим в качестве опоры для поддержания равновесия. Еще одной причиной для смены шасси явилось отсутствие возможности закрепить уже купленные колесные оптические энкодеры от DFRobot на двигателях, вследствие конструктивной особенности имеющихся моторов. Посмотрев стоимость подходящих двигателей я решил, что выгоднее будет приобрести новое четырехколесное шасси с двигателями, на которые я смог бы закрепить энкодеры. Как впоследствии выяснилось, я опять немного ошибся

Свой выбор я остановил на платформе Smart car chassis 4WD kit, купленной на Aliexpress еще до скачка курса доллара. Полученный комплект выглядел следующим образом:

В комплекте идут:

  • две детали из прозрачного акрилового стекла (PMMA) размером 250x148x3 мм
  • 4 прорезиненных колеса диаметром 65 мм
  • 4 мотор-редуктора
  • 4 диска с прорезями для энкодера (как впоследствии оказалось, энкодер от DFRobot отказался с ними работать, вероятно, из-за меньшего размера отверстий)
  • крепеж

Имеющиеся у меня пара энкодеров, предназначены для платформ DFRobot 3PA и AWD Rovers в составе которых идут вот такие двигатели:

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

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

Такие мотор-редукторы можно купить здесь.

Установленный на мотор-редуктор энкодер с родным диском, имеющим 10 вырезов и припаянными к двигателю проводами выглядит следующим образом:

Разрешение инкрементного оптического энкодера DFRobot составляет 10 отсчетов на оборот, что очень мало и будет привносить достаточно большую погрешность, но, надеюсь, будет достаточным для моих экспериментов. С этим энкодером также не получится определять направление вращения.

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

Принципиальная схема этого осевого датчика вращения с питанием 5В и потребляемым током не превышающим 20 мА приведена ниже.

Этот энкодер можно будет использовать для:

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

Для вычисления пройденного пути необходимо учесть геометрические параметры колеса. В моем случае колесо имеет диаметр D=65 мм,следовательно длина его окружности:

Поэтому, 10 отсчетов энкодера при условии вращения в одном направлении соответствуют перемещению на 204мм.

Простенький скетч, который позволяет используя прерывания, считывать с двух энкодеров скорость вращения колес (в числе отсчетов в секунду) и выводить считанные значения в последовательный порт. Левый энкодер подключен ко 2-му цифровому пину Arduino, правый энкодер — к 3-му цифровому пину.

Используйте Arduino для управления двигателем

Видео: TB6600 , Мощный БП с Китая 600W Станок с чпу 2021, Ноябрь

Используйте Arduino для управления двигателем

Управление двигателем с помощью Arduino относительно простое. В дополнение к простому вращению двигателя вы можете управлять положением вала двигателя, если двигатель имеет поворотный датчик.

Закон Фарадея гласит, что:

Любое изменение магнитной среды катушки провода приведет к «индуцированию» напряжения (э.д.с.) в катушке.

Это объясняет, как генераторы могут создавать напряжение. Это механическая энергия для преобразования электрической энергии. Двигатели работают в обратном порядке от генераторов; они преобразуют электрическую энергию в механическую. В двигателях ток подается в обмотку якоря, что создает магнитное поле, которое взаимодействует с магнитным полем, создаваемым постоянными магнитами в статоре. Взаимодействие между двумя магнитными полями приводит к вращению якоря.

Существует много различных типов двигателей, в том числе:

  • Двигатели постоянного тока (DC) (тот, который я буду использовать в этом учебнике).
  • Электродвигатели переменного тока (переменного тока).
  • Бесщеточные двигатели постоянного тока (BLDC).
  • Бесщеточные двигатели переменного тока (BLAC).
Читайте также  Электрические моторы 220 вольт

Вращающий кодер — это устройство, которое преобразует угловое положение или движение вала или оси в аналоговый или цифровой код. Существует два типа вращательных энкодеров:

  • Инкрементальные энкодеры. Инкрементный роторный датчик выдает импульсы только во время вращения двигателя. Чтобы определить положение вала с помощью инкрементного датчика, вы должны знать начальное положение и использовать внешнюю схему для подсчета количества выходных импульсов.
  • Абсолютные энкодеры. Абсолютный поворотный датчик выдает цифровой код, соответствующий углу поворота. Нет необходимости подсчитывать импульсы, чтобы знать положение вала двигателя. Вам нужно только прочитать цифровой выход энкодера.

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

H-Bridge — это электронная схема, которая позволяет микроконтроллеру, например, Arduino, управлять движением двигателя. Микроконтроллер не может быть подключен непосредственно к двигателю постоянного тока, потому что микроконтроллер не может обеспечить высокий ток, требуемый двигателем. H-мост содержит сильноточные выключатели, необходимые для управления двигателем. Эти переключатели управляются сигналами от Arduino.

H-мост позволяет двигателю перемещаться вперед или назад. Направление определяется последовательностью управляющих сигналов от Arduino.

Скорость двигателя определяется установкой рабочего цикла сигналов управления. Этот тип управления скоростью называется широтно-импульсной модуляцией. Двигатель работает на полной скорости, когда рабочий цикл составляет 100%. Однако, когда рабочий цикл равен 0%, двигатель останавливается и больше не будет двигаться.

Для этого руководства мы разработали и построили H-мост, который использует следующие компоненты:

  • TIP 142 и TIP 147 транзисторы
  • Диоды
  • Зеленые соединители
  • оптопары

Показана упрощенная схема H-Bridge:

Для этого учебника используется сложенный модуль H-bridge. Вы можете найти много схем для H-мостовых схем в Интернете, но если вы не хотите создавать свои собственные, вы можете использовать L298 IC.

Необходимое оборудование

1. Соберите все необходимые детали:

двигатель

Изображение крупным планом, показывающее контакты двигателя

Arduino Mega 2560

6-контактный разъем для двигателя

Зеленый коннектор

аккумулятор

H-мост

Перемычки

3-контактный разъем для H-Bridge

Колесо (опционально)

2. Подключите перемычку к батарее и затем включите H-мост с помощью аккумулятора:

3. Подключите 3-контактный разъем к модулю H-Bridge, затем подключите модуль H-Bridge к Arduino после этого подключения:

  • Arduino 13 -> PWM
  • Arduino 12 -> Вперед
  • Arduino 11 -> Реверс


5. Теперь подключите 6-контактный разъем к двигателю и подключите его, затем подключите двигатель к модулю H-bridge.

Не забудьте подключить штыри питания двигателя к контактам питания H-Bridge. Штыри энкодера двигателя, обозначенные Hall VCC и Hall GND, должны быть подключены к контактам Arduino 5V и GND. Наконец, подключите выходной канал двигателя CHA к контакту Arduino 21. Соединения показаны ниже:

Более пристальное внимание к контактным разъемам Arduino:

6. Теперь подключите Arduino к компьютеру или ноутбуку для программирования:

Код для проверки кодировщика вручную

Код для запуска двигателя до определенного энкодера

Вывод

Кодеры — это устройства, которые могут быть подключены к любому вращающемуся или линейному устройству для отслеживания движения и ориентации устройства. Здесь мы использовали абсолютный поворотный датчик для управления скоростью двигателя и положением вала.

Видео

Попробуйте этот проект сами! Получить спецификацию.

Как работает сервопривод

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

Соберем сервопривод используя подручные компоненты.

В качестве системы управления и контроля будем использовать Arduino Nano, думаю её скорости работы и ресурсов будет достаточно.

В качестве двигателя с энкодером будет использован довольно мощный привод, купленный на AliExpress . Двигатель работает от 24вольт, имеет понижающий червячный редуктор и двунаправленный (позволяющий определять направление вращения) энкодер на датчиках Холла.

В качестве драйвера мотора я вначале использовал L298N, но конечно данный драйвер не мог справится с той нагрузкой, которая на него легла. И пока я ждал посылки с мощными драйверами спалил пару L298N. На фото ниже можно разглядеть результаты пожара.

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

Отличие от L298N в функциях управляющих контактов:

EN – включает драйвер;

DIR – задает направление вращения;

PWM – служит для широтно-импульсного регулирования мощности подаваемой на мотор.

Драйвер позволяет управлять парой мощных коллекторных моторов, может работать с напряжением до 36 вольт и током 16А.

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

Теперь о источнике питания, им будет литий-ионный аккумулятор на 36вольт от гироскутера.

А для питания Arduino и цепей управления я применю связку из понижающего импульсного стабилизатора и линейного 5вольтового стабилизатора. Импульсным стабилизатором снижу напряжение с 36 до 8 вольт, а затем, понижу до 5вольт линейным стабилизатором, заодно уберу колебания, которые как правило присутствуют на выходе импульсных стабилизаторов.


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

Перейдем к схеме

Схема довольно проста, 8 и 9 пин считывают показания с энкодера мотора, 2 пин включает/отключает драйвер, 3 пин управляет направлением вращения, 5 пин регулирует подачу мощности драйвером на мотор посредством широтно-импульсной модуляции сигнала (ШИМ) .

Для управления двигателем я буду использовать ПИД регуляцию, т. е. мне потребуется разобраться с составляющими: что из себя представляет пропорциональное, интегральное и дифференциальное звенья регулятора.

С энкодера мотора можно получить информацию о перемещении в виде подсчета количества срабатываний энкодера. Это будет происходить в фоне по прерыванию один раз в 20 микросекунд. Алгоритм обработки показаний энкодера довольно простой используется предыдущее показание и текущее:

if (encoder_new_L == 3) encoder_L++;

if (encoder_new_L == 0) encoder_L—;

if (encoder_new_L == 2) encoder_L++;

if (encoder_new_L == 1) encoder_L—;

if (encoder_new_L == 0) encoder_L++;

if (encoder_new_L == 3) encoder_L—;

if (encoder_new_L == 1) encoder_L++;

if (encoder_new_L == 2) encoder_L—;

Основной цикл опроса и управления

Один раз в 10 миллисекунд происходит опрос и корректировка работы двигателя

ENC_cel – целевое значение перемещения в тиках энкодера;

ENC_tec — текущее значение положения энкодера.

Otklonenye — отклонение от целевого положения энкодера,

.

Realspeed — реальная скорость в тиках энкодера в секунду ,

,

ENC_OLD – значение энкодера в прошлом опросе;

Dt – время, которое прошло с прошлого опроса.

,

Speed – разница между реальной скоростью и заданной скоростью (с которой нужно двигаться), использование данного параметра в ПИД регуляторе является ключевым и имеет максимальное влияние на результат.

Читайте также  Эндодонтический мотор endo mate dt nsk япония

motor_Speed — заданная скорость мотора, та с которой должно происходить перемещение

,

dSpeed — ускорение с которым изменяется отклонение реальной скорости от заданной, позволяет сгладить толчки.

oldSpeed — разница между реальной скоростью и заданной скоростью рассчитанная в прошлом опросе

,

IntegraSpeed — интеграл по отклонению скорости от заданной на время этого отклонения. Интеграл работает так, что если реальная скорость постоянно меньше/больше чем заданная, значение интеграла растет в сторону этого отклонения. Это значение начинает влиять на общий результат в расчете PWM, что приводит к увеличению/уменьшению мощности отдаваемой на мотор. Интегральная составляющая должна работать на анализе большого колчества итераций, работает по среднему значению за длительный период. Неправильная настройка интегрального звена приводит к низкочастотным колебаниям.

,

PWM_motor — ШИМ, который будет подан на мотор;

oldPWM_motor — ШИМ , поданный на мотор в прошлой итерации (по результатам предыдущего опроса);

Kd — коэффициент пропорциональности по отклонению скорости;

Kdd — коэффициент пропорциональности по ускорению;

Ki — коэффициент пропорциональности по интегральной составляющей.

Как работает ШИМ регулирование

Дополнителная информация по теме энкодеры