Описание работы енкодера Поворотный энкодер имеет фиксированное число позиций на оборот. Эти позиции легко ощущаются руками как небольшие щелчки при повороте оси энкодера. Данный модуль энкодера имеет тридцать таких позиций. Количество таких позиций характеризует чувствительность датчика вращения.
У отдельного датчика имеются три вывода. Они обычно обозначаются как A, B и C. В случае KY-040, они ориентированы так, как показано на рисунке. Внутри энкодера есть два переключателя. Первый переключатель соединяет вывод А с выводом С, а второй соединяет вывод B с выводом C. В каждом фиксированном положении датчика, оба переключателя или открыты или закрыты. Каждый клик означает переключение состояния переключателей следующим образом: Если оба переключателя замкнуты, поворачивая ось по часовой стрелке или против часовой стрелки на одну позицию переведет оба переключателя на размыкание Если оба разомкнуты, поворачивая ось по часовой стрелке или против часовой стрелки на одну позицию переведет оба переключателя в закрытое состояние. На приведенном ниже рисунке показано расположение переключателей.
Как вы можете видеть, угловое положение контакта A и контакта B такое, что: вращающаяся пластинка по часовой стрелке соединит контакты А и С. Вращающаяся пластина против часовой стрелки соединит контакты В и С. Представим на графике переходные характеристики контактов при равномерном вращении пластины.
Определив то, какая пара контактов изменяет свое состояние первой, узнаем направление вращения вала. Если контакт А изменяет состояние первым, то вал вращается в направлении по часовой стрелке. Если же контакт B изменяет свое состояние первым, то вал энкодера вращается в направлении против часовой стрелки.
Выводы KY-040
На следующем рисунке показано назначение выводов данного ротационного энкодера.
Модуль сконструирован таким образом, что низкий логический уровень появляется, когда контакты замкнуты, и высокий, когда контакты разомкнуты. Низкий сигнал генерируется путем замыкания контакта C на общий провод, а так же ноль подается в это время и на выводы CLK и DT, когда переключатель замкнут. Высокий уровень генерируется подачей напряжения питания 5В через подтягивающий резистор. При этом на выходах CLK и DT будут единицы, когда контакты энкодера разомкнуты. Так же у данного енкодера имеется кнопка, расположенная в начале вала, и она является его неотемлемой частью. Если нажать на вал, то нормально открытый контакт кнопки замкнется. Это может быть полезно для программного увеличения или уменьшения чувствительности датчика, а так же для выбора пунктов меню, если использовать енкодер как устройство ввода настроек меню.
Схема ротационного енкодера
Схема рассматриваемого модуля приведена ниже. R2 и R3 на схеме выполняют функцию подтягивающих резисторов.
Схема подключения енкодера KY-040
Успешная реализация енкодера в любом проекте требует четкого понимания всего, что обсуждалось до сих пор. Если вы ещё не поняли работу датчика до конца, вы можете ознакомиться с упрощённой схемой подключения с сигнализацией работы контактов при помощи светодиодов:Очень медленно вращайте вал датчика угла поворота как по часовой стрелке так и против часовой стрелки. И следите за переключением светодиодов реагирующих на вращение вала.
Подключение модуля к Arduino
Тут всё максимально просто. Все, что вам нужно сделать, это подключить четыре провода к модулю.
Пример программы для Arduino
int pinA = 3; // номер вывода, подключенный к CLK енкодера int pinB = 4; // номер вывода контроллера, подключенный к DT енкодера int encoderPosCount = 0; int pinALast; int aVal; boolean bCW; void setup() { pinMode (pinA,INPUT); pinMode (pinB,INPUT); /* Считываем значение на выводе A и запоминаем его как последнее значение на этом выводе */ pinALast = digitalRead(pinA); Serial.begin (9600); } void loop() { aVal = digitalRead(pinA); if (aVal != pinALast){ // проверка на изменение значения на выводе А по сравнению с предыдущим запомненным, что означает, что вал повернулся // а чтобы определить направление вращения, нам понадобится вывод В. if (digitalRead(pinB) != aVal) { // Если вывод A изменился первым — вращение по часовой стрелке encoderPosCount ++; bCW = true; } else {// иначе B изменил свое состояние первым — вращение против часовой стрелки bCW = false; encoderPosCount—; } Serial.print («Вращение: «); if (bCW){ Serial.println («по часовой стрелке»); }else{ Serial.println(«против часовой стрелки»); } Serial.print(«Положение енкодера: «); Serial.println(encoderPosCount); } pinALast = aVal; }
Похожие статьи
Arduino — что это такое? Популярно для начинающих
Arduino это недорогая, доступная в смысле покупки электронная плата с микроконтроллером и выводами входов-выходов. Arduino выпускаются в различных версиях, но поддерживают один и тот же, простой язык программирования. Огромный успех Ардуино, с уважением к другим микроконтроллерам, связан с тем, что аппаратное и программное обеспечение были опубликованы в открытом бесплатном для общего пользования виде: вы можете читать, изучать и даже расширять его возможности как в плане программного обеспечения, так и с точки зрения аппаратных средств. Вся информация об Ардуино доступна под лицензией «Creative Commons Attribution-ShareAlike 3.0 License».
Выбор шагового двигателя
Вам уже приходилось делать выбор между разными шаговыми двигателями для реализации своих амбициозных проектов? Зачастую у новичков существует миф, что NEMA 17 слабые и ни на что не годные шаговики, а для 3D-принтера обязательно нужен как минимум NEMA 23, а то и дороже. Давайте попробуем разобраться какие критерии всё-таки должны учитываться при правильном выборе шагового двигателя. Если на них не обращать внимание, а просто надеяться на свой инстинкт потребителя, то в результате можно сильно разочароваться. К примеру можно купить как бы обычный двигатель NEMA 17 и стандартный драйвер рекомендуемый под него, но получить постоянно перегревающуюся микросхему драйвера и невозможность нормальной работы проекта.
Посмотрим для начала какой выбор нам предоставляют самые доступные поставщики шаговых двигателей.
Arduino и шаговый двигатель
Перед началом очередного проекта на Arduino, было решено использовать шаговый двигатель Nema 17 из-за отличного соотношения цена/качество. Перед подключением Nema 17, за плечами был определенный опыт работы с шаговиком 24byj48 (даташит). Управлялся он и с помощью Arduino, и с помощью Raspberry pi, проблем не возникало. Основная прелесть этого двигателя — цена (около 3 долларов в Китае). Причем, за эту сумму вы приобретаете двигатель с драйвером в комплекте. Согласитесь, такое можно даже и спалить, не особо сожалея о содеянном.
Серводвигатель MG995 и Arduino ,подключение,распиновка + код
Серводвигатель MG995 поставляется с проводом длиной 30 см и 3-мя ‘S’ контактами типа мама. Выходной вал сервопривода поворачивается приблизительно на 120 градусов (60 градусов в каждом направлении). Для управления сервами MG995 можно использовать любые контроллеры с питанием логики 5 В, в том числе и Arduino.
Сервомашинка изготавливается в пластиковом корпусе. На выходе стоит редуктор с металлическими шестернями. В комплекте поставляются пластиковые качалки различных форм-факторов.
Подключение LCD1602 по I2C к Ардуино
Подключение часов реального времени DS1302 к Arduino и дисплея 1602 i2C — часы на ардуино !
Общее описание:
Микросхема DS1302 содержит часы реального времени с календарем и 31 байт статического ОЗУ. Она общается с микропроцессором через простой последовательный интерфейс. Информация о реальном времени и календаре представляется в секундах минутах, часах, дне, дате, месяце и годе. Если текущий месяц содержит менее 31 дня, то микросхема автоматически определит количество дней в месяце с учетом высокосности текущего года. Часы работают или в 24-часовом или 12-часовом формате с индикатором AM/PM (до полудня/ после полудня)
Теги: Подключение к ардуино датчика вращения енкодер KY-040
СОДЕРЖАНИЕ ►
Энкодер Ардуино, а точнее модуль KY-040 очень часто используется в проектах для управления различными устройствами от платы Arduino. В этом обзоре мы рассмотрим схему подключения модуля к микроконтроллеру, а также представим сразу несколько примеров с использованием датчика для включения и управления яркостью светодиодов, вращение сервопривода с помощью энкодера и платы Arduino.
Модуль энкодер Ардуино: схема, распиновка
Энкодер служит для преобразования угла поворота в электрический сигнал. При вращении ручки модуля мы получаем два сигнала (A и B), которые противоположны по фазе. Сигналы A и B зависят друг от друга при вращении энкодера Ардуино по часовой или против часовой стрелки. Для считывания сигнала A и B с энкодера можно использовать, как цифровые, так и аналоговые порты микроконтроллера.
Каждый раз, когда сигнал A переходит от положительного уровня к нулю, мы считываем значение сигнала B (смотри диаграмму выше). Если сигнал B находится в этот момент в положительном состоянии, значит энкодер вращается по часовой стрелке, если B равен нулю, то энкодер вращается против часовой стрелки. Считывая оба выхода при помощи Ардуино, можно определить направление и угол поворота.
Как подключить энкодер к Ардуино
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- модуль энкодер ky-040;
- беспаечная макетная плата;
- светодиоды и резисторы;
- микро сервопривод;
- провода «папа-папа», «папа-мама».
Для работы с энкодером потребуется установить библиотеку RotaryEncoder.h, скачать архив можно здесь. Если у вас возникли трудности с установкой библиотеки для энкодера, то рекомендуем ознакомиться с информацией, как установить библиотеку в Arduino IDE. Для подключения KY-040 к Arduino можно использовать цифровые и аналоговые пины микроконтроллера, в наших примерах используются пины A1-A3.
Скетч. Пример Ардуино энкодер прерывание
Разберем для начала самый простой пример управления энкодером от Ардуино с помощью прерываний, где вся черновая работа по определению положения ручки энкодера выполняется с помощью библиотеки RotaryEncoder.h. Мы лишь выводим данные на монитор порта Arduino IDE. Соберите схему с энкодером, как показано на картинке выше и загрузите в микроконтроллер Arduino следующую программу.
#include"RotaryEncoder.h"// библиотека для энкодера RotaryEncoder encoder(A2, A3); // пины подключение энкодера (DT, CLK)static int pos = 0; // задаем начальное положение энкодераint newPos; voidsetup() { Serial.begin(9600); Serial.println(pos); // выводим на монитор начальное значение } voidloop() { // проверяем положение ручки энкодера encoder.tick(); newPos = encoder.getPosition(); // если положение изменилось - выводим на мониторif (pos != newPos) { Serial.println(newPos); pos = newPos; } }
Пояснения к коду:
- начальное положение ручки равно нулю
static int pos = 0;
и это значение выводится на мониторе порта в процедуре void setup в начале программы; - в примере программы для энкодера нет ограничения по положению рукоятки датчика KY-040, положение может быть положительным и отрицательным.
Скетч. Управление энкодером Ардуино светодиодом
Следующий пример позволит управлять яркостью светодиода с помощью ШИМ сигнала, а также включать и выключать второй светодиод с помощью нажатия кнопки энкодера. Для этого соберите схему, размещенную выше. Обратите внимание, что порт SW энкодера подключен к пину 2 Arduino, а светодиоды к 12 и 11 пину. После сборки схемы загрузите следующий код управления светодиодами на Arduino с энкодером.
#include"RotaryEncoder.h"// библиотека для энкодера RotaryEncoder encoder(A2, A3); // пины подключение энкодера (DT, CLK)// задаем шаг энкодера и макс./мин. значение#define STEPS 5 #define POSMIN 0 #define POSMAX 255 int lastPos, newPos; voidsetup() { pinMode(2, INPUT_PULLUP); // пин подключения кнопки энкодера (SW)pinMode(11, OUTPUT); // пины для подключения светодиодовpinMode(12, OUTPUT); Serial.begin(9600); encoder.setPosition(10 / STEPS); } voidloop() { // проверяем положение ручки энкодера encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } // если положение изменилось - выводим на мониторif (lastPos != newPos) { Serial.println(newPos); lastPos = newPos; } // включаем первый светодиод с установленной яркостьюanalogWrite(11, lastPos); // включаем второй светодиод с помощью нажатия кнопкиif (digitalRead(2)==HIGH) { digitalWrite(12, LOW); } if (digitalRead(2)==LOW) { digitalWrite(12, HIGH); } }
Пояснения к коду:
- для пина 2 используется конфигурация INPUT_PULLUP, так как кнопка энкодера подключена к GND и при ее нажатии на цифровом входе будет сигнал LOW;
- в программе можно изменить максимальное и минимальное значение поворота энкодера, а также шаг вращения ручки датчика ky-040.
Скетч. Управление серво мотором от энкодера
Следующий скетч демонстрирует подключение серво с энкодером. Логический провод микросерво (желтый или оранжевый цвет) подключается к ШИМ порту 11 микроконтроллера. В программе задается угол поворота серво с помощью поворота ручки модуля ky-040. Работа программы похожа на управление потенциометром серво, но в случае с энкодером, можно задавать максимально точный угол поворота.
#include"RotaryEncoder.h"// библиотека для энкодера RotaryEncoder encoder(A2, A3); // пины подключение энкодера (DT, CLK)#include<Servo.h> // библиотека для сервоприводаServo servo; // задаем шаг энкодера, макс./мин. значение поворота#define STEPS 10 #define POSMIN 0 #define POSMAX 180 int lastPos, newPos; voidsetup() { servo.attach(11); // пин для подключения сервоSerial.begin(9600); encoder.setPosition(10 / STEPS); } voidloop() { // проверяем положение ручки энкодера encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } // если положение изменилось - выводим на мониторif (lastPos != newPos) { Serial.println(newPos); lastPos = newPos; } // устанавливаем угол поворота микросерво servo.write(lastPos); }
Пояснения к коду:
- шаг поворота качалки серво Ардуино составляет 10 градусов. Шаг поворота и максимальный угол поворота можно изменить в программе.
Заключение. Мы рассмотрели несколько вариантов подключения модуля энкодера к Arduino: пример с прерыванием и управлением светодиодом, пример с управлением мотором серво. Также модуль можно использовать для управления меню на дисплее 1602 LCD Ардуино. Мы использовали библиотеку RotaryEncoder.h, но есть еще несколько библиотек энкодера для Ардуино, которые в одном обзоре не уместить.
- Цена: $0.50
Часть первая: Лирическая. Отвечает на вопрос «ЗАЧЕМ?» В этом году яблок у меня будет дону очень много! Да и остальное плодово-ягодное уродилось на даче неплохо. И, если раньше мне прекрасно хватало урожая для удовлетворения годовой потребности в чаче, граппе, кальвадосе и в остальных источниках витаминов и хорошего настроения, то в этом году на яблонях просто северный зверь, как много яблок. А столько бочек для замачивания этого добра у меня нет, да и, пожалуй, здоровья потом не хватит. В общем, решил я начать сушить. Первым делом заказал я себе сушилку довольно внушительного, для непромышленного производства конечно, объема на 5 лотков с теном на полкиловатта. Сушилка пока едет, но, у нее, помимо таких достоинств как простота, регулируемая мощность и обилие хороших отзывов есть одно слабое место. Как и у большинства подобных аппаратов у нее нет таймера обратного отсчета или, по-народному, реле времени. А эта штука для сушилки ну весьма нужная. Посудите сами: при разных режимах сушки и разных продуктах время сушки может доходить до 2-х суток! Т.е. процесс сушки может закончиться в самое неожиданное время – ночью, например, или, когда мы на работе. Кто выключать будет? Простой выход есть – купить реле времени в виде розетки с возможностью программирования времени коммутации. Но не все так просто. Я живу в небольшом городке и всяких Икей, Ашанов и прочих Мерлин Монро у нас нет в принципе, а есть только армяне, активно торгующие только самыми ходовыми товарами типа лампочки Ильича. Значит – заказ с Али или Ебея. Но урожай-то – вот он, а где Китай и наша быстрая почта? Вот то-то и оно… Перелом стопы, штука конечно не очень. Гипс, очереди к врачу, ходишь как зомби из С.Т.А.Л.К.Е.Р.- а. А с другой стороны – не надо полтора месяца ходить на работу, ничего не болит, полные холодильники пива от любящей жены, ящик волжской воблы (посылка от мамы) и, опять же, чемпионат мира по футболу… В общем, плюсы свои есть, и, главное – времени свободного уйма. Да и загашники им. Плюшкина наполнились за столько лет шопинга в Китай-магазинах не слабо. Вот, вроде все сложилось, чтобы самому попробовать сделать реле времени для сушилки и далее я расскажу о результате и покажу его. Часть вторая: Практическая. Отвечает на вопрос «КАК?» Для начала я определился с задачами. Реле должно обладать возможностью задавать независимо часы и минуты, отображать остаток времени в процессе работы, коммутировать ток, достаточный для сушилки, выдавать сигнал по окончании работы, быть по возможности, компактным, удобным и, разумеется, недорогим по бюджету. Поскольку я часто в последнее время работаю с ардуино, то выбор платформы для меня был очевиден -Arduino Pro Mini в самом дешевом варианте на чипе Atmega 168, с рыночной стоимостью в районе $1.5. Мне-же эти ардуинки в свое время вообще обошлись в полцены, поскольку хитрый прод горсть заказанных 328-х обильно разбавил 168-ми и, пойманный за руку, не торгуясь, вернул половину суммы. В качестве устройства отображения отлично подошел дисплейчик на TM1637 с высотой цифр 0.36”, найденный в запасах и продающийся сейчас на ебее центов по 80. Данный дисплей изначально заточен на отображение времени, поэтому для моей цели вписался прекрасно. Для силовой коммутации я применил самое популярное одноканальное реле SDR-05VDC-SL-C, предлагаемое на ebee по полбакса за штуку. Но тут у меня сначала возникли сомнения – потянет ли? Хотя на нем и написано: 10A 250VAC, что-то я засомневался в способности этой малютки держать не то, что 2.5, а даже нужные мне полкиловатта. Пришлось обратиться к гуру электроники и наш уважаемый Ksiman развеял мои сомнения, поручившись за эту релюху. В качестве устройства для подачи сигнала по истечении заданного времени я использовал пьезопищалку, кои ныне продаются дешевле бакса за пяток. Громкость сигнала у нее примерно, как у сигнала микроволновки, впрочем, думаю, там примерно такие и стоят. В качестве питания для ардуины, как ни странно, подошел маленький и исключительно поганый БП 220VAC-5VDC, купленный еще во времена оные за компактность и валяющийся без дела по причине нежелания ардуино-девайсов работать с таким мерзким питанием. Однако, к моему удивлению, с моим текущим набором компонент эта гадость подружилась отлично. Наконец я и подошел к самому интересному – устройству ввода. Как осуществлять ввод быстро, безошибочно, с максимальным комфортом, не городя при этом многокнопочных панелей? И вот тут своего звездного часа дождался наконец энкодер KY-040, о существовании которого я когда-то узнал тут-же на муське, тогда-же его заказал и у меня давно чесались руки познакомиться с этим девайсом поближе.
- http://www.electronica52.in.ua/proekty-arduino/podkluchenie-k-arduino-datchika-vracsheniya-enkoder-ky040
- https://xn--18-6kcdusowgbt1a4b.xn--p1ai/%d1%8d%d0%bd%d0%ba%d0%be%d0%b4%d0%b5%d1%80-%d0%b0%d1%80%d0%b4%d1%83%d0%b8%d0%bd%d0%be/
- https://mysku.me/blog/aliexpress/64757.html