Страница 1 из 1

Энкодер вместо кнопок громкости

Добавлено: 12 сен 2019, 23:09
gritsan
Здравствуйте.

Подключил энкодер к ардуино, попробовал библиотеку Button.h все работает.

Хочу энкодером заменить 2 кнопки громкости на навигаторе. Кнопки замыкаются на землю.

Если я правильно понял, необходимо чтобы на пинах ардуино был низкий уровень при вращении энкодера.
К примеру, при вращении влево pinMode(6, OUTPUT) был низкий уровень, вправо pinMode(7, OUTPUT) низкий уровень.

Помогите с примером скетча.

Попробовал со светодиодом, работает

► Показать

Re: Энкодер вместо кнопок громкости

Добавлено: 12 сен 2019, 23:47
Эдуард
Здравствуйте!
На ночь глядя быстро написал скетч, который по задумке должен при повороте энкодера вырабатывать сигналы с активными низкими уровнями на выходах LEFT_BUTTON_PIN и RIGHT_BUTTON_PIN. Попробуйте. Программу не проверял, могут быть ошибки.

Код: Выделить всё

#include <TimerOne.h>
#include <Encod_er.h>

#define LEFT_BUTTON_PIN 5 // левая кнопка
#define RIGHT_BUTTON_PIN 6 // правая кнопка

#define TIME_NO_TURN 500 // время, ожидания поворота энкодера (* 0,25 мс)

Encod_er encoder( 2, 8, 4);

volatile unsigned int leftTime=65000, rightTime=65000;

void setup() {
  pinMode(LEFT_BUTTON_PIN, OUTPUT);
  pinMode(RIGHT_BUTTON_PIN, OUTPUT);
  digitalWrite(LEFT_BUTTON_PIN, HIGH);
  digitalWrite(RIGHT_BUTTON_PIN, HIGH);
 
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
}

void loop() {

  if(encoder.timeRight != 0) {
    encoder.timeRight= 0;
    rightTime=0;   
  }

  if(encoder.timeLeft != 0) {
    encoder.timeLeft= 0;
    leftTime=0;   
  }

  if( rightTime < TIME_NO_TURN ) digitalWrite(RIGHT_BUTTON_PIN, LOW);
  else digitalWrite(RIGHT_BUTTON_PIN, HIGH);

  if( leftTime < TIME_NO_TURN ) digitalWrite(LEFT_BUTTON_PIN, LOW);
  else digitalWrite(LEFT_BUTTON_PIN, HIGH); 
}

// обработчик прерывания 250 мкс
void timerInterrupt() {
  encoder.scanState();
  leftTime++;
  if(leftTime > 65000) leftTime=65000;
  rightTime++; 
  if(rightTime > 65000) rightTime=65000;
}

Re: Энкодер вместо кнопок громкости

Добавлено: 13 сен 2019, 21:22
Ale[_Mir
Доброго времени суток!
Может так: использовать attachInterrupt(0, A_High , RISING); //прерывания по фронту сигнала А
и в обработчике
void A_High()
{
if (digitalRead(Вх энкодера В)==true) st--;else st++; // тут пин входа сигнала " В "
}
st-уровень громкости.

Re: Энкодер вместо кнопок громкости

Добавлено: 13 сен 2019, 21:24
Ale[_Mir
Извините поторопился:
attachInterrupt(0, A_High , FALLING)

Re: Энкодер вместо кнопок громкости

Добавлено: 16 сен 2019, 12:59
gritsan
Эдуард писал(а):На ночь глядя быстро написал скетч[/code]


Великолепно! Спасибо Эдуард, все работает, но пока на столе.
Планируется в автомобиле.
Не совсем понял нужно ли использовать внешние подтягивающие резисторы?

Re: Энкодер вместо кнопок громкости

Добавлено: 16 сен 2019, 18:32
Эдуард
Если провода до энкодера длинные, то лучше поставить.

Re: Энкодер вместо кнопок громкости

Добавлено: 17 сен 2019, 00:02
gritsan
Эдуард писал(а):Если провода до энкодера длинные, то лучше поставить.

Большое спасибо Эдуард!!! :roll:

Re: Энкодер вместо кнопок громкости

Добавлено: 20 сен 2019, 00:09
gritsan
Конечно к теме энкодера не относится.
Все же упустил, проблемку. Без питания Aduino, громкость уменьшается до нуля бесконечно.
Может связано с тем, что в планшете кнопки подтянуты к плюсу.

Re: Энкодер вместо кнопок громкости

Добавлено: 20 сен 2019, 20:04
gritsan
Добавил диоды на LEFT_BUTTON_PIN 5 и RIGHT_BUTTON_PIN 6 проблема ушла

Re: Энкодер вместо кнопок громкости

Добавлено: 20 сен 2019, 21:24
gritsan
И хотелось бы немного подправить "скорость нажатий" кнопок.
При быстром резком вращении энкодера громкость не меняется так же быстро, если плавно увеличивать скорость вращения то работает нормально.
НО это все моя придирчивость))

Re: Энкодер вместо кнопок громкости

Добавлено: 20 сен 2019, 21:48
gritsan
Все, разобрался. Дело в самом навигаторе, он не способен быстро менять громкость.
Победа)