Кодировщик + Библиотека 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

, 👍3

Обсуждение

Я также хочу отметить, что ни одна форма аппаратной дебютировки не используется. Вращающийся кодер подключен непосредственно к arduino без каких-либо пассивных компонентов на месте., @kevinconnectable

См. [Мой ответ на *Как читать RPS для быстрого вращения с помощью метода изменения состояния в Arduino?*](http://arduinoprosto.ru/q/32043/3917). Также см. Мой комментарий к другому ответу там: “Реализовано с помощью State Machine, квадратурное кодирование не требует разборки. Отскок может привести к недействительным состояниям или дополнительным состояниям, но они отменяются". Другими словами, списание входов роторного кодера-это ошибочный подход., @James Waldby - jwpat7

@jwpat7 Спасибо! Я посмотрю!, @kevinconnectable

Я всегда находил с кодировщиками, что аппаратное осуждение избавляет меня от многих проблем. Все, что вам нужно, - это пара маленьких колпачков., @Delta_G


1 ответ


0

Библиотека 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 Ом. Не уверен, что это имеет значение.

,