Кодировщик + Библиотека Bounce2
Я работаю над дебютированием своего кодера keyes rotary encoder с помощью библиотеки Bounce2, найденной здесь ( https://github.com/thomasfredericks/Bounce2 ).
Я считаю, что проблема заключается в моем коде, так как там не так много с точки зрения схемы. Кодер подключается к моему arduino следующим образом
- 5V : подключено к выходу 5v на arduino
- GND : подключено к GND
- SW : подключено к контакту A1
- DT : подключено к контакту 3
- CLK : подключен к контакту 2
Я пытаюсь вызвать ISR с входа CLK. Когда ISR вызывается, он должен увеличивать или уменьшать значение на основе направления, в котором был повернут кодер. Этот кодер привязан к ISR, потому что он будет использоваться для пользовательского ввода, и я хотел бы, чтобы он оставался отзывчивым на протяжении всего скетча.
Ранее я использовал millis (), чтобы отменить кодер, но у меня все еще были проблемы с получением более одного ввода от кодера. Я надеялся, что эта библиотека решит этот вопрос.
Текущий выход кода, который я включил, никогда не увеличивает/не уменьшает начальное значение независимо от того, в каком направлении повернут кодер. Короче говоря, он всегда выводит 0.
Если бы кто-нибудь мог объяснить, что я делаю неправильно, это было бы замечательно! Тогда, может быть, но только может быть, я могу перестать биться головой о стол. :p
Спасибо, Кевин
#include <Bounce2.h>
#define sw A1
#define LED_PIN 9
#define clk 2
#define dt 3
int ledState = LOW;
int onOff = LOW;
volatile int virtualPosition = 0;
int lastCount = 0;
// Initiate bounce objects
Bounce debouncerSW = Bounce();
Bounce debouncerROT = Bounce();
void setup() {
Serial.begin(115200);
pinMode(sw, INPUT_PULLUP);
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(LED_PIN, OUTPUT);
// настройка экзэмпляра кнопки
debouncerSW.attach(sw);
debouncerSW.interval(100);
// настройка экземпляра поворотного энкодера
debouncerROT.attach(clk);
debouncerROT.interval(10);
// setup the LED
digitalWrite(LED_PIN, ledState);
// attach ISR
attachInterrupt(digitalPinToInterrupt(clk), isr, LOW);
Serial.println("Start"); // просто дайте мне знать, что sketch закончил настройку
}
void loop() {
debouncerSW.update();
if ( debouncerSW.fell() ) {
ledState = !ledState;
onOff = !onOff;
digitalWrite(LED_PIN, ledState);
//read-outs
Serial.print("onOff = ");
Serial.println(onOff);
}
virtualPosition = lastCount;
//read-outs
Serial.print ("lastCount = ");
Serial.println (lastCount);
delay(1000); // для удобства чтения / имитирует время задержки для остальной части основного скетча
} // конец основного цикла
void isr () {
// Обновите экземпляр Bounce :
debouncerROT.update();
if (debouncerROT.fell()) {
if (digitalRead(dt) == LOW)
{
virtualPosition -- ; // Could be -5 or -10
}
else {
virtualPosition ++ ; // Could be +5 or +10
}
// Ограничить значение от 0 до 100
virtualPosition = min(100, max(0, virtualPosition));
}
} // end ISR
1 ответ
Библиотека ClickEncoder очень хорошо работает с поворотным кодером Keyes: https://github.com/0xPIT/encoder. Кнопка сообщает о нескольких состояниях: Нажата, дважды нажата, Удержана и отпущена. Он использует аналоговые контакты A1, A0, A2. Вам также понадобится библиотека часовых поясов: https://code.google.com/archive/p/arduino-timerone/downloads.
Мои поворотные энкодеры keyes имеют 3 резистора для поверхностного монтажа в нижней части печатной платы. У R1 ничего нет, у R2 и R3 припаян резистор на 10 Ом. Не уверен, что это имеет значение.
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Будет ли простой RC-фильтр работать с механическим поворотным энкодером или понадобится триггер Шмитта?
- Чтение поворотного энкодера с использованием цифровых контактов Mega 2560 напрямую с помощью регистров порта?
- Понимание кода Debounce
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Считывание нескольких поворотных энкодеров
- Проблема с датчиком температуры и влажности DHT11
Я также хочу отметить, что ни одна форма аппаратной дебютировки не используется. Вращающийся кодер подключен непосредственно к arduino без каких-либо пассивных компонентов на месте., @kevinconnectable
См. [Мой ответ на *Как читать RPS для быстрого вращения с помощью метода изменения состояния в Arduino?*](http://arduinoprosto.ru/q/32043/3917). Также см. Мой комментарий к другому ответу там: “Реализовано с помощью State Machine, квадратурное кодирование не требует разборки. Отскок может привести к недействительным состояниям или дополнительным состояниям, но они отменяются". Другими словами, списание входов роторного кодера-это ошибочный подход., @James Waldby - jwpat7
@jwpat7 Спасибо! Я посмотрю!, @kevinconnectable
Я всегда находил с кодировщиками, что аппаратное осуждение избавляет меня от многих проблем. Все, что вам нужно, - это пара маленьких колпачков., @Delta_G