Странные значения поворотного энкодера
Я пытаюсь понять этот поворотный энкодер, который у меня есть, но для меня это бессмысленно.
Я использую этот поворотный энкодер: https://www.amazon.com/gp/product/B07DM2YMT4/
CYT1100, он же CY110, он же EC11
Я использую эту проводку: https://i.imgur.com/G1FzH13.png
P2 — это "кнопка" и обеспечивает непрерывность при нажатии.
Я использую подделку Arduino Nano, и это мой простой скрипт:
#define PIN_CLK 2
void setup()
{
Serial.begin(9600);
pinMode(PIN_CLK, INPUT);
}
void loop()
{
auto val = digitalRead(PIN_CLK);
Serial.println("CLK:" + String(val));
}
Где PIN_CLK подключен к A (DW) или B (CLK) на диаграмме.
Я ожидаю, что A и B должны быть либо постоянными ВЫСОКИМ, либо НИЗКИМ, в зависимости от того, где щетки находятся внутри. Не переключаться на ВЫСОКИЙ или НИЗКИЙ на мгновение, а затем возвращаться к тому, что было раньше.
Когда я проверяю их мультиметром, они оба всегда 5 В (когда нет слабого контакта на макетной плате).
Последовательный плоттер повторяет переключение между HIGH и LOW:
https://i.imgur.com/Tks5O9x.png
То же самое с последовательным монитором:
https://i.imgur.com/BtwZvWg.png
Когда я вращаю энкодер, на выходе появляются промежутки LOW, например:
https://i.imgur.com/Ek7ivGT.png
Если я держу указательный и большой пальцы напротив P1 (5v) и A (CLK) во время вращения энкодера. Я получаю постоянный поток HIGH с LOW на каждом вращении метки:
https://i.imgur.com/JwgMOBa.png
Может ли кто-нибудь объяснить это поведение и как этот кодировщик должен работать?
Редактировать: я попробовал эту схему:
https://i.imgur.com/xaHbOsm.png
Каждый раз, когда я поворачиваю энкодер. Светодиод мигает несколько миллисекунд. Затем выключается.
Предполагается, что он останется неизменным в зависимости от 2-битных состояний?
Edit2: Если я поверну его очень медленно. Он включает светодиоды в порядке слева направо или справа налево в зависимости от направления.
Итак, приведенная выше схема со светодиодами работает, но мне это кажется странным.
@John, 👍1
Обсуждение2 ответа
Лучший ответ:
Здесь возникает несколько проблем. Поскольку ваш код охватывает только один входной контакт, я собираюсь поговорить о входе A. Этот контакт остается плавающим! Когда вы поворачиваете диск, щетка соединяет A и/или B с G на вашей фотографии, или, другими словами, контакты A/B заземляются. Но если A/B не подключен к земле, другого состояния напряжения нет — оно просто остается плавающим. У вас должен быть логический НИЗКИЙ 0 В и логический ВЫСОКИЙ (либо 3,3 В, либо 5 В в зависимости от вашей платы Arduino), чтобы Arduino мог различать состояния НИЗКИЙ и ВЫСОКИЙ. Вы можете решить эту проблему, изменив код на:
pinMode(PIN_CLK, INPUT_PULLUP);
Таким образом, когда контакт (A) не подключен к GND через (G), он удерживается в высоком логическом состоянии.
P1 & P2 для кнопки, поэтому вы не можете игнорировать один из контактов. Чтобы правильно подключить это с помощью подтяжки входа, P1 необходимо подключить к GND. P2 необходимо подключить к входному выводу с помощью другого input_pullup
. Когда кнопка не нажата, состояние по умолчанию будет ВЫСОКОЕ. При нажатии она будет подключена к GND и будет отображаться как НИЗКИЙ уровень.
Вероятнее всего, вы используете изображения в Интернете для подключения энкодеров, которые уже установлены на печатной плате. На этой печатной плате есть 3 подтягивающих резистора. Независимо от того, используете ли вы для этого код или аппаратное обеспечение, схема должна выглядеть так. input_pullup
на Arduino будет действовать точно так же, как резисторы, показанные на схеме.
Вот отличный ресурс: https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/
У меня это заработало после того, как я использовал пример со светодиодом, чтобы понять, что ток течет только между выемками, а не все время. Требование подтягивания также было тем, чего мне не хватало. Единственная разница между вашим и моим в том, что я вообще не подключаю 5v. У меня есть еще несколько вопросов, если вы можете на них ответить. Для CLK и DT. Зачем использовать два резистора на сигнальных путях вместо одного резистора на пути заземления? Кажется, пока это работает нормально. Кроме того, нужны ли резисторы при подключении контакта Arduino к земле?, @John
Если вы объедините резисторы, CLK и DT одновременно станут НИЗКИМИ, что означает, что вы не сможете правильно использовать энкодер, если пытаетесь работать по часовой стрелке и против часовой стрелки. Вы действительно должны посмотреть учебник по кнопкам Arduino и ознакомиться с тем, что делают входные подтягивающие / подтягивающие резисторы, которые ответят на все ваши вопросы., @HavocRC
Не похоже, чтобы этот энкодер когда-либо включал одновременно CLK и DT. Если я попытаюсь его обойти. Он мерцает между ними, но они никогда не включаются одновременно. Редактировать: я проверил это, и как одиночный резистор, так и двойной резистор в конечном итоге имели двойные НИЗКИЕ показания при вращении энкодера., @John
Потратьте некоторое время на чтение этого учебника, на который я дал ссылку :), @HavocRC
При обнаружении странных значений в поворотном энкодере существует несколько возможных причин и действий по устранению неполадок, которые вы можете предпринять. возьми:
Механические проблемы: Проверьте, нет ли каких-либо физических повреждений или препятствий, мешающих движению поворотного энкодера. Убедитесь, что он вращается плавно, без какого-либо необычного сопротивления или пропусков.
Слабые соединения: Проверьте соединения проводов между поворотным энкодером и устройством, к которому он подключен. Убедитесь, что соединения надежны и правильно установлены.
Электрический шум. Электрический шум или помехи иногда могут вызывать ошибочные показания. Попробуйте использовать для соединений экранированные кабели и рассмотрите возможность добавления конденсаторов или ферритовых шариков для фильтрации помех.
Неправильная конфигурация. Проверьте настройку и конфигурацию поворотного энкодера в вашем коде или программном обеспечении. Убедитесь, что вы выбрали правильный тип энкодера (инкрементальный или абсолютный) и правильно реализована обработка сигнала.
Устранение дребезга. Если вы используете инкрементальный поворотный энкодер, он может генерировать несколько импульсов или дребезжащие сигналы при вращении. Реализация методов устранения дребезга в вашем коде может помочь отфильтровать эти ошибочные показания.
Настройки разрешения и скорости. Проверьте, соответствуют ли настройки разрешения и скорости в вашем коде или программном обеспечении характеристикам вашего поворотного энкодера. Неправильные настройки могут привести к неожиданным значениям.
Проблемы совместимости. Убедитесь, что используемый вами поворотный регулятор совместим с устройством или системой, к которой вы его подключаете. Проверьте характеристики и требования кодировщика и устройства, чтобы убедиться в совместимости.
Если вы выполнили эти действия по устранению неполадок и по-прежнему наблюдаете странные значения поворотного энкодера, возможно, стоит рассмотреть возможность замены или обратиться в службу поддержки производителя для получения дополнительной помощи.
- Как включить и выключить зуммер
- Как сканировать сигнал HIGH на digitalRead во время основного цикла, одновременно выполняя другие задачи?
- Невозможно использовать аналоговые контакты в качестве цифровых входов
- Чтение квадратурного энкодера в реальном времени с полным разрешением только с одним прерыванием на ATmega328
- Светодиод Arduino Nano не работает
- Изменить прерывания на ATTiny 88
- Nano: все цифровые контакты ничего не выводят
- Как безопасно удалить Arduino Nano с макета ?
P1 и P2, вероятно, являются переключателем ... подключите один к GND, а другой к выводу IO ... включите подтягивающий резистор на вывод IO ... сделайте то же самое с B и A ... не подключайте контакты к 5 В, @jsotola
@jsotola Я отключил P1 от 5 В и подключил G к земле, A к D2, B к D3. Значения колеблются между ВЫСОКИМ и НИЗКИМ. Затем оба становятся низкими на несколько тиков при вращении энкодера. Тот же результат, что и раньше., @John
вы включили подтягивающие резисторы?, @jsotola
@jsotola Я сделал сейчас, @John
Это просто квадратурное кодирование/декодирование. Для этого есть учебники по всему интернету. Так работают старые мыши. Дополните этот комментарий, если вам нужно узнать больше, и я создам еще один ответ, основанный на этом подходе., @st2000