4.03.2. Лабораторная работа №4.3.2.md
Управление с помощью потенциометра
Тема работы
В прошлой работе мы научились считывать положение потенциометра. Теперь давайте используем эти данные для управления чем-то интересным! В этой лабораторной работе мы создадим интерактивную подсветку - с помощью потенциометра мы сначала будем плавно регулировать яркость одного цвета RGB-светодиода
, а затем напишем вторую программу, которая позволит выбирать один из восьми цветов простым поворотом ручки.
Цель
- Объединить навыки чтения аналогового сигнала (
analogRead
) и управления ШИМ (analogWrite
). - Научиться преобразовывать (масштабировать) данные из одного диапазона в другой.
- Создать полноценное интерактивное устройство: цифровой диммер и переключатель цветов.
Оборудование и материалы
- Отладочная плата
Рудирон
. - Макетная плата.
- 1
RGB-светодиод
с общим катодом. - 1 потенциометр (10 кОм).
- 3 резистора номиналом 220 Ом.
- Соединительные провода.
- USB-кабель для подключения
Рудирона
. - Компьютер с
Arduino IDE
.
Ход работы
-
Сборка схемы
Мы объединим схемы из двух предыдущих лабораторных работ. Нам нужно подключить и
RGB-светодиод
, и потенциометр.- Подключите потенциометр:
- Крайние выводы — к
3.3V
иGND
. - Центральный вывод — к аналоговому входу
A0
.
- Крайние выводы — к
- Подключите
RGB-светодиод
:- Вывод красного цвета (через резистор 220 Ом) — к пину 5 (ШИМ).
- Вывод зелёного цвета (через резистор 220 Ом) — к пину 7 (ШИМ).
- Вывод синего цвета (через резистор 220 Ом) — к пину 8 (ШИМ).
- Длинную ножку (общий катод) — к
GND
.
- Подключите потенциометр:
-
Программа №1. Плавная регулировка яркости (Диммер)
Сначала напишем код, который будет считывать значение с потенциометра и использовать его для управления яркостью красного цвета.
analogRead()
возвращает значение от 0 до 4095.-
analogWrite()
принимает значение от 0 до 255. Нам нужно масштабировать один диапазон в другой. Для этого можно использовать простую математику или готовую функциюmap()
. -
В
Arduino IDE
введите следующий код:const int potPin = A0; const int redPin = 5; void setup() { pinMode(redPin, OUTPUT); } void loop() { // Считываем значение с потенциометра (0-4095) int potValue = analogRead(potPin); // Масштабируем значение 0-4095 в диапазон 0-255 int brightness = map(potValue, 0, 4095, 0, 255); // Устанавливаем яркость красного светодиода analogWrite(redPin, brightness); }
- Загрузите код на плату. Вращая ручку потенциометра, вы сможете плавно менять яркость красного светодиода.
-
Программа №2. Переключатель цветов
Теперь усложним задачу. Разделим весь диапазон потенциометра (0-4095) на 8 равных участков. Каждый участок будет соответствовать своему цвету.
- 0 - 511: Выключен (чёрный)
- 512 - 1023: Красный
- 1024 - 1535: Зелёный
-
…и так далее.
-
Сотрите предыдущий код и введите новый:
const int potPin = A0; const int redPin = 5; const int greenPin = 7; const int bluePin = 8; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } // Функция для установки цвета void setColor(int r, int g, int b) { digitalWrite(redPin, r); digitalWrite(greenPin, g); digitalWrite(bluePin, b); } void loop() { int potValue = analogRead(potPin); if (potValue < 512) { setColor(LOW, LOW, LOW); // Чёрный (выкл) } else if (potValue < 1024) { setColor(HIGH, LOW, LOW); // Красный } else if (potValue < 1536) { setColor(LOW, HIGH, LOW); // Зелёный } else if (potValue < 2048) { setColor(LOW, LOW, HIGH); // Синий } else if (potValue < 2560) { setColor(HIGH, HIGH, LOW); // Жёлтый } else if (potValue < 3072) { setColor(LOW, HIGH, HIGH); // Голубой } else if (potValue < 3584) { setColor(HIGH, LOW, HIGH); // Фиолетовый } else { setColor(HIGH, HIGH, HIGH); // Белый } }
- Загрузите код на плату. Теперь, вращая ручку потенциометра, вы будете переключаться между 8-ю разными цветами.
Результаты
Вы создали два полноценных интерактивных устройства: 1. Цифровой диммер, позволяющий плавно регулировать яркость. 2. Переключатель цветов, где положение ручки потенциометра выбирает один из восьми предустановленных цветов.
Анализ результатов
- Программа №1. Ключевым элементом является функция
map(value, fromLow, fromHigh, toLow, toHigh)
, которая пропорционально преобразует число из одного диапазона в другой. Это очень частая задача при работе с датчиками. - Программа №2. Здесь мы использовали цепочку
if-else if
, чтобы разделить весь диапазон значений АЦП на сектора. Для удобства мы создали собственную функциюsetColor()
, чтобы не повторять три строкиdigitalWrite()
для каждого цвета.
Выводы
В этой лабораторной работе вы объединили практически все полученные ранее знания: analogRead
, analogWrite
, digitalWrite
, if-else
и функции. Вы научились создавать сложные интерактивные устройства, которые считывают аналоговый сигнал от пользователя и преобразуют его в сложное управляющее воздействие на выходе.
Вопросы для самопроверки
- Зачем в первой программе нужна функция
map()
? - Как устроен переключатель цветов во второй программе?
- Почему для установки цвета мы использовали
digitalWrite()
, а неanalogWrite()
? - Что произойдёт, если в первой программе убрать
map()
и написатьanalogWrite(redPin, potValue)
? - Задача со звёздочкой. Модифицируйте вторую программу так, чтобы вместо резкого переключения цветов происходил плавный перелив по цветовому кругу (как в лабораторной работе 4.2.2), а потенциометр управлял общей яркостью этого перелива.
Вы проделали огромную работу и создали сложное интерактивное устройство! В следующей лабораторной работе мы поднимем ставки и поработаем с настоящим «суставом» робота — сервоприводом.
- Страницы
- 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