#1 2019-02-19 10:12:21

Константин М
Учасник
Зареєстрований: 2019-02-19
Повідомлень: 9

Энкодер отрабатывает только каждый второй сигнал ??

Собрал синтезатор на Si5351A + Ардуино Уно+ энкодер KY-040 + дисплей.
Подключил, прошил, все заработало, НО ! Повернул энкодер на один шаг - ничего, на второй шаг - данные изменились. И так все время. Что вправо, что влево. Показания изменяются только на каждый второй поворот энкодера.
Я обратился к автору программы, он ответил, что у него и у всех, кто повторял эту схему, все работает. Прислал мне несколько программ для проверки энкодера - на всех их энкодер работает точно также. Я заменил энкодер на точно такой же ( купил их 3 штуки ) - ничего не поменялось. Все работает четко, не сбоит, нет ложных срабатываний, но показания изменяются только на каждый второй поворот энкодера.
Можете чем-то помочь ?

Неактивний

#2 2019-02-19 10:56:11

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Энкодер отрабатывает только каждый второй сигнал ??

Могу, только чем ?

http://forum.arduino.ua/viewtopic.php?pid=21076#p21076

http://forum.arduino.ua/viewtopic.php?pid=21082#p21082

Остання редакція renoshnik (2019-02-19 11:02:18)

Неактивний

#3 2019-02-19 11:48:38

Энкодер
Гість

Re: Энкодер отрабатывает только каждый второй сигнал ??

Скорее всего, вы напутали с подключением и повторяете ошибку многократно.

#4 2019-02-19 15:14:03

Константин М
Учасник
Зареєстрований: 2019-02-19
Повідомлень: 9

Re: Энкодер отрабатывает только каждый второй сигнал ??

Накормил внука и уложил спать, есть время продолжить. wink
Еще раз ( десятый ) перепроверил подключение. Запустил скетч ( очередной проверочный )

/*
    Rotary Encoder - Interrupt Example
   
    The circuit:
    * encoder pin A to Arduino pin 2
    * encoder pin B to Arduino pin 3
    * encoder ground pin to ground (GND)
*/

#include "Rotary.h"

Rotary r = Rotary(2, 3);

void setup() {
  Serial.begin(57600);
  r.begin();
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
}

void loop() {

}

ISR(PCINT2_vect) {
  unsigned char result = r.process();
  if (result == DIR_NONE) {
    // do nothing
  }
  else if (result == DIR_CW) {
    Serial.println("ClockWise");
  }
  else if (result == DIR_CCW) {
    Serial.println("CounterClockWise");
  }
}
Если меняю CLK и DT местами, меняется
ClockWise
CounterClockWise

Без подключения + не работает совсем.
Подключение кнопки ( CW )  в данном варианте ни на что не влияет.

В другом скетче кнопкой можно обнулять показания. Обнуляет.
#define pin_CLK 2
#define pin_DT  3
#define pin_Btn 4

unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
int EncoderA, EncoderB, EncoderAPrev, counter;
bool ButtonPrev;

eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
  CurrentTime = millis();
  if (CurrentTime >= (LastTime + 5)) {
    // Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
    LastTime = CurrentTime;
    if (digitalRead(pin_Btn) == LOW ) {
      if (ButtonPrev) {
        Result = eButton; // Нажата кнопка
        ButtonPrev = 0;
      }
    }
    else {
      ButtonPrev = 1;
      EncoderA = digitalRead(pin_DT);
      EncoderB = digitalRead(pin_CLK);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние сигнала A
    }
  }
  return Result;
}

void setup() {
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
   pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
  Serial.begin(115200);
  counter = 0;
}

void loop() {
  switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {
        counter--;
        break;
      }
    case eRight: {
        counter++;
        break;
      }
    case eButton: {
        counter = 0;
        break;
      }
  }
  Serial.println(counter);
}

Но во всех вариантах показания меняются только на каждом втором повороте энкодера.
На Ардуино еще по шине I2C подключен дисплей 1602 и синтезатор.
Все.

Неактивний

#5 2019-02-19 21:59:17

MikeM
Учасник
З Киев
Зареєстрований: 2017-11-03
Повідомлень: 160

Re: Энкодер отрабатывает только каждый второй сигнал ??

Схему подключения увидеть не помешало бы

Неактивний

#6 2019-02-19 23:20:12

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Энкодер отрабатывает только каждый второй сигнал ??

я модулями с подтяжками не пользуюсь, использую самый обычный EC-11.

Неактивний

#7 2019-10-24 23:26:52

Сергей Сизов
Гість

Re: Энкодер отрабатывает только каждый второй сигнал ??

Вот это забыл исправь и всё заработает!

pinMode(pin_DT,  INPUT);

digitalWrite(pin_DT,HIGH);  // Кнопка  подтянута к +5

pinMode(pin_CLK, INPUT);
   
digitalWrite(pin_CLK,HIGH);  // Кнопка  подтянута к +5
   
pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор

#8 2019-10-24 23:30:11

Сергей Сизов
Гість

Re: Энкодер отрабатывает только каждый второй сигнал ??

Без подтяжки к плюсу какую пульсацию ты ожидаешь?

#9 2019-10-24 23:53:39

Сергей Сизов
Гість

Re: Энкодер отрабатывает только каждый второй сигнал ??

Или делай все входы INPUT_PULLUP.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму