Подключение потенциометра. Датчики. Ардуино

Подключение потенциометра
Подключение потенциометров к ардуино
Подключение потенциометров к ардуино

Привет. Сегодня начнем разбираться с датчиками для ардуино. Всевозможных датчиков для ардуино существует очень много. А самый простой пример, который мы разберем — это подключение потенциометра к ардуино.

Потенциометр — это резистор с переменным сопротивлением. Обычно сопротивление регулируется в ручном режиме. Но существуют и программируемые цифровые потенциометры.

В предыдущем уроке мы рассматривали возможность вывода информации в последовательный порт. Сейчас мы будем использовать эти возможности ардуино. Так что, если вы уже забыли, или пропустили тот пост, пожалуйста, посмотрите его.

Последовательный порт. Урок 5. Ардуино

Итак, план на сегодня такой. Подключим к ардуино несколько разных потенциометров. Измерим сопротивление на каждом из них. Выведем полученные данные в последовательный порт. И настроим яркость светодиода с помощью ШИМ и данных с потенциометра.

Для того, чтобы выполнить этот урок нам понадобиться.

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • Потенциометры разного сопротивления
  • Светодиод 5 мм
  • Резистор номиналом 220 Ом
  • Кабель USB

Потенциометры действуют как регулируемые делители напряжения. Они могут быть разных размеров и форм, но всегда имеют три вывода.

Подключаем один крайний вывод потенциометра к земле, а другой к шине 5 В. Потенциометры симметричны, так что не имеет значения, с какой стороны вы подключите шину питания, а с какой землю. Средний вывод соединяем с одним из аналоговых контактов на плате ардуино.

Принципиальная схема подключения потенциометров
Принципиальная схема подключения потенциометров

При повороте ручки потенциометра аналоговый входной сигнал будет плавно меняться от 0 до 5 В.

analogRead()

Для того, чтобы считать сигнал от датчика в программу, нам понадобится функция analogRead(). Она принимает номер порта в качестве аргумента. А пины, которые можно использовать для аналогового входа помечены на плате ардуино как ANALOG IN.

Напряжение  поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Разброс напряжение и шаг может быть изменен функцией analogReference().

Считывание значение с аналогового входа занимает около 100 микросекунд (0.0001 сек), Значит, максимальная частота считывания приблизительно 10,000 раз в секунду.

Программа

Тестовая программа уже есть в стандартной библиотеке, так что, сегодня не будем писать собственную. Только немного изменим стандартную.

Откроем программу AnalogInOutSerial из меню File — Examples — Analog. Добавим константу и переменную для подключения потенциометра и получаемого значения от него.

const int analogInPin1 = A0;
const int analogInPin2 = A1;
const int analogOutPin = 9;
int sensorValue1 = 0;
int sensorValue2 = 0;
int outputValue = 0;

В функции setup() откроем последовательный порт. А в функции loop() добавим считывание сигнала со второго подключенного потенциометра.

void loop() {
  // read the analog in value:
  sensorValue1 = analogRead(analogInPin1);
  sensorValue2 = analogRead(analogInPin2);

Map()

Когда мы используем данные от аналоговых датчиков и выводим напряжение на пин в зависимости от этих датчиков, необходимо позаботиться о преобразовании чисел из одного диапазона в другой.

Данные с потенциометра будут приходить от 0 до 1023, а на светодиод мы может подать напряжение от 0 до 255. Такое преобразование просто сделать с помощью функции map().

Она пропорционально переносит значение из текущего диапазона значений в новый диапазон. Например,

outputValue = map( (sensorValue1+sensorValue2)/2 , 0, 1023, 0, 255);

В данном случае, среднее значение с двух подключенных потенциометров мы получаем в диапазоне от 0 до 1023. Но преобразуем в новый диапазон от 0 до 255. Который уже можно вывести на светодиод через ШИМ.

Сonstrain()

Так же можно использовать функцию constrain(). Она принимает три параметра и выводит значения границ диапазона, если проверяемое значение выходит за границы этого диапазона. Например,

sensVal = constrain(0, 5, 150); // 5
sensVal = constrain(200, 5, 150); // 150
sensVal = constrain(95, 5, 150); // 95

// ограничиваем значения sensVal диапазоном от 5 до 150
Управляем яркостью светодиода двумя потенциометрами
Управляем яркостью светодиода двумя потенциометрами

Полный текст программы

// These constants won't change. They're used to give names to the pins used:
const int analogInPin1 = A0;  // Analog input pin that the potentiometer is attached to
const int analogInPin2 = A1;
const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue1 = 0;        // value read from the pot
int sensorValue2 = 0;

int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // read the analog in value:
  sensorValue1 = analogRead(analogInPin1);
  sensorValue2 = analogRead(analogInPin2);
  // map it to the range of the analog out:
  outputValue = map( (sensorValue1+sensorValue2)/2 , 0, 1023, 0, 255);
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);

  // print the results to the Serial Monitor:
  Serial.print("sensor1 = ");
  Serial.print(sensorValue1);
  
  Serial.print("\t sensor2 = ");
  Serial.print(sensorValue2);
  
  Serial.print("\t output = ");
  Serial.println(outputValue);

  // wait 2 milliseconds before the next loop for the analog-to-digital
  // converter to settle after the last reading:
  delay(2);
}

В результате выполнения программы мы получим управление яркостью светодиода от двух потенциометров. А в мониторе последовательного порта данные от обоих подключенных датчиков и новое значение передаваемое на светодиод.

Данные от потенциометров в последовательном порте
Данные от потенциометров в последовательном порте

Заключение

Сегодня мы рассмотрели подключение потенциометра к ардуино. Использовали еще одну стандартную программу из библиотеки ide. И разобрали две новые функции map() и constrain(), которые помогут нам в работе со всеми датчиками и ардуино. В следующий раз рассмотрим датчик измерения расстояния.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *