пятница, 17 февраля 2017 г.

Arduino: Энкодер

Энкодер - большеснству знаком, как регулятор громкости в автомагнитолах. Он не имеет ограничителей, и может сообщать, только то, что он повернулся в одном или другом направлении. Различаются энкодеры углом поворота, который они могут фиксировать.

Принцип работы:  есть вращающийся диск с "лепестками" (обозначается как контакт "C") и есть два контакта ("A","B") напротив лепестков. Вращая - в одну сторону, "лепесток" сначала замкнется на контакт A, потом на B. (или если "междулепестье", то разомкнется А, потом В).
Аналогично, но наоборот, до вращения в другую сторону =)

Итого на 15 лепестков, мы имеем 30 положений =)



Аналогично обычным кнопкам, контакт А и Б надо "подтянуть" резистором. Схема и более подробное описание, по ссылке в конце

Код для изменения ШИМом яркости светодиода, вращая энкодер:
/*
** Энкодер
** Для управлением яркостью 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

Комментариев нет:

Отправить комментарий