Arduino. Используем механический энкодер

После использования потенциометра, захотелось использовать  механический энкодер(он же датчик угла поворота) для управления чем либо.

ЗадачаArduino. Используем механический энкодер

При помощи механического энкодера менять яркость свечения светодиода.

Для реализации потребуется

  1. Arduino;
  2. Отладочная плата;
  3. Механический энкодер;
  4. Соединительные провода;
  5. Резистор 220 Ом;
  6. 2 резистора 10 КОм;
  7. Светодиод.

Реализация

Подробно описывать принцип действия энкодера не буду, все есть в wikipwdia, ссылочка была выше)

Для определения направления вращения энкодера будем использовать функцию преобразования кода Грея в двоичный код, функция взята прямо из wikipedia без изменений.

Подключаем провода:

  1. Правую и левую ножку энкодера подключаем D11 и D12 и через резисторы 10 КОм к 5V;
  2. Средний контакт энкодера подключаем к GND;
  3. К выходу D9 подключить резистор 220 Ом, к резистору подключаем анод светодиода, катод подключаем к выходу GND.

Код:

Примеров кода в интернетах очень много, читаем их, еще читаем их и пишем свой кусок кода)

enum {LED_PIN = 9, ENC_PIN1 = 11, ENC_PIN2 = 12};

int brightness  = 120;  // Яркость
int change      = 10;   // Изменение яркости

void setup() {
  pinMode(ENC_PIN1,  INPUT);
  pinMode(ENC_PIN2,  INPUT);
  pinMode(LED_PIN,   OUTPUT);
}

// Преобразование значения Грея в двоичный код
// без изменений прямиком из wilipedia
unsigned graydecode(unsigned gray) {
  unsigned bin;

  for (bin = 0; gray; gray >>= 1)
    bin ^= gray;

  return bin;
}

//  grayValue - Значение Грея
//  value     - Преобразованное значение Грея
//  oldValue  - Старое преобразованное значение Грея
void loop() {

  static uint8_t oldValue = 0;

  uint8_t grayValue = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), value = graydecode(grayValue);

  if (value == 0) // Энкодер вращается
  {
    if (oldValue == 3) { // Вправо
      if (brightness + change <= 255) brightness += change;
    }
    else if (oldValue == 1) { // Влево
      if (brightness - change >= 0) brightness -= change;
    }
  }

  analogWrite(LED_PIN, brightness); // Задаем яркость светодиода

  oldValue = value;

  delay(1);
}

Заливаем скетч на arduino и радуемся результату

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *