4.06.2. Лабораторная работа №4.6.2.md
Энкодер
Тема работы
Мы уже умеем управлять устройствами с помощью кнопок. Но что, если нам нужен более удобный и интуитивный орган управления, например, для выбора пункта в меню или плавной настройки параметра? В этой лабораторной работе мы познакомимся с инкрементальным энкодером и превратим его в «ручку» для переключения цветов на RGB-светодиоде
по цветовому кругу. Вращаем по часовой — цвета меняются в одну сторону, вращаем против — в другую.
Цель
- Понять принцип работы и устройство инкрементального энкодера.
- Научиться определять не только факт, но и направление вращения.
- Использовать аппаратные прерывания для точной обработки сигналов энкодера.
- Создать интерактивное устройство с интуитивным управлением.
Оборудование и материалы
- Отладочная плата
Рудирон
. - Макетная плата.
- Модуль с инкрементальным энкодером.
- 1
RGB-светодиод
с общим катодом. - 3 резистора номиналом 220 Ом.
- Соединительные провода.
- USB-кабель для подключения
Рудирона
. - Компьютер с
Arduino IDE
.
Ход работы
-
Что такое энкодер и как он работает?
Инкрементальный энкодер — это датчик, который преобразует вращательное движение в последовательность электрических импульсов. В отличие от потенциометра, у него нет начального и конечного положения — его можно вращать бесконечно. Он не сообщает абсолютный угол, а лишь говорит: «Меня повернули на один шаг».
Внутри энкодера находится диск с чередующимися проводящими и непроводящими секторами. Два контакта (для каналов A и B) скользят по этому диску. При вращении они поочерёдно замыкаются и размыкаются, генерируя на выходах
S1
иS2
прямоугольные цифровые импульсы.Главный секрет энкодера — квадратурное кодирование. Контакты A и B расположены со сдвигом. Из-за этого импульсы на двух каналах тоже сдвинуты по фазе на 90 градусов. Именно этот сдвиг позволяет нам определить не только факт вращения, но и его направление.
Как определить направление? Алгоритм простой - мы настраиваем прерывание на один канал, например, A. Когда на нём происходит изменение (например, нарастание сигнала), мы в этот самый момент смотрим на состояние второго канала (B). Если их состояния отличаются, значит, вращение идёт в одну сторону. Если совпадают — в другую.
-
Сборка схемы
- Подключите
RGB-светодиод
. Красный, зелёный и синий каналы (через резисторы 220 Ом) подключите к ШИМ-пинам 5, 7, 8. Общий катод — кGND
. - Подключите энкодер:
+
(или5V
) модуля — к пину 5VРудирона
.GND
модуля — к пину GNDРудирона
.- S1 (канал A) — к пину 35 (
BUTTON_BUILTIN_1
, поддерживает прерывание). - S2 (канал B) — к пину 6 (любой свободный цифровой пин).
KEY
(кнопку) мы в этой работе использовать не будем.
- Подключите
-
Написание и загрузка кода
- Убедитесь, что перемычка
IRQ
на плате снята, а перемычкаPRG | RUN
стоит в положенииPRG
. -
В
Arduino IDE
введите следующий код:// Пины для RGB-светодиода const int redPin = 5; const int greenPin = 7; const int bluePin = 8; // Пины энкодера #define ENCODER_A 35 #define ENCODER_B 6 // Переменная для хранения текущего "цвета" (0-5) // volatile - потому что изменяется в прерывании volatile int colorState = 0; volatile bool changed = true; // Флаг, что цвет изменился void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); // Модули энкодеров обычно имеют встроенные подтягивающие резисторы, // но для надёжности лучше включить их и в микроконтроллере. pinMode(ENCODER_A, INPUT_PULLUP); pinMode(ENCODER_B, INPUT_PULLUP); // Настраиваем прерывание на пине A на RISING (передний фронт) attachInterrupt(digitalPinToInterrupt(ENCODER_A), handleEncoder, RISING); } // Обработчик прерывания для энкодера void handleEncoder() { // Проверяем состояние второго пина, чтобы определить направление if (digitalRead(ENCODER_B) == LOW) { colorState++; // По часовой стрелке } else { colorState--; // Против часовой стрелки } // Ограничиваем значение в пределах 0-5 if (colorState > 5) colorState = 0; if (colorState < 0) colorState = 5; changed = true; // Устанавливаем флаг, что нужно обновить цвет } // Функция для установки одного из 6 цветов void setColor(int state) { switch (state) { case 0: analogWrite(redPin, 255); analogWrite(greenPin, 0); analogWrite(bluePin, 0); break; // Красный case 1: analogWrite(redPin, 255); analogWrite(greenPin, 128); analogWrite(bluePin, 0); break; // Оранжевый case 2: analogWrite(redPin, 0); analogWrite(greenPin, 255); analogWrite(bluePin, 0); break; // Зелёный case 3: analogWrite(redPin, 0); analogWrite(greenPin, 255); analogWrite(bluePin, 255); break; // Голубой case 4: analogWrite(redPin, 0); analogWrite(greenPin, 0); analogWrite(bluePin, 255); break; // Синий case 5: analogWrite(redPin, 255); analogWrite(greenPin, 0); analogWrite(bluePin, 255); break; // Пурпурный } } void loop() { // Если флаг установлен (т.е. прерывание сработало) if (changed) { setColor(colorState); // Обновляем цвет светодиода changed = false; // Сбрасываем флаг } }
- Нажмите кнопку «Upload», чтобы загрузить код на плату.
- Убедитесь, что перемычка
-
Проверка работы
- Сразу после загрузки
RGB-светодиод
загорится красным цветом. - Начните вращать ручку энкодера по часовой стрелке. Цвет будет переключаться: красный → оранжевый → зелёный → голубой → синий → пурпурный и снова красный.
- Теперь повращайте ручку против часовой стрелки. Цвета будут меняться в обратном порядке.
- Сразу после загрузки
Результаты
Вы создали интуитивно понятный контроллер для управления цветом. Вращая ручку энкодера, вы переключаетесь по цветовому кругу, а аппаратное прерывание гарантирует, что ни один шаг вращения не будет пропущен.
Анализ результатов
- Определение направления. Вся логика скрыта в
ISR
handleEncoder()
. Ключевая строка —if (digitalRead(ENCODER_B) == LOW)
. Она сравнивает состояния двух каналов в момент изменения на одном из них, что и позволяет определить направление. - Переменная
colorState
. Эта переменная работает как счётчик, который увеличивается или уменьшается в прерывании. Она хранит текущий выбранный «цвет». - Флаг
changed
. Чтобы не вызыватьsetColor()
в каждой итерацииloop()
, мы используем флаг.ISR
устанавливает его вtrue
, аloop()
, увидев это, обновляет цвет и сбрасывает флаг. Это правильный способ взаимодействия междуISR
иloop()
.
Выводы
В этой лабораторной работе вы освоили одно из самых важных применений аппаратных прерываний — обработку сигналов с инкрементального энкодера, включая определение направления. Вы научились создавать сложные интерактивные устройства, где физическое действие (вращение) напрямую управляет состоянием программы.
Вопросы для самопроверки
- Что такое квадратурное кодирование и зачем энкодеру два сигнальных канала?
- Как с помощью состояний двух каналов можно определить направление вращения?
- Почему для отслеживания вращения энкодера мы использовали прерывание с режимом
RISING
? - Зачем в программе используется флаг
changed
? - Как изменить код, чтобы по нажатию на кнопку энкодера (
KEY
, пин 32) цвет сбрасывался на красный (colorState = 0
)?
Поздравляем с освоением энкодера и прерываний!
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home