Connect the encoder from the mouse to Arduino
Vložit
- čas přidán 15. 09. 2017
- The encoder from the mouse has a roller, which makes it very convenient to use in various projects. Connect it to arduino very easy!
Sketch and schema: drive.google.com/open?id=0Bw5...
Friends, support the channel!
The WS2812B LEDs have become very popular because of their ease of use and connection. You can control a huge tape with just 1 pin. At the same time, you can not only transmit various colors and shades, but also build entire images! An important point is adequate nutrition. The choice of power supply must be approached very seriously, otherwise you may get malfunctions.
Libraries and sketch test: drive.google.com/open?id=0Bw5...
Friends, support the channel!
Z422687519909
U139735106020
5168 7422 2228 7801 Privat Bank (Ukraine)
Useful links:
Tape WS2812B: ali.pub/1x8oim
WS2812B matrix of different sizes: ali.pub/1x8olx
Powerful WS2812B: ali.pub/1x8oon
5V 3A Power Supply: ali.pub/1x8pcy
Powerful PSU 5V 3A: ali.pub/1x8pfv
TFT Displays: ali.pub/1ny2rc
Arduino Mega 2560: ali.pub/1ny34r
The cheapest Arduino Pro Mini for crafts: ali.pub/1ny2z4
Layout: ali.pub/1ny3ae
Jumpers: ali.pub/1ny3la
Quality jumpers: ali.pub/1ny3j5
The most convenient cashback:
LetyShops: goo.gl/Ev5XgI
The most profitable cashback on aliexpress:
Ecomerce: goo.gl/3dDc2w
Useful links:
Touch button with backlight: ali.pub/1tuuns
Micro SD Module: ali.pub/1tkx36
Arduino Mega 2560: ali.pub/1ny34r
Cheapest Arduino Pro Mini for crafts: ali.pub/1ny2z4
Breadbord: ali.pub/1ny3ae
Lintels: ali.pub/1ny3la
Quality crosspieces: ali.pub/1ny3j5
The most convenient cash back:
LetyShops: goo.gl/Ev5XgI
The most profitable cash back on aliexpress:
Ecomerce: goo.gl/3dDc2w - Věda a technologie
поддерживаю подход с прерываниями. Испытано: точность срабатывания намного выше и нет пропусков тактов!
Добрый день. А можете привести код для примера? Если вас не затруднит, конечно. У меня не получилось нормально настроить прерывания. Было бы не плохо посмотреть как это реализовано у других.
Да, конечно, я в своих проектах использую библиотеку RotaryEncoder, разработанную немецким товарищем, работает отлично: github.com/mathertel/RotaryEncoder . В библиотеке есть примеры, в частности - InterruptRotator.ino. Единственная сложность, которая может встретиться, это корректно настроить прерывания. Библиотека использует Pin Change Interrupt для любого порта. Необходимо знание процессора и регистров. В примере используются порты А2, А3, но можно настроить для любого порта. Могу помочь с кодом, ежели чего...
Спасибо! Как появится минутка, почитаю.
Рекомендую, компактная и надежная библиотека... в свое время долго выбирал, пробовал различные варианты и библиотеки, но эта библиотека по моему мнению - лучшая из того, что я пробовал... У этого разработчика есть еще одна классная библиотека для работы с кнопками, отрабатывает кроме всего прочего длинное нажатие и двойной клик. Тоже рекомендую: OneButton :-)
спасибо большое!
) мда, реально улыбнуло) Я тоже в своё время на эти грабли наступил), покане наткнулся на вопрос с прерываниями. Такой код жесть какой тяжелый и не стабильно работающий.
Полезно! вдруг займусь))
круто!сделаю себе такую же схему.
Успехов вам!
Я бы с удовольствием глянул как сделать энкодер на основе оптического сенсора от мыши (не колесика, а того, что отслеживает перемещение). Пишут, что можно добиться высокой точности и большого числа шагов.
на оптическом только 1 сигнальный провод
Спасибо!
Энкодер - он и в Африке энкодер и в компе он показывает каждый шаг. Другое дело, что заюзан потрёпанный энкодер с сильным дребезгом и чел по неопытности не знает как с этим бороться. Приведённый код в скетче работоспособный, но не верный. Для мышей пойдёт, но для "дрожащего" энкодера на двигателе не катит. И даже в этом скетче проверка милсов сравнением с суммой неверно, ибо милс тоже длится, а когда его стал проц читать в начале или конце не угадаешь. Более верным будет такой код:
const int pin_A = 9;
const int pin_B = 10;
byte EncoderA;
byte EncoderB;
byte PrevEncoderA=0;
unsigned long LoopTime;
int EncoderPos = 0;
void setup() {
pinMode(pin_A, INPUT_PULLUP);
pinMode(pin_B, INPUT_PULLUP);
LoopTime = millis();
}
void loop() {
if(millis() >= (LoopTime)){
EncoderA = digitalRead(pin_A);
EncoderB = digitalRead(pin_B);
if((!EncoderA) && (PrevEncoderA)){
if(EncoderB) {
EncoderPos--;
} else {
EncoderPos++;
};
Serial.println(EncoderPos);
};
PrevEncoderA = EncoderA;
LoopTime = millis()+2;
};
}
Вы пробовали этот код на энкодере от мышки? Вы полностью повторили код из видео, только немного в другом виде. Дело не в потрепанности а в том что Энкодеры от мышки сделаны так что ОБА выхода ВСЕГДА находятся в одинаковом положении. Разница между ними есть только в переходной момент между одним состоянием и другим. Подобным образом (как в скетче) этот переходной момент отследить невозможно. Что бы его отследить нужно выходы энкодера вешать на прерывания. Только тогда можно сделать реакцию на каждое движение энкодера от мышки.
только что проверил- не работает!
Как раз на прерывания их вешать не нужно. Так вы точно ничего не отследите. Функция для работы с энкодером в бесконечном цикле, и кнопка, работающая по прерываю для выхода из этого цикла. например для изменений каких либо значений в меню. А уж если нужны прерывания от энкодера, тогда ставят отдельный контроллер для работы с энкодером (энкодерами), который выдает на два выхода сигналы. Первый об изменении состояния, для вызова прерывания и второй о направлении изменения.
Он даже схему нормальную не может составить из нескольких элементов. Сопротивления фильтров не туда поставил, ещё учить кого то лезит!
А шо там с стм?
состояние пинов при вращении в определенную сторону такое 00, 01, 11, 00, 01, 11, 00..и т.д. Можно заметить что в некоторых случаях между 00 и 11, пробегает 01, и собственно относительно этого состояния можно считать каждый шаг и направление
Для тех, у кого так же if (wA == 1 && wB == 1 && a1 == 0 && b1 == 0 || wA == 0 && wB == 0 && a1 == 1 && b1 == 0 || wA == 1 && wB == 0 && a1 == 1 && b1 == 1) - колесо в одну сторону, else в другую где wA и wB новые значение, a1 и b1 старые
Спасибо.
Возможно на дорогих мышках более продвинутый энкодер стоит? Тем более что стоимость бывает разной на порядок.
Обычно используются два типа энкодеров: оптические и механические. Оптические еще сложнее применить.
Попробовал, схема рабочая (вместо резисторов и конденсаторов использовал внутренние подтягивающие резисторы ардуины). Но не совсем понятно, как энкодер определяет в какую сторону его вращают. Ведь (если я правильно понимаю) при каждом щелчке энкодера, оба контакта одновременно замыкаются, а при следующем, одновременно размыкаются. Поясните пожалуйста этот момент.
Контакты энкодера замыкаются/размыкаются не одновременно, а последовательно. Если вращать в одну сторону, то сначала срабатывает 1-й контакт, потом 2-й. Если вращать в противоположную сторону то сначала срабатывает 2-й, потом 1-й. Именно эта последовательность в срабатывании и определяет направление вращения энкодера
Муха прилетела и пощикотала. Такая милая! 5:26
спасибо
На клавиатуре регулятор громкости с подобным энкодером как у мышки. Начал подглючивать, заказал TTC с али, а он регулирует через отсечку с шагом в 4 единицы громкости, вместо 2 как в оригинале. Подскажите, какой нужен правильный энкодер? Как на алике различить "модные" TTC, ALPS, KAILH, NONAME, чтобы они срабатывали каждый шаг?
Они просто немного по-разному сделаны, программно обрабатываются по-разному и из-за этого не взаимозаменяемы. Увы, не могу подсказать какой вам нужен.
можете пояснить про фильтры(2 конденсатора и резистора) почему именно такие значения и как понять какие в данной работе частоты помех надо срезать?
Конденсатор выполняет функцию плавного изменения состояния пина. Так как заряд на нем удерживается то это полностью (или почти полностью) сглаживает «скачки», превращая сигнал в плавную синусоиду. Резистор влияет на «скорость» формирования этой синусоиды.
Да и емкость конденсатора на это влияет.
Очень рекомендую посмотреть видеоуроки от Джереми Блюма, он это подробно объясняет
@@UCanDo Круто, спасибо за ответ
Помогите мне, кото знает как соединить энкодер 3pin в мышку, где энкодер 4pin датчик холла в нём, барабан крутится над датчиком и происходит сигнал вращения. Мышка bloody A90 модель энкодер LK E13
Спокойно можно сделать, чтобы ловился каждый шаг. Вот прямо сейчас кручу энкодер от старой мыши, с ужасным дребезгом. STM32 и экран от Nokiа 5110 для контроля . Счетчик считает четко назад и вперед. Просто потому, что я сам писал код, полностью понимая что происходит в этом энкодере. В энкодере оба контакта при вращении в принципе не могут одновременно принимать одинаковое состояние. Какой то раньше, а какой то позже. Всегда.
Вы не первый такой: "вот, у меня все работает!"... Как говорится: КОД В СТУДИЮ! Тогда и посмотрим. :)
Я говорил о том что стандартные способы на Ардуино не работают. Что бы ловился каждый шаг нужно либо очень высокая частота опроса (не менее 200 раз в секунду, иначе будут глюки) либо вешать на прерывания. В первом случае это сложно реализовать. Любая задержка и энкодер уже неправильно считывается (как направление так и шаги). На прерываниях код получится очень сложный. Я так и не нашел в сети нормальной реализации опроса енкодера на прерываниях (для Ардуино).
У вас не Ардуино. У вас STM. А это и высокая скорость, и возможность любой пин на прерывание повешать. Но я бы все же просил бы вас поделиться кодом. Интересно на него взглянуть и научиться чему-то новому и полезному! Сам сейчас начал изучать STM.
//переменные
uint8_t enc_status=0; // последнее устойчивое состояние энкодера
uint8_t enc_statusprev= 0;// предыдущее устойчивое состояние энкодера
// устойчивых состояний два: 0x0 и 0x3
uint8_t enc_statuslast; // последнее состояние перед устойчивым
// может принимать значение 0x1 и 0x2, определяет направление
uint16_t enc_counter = 32768;// счетчик
while (1)
{
//читаем состояние энкодера в переменную, сдвигая значение первого пина влево
enc_status = HAL_GPIO_ReadPin(GPIOB, ENC_YELLOW_Pin);
enc_status
Кстати, тот вывод, который должен быть средним у энкодера от мыши крайний слева, если смотреть со стороны колеса у меня во всяком случае.
@@aerotachka У STMки скорость 72мгц. Поставьте в конце бесконечного цикла hal_delay(20); и проверьте будут ли глюки, я думаю будут
@@ruslan_ww8114 во первых у стмки столько, сколько выставить умножителями и предделителями.
На 4мгц все прекрасно работает.
Во вторых delay(20) это период 20 милисекуднд, то есть частота 50 Герц. Ардуино разве работает на частоте сети? 😂
Сделай электронную линейки
Здравствуйте! А можно ли к ардуино подключить лазерную мышку в качестве линейного датчика? Спасибо.
Мышку, думаю, можно подключить. Если она PS/2 то без проблем подключить можно, с USB будет по-сложнее. А зачем именно мышку? В чем суть устройства? Как именно она (как датчик) должна работать?
Правильно отрезной станок для проволоки. Нужен датчик для определения длинны прошедшей проволоки чтобы отрубывать куски зоданой длинны. И есть несколько мышек. Вот и возник вопрос можно ли замерять длинну таким образом.
На сколько он должен быть точным? +- 0.1 мм или +-5 мм?
Если очень точный нужен, то я бы разобрал принтер, там есть оптопара и сегментированный диск (не знаю как он называется). Диск поставить на ролик движения проволоки, а оптопарой ловить повороты. Так можно очень точно отследить размеры. Если высокая точность не нужна то можно и энкодер от мышки использовать. Энкодер поставить на ролик и отслеживать повороты.
на канале Radiosoft есть обзор работы с мышью, получение данных, разбор даташита
а смысл этого экзерсиса?
- знакомство с энкодерами (не кнопками едиными можно клацать)
- использование энкодера
- 2-я жизнь мертвым мышкам
Почему резисторы 10кОм?
Это не важно, можно использовать любые на 4.7 - 50 кОм.
Резисторы выполняют роль подтяжки
@@UCanDo спасибо
Как сделать чтобы была одна ардуино и два энкодера?Выводить информацию на один дисплей
Подключите энкодеры на разные Пины, для каждого энкодера используйте разные части кода.
7:15 с энкодером от мышки не сделаешь? а как оно тогда в мышке работает? могу заделиться кодом. там очень все просто!
На прерываниях можно сделать.
Что-то заговорился и сам себя запутал. Да, можно сделать, но только на прерываниях. Именно так и работает мышка. Там стоит МК который все и обрабатывает.
Код можете выложить. Кому-то точно пригодится.
зачем прерывания? без всяких прерываний. прерывания используются только для того, чтобы не занимать процессорное время на пустые проверки состояния энкодера. а энкодер от колеса мыши выдает последовательность, отличную от той, которую выдает "нормальный" энкодер. там весь прикол в логике. и на прерываниях все-равно придется столкнуться именно с логикой.
Приведите, пожалуйста, пример кода который бы работал на каждый поворот ролика
тут я призадумался: как лучше это сделать? может вы знаете сервисы специально для этого? вот ссылка на дропбокс: www.dropbox.com/s/jxj29z2dwvnqbli/mouse_wheel.ino?dl=0
но вся беда в том, что это директория с рабочими файлами и я могу однажды забыть и переименовать или переместить файл ((
На ГуглДиске выкладывайте. Через браузер. Тогда все файлы и папки останутся (пока вы их сами не удалите).
Посмотрел я ваш код. Сразу встречный вопрос: Вы его проверяли на енкодере ОТ МЫШКИ? А чем отличается ваш код от моего? Вы делаете все тот же:
aState = digitalRead(OUTPUT_A);
bState = digitalRead(OUTPUT_B);
Но этот способ НЕ работает с энкодерами от мышек. Точнее этот способ НЕ считывает каждый поворот. Если у вас работает - то вы исключение, и у вас на руках нестандартный, редкий енкодер. Вы просто повторили точно тот же код что и в видео, обычный, стандартный код, который, кстати, даже не со всеми энкодерами нормально работает. В видео я приводил усовершенствованный код который работает со всеми енкодерами. Ну кроме мышек конечно.
Вы знаете как устроен энкодер от мышки? Он сделан по другому принципу. Не так как обычно сделаны енкодеры.
В обычных енкодерах есть разность между положениями. То есть можно просто сравнить какой из выводов изменился:
if(aPrevState != aState || bPrevState != bState) {...
...
if(aPrevState != aState) { ...
....
Но в мышках энкодеры другие. Их выводы ВСЕГДА находятся в одинаковом положении. И каждый поворот ролика меняет состояние обоих выводов. То есть оба выхода А и В ВСЕГДА одинаковы - либо HIGH либо LOW. И меняются на каждом повороте ролика. Разница между выводами появляется только в момент поворота. Один из выводов раньше переключает свое состояние, другой позже. Разница во времени - микросекунды. За которые оба вывода опять становятся в одинаковое положение (либо HIGH либо LOW). Отловить такое обычным digitalRead невозможно. Только прерываниями.
А можно с помощью такого энкодера управлять шд в лево и в прово крутить энкодером
Энкодер можно использовать любой. В любом случае без дополнительной электроники не обойтись. А эта электроника будет считывать энкодер и управлять мотором
@@UCanDo а можно по подробнее или ссылкой где копать
Для управлением мотора нужен ДРАЙВЕР ШАГОВОГО ДВИГАТЕЛЯ.
Их есть очень много. Какие-то качественные, какие-то не очень. Выбор большой.
Драйвером управляет МИКРОКОНТРОЛЛЕР в котором содержится прошивка (программа), которая будет выполнять все необходимые действия.
Это в двух словах.
Хм... даже и не знаю что вам порекомендовать. Могу предположить что вы в электронике и программировании не разбираетесь, иначе бы не задавали такие базовые вопросы. А то что вам нужно - подразумевает умение работать с микроконтроллерами и уметь писать прошивки.
Если планируете изучать эту тему (программирование микроконтроллеров) то советую начать с видеоуроков от Джереми Блюма. Он очень хорошо объясняет.
Попробуете, наберетесь опыта.
А дальше нужно смотреть какой драйвер брать для шагового двигателя. Дешёвые - полное г... а самые лучшие стоят не дёшево.
У меня на канале есть видео об управлении Шаговым Двигателем: czcams.com/video/COd41BZ_XpM/video.html
Спасибо за видео Как раз куча неисправных мышек есть
А зачем эти резисторы нужны? Почему нельзя просто напрямую подключить?
Это подтягивающие резисторы, они нужны для формирования четких логических 0 и 1. Без них работа будет непредсказуемой.
а что делать если колесо срабатывает только при очень сильном нажатии на него? давить нужно со всей силы ,а при обычном нажатии не работает .
Не срабатывает нажатие или вращение?
Если нажатие, то нужно заменить кнопку, она износилась. Если вращение то скорее всего нужно почистить колесико от грязи и мусора
@@UCanDo не срабатывает нажатие при обычном нажатии , если со всей силы надавить на него ,тогда срабатывает .
@@UCanDo вот две фотки , ibb.co/3BkwgvP
ibb.co/1vnVSMZ Реально решить проблему с этой кнопкой без выпаивания и замены? может она разбирается ?
@@Phantoms60 Разобрать и почистить вы ее можете попробовать, вот только проработает это все не долго. Может несколько дней, может несколько месяцев. Все равно в итоге будете менять.
@@UCanDo а как ее разобрать?
только в скетче постоянно проверяется состояние, помоему по прерыванию меньше будет загружен процессор
Если у вас получится сделать обработку по прерыванию, то напишите здесь ссылку на скетч. Что бы и другие могли использовать ваш пример.
устанавливаем в шапке скетча вх1 на int1, вх2 на int2, далее по обработке прерываний определяем какое из них произошло раньше оно и определяет направление.
Пожалуйста, сделайте пример.
В теории оно все просто. У меня, на пример, не получилось сделать.
czcams.com/video/GjWooyEbzZs/video.html
а вообще в ютубе много по ардуино, этот пост я нашел по запросу "ардуино прирывания энкодер"
czcams.com/video/gRSYxXbjnCg/video.html
в этом без прерываний, но более понятно,
оптимально если совместить запоминание состояний с прерываниями
Хм. Я понимаю как работает энкодер. В моем видео применяется точно такой же код, как и у Паяльник TV (последняя ссылка). По крайней мере принцип тот же: очень точно отлавливаются каждый "тик" энкодера.
Все стандартные примеры работают только при отлавливании каждого второго шага энкодера. То есть в стандартных примерах отлавливание поворотов происходит через 1 шаг, каждый второй, а не каждый шаг.
В первом примере (ссылка на канал arduinoLab) хоть и применено прерывание, но остается все та же проблема: отслеживается не каждый шаг енкодера, а через один. Для того что бы отследить каждый шаг, нужно оба вывода вешать на прерывания. Прерывания делать по Изменению.
Я пробовал делать на двух прерываниях, но ничего не вышло. В сети примеров не нашел. Именно по этому я и попросил вас привести рабочий пример работы на прерываниях с подсчетом каждого шага. А просто как работать с энкодером - показано и в моем видео.
А можно наоборот к мышке нормальный большой энкодер подключить?
Думаю да. Энкодеры бывают разных типов, главное выбрать енкодер подходящего типа
Че это вообще такое зачем оно надо
Это интересно тем, кто занимается программированием микроконтроллеров, и для проектов использует различные подручные запчасти
Отвратительный алгоритм обработки энкодера. Используйте код Грэя
robocraft.ru/blog/electronics/590.html
Используемый мной код позволяет уловить каждый такт энкодера. Предложенный вами код делает то же самое?
@@UCanDo , конечно. Иначе зачем бы он вообще нужен был?)
Сейчас у меня нет под рукой подходящего энкодера чтобы протестировать пример. В сети гуляет множество примеров работы с энкодерами, но подавляющее большинство имеют один недостаток: срабатыванием через шаг. Предложенный вами мне не встречался. Возьму на заметку
@@UCanDo Алекс Гайвер недавно выложил обновленные библиотеки для работы с энкодером. Говорит что у него не было пропусков шагов. К тому же его библиотеки работают с несколькими типами энкодеров. (Сам пока в железе не проверял)
раскажи лучше как энкодер (какую ногу куда) к микроволновки подключить. родной развалился а аналогов ненайду
Ну серьезно ... прерывания придумали 2000 лет назад..... Зачем покупать Феррари и потом толкать ее пешком? Любое изменение на одном из двух пинов вызывает функцию прерывания, смотришь что произошло выставляешь флаг а забываешь. 4 строки примитивного кода. 6 если убивать дребезг. Ну. К чему городить этот огород.
Можете привести пример?
@@UCanDo
volatile uint8_t LED_COUNT=0;
volatile bool RotVec = false;
volatile bool FlagLedUpdate = false;
#define MAXLEDCOUNT 254
#define PINA 5 //Arduino INT 0 Pin
#define PINB 4 //Arduino INT 1 Pin
void setup() {
pinMode(PINA, INPUT_PULLUP);
pinMode(PINB, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PINA), CbInq, CHANGE);
attachInterrupt(digitalPinToInterrupt(PINB), CbInq, CHANGE);
interrupts();
}
void CbInq() {
noInterrupts();
bool InqP1 = digitalRead(PINA);
bool InqP2 = digitalRead(PINB);
if( ( (RotVec && ((InqP1 && InqP2) || (!InqP1 && InqP2))) || (!RotVec && (!InqP1 && !InqP2)) ) && LED_COUNT0){
LED_COUNT--; FlagLedUpdate=true;
}
RotVec=InqP1;
interrupts();
}
void loop() {
if(FlagLedUpdate){
//установка яркости из LED_COUNT
FlagLedUpdate=false;
}
}
Использовать под такую херню как энкодер аппаратные прерывания INT0 и INT1 жаба душит... конечно, но Ардуина не слишком умна чтобы работать с программными прерываниями PCINTx. Видимо разработчики IDE не особо рассчитывают, что кто-то будет работать с прерываниями.... собственно так оно и получается. Для работы PCINTx есть отдельная либа "PinChangeInterrupt", например.... чтобы не использовать аппаратные прерывания. Объем кода в редакторе это не меняет, но сам факт необходимости отдельно либы для PCINTx меня откровенно удивляет.
noInterrupts(); и interrupts(); из прерывания можно убрать, в теории... если аппаратный дребезг надежный. Но я бы не стал, ради предсказуемости результата.