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

Обсуждение и вопросы по урокам Ардуино
gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 12 сен 2019, 23:09

Здравствуйте.

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

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

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

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

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

► Показать


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

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;
}

Ale[_Mir
Сообщения: 2
Зарегистрирован: 13 сен 2019, 21:13

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

Сообщение Ale[_Mir » 13 сен 2019, 21:22

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

Ale[_Mir
Сообщения: 2
Зарегистрирован: 13 сен 2019, 21:13

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

Сообщение Ale[_Mir » 13 сен 2019, 21:24

Извините поторопился:
attachInterrupt(0, A_High , FALLING)

gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 16 сен 2019, 12:59

Эдуард писал(а):На ночь глядя быстро написал скетч[/code]


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

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 16 сен 2019, 18:32

Если провода до энкодера длинные, то лучше поставить.

gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 17 сен 2019, 00:02

Эдуард писал(а):Если провода до энкодера длинные, то лучше поставить.

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

gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 20 сен 2019, 00:09

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

gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 20 сен 2019, 20:04

Добавил диоды на LEFT_BUTTON_PIN 5 и RIGHT_BUTTON_PIN 6 проблема ушла

gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 20 сен 2019, 21:24

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

gritsan
Сообщения: 7
Зарегистрирован: 12 сен 2019, 22:33

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

Сообщение gritsan » 20 сен 2019, 21:48

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


Вернуться в «Уроки Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость