- Принцип работы потенциометра
- Программа
- 2 Логика работы и схема подключения цифрового потенциометра X9C103 к Arduino
- Сonstrain()
- Первый пример
- Map()
- Второй пример
- Скетч чтения аналогового входа ардуино
- Объяснение
- Подключение потенциометра к платам Ардуино
- Схема подключения
- Пример проекта
- Как подключить потенциометр к Ардуино
- Скетч. Подключение потенциометра и светодиода
- Скетч. Подключение потенциометра и сервопривода
- Код:
- Результат чтения аналогового входа ардуино
- Скетч управления цифровым потенциометром X9C102, X9C103, X9C104
Принцип работы потенциометра
Переменный резистор или потенциометр — это электрическое устройство, уровень сопротивления которого можно установить в определенных пределах. Таким образом, мы можем изменять параметры электрических цепей, гибко адаптируя их к определенным условиям: например, регулируя чувствительность датчика или громкость звука в динамике. Потенциометры широко используются в схемах для регулировки громкости, напряжения, контраста и т.д. Благодаря своей простоте и практичности.
В зависимости от конструкции потенциометры делятся на два больших класса: цифровые и аналоговые. Сердце цифрового потенциометра — резистивная шкала, на каждой фазе цепи которой находятся электронные переключатели. В данный момент замыкается только электронный переключатель, который устанавливает определенное значение сопротивления. Количество шагов на шкале определяет диапазон разрешения потенциометра. Аналоговый потенциометр может непрерывно изменять свое значение, но, как правило, в более узком диапазоне, а сам резистор будет больше по размеру.
В подавляющем большинстве случаев цифровые потенциометры используются в проектах Arduino. Чаще всего это интегральные схемы с положением цифровой стрелки в центре шкалы.
Программа
Тестовая программа уже есть в стандартной библиотеке, поэтому сегодня писать не будем. Давайте немного изменим стандарт.
Откройте программу AnalogInOutSerial из меню Файл — Примеры — Аналоговый. Давайте добавим константу и переменную, чтобы подключить потенциометр и полученное от него значение.
const int analogInPin1 = A0; const int analogInPin2 = A1; const int analogOutPin = 9; int значение sensor1 = 0; int value sensor2 = 0; int outputValue = 0;
Откройте последовательный порт в функции setup (). И в функции loop () добавьте показание сигнала со второго подключенного потенциометра.
void loop () {// считываем аналоговое значение в: sensorValue1 = analogRead (analogInPin1); sensorValue2 = analogRead (analogInPin2);
2 Логика работы и схема подключения цифрового потенциометра X9C103 к Arduino
Между 0 и максимальным значением с шагом 1/100 от максимума можно регулировать сопротивление на третьем подвижном штыре.
Положение «мобильного» терминала контролируется серией отрицательных импульсов. Каждый импульс сдвигает значение сопротивления на 1 шаг в сторону увеличения или уменьшения.
Потенциометр управляется тремя линиями:
Название булавки | Назначение | Примечание |
CS | Выбор устройства | LOW — устройство активно |
INC | Изменение выходного сопротивления | Отрицательные импульсы |
U / D | Направление изменения | U (вверх) — если напряжение на ножке микросхемы ВЫСОКОЕ, D (вниз) — НИЗКОЕ |
Вот как выглядит временная диаграмма управляющих сигналов:
Временная диаграмма управления потенциометром X9C102, X9C103, X9C104
Здесь VW — напряжение на центральном контакте.
Строим схему как показано на рисунке:
Схема подключения цифрового потенциометра X9C102, X9C103, X9C104 к Arduino
Для модуля требуется питание +5 В.
Сonstrain()
Вы также можете использовать функцию constrain (). Он принимает три параметра и выводит значения пределов диапазона, если проверяемое значение выходит за пределы этого диапазона. Например,
sensVal = ограничение (0, 5, 150); // 5 sensVal = constriction (200, 5, 150); // 150 sensVal = constrain (95, 5, 150); // 95 // ограничиваем значения sensVal в диапазоне от 5 до 150
Регулируем яркость светодиода двумя потенциометрами
Первый пример
Сначала попробуем просто считать напряжение на выводе A0 микроконтроллера и отправить его в COM-порт.
Это делается с помощью функции analogRead (). Этой функции необходимо передать номер контакта, напряжение, при котором он должен быть измерен, и она вернет текущее значение.
Загрузите на карту следующий пример:
int val; void setup () {Serial.begin (9600);} недействительный цикл () {val = analogRead (A0); Serial.println (val); задержка (1000);}
Микроконтроллер Atmega8A, используемый на нашей EduBoard, имеет модуль АЦП с 10-битным разрешением и возможностью мультиплексирования с шестью входами. Эти входы пронумерованы A0-A6 (или 14-19).
Измерение производится относительно напряжения питания. Ни при каких обстоятельствах на вход не должно подаваться отрицательное напряжение или напряжение выше напряжения питания! Мы подключили ко входу переменный резистор и наше входное напряжение точно не выйдет за пределы блока питания.
Теперь разберемся, что нам пришлёт платеж. Как только разрешение составит 10 бит — в десятичной форме, значение изменится от 0 до 1023. Измерение относится к 5 вольтам, поэтому изменение показаний 1 соответствует фактическому напряжению 5/1023 = 4,9 мВ. То есть с помощью встроенного АЦП микроконтроллера можно измерить напряжение с точностью до 4,9 мВ.
Вернемся к эскизу. Из-за линии …
val = analogRead (A0);
. переменная val будет записана с оцифрованным напряжением, считываемым на выводе A0. Откройте дверной монитор (Ctrl + Shift + M) и посмотрите, как меняются показания АЦП при вращении вала переменного резистора. Обратите внимание, что нет необходимости регулировать штифт на входе.
Пришло время немного улучшить работу с модулем аналого-цифрового преобразователя. На практике младшие биты АЦП могут сильно колебаться из-за шума и обычно отбрасываются двумя битами одновременно. Остается 8-битное число, с которым гораздо удобнее работать. В этом случае точность составляет 5/255 = 19,6 мВ, чего достаточно для большинства ситуаций.
Измените код, чтобы отправить 8-битное значение. Замените строку, в которой отображается состояние АЦП, на это:
val = analogRead (A0) >> 2;
Теперь присваиваем значение, считываемое АЦП, переменной val, сдвинутой на два бита вправо. Остальные биты просто отбрасываются.
Map()
При использовании данных аналогового датчика и выводе напряжения на вывод на основе этих датчиков нам необходимо позаботиться о преобразовании чисел из одного диапазона в другой.
Данные потенциометра будут от 0 до 1023, и мы можем подавать напряжение на светодиод от 0 до 255. Это преобразование легко сделать с помощью функции map().
Пропорционально переносит значение из текущего диапазона значений в новый диапазон. Например,
outputValue = map ((sensorValue1 + sensorValue2) / 2, 0, 1023, 0, 255);
В этом случае мы получаем среднее значение от двух подключенных потенциометров в диапазоне от 0 до 1023. Но мы преобразуем его в новый диапазон от 0 до 255. Что уже может быть выведено на светодиод через PWM.
Второй пример
Теперь мы можем легко изменить яркость светодиода с помощью ШИМ модуляции, задав ее переменным резистором. Установите «цветную» перемычку, как описано в этой статье. Таким образом, вы подключены к 9-му, 10-му и 11-му пиновым сегментам трехцветного светодиода.
Для начала попробуем изменить яркость всего одного светодиода:
#define СИНИЙ 9int val; void setup () {pinMode (BLUE, OUTPUT);} void loop () {analogWrite (BLUE, (analogRead (A0) >> 2));}
Достаточно простой код, если вы помните, как работает analogWrite (). По мере вращения вала переменного резистора яркость светодиода изменяется с минимальной на максимальную.
Между прочим, если вы удалите двухбитовый сдвиг, функция analogWrite () переполнится, так как может принимать только значения от 0 до 255. Попробуйте удалить этот сдвиг и посмотрите, что произойдет.
И наконец, добавим управление всеми тремя светодиодами. Осталось только найти отвертку, чтобы покрутить два других режущих резистора.
#define СИНИЙ 9 # определить ОРАНЖЕВЫЙ 10 # определить ЗЕЛЕНЫЙ 11int val; void setup () {pinMode (BLUE, OUTPUT); pinMode (ОРАНЖЕВЫЙ, ВЫХОД); pinMode (ЗЕЛЕНЫЙ, ВЫХОД);} void loop () {analogWrite (СИНИЙ, (analogRead (A0) >> 2)); analogWrite (ОРАНЖЕВЫЙ, (analogRead (A1) >> 2)); analogWrite (ЗЕЛЕНЫЙ, (analogRead (A2) >> 2));}
Скетч чтения аналогового входа ардуино
/ ** * Эксперимент № 1. * * https://jarduino.ru * * Эксперименты с ардуино. * / const byte POT_PIN = A0; // Порт для . int val {0}; // Переменная для… // вызывается один раз, для начальной конфигурации void setup () {Serial.begin (9600); pinMode (A0, ВХОД); // вывод A0 будет входом} // вызывается в цикле void loop () {val = analogRead (POT_PIN); // Считываем аналоговое значение и присваиваем его переменной val. Serial.print (val); // Отправляем прочитанное значение в последовательный порт. Serial.print («(«); Serial.print (map (val, 0, 1023, 0, 5))); // Распечатать значение в вольтах Serial.println («V)»); задержка (100); // Небольшая задержка в мс. }
Объяснение
Чтобы получить аналоговое значение, мы вызываем analogRead (A0). Он вернет целочисленное значение в диапазоне 0..1023. В данном случае 0 соответствует 0 В, а 1024 — максимум, т.е. 5В.
Потенциометр действует как делитель напряжения, позволяя подавать напряжение на порт A0 в диапазоне от 0 В до значения на входе (5 В).
Теперь должно быть понятно, почему точность измерения Arduino составляет 1/1024 — это деление шкалы аналогового считывателя значений.
для получения истинного аналогового значения, выраженного в вольтах, можно применить простую формулу соотношения. Однако в arduino есть готовая функция карты, которая сделает это за нас:
map (val, 0, 1023, 0, 5)
На вход подаются значение, которое нужно преобразовать, диапазон значений в текущих единицах измерения (0..1023) и диапазон в единицах вывода (0..5В).
Подключение потенциометра к платам Ардуино
Схема подключения
Потенциометр подключается к ардуино по схеме, изображенной на рисунке:
Для этого необходимо подключить три пина потенциометра к указанным пинам платы:
- Черный — GND;
- Красный — питание 5В;
- Средний — от центрального выхода к аналоговому входу A0.
При изменении положения вала подключенного потенциометра происходит изменение параметра сопротивления, что вызывает изменение индикатора на нулевом выводе платы Arduino. Считывание полученного значения аналогового импульсного напряжения выполняется в скетче с помощью команды analogRead ().
В плату Arduino встроен аналого-цифровой преобразователь, способный считывать напряжение и преобразовывать его в цифровые индикаторы со значением от нуля до 1023. Когда указатель поворачивается до конечного значения в одном из двух возможных направлений, напряжение на выводе равно нулю, и, следовательно, напряжение, которое будет генерироваться, равно 0 В. Когда вал поворачивается до конца в противоположном направлении, на вывод подается напряжение 5 В, что означает числовое значение будет 1023.
Пример проекта
Примером реализации схемы подключения потенциометра может служить макетная плата с подключенным переменным резистором и светодиодом. Потенциометр будет контролировать уровень яркости.
Для выполнения работы необходимо подготовить следующие детали:
- 1 плата Arduino Uno
- 1 x беспаечный макет
- 1 светодиод
- 1 резистор сопротивлением 220 Ом
- 6 проводов «папа-папа»
- 1 потенциометр.
Чтобы использовать меньше проводов от макета к контроллеру, подключите светодиод и потенциометр заземляющим проводом к длинной минусовой дорожке.
Как подключить потенциометр к Ардуино
Для этого урока нам понадобятся:
Внешние ножки переменного резистора подключены к портам питания (5V и GND). Средний контакт имеет подвижный контакт, на котором изменяется напряжение из-за изменения сопротивления при повороте ручки. Полярность подключения «+» и «-» не имеет значения, в этом случае произойдет только инверсия сигнала потенциометра. Соберите следующую схему и загрузите данный код в плату.
Скетч. Подключение потенциометра и светодиода
Чтобы отрегулировать яркость светодиода с помощью переменного резистора, считайте данные с этого радиоэлемента, подключив его к аналоговому входу. В зависимости от поворота ручки потенциометра необходимо изменять яркость светодиода в линейной зависимости. Сделать это на микроконтроллере достаточно просто, ниже размещена схема подключения переменного резистора с примером кода.
Скетч. Подключение потенциометра и сервопривода
Серводвигатель подключается к аналоговым выходам Arduino Nano. В скетче используется функция карты, которая пропорционально переносит значение переменной из текущего диапазона значений в новый диапазон. Поэтому значения потенциометра в диапазоне 0… 1023 переводим их в новый диапазон от 0 до 180 (угол поворота серводвигателя). Постройте схему и загрузите следующий эскиз.
Код:
#включать // включение библиотеки для оборудования SPI # defineCS10 // ножка чипсета byteval = 0; voidsetup () {Serial.begin (115200); SPI.begin (); pinMode (CS, ВЫХОД); } voidloop () {floatvoltage = (analogRead (A0) * 5.0) /1024.0; // считываем напряжение на входе A0 Serial.print («Voltage =»); // отправляем данные о напряжении на монитор порта Serial.print (Voltage); Serial.print («val =»); // значение записываем на потенциометр Serial.print (val, BIN); // двоичный Serial.print («/»); Serial.println (val, DEC); // десятичное значение ++; // добавляем 1 к переменной MCP4xxxxWrite (val); // записываем значение переменной в потенциометр delay (50); // ждем следующего раза} voidMCP4xxxxWrite (byteval) {// отправляем значение ползунка в потенциометр digitalWrite (CS, LOW); // разрешить прием данных микросхемой SPI.transfer (0b00010001); // отправляем первый байт в регистр конфигурации SPI.transfer (val); // отправляем второй байт в «регистр ползунка» digitalWrite (CS, HIGH); // отключаем прием данных от микросхемы}
Результат чтения аналогового входа ардуино
Скетч считывает значение из аналогового порта A0 (с небольшой задержкой) и отправляет его в последовательный порт. В этом случае считанное значение преобразуется в вольты и также отображается.
Скетч управления цифровым потенциометром X9C102, X9C103, X9C104
Теперь напишем такой скетч:
const int CS = 10; const int INC = 9; const int UD = 8; void setup () {pinMode (CS, ВЫХОД); pinMode (INC, ВЫХОД); pinMode (UD, ВЫХОД); digitalWrite (CS, HIGH); // X9C в режиме низкого энергопотребления digitalWrite (INC, HIGH); digitalWrite (UD, HIGH); } void loop () {для (int я = 0; я <= 100; я + = 10) {setResistance (я); задержка (100); }} // Устанавливаем сопротивление на «подвижном» выводе. // Уровень в процентах изменяется от 0 до 100% от максимального значения void setResistance (int percent) {// Уменьшает сопротивление до 0%: digitalWrite (UD, LOW); // выбираем более раннюю версию digitalWrite (CS, LOW); // выбираем потенциометр X9C для (int i = 0; i <100; i ++) {// потому что потенциометр имеет 100 доступных позиций digitalWrite (INC, LOW); микросекунды задержки (1); digitalWrite (INC, HIGH); микросекунды задержки (1); } // Увеличиваем сопротивление до требуемого: digitalWrite (UD, HIGH); для (int i = 0; i
Эта диаграмма содержит следующий алгоритм: увеличивайте сопротивление каждые 100 мс с шагом 10% от 0 до 100% от максимального потенциометра.
Загрузим этот скетч в память платы Arduino.