4.03.2. Лабораторная работа №4.3.2.md


Управление с помощью потенциометра

Тема работы

В прошлой работе мы научились считывать положение потенциометра. Теперь давайте используем эти данные для управления чем-то интересным! В этой лабораторной работе мы создадим интерактивную подсветку - с помощью потенциометра мы сначала будем плавно регулировать яркость одного цвета RGB-светодиода, а затем напишем вторую программу, которая позволит выбирать один из восьми цветов простым поворотом ручки.

Цель

  • Объединить навыки чтения аналогового сигнала (analogRead) и управления ШИМ (analogWrite).
  • Научиться преобразовывать (масштабировать) данные из одного диапазона в другой.
  • Создать полноценное интерактивное устройство: цифровой диммер и переключатель цветов.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • Макетная плата.
  • 1 RGB-светодиод с общим катодом.
  • 1 потенциометр (10 кОм).
  • 3 резистора номиналом 220 Ом.
  • Соединительные провода.
  • USB-кабель для подключения Рудирона.
  • Компьютер с Arduino IDE.

Ход работы

  1. Сборка схемы

    Мы объединим схемы из двух предыдущих лабораторных работ. Нам нужно подключить и RGB-светодиод, и потенциометр.

    • Подключите потенциометр:
      • Крайние выводы — к 3.3V и GND.
      • Центральный вывод — к аналоговому входу A0.
    • Подключите RGB-светодиод:
      • Вывод красного цвета (через резистор 220 Ом) — к пину 5 (ШИМ).
      • Вывод зелёного цвета (через резистор 220 Ом) — к пину 7 (ШИМ).
      • Вывод синего цвета (через резистор 220 Ом) — к пину 8 (ШИМ).
      • Длинную ножку (общий катод) — к GND.
  2. Программа №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);
      }
      
    • Загрузите код на плату. Вращая ручку потенциометра, вы сможете плавно менять яркость красного светодиода.
  3. Программа №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 и функции. Вы научились создавать сложные интерактивные устройства, которые считывают аналоговый сигнал от пользователя и преобразуют его в сложное управляющее воздействие на выходе.

Вопросы для самопроверки

  1. Зачем в первой программе нужна функция map()?
  2. Как устроен переключатель цветов во второй программе?
  3. Почему для установки цвета мы использовали digitalWrite(), а не analogWrite()?
  4. Что произойдёт, если в первой программе убрать map() и написать analogWrite(redPin, potValue)?
  5. Задача со звёздочкой. Модифицируйте вторую программу так, чтобы вместо резкого переключения цветов происходил плавный перелив по цветовому кругу (как в лабораторной работе 4.2.2), а потенциометр управлял общей яркостью этого перелива.

Вы проделали огромную работу и создали сложное интерактивное устройство! В следующей лабораторной работе мы поднимем ставки и поработаем с настоящим «суставом» робота — сервоприводом.