Энкодер - большеснству знаком, как регулятор громкости в автомагнитолах. Он не имеет ограничителей, и может сообщать, только то, что он повернулся в одном или другом направлении. Различаются энкодеры углом поворота, который они могут фиксировать.
Принцип работы: есть вращающийся диск с "лепестками" (обозначается как контакт "C") и есть два контакта ("A","B") напротив лепестков. Вращая - в одну сторону, "лепесток" сначала замкнется на контакт A, потом на B. (или если "междулепестье", то разомкнется А, потом В).
Аналогично, но наоборот, до вращения в другую сторону =)
Итого на 15 лепестков, мы имеем 30 положений =)
Аналогично обычным кнопкам, контакт А и Б надо "подтянуть" резистором. Схема и более подробное описание, по ссылке в конце
Принцип работы: есть вращающийся диск с "лепестками" (обозначается как контакт "C") и есть два контакта ("A","B") напротив лепестков. Вращая - в одну сторону, "лепесток" сначала замкнется на контакт A, потом на B. (или если "междулепестье", то разомкнется А, потом В).
Аналогично, но наоборот, до вращения в другую сторону =)
Итого на 15 лепестков, мы имеем 30 положений =)
Аналогично обычным кнопкам, контакт А и Б надо "подтянуть" резистором. Схема и более подробное описание, по ссылке в конце
Код для изменения ШИМом яркости светодиода, вращая энкодер:
Скетч от сюда: http://www.hobbytronics.co.uk/arduino-tutorial6-rotary-encoder или http://cxem.net/arduino/arduino8.php
/*
** Энкодер
** Для управлением яркостью LED используется энкодер Sparkfun
*/
int
brightness = 120;
// яркость LED, начинаем с половины
int
fadeAmount = 10;
// шаг изменения яркости LED
unsigned
long
currentTime;
unsigned
long
loopTime;
const
int
pin_A = 12;
// pin 12
const
int
pin_B = 11;
// pin 11
unsigned
char
encoder_A;
unsigned
char
encoder_B;
unsigned
char
encoder_A_prev=0;
void
setup
() {
// declare pin 9 to be an output:
pinMode
(9,
OUTPUT
);
// устанавливаем pin 9 как выход
pinMode
(pin_A,
INPUT
);
pinMode
(pin_B,
INPUT
);
currentTime =
millis
();
loopTime = currentTime;
}
void
loop
() {
currentTime =
millis
();
if
(currentTime >= (loopTime + 5)){
// проверяем каждые 5мс (200 Гц)
encoder_A =
digitalRead
(pin_A);
// считываем состояние выхода А энкодера
encoder_B =
digitalRead
(pin_B);
// считываем состояние выхода B энкодера
if
((!encoder_A) && (encoder_A_prev)){
// если состояние изменилось с положительного к нулю
if
(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if
(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else
{
// выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if
(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}
}
encoder_A_prev = encoder_A;
// сохраняем значение А для следующего цикла
analogWrite
(9, brightness);
// устанавливаем яркость на 9 ножку
loopTime = currentTime;
}
}
Скетч от сюда: http://www.hobbytronics.co.uk/arduino-tutorial6-rotary-encoder или http://cxem.net/arduino/arduino8.php
Комментариев нет:
Отправить комментарий