Энкодер - большеснству знаком, как регулятор громкости в автомагнитолах. Он не имеет ограничителей, и может сообщать, только то, что он повернулся в одном или другом направлении. Различаются энкодеры углом поворота, который они могут фиксировать.
Принцип работы: есть вращающийся диск с "лепестками" (обозначается как контакт "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*/intbrightness = 120;// яркость LED, начинаем с половиныintfadeAmount = 10;// шаг изменения яркости LEDunsignedlongcurrentTime;unsignedlongloopTime;constintpin_A = 12;// pin 12constintpin_B = 11;// pin 11unsignedcharencoder_A;unsignedcharencoder_B;unsignedcharencoder_A_prev=0;voidsetup() {// declare pin 9 to be an output:pinMode(9,OUTPUT);// устанавливаем pin 9 как выходpinMode(pin_A,INPUT);pinMode(pin_B,INPUT);currentTime =millis();loopTime = currentTime;}voidloop() {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) {// выход В в полож. сост., значит вращение по часовой стрелке// увеличиваем яркость, не более чем до 255if(brightness + fadeAmount <= 255) brightness += fadeAmount;}else{// выход В в 0 сост., значит вращение против часовой стрелки// уменьшаем яркость, но не ниже 0if(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
Комментариев нет:
Отправить комментарий