После использования потенциометра, захотелось использовать механический энкодер(он же датчик угла поворота) для управления чем либо.
Содержание
Задача
При помощи механического энкодера менять яркость свечения светодиода.
Для реализации потребуется
- Arduino;
- Отладочная плата;
- Механический энкодер;
- Соединительные провода;
- Резистор 220 Ом;
- 2 резистора 10 КОм;
- Светодиод.
Реализация
Подробно описывать принцип действия энкодера не буду, все есть в wikipwdia, ссылочка была выше)
Для определения направления вращения энкодера будем использовать функцию преобразования кода Грея в двоичный код, функция взята прямо из wikipedia без изменений.
Подключаем провода:
- Правую и левую ножку энкодера подключаем D11 и D12 и через резисторы 10 КОм к 5V;
- Средний контакт энкодера подключаем к GND;
- К выходу 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 и радуемся результату