Трабла с Энкодером
- Войдите на сайт для отправки комментариев
Чт, 16/04/2015 - 22:09
Разобрал китайскую магнитоллу. В ней обнаружился двигатель и и энкодер спаренный с этим движком через щестерни.
Залил вот такой скетч:
/* Пины, к которым подключен энкодер */ enum { ENC_PIN1 = 2, ENC_PIN2 = 3 }; void setup() { pinMode(ENC_PIN1, INPUT); pinMode(ENC_PIN2, INPUT); Serial.begin(9600); } /* Функция декодирования кода Грея, взятая с Википедии. * Принимает число в коде Грея, возвращает обычное его представление. */ unsigned graydecode(unsigned gray) { unsigned bin; for (bin = 0; gray; gray >>= 1) bin ^= gray; return bin; } void loop() { static uint8_t previous_code = 0; // предыдущий считанный код /* gray_code - считанное с энкодера значение * code - декодированное значение */ uint8_t gray_code = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), code = graydecode(gray_code); /* Если считался нуль, значит был произведён щелчок ручкой энкодера */ if (code == 0) { /* Если переход к нулю был из состояния 3 - ручка вращалась * по часовой стрелке, если из 1 - против. */ if (previous_code == 3) Serial.println("->"); else if (previous_code == 1) Serial.println("<-"); } /* Сохраняем код и ждём 1 мс - вполне достаточно опрашивать энкодер * не более 1000 раз в секунду. */ previous_code = code; delay(1); }
У энкодера 3 вывода. Проблема в том что они не подписаны. Хорошо хоть провода цветные - черный, красный, зеленый.
Красный подключаю на 27 контакт (+5V).
Черный на 4 контакт (GND)
А далше самое интересное: Вешаю зеленый на D2 и на мониторе показывает направление всё время влево, хотя кручу энкодер в разные стороны. Затем перевешываю зеленый на D3 и стрелка теперь показывает всё время вправо.
Не могу разобраться где неправильно делаю. Контакты не так подключил или скетч неверный. Может то и другое.
Я пока новичек.
А может быть что этот энкодер не может распозновать направление движения, а только угол наклона?
Дальнейшая задача этого энкодера запоминать последнее положение и восстанавливать из памяти в прошлое состояние. А пока только тест.
у энка три вывода - GND , канал1 , канал2 - анализировать нужно одновременно каналы 1 и 2
А может быть что этот энкодер не может распозновать направление движения, а только угол наклона?
он и придуман для распознования направления вращения....
В ней обнаружился двигатель и и энкодер спаренный с этим движком через щестерни.
странная связь... вращая энк вращаем мотор , а мотор может вращать энк ?
При одновременной посадке всех выводов то же происходит.
Хорошо. Может тогда подскажете на какие выводы на НАНО обычно садят энкодер?
Мотор вращает набор шестерен. На одной из них стоит датчик и энкодер.
http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder?page=2#comm...
Попробуйте вот такой код:
Друзья. Попробовал представленный скетч. Не работает. Видео дальше.
https://youtu.be/15uNQENN6S8
Надо довести до ума тестовый скетч и подключение чтобы двигаться дальше чтобы научится управлять движком. Надо искать проблемы дальше.
Фото. соединения и энкодера:
mrDobryj, какой скетч вы считаете "представленным"? Тут упоминалось как минимум 3. Потом про свой энкодер вы ровным счётом ничего не рассказали, что это? Механика, оптика, Холла? Нужен лог срабатываний . Глупо просто перебирать все варианты скетчей под непонятный энкодер, нужно понимать как работает именно ваш.
Я же сказал из китайской магнитоллы. Если бы я знал какой,то написал. Потому фото и выложил. На фото ведь видно что это никакая не мехника. Если бы я мог прийти и дать его в руки, но это нереально.
Как лог срабатываний вытащить может подскажете?
Потому и прошу помощи у опытных
Судя по это статье http://robocraft.ru/blog/technology/734.html у меня одинарный оптический энкодер
mrDobryj, если действительно одиночный -значит счёт только в одну сторону объясним. По-хорошему нужно было зарисовать схему, почётче сфотографировать нечто с 4-мя выводами, описать материал блестящих секторов шестерёнки что вы держите. Но раз уже определились, то теперь, конечно не актуально.
материал блестящий сектор и не блестящий т.е.отражающий и нет.
Как я писал выше вывода только 3 на схеме энкодера. и какое значение из них каждый имеет тоже не могу понять. Известны только цвета проводов. Четче не снять. там все прекрасно видно. каждую цифру.
mrDobryj, а как же вы его подключали, если не разобрались с концами? Ведь счёт инкрементов шёл на видео. Выводы у вас подписаны. Над красным проводом виднеется Vcc, чёрный не видно откуда ползёт, но вероятно земля. И зелёный получается -данные. Без схемы я бы не вынес окончательный приговор, что это одиночный энкодер. PS: хотя да, похоже, что он. Транзистор усиливает сигнал с фото-чего-то там, вывод CP получается подтянутым к единице.
щас подробнее попробую его отснять. И чуть позже выложу
Вот еще фоточки:
mrDobryj, да, очень похож на одинарный. Стало быть практического применения, кроме как считать обороты у него нет... А вы что хотели от него добится?
Доброго времени суток !
На него бы осцелографом глянуть, там резисторы, кондеры, диод. Я думаю с импульсом там не все так однозначно.
Датчик отражения. А ваш "энкодер" - это просто счётчик импульсов...... В любую сторону .... 4 импульса на оборот
Ну чтож. Думаю мне и такой подойдет. Только внесу небольшую корректировку в задумку.
Что же я хочу сделать?
Хочу в авто установить поворотный экран на ардуино.
Вот принцип работы экрана:
- принудительное включение/выключение экрана
- принудительное закрывание /открывание панели
- наклон экрана от водителя
- наклон экрана к водителю
А теперь как будет выполняться работа с таким энкодером. Энкодер будет просто запоминать положение, в котором будет открыт монитор. И соответственно выводить его в тоже положение из eeprom. Также в системе будут встроенны 2 концевика. Один в раскрытый монитор (чтобы не сломать). А на закрытое положение другой концевик.
Теперь самое сложное это написать скетч. За сим прошу помощи.
Управлять всем этим театром будет ардуино нано.
Кстати вот нашел про мой фотоэлемент http://robocraft.ru/shop/index.php?route=product/product&path=38&product_id=143
При разработке скетча столкнулся с проблемой.
Из видео видно что в какую бы сторону не крутил, значения либо растут либо падают в одном направлении. Не могу понять как мне осуществить запоминание угла положения манитора, если после регулировки данные всегда растут или падают. И к ним потом никак не вернуться.
https://youtu.be/h0aDQ9Psfds
http://pixs.ru/showimage/shemamotor_7779304_17186882.jpg
В настоящий момент реализовал только это. Освоение Ардуино снуля. Поэтому медленно.
А теперь как будет выполняться работа с таким энкодером. Энкодер будет просто запоминать положение, в котором будет открыт монитор. И соответственно выводить его в тоже положение из eeprom.
Как работает энкодер разобрались?
Ваш показывает направление вращения?
Сколько значений на оборот?
Разбираться начал с ним только сейчас. Судя по всему направления движения не показывает. Буду дальше его пытать либо прийдется заменять чем то другим.
Но непонятно вот что - У КИТАЙЦЕВ ТО РАБОТАЛ!
От энкодера отказываюсь. Этот не позволяет использовать в данной задумке. Предлагают потенциометр на вал посадить. Буду думать как реализовать данную схему.
Как вы думаете: Зачем были придуманы всякие безконтактные ( магнитные и оптические) энкодеры?
Правильно - чтобы ничто не могло "протереться"
Как вы думаете: Зачем были придуманы всякие безконтактные ( магнитные и оптические) энкодеры?
Правильно - чтобы ничто не могло "протереться"
Я не понял о чем вы говорите.
Другой энкодер туда не воткнуть. Мало места. Придется полностью переделывать схему.
Я про ваш "потенциометр" высказался. У вас есть безконтактный потенциометр?
Другой энкодер туда не воткнуть. Мало места. Придется полностью переделывать схему.
подъём/опускание экрана - по количеству импульсов с одиночного энкодера ? ( направление ему не нужно - его задаёт моторчик )...
концевики положений "сложена" и "полностью поднята" есть ?
на видео не видно - панель изменяет положение по однократному нажатию кнопки или пока она ( кнопка ) удерживается
положение угла и надо считать с одиночного энкодера - только декр или инкр положения делать взависимости от направления вращения ( т.е. от нажатой кнопки )
в коде определить переменную положения панели, при подъёме/опускании гонять её от 0 до макс, макс значение определить подсчётом тиков энкодера от крайнего до крайнего положения панели.... при выключении писать положение в EEPROM
от края до края пусть 135 тиков энка ( градусов ) - вкл - панель ушла на 135, в переменной = 135 - жмёмь "уменьшить угол" до желаемого визуально, моторчик крутит, энк тики выдаёт, а ПЕРЕМЕННАЯ положения в коде уменьшается с каждым тиком - стало на 25 тиков меньше, угол = 110 - выкл - ардуинка запоминает position=110 - панель складывается
снова вкл - панель поднимается до положения 110 и ардуинка выключает моторчик....
кататак....
у энка три вывода - GND , канал1 , канал2 - анализировать нужно одновременно каналы 1 и 2
надо исправиться :)
у этого одиночного энка 1 - VCC , 2 - GND , 3 - сигнальный ( 0 или 1 , засвечен или незасвечен ) и скорее всего ещё с открытым коллектором ( нужна будет подтяжка читающего пина к VCC )
хватит и три кнопки :
принудительное вкл/выкл в триггерном режиме , -угол , +угол
и покажите свой крайний код :)
так, по быстрому делал :(
подъём/опускание экрана - по количеству импульсов с одиночного энкодера ? ( направление ему не нужно - его задаёт моторчик )...
Вы облегчили эту часть для моего понимания.
концевики положений "сложена" и "полностью поднята" есть ?
Да конечно есть. Концевики будут кнопочные.
на видео не видно - панель изменяет положение по однократному нажатию кнопки или пока она ( кнопка ) удерживается
Пока удерживается кнопка.
у этого одиночного энка 1 - VCC , 2 - GND , 3 - сигнальный ( 0 или 1 , засвечен или незасвечен ) и скорее всего ещё с открытым коллектором ( нужна будет подтяжка читающего пина к VCC )
Как делается подтяжка читающего пина в VCC?
Спасибо за очень понятный алгоритм работы.
К сожалению у меня 2 экзамена на носу по специальности. Ещё работаю. Сейчас на недельку, две буду занят насущными проблемами. А после продолжу изготовление.
mrDobryj, подтяжка вам не нужна. Выход платы уже подтянут к питанию через коллекторный резистор 470ком.