Энкодер из шагового двигателя схема
Взаимозаменяем потенциометр, джойстик и энкодер в схемах на Arduino (Часть I)
У каждого из этих устройств есть свои особенности, которые определяют практичность их применения в определенных проектах. Но иногда возникают ситуации, когда под рукой нет энкодера, а крутить и шевелить чем-то нужно. И тогда, пошевелив собственными извилинами, можно прийти к решению заменить одно другим для экономии времени и денег.
Приветствую всех поклонников и поклонниц Arduino на сайте магазина Amperkot.ru. С этой статьи я начинаю интересную тему “Взаимозамена потенциометра, джойстика и энкодера в различных проектах”. Этот большой и структурированный объем материала будет полезен начинающим и более продвинутым пользователям.
На примере простых проектов будет разобрано и изучено много полезного материала, но самое главное, что после прочтения всего цикла, 95% из Вас будут знать намного больше, чем ранее. Ваш покорный слуга будет намеренно моделировать проблемы (которые могут встретиться и в реальной жизни), чтобы подтянуть гибкость и остроту мышления читателя в теме Arduino!
В этом цикле статей Вас будут ждать:
— Интуитивно понятное объяснение основ написания скетчей для Arduino;
— Разбор схем подключения;
— Поиск интересных и самых разнообразных способов решения проблем в проектах на аппаратном, программном и “колхозном” уровнях.
Введение
Итак, потенциометр, джойстик и энкодер. Всё на первый взгляд просто.
У каждого из этих устройств есть свои особенности, которые определяют практичность их применения в определенных проектах. Но иногда возникают ситуации, когда под рукой нет энкодера, а крутить и шевелить чем-то нужно. И тогда, пошевелив собственными извилинами, можно прийти к решению заменить одно другим для экономии времени и денег.
В этом цикле статье основной уклон идет на получение навыков работы со всеми тремя модулями сразу в проектах на Arduino и её аналогов на случай банального отсутствия необходимого компонента. Именно по этой причине сильно углубляться в электротехнику, а также описывать подробно принцип работы с физической точки зрения не считаю нужным.
Я рассмотрю несколько несложных схем (управление яркостью светодиода, изменение мощности двигателя, навигация по меню LCD дисплея) и подробно объясню, как пишется код во всех случаях. В некоторых случаях мы неизбежно будем сталкиваться с трудностями, которые только сильнее приблизят нас к истине и пониманию некоторых тем!
А теперь кратко о трех наших героях!
Немного теории
Потенциометр — он же переменный резистор, он же “какая-то крутилка с ручкой”, предлагает нам пропорционально изменять сопротивление внутри устройства в зависимости от положения ручки. На его выходе получаем напряжение (в зависимости от подключения контактов питания, в крайних положениях ручки, получаем значения 0 и 5 вольт, так как плата Arduino выдает максимальное напряжение 5 вольт) которое с помощью Ардуино преобразуется в цифровые значения от 0 до 1023. Оперируя ими, можно влиять на параметры различных устройств.
Энкодер — это уже крутилка с ручкой и кнопкой, но важным изменением в практическом смысле является то, что у потенциометра диапазон вращения ручки ограничен минимальным и максимальным значениями, а у энкодера ручка вращается безостановочно все стороны. В теоретическом плане тоже есть отличие — при изменении угла поворота ручки энкодера меняются значения двух сигналов, генерируемых устройством на выходах DT и CLC. Они сообщают контроллеру о направлении и скорости вращения ручки.
Джойстик — устройство для ввода данных по двум осям: OX и OY, а также с помощью встроенной кнопки. В состоянии покоя напряжение на этих контактах равняется 2,5 вольтам, а с помощью перемещению стика изменяется в диапазоне от 0 до 5 вольт. Основное отличие джойстика от энкодера и потенциометра — выходные значения не сохраняются, так как стик не фиксируется и всегда возвращается в исходное положение
Подготовимся заранее
Прежде, чем начать практическим путем получать полезные навыки, подготовим компоненты, которые нам понадобятся. Купить их Вы можете на сайте интернет-магазина Amperkot.ru по вполне себе демократичным ценам!
Да и говоря в целом — покупать в некоторых российских магазинах бывает выгоднее, чем в Китае, так как Вы в течение быстрого времени получаете нужные компоненты, экономите время, (а значит деньги тоже), а также можете рассчитывать на быструю поддержку технического специалиста и гарантию на купленный товар.
А если Вы живете в одной из двух столиц России: Санкт-Петербурге или Москве, то сможете получить необходимое в течение дня (самовывоз). Очень даже удобно!
Вот список компонентов, которые нам понадобятся в этих уроках:
А теперь к практике
Наша с Вами задача — научиться находить нестандартные выходы из любых проблем и не опускать руки, поэтому смоделируем эти самые ситуации и поработаем с кодом!
Пример 1.1: Регулировка яркости светодиода потенциометром
Практичнее всего в данном случае использовать потенциометр. Для начала подключим все по схеме:
Обратите внимание, что в схеме не используется подтягивающий резистор. Такие резисторы (чаще всего номиналом от 10 до 30 кОм) используются для уменьшения помех в данных, передаваемых через аналоговый сигнал. Но многие забывают, что в плату Arduino уже встроены такие резисторы на каждый контакт. В данной же ситуации использовать его нет смысла, так текущая задача не требуется высокой точности значений. Но в следующих частях этого большого ликбеза эта тема обязательно будет освещена!
Настало время написать код. В следующих нескольких абзацах я позволю себе написать небольшое руководство по структуре написания кода на Arduino, чтобы начинающие не чувствовали себя некомфортно:) Все, кто уже обладают этими базовыми навыками, — можете пропустить этот текст, либо постараться почерпнуть для себя что-нибудь новое.
Для начала посчитаем, сколько устройств ввода и вывода информации мы используем в нашей схеме: их два — переменный резистор и светодиод. Теперь обозначим их в коде.
Сделаем это с помощью констант (ячейки памяти в контроллере). Используя директиву #define, мы создаем ячейку памяти, в которой будет храниться значение пина платформы Arduino, которому соответствует подключенное устройство.
Чтобы понимать, где будет храниться информация, и легко к ней обращаться в будущем, назовем каждую из констант удобными словами (led, pot), а после оператора присваивания (‘=’) записываем данные, которые будем хранить в конкретной ячейке. В нашем случае, это номера пинов платы Arduino, к которым подключаются наши устройства. Выглядит это так:
Далее в коде идут две обязательные функции — void setup() и void loop(). В первой пишется то, что контроллер обработает только один раз (сразу после подачи питания), а во второй прописываются уже конкретные действия, которые мы хотим выполнять с нашими устройствами на протяжении всей работы кода. Код обрабатывается сверху вниз, однако после выполнения последней команды в void loop() контроллер возвращается в начало функции void loop() и продолжает выполнять те же самые действия в том же самом порядке. Так и проявляется цикличность. Не зря loop переводится с английского, как “петля”.
Ранее мы выяснили, что в нашей схеме будет два устройства. Им мы дали имена при помощи констант. Теперь определимся с тем, что они должны будут выполнять. Поставим задачу — пропорциональное изменение яркости светодиода при вращении ручки потенциометра.
Теперь классифицируем устройства по их назначению: устройства ввода и вывода данных (относительно платы Arduino конечно же). Когда мы крутим ручку потенциометра, то мы лично изменяем значения на его сигнальном контакте, которые затем считываются на аналоговом пине и обрабатываются контроллером. Это те данные, которые поступают/вводятся в контроллер, а значит и потенциометр будет устройством ввода данных.
После кручения ручки контроллер должен посылать сигнал уже на светодиод, чтобы тот светился с определенной яркостью. Эти данные выводятся из контроллера. А значит светодиод — устройство вывода данных.
Оперируя этими данными, запишем назначение этих устройств в функции void setup (контроллеру достаточно один раз понять, с какими типами устройств он имеет дело, чтобы продолжить работу с ними). Делается это с помощью функции pinMode (номер пина с подключенным устройством, режим работы для данного пина). Для устройств ввода данных — INPUT, а для устройств вывода данных — OUTPUT.
В функции void loop() прописываем цикличные действия: считывание данных с контакта потенциометра, регулировка яркости светодиода.
Работу с контактами на плате Arduino можно преобразовать для лучшего понимания в такую простую схему:
Имеются два типа контактов: цифровые (могут выдавать только два значения: 1 и 0, как реле или выключатель) и аналоговые (диапазон значений от 0 до 1023). Есть еще ШИМ контакты (это некоторые цифровые контакты, но со встроенным аналого-цифровым преобразователем, обозначаются на плате вот таким значком
): они могут работать в обоих режимах. Все зависит от того, как Вы это пропишете в коде.
Далее самые распространенные функции ввода (чтения) и вывода (написания команды) данных — Write и Read. Запомнить их очень просто: если мы хотим считать данные с пина контроллера, то иначе говоря, хотим прочесть их (как с открытой книги), а значит пишем после типа контакта (digital или analog) слово Read (с английского языка “читать”). В случае вывода данных можно представить, что мы прописываем команду нашему устройству сделать то или иное действие (в нашем случае — команда светодиоду включиться). Писать с английского языка “write”.
Так и получаются эти функции путем объединения двух различных слов: digitalWrite, digitalread, analogWrite, analogRead.
Для функций с чтением данных прописываем в скобках только один параметр (номер пина, с которого происходит считывание): analogRead (pot).
Для функций с выводом данных прописываем в скобках два параметра: номер пина и значение сигнала. Таким образом яркость светодиода будет настраиваться функцией analogWrite (номер пина, к которому подключен светодиод, логическое значение). Не забывайте, что для цифровых пинов допустимо на месте второго параметра писать значения 1 или HIGH (высокий логический уровень) и 0 или LOW (низкий логический уровень), а для аналоговых или цифровых с поддержкой ШИМ число от 0 до 255 (на выводе Arduino может генерировать только такой диапазон значений).
Для текущей задачи, очевидно, удобнее использовать аналоговый контакт для получения данных с сигнального контакта потенциометра. Эти данные нужно как-то посчитать. Используем функцию analogRead (pot).
Чтобы эти данные было удобнее использовать в процессе работы кода, их нужно сохранить в новую ячейку памяти — переменную. Она создается также, как и константа, только вместо #define пишется тип переменной (который определяет ее размер). Какие бывают типы переменных можно посмотреть в любой табличке в Яндекс Картинках. Нам будет достаточно целочисленного типа int. Создадим переменную с названием val (от английского value — «значение») и присвоим ей значения с вывода потенциометра. Теперь у нас появилась ячейка, в которой будут храниться эти данные. В любой момент мы можем обратиться к ней, чтобы выполнить с данными какие-либо действия.
Так как на выходе Arduino может генерировать значения от 0 до 255, то нужно пропорционально уменьшить значения с потенциометра: уменьшить их в четыре раза. Полученный результат сохраним в новую целочисленную переменную «brightness». А затем значения из этой переменной выставим в качестве второго параметра в функции analogWrite (led, brightness) — теперь на пин, которому мы дали название led, подается напряжение от 0 до 5 вольт, которое пропорционально значения с потенциометра. Задача выполнена!
Пример 1.2: Регулировка яркости светодиода джойстиком
С потенциометром никаких проблем не возникло, поскольку это самое практичное решение для подобной ситуации. Но как быть, если под рукой у Вас, скажем, джойстик? Этот модуль более функционален, поскольку имеет встроенную кнопку, а также возможность управления по двум осям (по сути это два потенциометра, расположенных перпендикулярно друг к другу).
Будем считывать значения с джойстика по оси OX, а затем при помощи функции map() преобразуем их в значения для яркости светодиода в качестве параметра функции analogWrite(). Джойстик подключим без использования обвязки, так как в случае с джойстиком помехи в данных будут меньше, а в случае со светодиодом они роли не играют. Но Вы должны помнить об этом на будущее. Контакты с плавным напряжением подключим через резисторы. Схема подключения представлена на картинке ниже:
По такой же логике, как и в примере 1.1 напишем код. Получаем то, что на картинке ниже:
Здесь у нас также 2 устройства, но джойстик в отличие от потенциометра позволяет считывать значения с трех разных контактов (по оси OX, по оси OY и со встроенной кнопки), поэтому введем 4 константы. В остальном — всё то же самое.
Если Вы искренне хотите научиться писать скетчи для Arduino и лучше понимать их, то советую писать код вручную, без копипаста. В этом случае у Вас сильнее активизируются моторная и зрительная типы памяти, что поможет лучше запомнить функции, структуру кода и многое другое.
После загрузки кода получаем возможность менять значения яркости светодиода с помощью джойстика. Все работает, но есть нюанс. Я с его разбора начну следующую часть статьи, а Вам предлагаю подумать над этим, или попробовать повторить этот проект в домашних условиях и самостоятельно найти недостатки практическим методом.
Заключение первой части
На этом первую часть можно считать завершенной! Вы можете оставлять свои вопросы в комментариях к этой статье. По возможности буду на них отвечать. Но не забывайте о правилах грамотности и адекватности! Всем желаю успехов и удачной компиляции!
Подключение энкодера KY-040 к Arduino
Автор: Сергей · Опубликовано 01.05.2021 · Обновлено 30.04.2021
Модуль энкодера KY-040 — это тип датчика, который преобразует угловое вращение ручки в цифровой сигнал. Благодаря своей надежности и точному управлению, энкодер используются во многих устройствах, таких как в робототехнике, станках с ЧПУ и принтерах.
Технические параметры
► Тип: механический, инкрементальный;
► Наличие кнопки: да;
► Поворот на: 360° в обе стороны;
► Напряжение питания: 4,5 – 5,5 В;
► Габариты: 26,2 х 18,7 х 29 мм;
► Вес: 7 г.
Обзор энкодера KY-040
Каждый энкодер имеет фиксированное количество циклов переключений на оборот, у KY-040 это число 30. Давайте рассмотрим принцип работы, внутри энкодера находится медный диск с отверстиями соединенный с общей землей, назовем этот вывод «С» (чем больше отверстия тем, точнее энкодер). Так же, есть два вывода, назовем их «А» и «B«, с которых мы снимает сигнал, так-же эти выводы подтянуты к 5 В с помощью резисторов на 10 кОм. Если контакты «А» и «В» не касаются вывода диска «С» на их выходе будет 5 В. Когда мы начнем вращать энкодер по часовой стрелке, вывод «А» коснется диска и на выходе получим «0 В», если продолжить вращать энкодер вывод «B» так же коснется диска и на выходе будет «0 В».
То есть, когда вы поворачиваете ручку по часовой стрелке, сначала подключается вывод А, а затем вывод В. Когда вы поворачиваете ручку против часовой стрелки, сначала подключается вывод B, а затем штифт A. Отслеживая, когда каждый вывод соединяется с землей и отсоединяется от нее, можно понять в каком направлении вращается ручка.
Назначение контактов:
► GND — заземляющее соединение;
► VCC (+) — напряжение питания;
► SW — вывод кнопки, когда кнопка нажата, напряжение «0 В»$
► DT (Выход B) — выход DT;
► CLK (выход А) — выход CLK.
Подключение модуля энкодера KY-040 к Arduino
Необходимые детали:
► Arduino UNO x 1 шт.
► Модуль энкодера, KY-040 x 1 шт.
► Провода DuPont M-F, 20 см x 1 шт.
Подключение:
Подключение энкодера KY-040 к Arduino не сложное. Подключим сначала вывод +V к 5V на Arduino и вывод GND к GND. Теперь соединим CLK, DT, SW с цифровыми контактами 2, 3 и 4 к Arduino. Для удобства приведу схему подключения.
Программа:
Теперь запускаем среду разработку Arduino IDE и загружаем скетч в контроллер. Программа определяет, в каком направление вращается энкодер и нажимается ли кнопка.
Разработка программы в Tia Portal
После этого небольшого вступления перейдем к нашей непосредственной задаче. А именно подключении абсолютного энкодера Leine Linde к контроллеру Siemens S7 300 по протоколу Profibus DP.
Для нашей задачи нам потребуется скачать конфигурационный файл GSD (General Station Data – общее описание станции), можно сказать драйвер, содержащий спецификацию устройства — идентификатор устройства, конфигурационную информацию, регулируемые параметры, тип данных и допустимые предельные значения. Благодаря GSD файлу отпадает необходимость в ручном вводе данных, осуществляется автоматическая проверка ошибок и целостности данных. Скачать GSD файл можно на официальном сайте производителя конкретного оборудования.
Далее необходимо импортировать наш GSD файл в среду разработки Tia Portal. Для этого выбираем в меню Options пункт Manage general station description files (GSD).
Указываем путь к нашему файлу на жестком диске и после завершения установки наш энкодер добавится в каталоге оборудования.
Добавляем энкодер в проект. Из раздела Devices & networks переходим на вкладку Network view и производим соединение контроллера и энкодера по шине Profibus. В данном случае к контроллеру 314С-2 подключены по Profibus два энкодера Leine Linde и HMI панель KTP700 Basic, а по Profinet еще один контроллер Siemens 317F-2.
Для настройки обмена данными между ПЛК и энкодером задействуем стандартную телеграмму Telegram 81. Выберем ее в разделе Device view .
Телеграмма 81 включает в себя следующую структуру данных:
Слева — это данные, передаваемые с ПЛК в энкодер.
- STW2_ENC — слово управления 2 используется для контроля правильной синхронизации процессов контроллера с процессами в энкодере.
- G1_STW — слово управления 1 основными функциями энкодера, такими как установка абсолютного положения, парковка, подтверждение ошибки.
Справа — данные, принимаемые ПЛК с энкодера.
- ZSW2_ENC — слово состояния 2, эквивалентно STW2_ENC.
- G1_ZSW — слово состояния 1 основными функциями энкодера, эквивалентно G1_STW.
- G1_XIST1 — фактическое значение положения 1
- G1_XIST2 — фактическое значение положения 2. В случае возникновения какой-либо ошибки, отображает код ошибки.
Далее на вкладке Device-specific parameters задаем необходимые значения параметров энкодера, после чего сохраним и скомпилируем наш проект.
Загружаем проект в контроллер PLC — Download to Device .
Переходим непосредственно к программной части. Нам понадобится два блока, один из которых будет отвечать за обработку данных энкодера, а второй за управление энкодерами.
Создадим новую функцию и задаем ей имя Profibus_DP_Leine.
Функция Profibus_DP_Leine готова.
Данную функцию будем вызывать в функциональном блоке. Создаем новый блок Encoder_Leine&Linde, который отвечает непосредственно за управление энкодерами.
Network 1: Энкодер 1 BQ1
Network 2: Энкодер 2 BQ2
Теперь в организационном блоке OB1 можно вызывать этот ФБ.
ФБ Encoder_Leine&Linde — Скачать
ФБ Profibus_DP_Leine — Скачать
Подключение
В простейшем случае, если позволяет ситуация, выход энкодера можно подключить ко входу счетчика и запрограммировать его на измерение скорости.
Но, как правило, энкодер используется совместно с контроллером. К контроллеру подключаются все необходимые выходы, и его программа рассчитывает скорость, ускорение, положение объекта с необходимыми коэффициентами и размерностями.
Например, энкодер установлен на валу электродвигателя, который перемещает одну деталь по направлению к другой. Путем вычислений на экране оператора отображается зазор между деталями, а при достижении некоторого минимального зазора движение деталей прекращается, чтобы избежать их повреждения.
Также преобразователи угловых перемещений нередко используются в качестве элемента обратной связи на валу двигателя, подключенного через частотный преобразователь. В этом случае энкодер устанавливается на валу двигателя или редуктора, и подключается к частотнику через специальную плату сопряжения. Таким образом, появляется возможность точного позиционирования поддержания нужной скорости и момента двигателя.